Skip to content

Commit e3d2c2f

Browse files
committed
test(deserializer): add List and Array fields to polymorphic test classes
Enhanced polymorphic test coverage with collection fields: Test class changes: - BasePooledClass: added BaseIntArray (int[]) and BaseStringList (List<string>) - DerivedPooledClass: added DerivedDoubleArray (double[]) and DerivedIntList (List<int>) - DerivedWithoutPoolClass: added DerivedDoubleList (List<double>) and DerivedStringArray (string[]) - PolymorphicContainer: added PolymorphicList (List<BasePooledClass>) Test method updates: - All 8 polymorphic test methods now include collection data - Added new test: TestPolymorphic_PolymorphicList_CallsCorrectFactories - Tests verify that factory methods work correctly with objects containing collections - Collection assertions verify proper serialization/deserialization of arrays and lists This ensures NinoRefDeserializationAttribute works correctly with complex objects containing nested collections in polymorphic scenarios.
1 parent 128b885 commit e3d2c2f

File tree

1 file changed

+141
-2
lines changed

1 file changed

+141
-2
lines changed

src/Nino.UnitTests/RefDeserializationAttributeTests.cs

Lines changed: 141 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using Microsoft.VisualStudio.TestTools.UnitTesting;
23
using Nino.Core;
34

@@ -80,6 +81,8 @@ public static BasePooledClass GetFromBasePool()
8081

8182
public int BaseValue;
8283
public string BaseName;
84+
public int[] BaseIntArray;
85+
public List<string> BaseStringList;
8386

8487
[NinoIgnore]
8588
public bool FromBasePool;
@@ -102,6 +105,8 @@ public static DerivedPooledClass GetFromDerivedPool()
102105

103106
public int DerivedValue;
104107
public string DerivedName;
108+
public double[] DerivedDoubleArray;
109+
public List<int> DerivedIntList;
105110

106111
[NinoIgnore]
107112
public bool FromDerivedPool;
@@ -115,13 +120,16 @@ public class DerivedWithoutPoolClass : BasePooledClass
115120
{
116121
public int DerivedData;
117122
public string DerivedText;
123+
public List<double> DerivedDoubleList;
124+
public string[] DerivedStringArray;
118125
}
119126

120127
[NinoType]
121128
public class PolymorphicContainer
122129
{
123130
public BasePooledClass BaseField;
124131
public BasePooledClass[] PolymorphicArray;
132+
public List<BasePooledClass> PolymorphicList;
125133
}
126134

127135
[TestInitialize]
@@ -370,6 +378,8 @@ public void TestPolymorphic_BaseClass_CallsBaseFactory()
370378
{
371379
BaseValue = 100,
372380
BaseName = "BaseTest",
381+
BaseIntArray = new[] { 1, 2, 3 },
382+
BaseStringList = new List<string> { "A", "B", "C" },
373383
FromBasePool = false
374384
};
375385

