ts-prime
Version:
A utility library for JavaScript and Typescript.
316 lines (300 loc) • 6.53 kB
text/typescript
import { deepMergeLeft, deepMergeRight } from './deepMerge';
describe('mergeDeepLeft and mergeRight tests', () => {
test('basic', () => {
interface Item {
a: number; // C1
b?: number; // C2
d: {
e: {
a?: number; // C3 nested object
};
d?: () => void; // C4 function
};
y?: {
a: number;
};
}
const data1: Item = {
a: 1,
d: {
e: {
a: 5,
},
},
};
const fn = () => {
return;
};
const data2: Item = {
a: 2,
b: 3,
d: {
d: fn,
e: {
a: 4,
},
},
};
expect(deepMergeLeft(data1, data2)).toEqual({
a: 1, // From data1
d: {
d: fn, // From data 2
e: {
a: 5, // From data1
},
},
b: 3, // From data2
});
expect(deepMergeRight(data1, data2)).toEqual({
a: 2, // From data2
d: {
d: fn, // From data 2
e: {
a: 4, // From data2
},
},
b: 3, // From data2
});
});
interface Data {
a: (number | { a: number })[];
}
const d1: Data = {
a: [1, 2, 3, { a: 1 }],
};
const d2: Data = {
a: [7, 2, 3, { a: 1 }, { a: 2 }],
};
test('Expecting correctly merged arrays', () => {
expect(deepMergeLeft(d1, d2)).toEqual({
a: [1, 2, 3, { a: 1 }, 7, { a: 1 }, { a: 2 }],
});
expect(deepMergeRight(d1, d2)).toEqual({
a: [7, 2, 3, { a: 1 }, { a: 2 }, 1, { a: 1 }],
});
});
test('Testing cycle objects', () => {
interface Data {
a: Data | null | number;
}
let data1: Data = {
a: null,
};
data1.a = data1; // Creating cycle
let data2: Data = {
a: 5,
};
expect(deepMergeLeft(data1, data2)).toEqual({
a: data1,
});
expect(deepMergeRight(data1, data2)).toEqual({
a: 5,
});
});
test('Testing cycle arrays', () => {
interface Data {
a: ReadonlyArray<Data | null | number>;
}
let data1: Data = {
a: [],
};
data1.a = [data1]; // Creating cycle
let data2: Data = {
a: [5],
};
expect(deepMergeLeft(data1, data2)).toEqual({
a: [data1],
});
expect(deepMergeRight(data1, data2)).toEqual({
a: [5, data1],
});
});
test('Complicated example', () => {
const source1: any = {
propS1: 'str1',
propS2: 'str2',
propN1: 1,
propN2: 2,
propA1: [1, 2, 3],
propA2: [],
propB1: true,
propB2: false,
propU1: null,
propU2: null,
propD1: undefined,
propD2: undefined,
propO1: {
subS1: 'sub11',
subS2: 'sub12',
subN1: 11,
subN2: 12,
subA1: [11, 12, 13],
subA2: [],
subB1: false,
subB2: true,
subU1: null,
subU2: null,
subD1: undefined,
subD2: undefined,
propX1Deep: {
a: {
subS1: 'sub11',
subS2: 'sub12',
subN1: 11,
subN2: 12,
subA1: [11, 12, 13],
subA2: [],
subB1: false,
subB2: true,
subU1: null,
subU2: null,
subD1: undefined,
subD2: undefined,
},
},
},
propO2: {
subS1: 'sub21',
subS2: 'sub22',
subN1: 21,
subN2: 22,
subA1: [21, 22, 23],
subA2: [],
subB1: false,
subB2: true,
subU1: null,
subU2: null,
subD1: undefined,
subD2: undefined,
},
};
const clone = { ...source1 };
const source2: any = {
propS2: 'str2',
propS3: 'str3',
propN2: -2,
propN3: 3,
propA2: [2, 2],
propA3: [3, 2, 1],
propB2: true,
propB3: false,
propU2: 'not null',
propU3: null,
propD2: 'defined',
propD3: undefined,
propO2: {
subS2: 'inv22',
subS3: 'sub23',
subN2: -22,
subN3: 23,
subA2: [5, 5, 5],
subA3: [31, 32, 33],
subB2: false,
subB3: true,
subU2: 'not null --- ',
subU3: null,
subD2: ' not undefined ----',
subD3: undefined,
},
propO3: {
subS1: 'sub31',
subS2: 'sub32',
subN1: 31,
subN2: 32,
subA1: [31, 32, 33],
subA2: [],
subB1: false,
subB2: true,
subU1: null,
subU2: null,
subD1: undefined,
subD2: undefined,
},
};
expect(deepMergeLeft(source1, source2)).toEqual({
propA1: [1, 2, 3],
propA2: [2],
propA3: [3, 2, 1],
propB1: true,
propB2: false,
propB3: false,
propD1: undefined,
propD2: 'defined',
propD3: undefined,
propN1: 1,
propN2: 2,
propN3: 3,
propO1: {
propX1Deep: {
a: {
subA1: [11, 12, 13],
subA2: [],
subB1: false,
subB2: true,
subD1: undefined,
subD2: undefined,
subN1: 11,
subN2: 12,
subS1: 'sub11',
subS2: 'sub12',
subU1: null,
subU2: null,
},
},
subA1: [11, 12, 13],
subA2: [],
subB1: false,
subB2: true,
subD1: undefined,
subD2: undefined,
subN1: 11,
subN2: 12,
subS1: 'sub11',
subS2: 'sub12',
subU1: null,
subU2: null,
},
propO2: {
subA1: [21, 22, 23],
subA2: [5],
subA3: [31, 32, 33],
subB1: false,
subB2: true,
subB3: true,
subD1: undefined,
subD2: ' not undefined ----',
subD3: undefined,
subN1: 21,
subN2: 22,
subN3: 23,
subS1: 'sub21',
subS2: 'sub22',
subS3: 'sub23',
subU1: undefined,
subU2: 'not null --- ',
subU3: null,
},
propO3: {
subA1: [31, 32, 33],
subA2: [],
subB1: false,
subB2: true,
subD1: undefined,
subD2: undefined,
subN1: 31,
subN2: 32,
subS1: 'sub31',
subS2: 'sub32',
subU1: null,
subU2: null,
},
propS1: 'str1',
propS2: 'str2',
propS3: 'str3',
propU1: undefined,
propU2: 'not null',
propU3: null,
});
expect(source1).toEqual(clone);
});
});