Skip to content

Commit 106f7db

Browse files
authored
Merge pull request #345 from livingspec/RDBC-662
RDBC-662 store type of every array member
2 parents 8ef1409 + ad3e8df commit 106f7db

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed

src/Mapping/ObjectMapper.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,7 @@ export class TypesAwareObjectMapper implements ITypesAwareObjectMapper {
425425
}
426426

427427
if (Array.isArray(obj)) {
428-
const newObjPathPrefix = `${objPathPrefix}[]`;
429-
return obj.map(x => this._makeObjectLiteral(x, newObjPathPrefix, typeInfoCallback, knownTypes));
428+
return obj.map((x, index) => this._makeObjectLiteral(x, `${objPathPrefix}.${index}`, typeInfoCallback, knownTypes));
430429
}
431430

432431
if (TypeUtil.isObject(obj)) {

test/Mapping/ObjectMapperTests.ts

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)