@@ -381,6 +391,8 @@ public void TestPolymorphic_BaseClass_CallsBaseFactory()
381391
Assert.IsNotNull(result);
382392
Assert.AreEqual(100, result.BaseValue);
383393
Assert.AreEqual("BaseTest", result.BaseName);
394+
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, result.BaseIntArray);
395+
CollectionAssert.AreEqual(new List<string> { "A", "B", "C" }, result.BaseStringList);
384396
Assert.IsTrue(result.FromBasePool, "Base factory method should have been called");
385397
Assert.AreEqual(1, BasePooledClass.GetBasePoolCallCount());
386398
}
@@ -393,8 +405,12 @@ public void TestPolymorphic_DerivedClass_CallsDerivedFactory()
393405
{
394406
BaseValue = 200,
395407
BaseName = "DerivedBase",
408+
BaseIntArray = new[] { 10, 20 },
409+
BaseStringList = new List<string> { "X", "Y" },
396410
DerivedValue = 300,
397411
DerivedName = "DerivedTest",
412+
DerivedDoubleArray = new[] { 1.5, 2.5, 3.5 },
413+
DerivedIntList = new List<int> { 100, 200, 300 },
398414
FromBasePool = false,
399415
FromDerivedPool = false
400416
};
@@ -407,8 +423,12 @@ public void TestPolymorphic_DerivedClass_CallsDerivedFactory()
407423
Assert.IsNotNull(result);
408424
Assert.AreEqual(200, result.BaseValue);
409425
Assert.AreEqual("DerivedBase", result.BaseName);
426+
CollectionAssert.AreEqual(new[] { 10, 20 }, result.BaseIntArray);
427+
CollectionAssert.AreEqual(new List<string> { "X", "Y" }, result.BaseStringList);
410428
Assert.AreEqual(300, result.DerivedValue);
411429
Assert.AreEqual("DerivedTest", result.DerivedName);
430+
CollectionAssert.AreEqual(new[] { 1.5, 2.5, 3.5 }, result.DerivedDoubleArray);
431+
CollectionAssert.AreEqual(new List<int> { 100, 200, 300 }, result.DerivedIntList);
412432
Assert.IsTrue(result.FromDerivedPool, "Derived factory method should have been called");
413433
Assert.AreEqual(1, DerivedPooledClass.GetDerivedPoolCallCount());
414434
Assert.AreEqual(0, BasePooledClass.GetBasePoolCallCount(), "Base factory should NOT be called");
@@ -422,8 +442,12 @@ public void TestPolymorphic_DerivedWithoutPool_UsesBaseFactory()
422442
{
423443
BaseValue = 400,
424444
BaseName = "DerivedNoPool",
445+
BaseIntArray = new[] { 7, 8, 9 },
446+
BaseStringList = new List<string> { "D", "E" },
425447
DerivedData = 500,
426-
DerivedText = "NoPoolTest"
448+
DerivedText = "NoPoolTest",
449+
DerivedDoubleList = new List<double> { 4.5, 5.5 },
450+
DerivedStringArray = new[] { "P", "Q", "R" }
427451
};
428452

