1+ using System . Collections . Generic ;
12using Microsoft . VisualStudio . TestTools . UnitTesting ;
23using 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