@@ -134,6 +134,36 @@ describe("ObjectMapper", function () {
134134 assert . strictEqual ( d . getMonth ( ) , 4 ) ;
135135 }
136136 } ) ;
137+
138+ it ( "can handle polymorphic arrays" , ( ) => {
139+ class Comedy extends Movie { }
140+
141+ const typeInfo = {
142+ nestedTypes : {
143+ "movies.0" : "Movie" ,
144+ "movies.1" : "Comedy"
145+ }
146+ } ;
147+
148+ const result : IRavenObject = mapper . fromObjectLiteral ( {
149+ movies : [
150+ {
151+ name : "Matrix" ,
152+ releasedAt : "1999-06-06T00:00:00.0000000"
153+ } ,
154+ {
155+ name : "Airplane" ,
156+ releasedAt : "1998-07-07T00:00:00.0000000"
157+ } ,
158+ ]
159+ } , typeInfo , new Map ( [ [ Movie . name , Movie ] , [ Comedy . name , Comedy ] ] ) ) ;
160+
161+ assert . ok ( result ) ;
162+ // eslint-disable-next-line no-prototype-builtins
163+ assert . ok ( result . hasOwnProperty ( "movies" ) ) ;
164+ assert . ok ( result . movies [ 0 ] instanceof Movie ) ;
165+ assert . ok ( result . movies [ 1 ] instanceof Comedy ) ;
166+ } ) ;
137167
138168 it ( "can handle top-level ctor" , ( ) => {
139169 const typeInfo = {
@@ -536,7 +566,29 @@ describe("ObjectMapper", function () {
536566 const expectedTypeInfo = {
537567 typeName : null ,
538568 nestedTypes : {
539- "dates[]" : "date"
569+ "dates.0" : "date" ,
570+ "dates.1" : "date"
571+ }
572+ } ;
573+ assert . deepStrictEqual ( typeInfo , expectedTypeInfo ) ;
574+ assert . strictEqual ( typeof result . dates [ 0 ] , "string" ) ;
575+ assert . strictEqual ( result . dates [ 0 ] , "2012-11-01T00:00:00.0000000" ) ;
576+ assert . strictEqual ( result . dates . length , 2 ) ;
577+ } ) ;
578+
579+ it ( "should store the type of every array member in order to support polymorphism" , ( ) => {
580+ const testObject = {
581+ dates : [
582+ new Date ( 2012 , 10 , 1 ) ,
583+ new Date ( 2013 , 2 , 1 )
584+ ]
585+ } ;
586+ const result : any = mapper . toObjectLiteral ( testObject , typeInfoCallback ) ;
587+ const expectedTypeInfo = {
588+ typeName : null ,
589+ nestedTypes : {
590+ "dates.0" : "date" ,
591+ "dates.1" : "date"
540592 }
541593 } ;
542594 assert . deepStrictEqual ( typeInfo , expectedTypeInfo ) ;
@@ -571,8 +623,10 @@ describe("ObjectMapper", function () {
571623 const expectedTypeInfo = {
572624 typeName : null ,
573625 nestedTypes : {
574- "movies[]" : Movie . name ,
575- "movies[].releasedAt" : "date"
626+ "movies.0" : Movie . name ,
627+ "movies.0.releasedAt" : "date" ,
628+ "movies.1" : Movie . name ,
629+ "movies.1.releasedAt" : "date"
576630 }
577631 } ;
578632
@@ -601,7 +655,8 @@ describe("ObjectMapper", function () {
601655 nestedTypes : {
602656 "me" : "Person" ,
603657 "me.bornAt" : "date" ,
604- "people[]" : "Person"
658+ "people.0" : "Person" ,
659+ "people.1" : "Person"
605660 }
606661 } ;
607662 assert . deepStrictEqual ( typeInfo , expectedTypeInfo ) ;
@@ -653,7 +708,7 @@ describe("ObjectMapper", function () {
653708 const expectedTypeInfo = {
654709 typeName : null ,
655710 nestedTypes : {
656- "animals[] " : animalType . name
711+ "animals.0 " : animalType . name
657712 }
658713 } ;
659714
@@ -731,8 +786,16 @@ describe("ObjectMapper", function () {
731786 const expectedTypeInfo = {
732787 typeName : null ,
733788 nestedTypes : {
734- "characters[][]" : "Person" ,
735- "characters[][].lastActedAt" : "date"
789+ "characters.0.0" : "Person" ,
790+ "characters.0.0.lastActedAt" : "date" ,
791+ "characters.0.1" : "Person" ,
792+ "characters.0.1.lastActedAt" : "date" ,
793+ "characters.1.0" : "Person" ,
794+ "characters.1.0.lastActedAt" : "date" ,
795+ "characters.1.1" : "Person" ,
796+ "characters.1.1.lastActedAt" : "date" ,
797+ "characters.1.2" : "Person" ,
798+ "characters.1.2.lastActedAt" : "date" ,
736799 }
737800 } ;
738801
0 commit comments