429453
byte[] bytes = NinoSerializer.Serialize(original);
@@ -434,8 +458,12 @@ public void TestPolymorphic_DerivedWithoutPool_UsesBaseFactory()
434458
Assert.IsNotNull(result);
435459
Assert.AreEqual(400, result.BaseValue);
436460
Assert.AreEqual("DerivedNoPool", result.BaseName);
461+
CollectionAssert.AreEqual(new[] { 7, 8, 9 }, result.BaseIntArray);
462+
CollectionAssert.AreEqual(new List<string> { "D", "E" }, result.BaseStringList);
437463
Assert.AreEqual(500, result.DerivedData);
438464
Assert.AreEqual("NoPoolTest", result.DerivedText);
465+
CollectionAssert.AreEqual(new List<double> { 4.5, 5.5 }, result.DerivedDoubleList);
466+
CollectionAssert.AreEqual(new[] { "P", "Q", "R" }, result.DerivedStringArray);
439467
// Note: This derived class doesn't have NinoRefDeserializationAttribute,
440468
// so it won't use base class factory either (each type needs its own attribute)
441469
}
@@ -450,8 +478,12 @@ public void TestPolymorphic_PolymorphicField_CallsCorrectFactory()
450478
{
451479
BaseValue = 600,
452480
BaseName = "PolyBase",
481+
BaseIntArray = new[] { 11, 12 },
482+
BaseStringList = new List<string> { "F", "G" },
453483
DerivedValue = 700,
454484
DerivedName = "PolyDerived",
485+
DerivedDoubleArray = new[] { 6.5, 7.5 },
486+
DerivedIntList = new List<int> { 400, 500 },
455487
FromBasePool = false,
456488
FromDerivedPool = false
457489
}
@@ -469,8 +501,12 @@ public void TestPolymorphic_PolymorphicField_CallsCorrectFactory()
469501
var derivedField = (DerivedPooledClass)result.BaseField;
470502
Assert.AreEqual(600, derivedField.BaseValue);
471503
Assert.AreEqual("PolyBase", derivedField.BaseName);
504+
CollectionAssert.AreEqual(new[] { 11, 12 }, derivedField.BaseIntArray);
505+
CollectionAssert.AreEqual(new List<string> { "F", "G" }, derivedField.BaseStringList);
472506
Assert.AreEqual(700, derivedField.DerivedValue);
473507
Assert.AreEqual("PolyDerived", derivedField.DerivedName);
508+
CollectionAssert.AreEqual(new[] { 6.5, 7.5 }, derivedField.DerivedDoubleArray);
509+
CollectionAssert.AreEqual(new List<int> { 400, 500 }, derivedField.DerivedIntList);
474510
Assert.IsTrue(derivedField.FromDerivedPool, "Derived factory should be called for polymorphic field");
475511
Assert.AreEqual(1, DerivedPooledClass.GetDerivedPoolCallCount());
476512
}
@@ -487,23 +523,33 @@ public void TestPolymorphic_PolymorphicArray_CallsCorrectFactories()
487523
{
488524
BaseValue = 10,
489525
BaseName = "Base1",
526+
BaseIntArray = new[] { 1, 2 },
527+
BaseStringList = new List<string> { "H", "I" },
490528
FromBasePool = false
491529
},
492530
new DerivedPooledClass
493531
{
494532
BaseValue = 20,
495533
BaseName = "Derived1",
534+
BaseIntArray = new[] { 3, 4 },
535+
BaseStringList = new List<string> { "J", "K" },
496536
DerivedValue = 30,
497537
DerivedName = "DerivedName1",
538+
DerivedDoubleArray = new[] { 8.5, 9.5 },
539+
DerivedIntList = new List<int> { 600, 700 },
498540
FromBasePool = false,
499541
FromDerivedPool = false
500542
},
501543
new DerivedWithoutPoolClass
502544
{
503545
BaseValue = 40,
504546
BaseName = "DerivedNoPool1",
547+
BaseIntArray = new[] { 5, 6 },
548+
BaseStringList = new List<string> { "L", "M" },
505549
DerivedData = 50,
506-
DerivedText = "NoPool1"
550+
DerivedText = "NoPool1",
551+
DerivedDoubleList = new List<double> { 10.5, 11.5 },
552+
DerivedStringArray = new[] { "S", "T" }
507553
}
508554
}
509555
};
@@ -521,24 +567,101 @@ public void TestPolymorphic_PolymorphicArray_CallsCorrectFactories()
521567
Assert.IsInstanceOfType(result.PolymorphicArray[0], typeof(BasePooledClass));
522568
Assert.AreEqual(10, result.PolymorphicArray[0].BaseValue);
523569
Assert.AreEqual("Base1", result.PolymorphicArray[0].BaseName);
570+
CollectionAssert.AreEqual(new[] { 1, 2 }, result.PolymorphicArray[0].BaseIntArray);
571+
CollectionAssert.AreEqual(new List<string> { "H", "I" }, result.PolymorphicArray[0].BaseStringList);
524572
Assert.IsTrue(result.PolymorphicArray[0].FromBasePool);
525573

526574
// Second element - derived class
527575
Assert.IsInstanceOfType(result.PolymorphicArray[1], typeof(DerivedPooledClass));
528576
var derived = (DerivedPooledClass)result.PolymorphicArray[1];
529577
Assert.AreEqual(20, derived.BaseValue);
530578
Assert.AreEqual("Derived1", derived.BaseName);
579+
CollectionAssert.AreEqual(new[] { 3, 4 }, derived.BaseIntArray);
580+
CollectionAssert.AreEqual(new List<string> { "J", "K" }, derived.BaseStringList);
531581
Assert.AreEqual(30, derived.DerivedValue);
532582
Assert.AreEqual("DerivedName1", derived.DerivedName);
583+
CollectionAssert.AreEqual(new[] { 8.5, 9.5 }, derived.DerivedDoubleArray);
584+
CollectionAssert.AreEqual(new List<int> { 600, 700 }, derived.DerivedIntList);
533585
Assert.IsTrue(derived.FromDerivedPool);
534586

535587
// Third element - derived without pool
536588
Assert.IsInstanceOfType(result.PolymorphicArray[2], typeof(DerivedWithoutPoolClass));
537589
var derivedNoPool = (DerivedWithoutPoolClass)result.PolymorphicArray[2];
538590
Assert.AreEqual(40, derivedNoPool.BaseValue);
539591
Assert.AreEqual("DerivedNoPool1", derivedNoPool.BaseName);
592+
CollectionAssert.AreEqual(new[] { 5, 6 }, derivedNoPool.BaseIntArray);
593+
CollectionAssert.AreEqual(new List<string> { "L", "M" }, derivedNoPool.BaseStringList);
540594
Assert.AreEqual(50, derivedNoPool.DerivedData);
541595
Assert.AreEqual("NoPool1", derivedNoPool.DerivedText);
596+
CollectionAssert.AreEqual(new List<double> { 10.5, 11.5 }, derivedNoPool.DerivedDoubleList);
597+
CollectionAssert.AreEqual(new[] { "S", "T" }, derivedNoPool.DerivedStringArray);
598+
599+
// Verify factory call counts
600+
Assert.AreEqual(1, BasePooledClass.GetBasePoolCallCount(), "Base factory called once");
601+
Assert.AreEqual(1, DerivedPooledClass.GetDerivedPoolCallCount(), "Derived factory called once");
602+
}
603+
604+
[TestMethod]
605+
public void TestPolymorphic_PolymorphicList_CallsCorrectFactories()
606+
{
607+
// Test list of base type containing different derived types
608+
var container = new PolymorphicContainer
609+
{
610+
PolymorphicList = new List<BasePooledClass>
611+
{
612+
new BasePooledClass
613+
{
614+
BaseValue = 15,
615+
BaseName = "Base2",
616+
BaseIntArray = new[] { 13, 14 },
617+
BaseStringList = new List<string> { "N", "O" },
618+
FromBasePool = false
619+
},
620+
new DerivedPooledClass
621+
{
622+
BaseValue = 25,
623+
BaseName = "Derived2",
624+
BaseIntArray = new[] { 15, 16 },
625+
BaseStringList = new List<string> { "P", "Q" },
626+
DerivedValue = 35,
627+
DerivedName = "DerivedName2",
628+
DerivedDoubleArray = new[] { 12.5, 13.5 },
629+
DerivedIntList = new List<int> { 800, 900 },
630+
FromBasePool = false,
631+
FromDerivedPool = false
632+
}
633+
}
634+
};
635+
636+
byte[] bytes = NinoSerializer.Serialize(container);
637+
638+
// Deserialize container
639+
var result = NinoDeserializer.Deserialize<PolymorphicContainer>(bytes);
640+
641+
Assert.IsNotNull(result);
642+
Assert.IsNotNull(result.PolymorphicList);
643+
Assert.AreEqual(2, result.PolymorphicList.Count);
644+
645+
// First element - base class
646+
Assert.IsInstanceOfType(result.PolymorphicList[0], typeof(BasePooledClass));
647+
Assert.AreEqual(15, result.PolymorphicList[0].BaseValue);
648+
Assert.AreEqual("Base2", result.PolymorphicList[0].BaseName);
649+
CollectionAssert.AreEqual(new[] { 13, 14 }, result.PolymorphicList[0].BaseIntArray);
650+
CollectionAssert.AreEqual(new List<string> { "N", "O" }, result.PolymorphicList[0].BaseStringList);
651+
Assert.IsTrue(result.PolymorphicList[0].FromBasePool);
652+
653+
// Second element - derived class
654+
Assert.IsInstanceOfType(result.PolymorphicList[1], typeof(DerivedPooledClass));
655+
var derived = (DerivedPooledClass)result.PolymorphicList[1];
656+
Assert.AreEqual(25, derived.BaseValue);
657+
Assert.AreEqual("Derived2", derived.BaseName);
658+
CollectionAssert.AreEqual(new[] { 15, 16 }, derived.BaseIntArray);
659+
CollectionAssert.AreEqual(new List<string> { "P", "Q" }, derived.BaseStringList);
660+
Assert.AreEqual(35, derived.DerivedValue);
661+
Assert.AreEqual("DerivedName2", derived.DerivedName);
662+
CollectionAssert.AreEqual(new[] { 12.5, 13.5 }, derived.DerivedDoubleArray);
663+
CollectionAssert.AreEqual(new List<int> { 800, 900 }, derived.DerivedIntList);
664+
Assert.IsTrue(derived.FromDerivedPool);
542665

543666
// Verify factory call counts
544667
Assert.AreEqual(1, BasePooledClass.GetBasePoolCallCount(), "Base factory called once");
@@ -553,8 +676,12 @@ public void TestPolymorphic_DeserializeRef_WithNullDerivedValue()
553676
{
554677
BaseValue = 800,
555678
BaseName = "RefDerivedBase",
679+
BaseIntArray = new[] { 17, 18 },
680+
BaseStringList = new List<string> { "R", "S" },
556681
DerivedValue = 900,
557682
DerivedName = "RefDerivedTest",
683+
DerivedDoubleArray = new[] { 14.5, 15.5 },
684+
DerivedIntList = new List<int> { 1000, 1100 },
558685
FromBasePool = false,
559686
FromDerivedPool = false
560687
};
@@ -568,8 +695,12 @@ public void TestPolymorphic_DeserializeRef_WithNullDerivedValue()
568695
Assert.IsNotNull(result);
569696
Assert.AreEqual(800, result.BaseValue);
570697
Assert.AreEqual("RefDerivedBase", result.BaseName);
698+
CollectionAssert.AreEqual(new[] { 17, 18 }, result.BaseIntArray);
699+
CollectionAssert.AreEqual(new List<string> { "R", "S" }, result.BaseStringList);
571700
Assert.AreEqual(900, result.DerivedValue);
572701
Assert.AreEqual("RefDerivedTest", result.DerivedName);
702+
CollectionAssert.AreEqual(new[] { 14.5, 15.5 }, result.DerivedDoubleArray);
703+
CollectionAssert.AreEqual(new List<int> { 1000, 1100 }, result.DerivedIntList);
573704
Assert.IsTrue(result.FromDerivedPool, "Derived factory should be called for null ref");
574705
Assert.AreEqual(1, DerivedPooledClass.GetDerivedPoolCallCount());
575706
}
@@ -582,8 +713,12 @@ public void TestPolymorphic_DeserializeRef_WithExistingDerivedValue()
582713
{
583714
BaseValue = 1000,
584715
BaseName = "RefExistingBase",
716+
BaseIntArray = new[] { 19, 20 },
717+
BaseStringList = new List<string> { "T", "U" },
585718
DerivedValue = 1100,
586719
DerivedName = "RefExistingDerived",
720+
DerivedDoubleArray = new[] { 16.5, 17.5 },
721+
DerivedIntList = new List<int> { 1200, 1300 },
587722
FromBasePool = false,
588723
FromDerivedPool = false
589724
};
@@ -603,8 +738,12 @@ public void TestPolymorphic_DeserializeRef_WithExistingDerivedValue()
603738
Assert.IsNotNull(result);
604739
Assert.AreEqual(1000, result.BaseValue);
605740
Assert.AreEqual("RefExistingBase", result.BaseName);
741+
CollectionAssert.AreEqual(new[] { 19, 20 }, result.BaseIntArray);
742+
CollectionAssert.AreEqual(new List<string> { "T", "U" }, result.BaseStringList);
606743
Assert.AreEqual(1100, result.DerivedValue);
607744
Assert.AreEqual("RefExistingDerived", result.DerivedName);
745+
CollectionAssert.AreEqual(new[] { 16.5, 17.5 }, result.DerivedDoubleArray);
746+
CollectionAssert.AreEqual(new List<int> { 1200, 1300 }, result.DerivedIntList);
608747
Assert.IsFalse(result.FromDerivedPool, "Derived factory should NOT be called for existing instance");
609748
Assert.AreEqual(0, DerivedPooledClass.GetDerivedPoolCallCount());
610749
}

0 commit comments

Comments
 (0)