UNPKG

@v4fire/core

Version:
130 lines (129 loc) 3.63 kB
"use strict"; describe('core/prelude/object/clone/fastClone', () => { it('simple object cloning', () => { const obj1 = {}; expect(Object.fastClone(obj1)).not.toBe(obj1); expect(Object.fastClone(obj1)).toEqual(obj1); const obj2 = { a: 1, b: { c: [1, 2, 3], d: new Date(), d2: '2017-02-03' } }; expect(Object.fastClone(obj2)).not.toBe(obj2); expect(Object.fastClone(obj2)).toEqual(obj2); }); it('simple array cloning', () => { const obj1 = []; expect(Object.fastClone(obj1)).not.toBe(obj1); expect(Object.fastClone(obj1)).toEqual(obj1); const obj2 = [1, 2, 3, new Date(), '2017-02-03']; expect(Object.fastClone(obj2)).not.toBe(obj2); expect(Object.fastClone(obj2)).toEqual(obj2); const obj3 = [{ a: 1 }, { b: 2 }]; expect(Object.fastClone(obj3)).not.toBe(obj3); expect(Object.fastClone(obj3)).toEqual(obj3); }); it('cloning of objects with functions', () => { const obj = { a: 1, bla: () => 1 }; expect(Object.fastClone(obj)).not.toBe(obj); expect(Object.fastClone(obj)).toEqual(obj); }); it('cloning of objects with cycle links', () => { const obj = { a: 1 }; obj.obj = obj; expect(Object.fastClone(obj)).not.toBe(obj); expect(Object.fastClone(obj)).toEqual(obj); }); it('cloning of non extendable objects', () => { const obj = Object.preventExtensions({ a: 1, b: 2 }), clone = Object.fastClone(obj, { freezable: true }); expect(clone).not.toBe(obj); expect(clone).toEqual(obj); expect(!Object.isExtensible(clone)).toBe(true); }); it('cloning of sealed objects', () => { const obj = Object.seal({ a: 1, b: 2 }), clone = Object.fastClone(obj, { freezable: true }); expect(clone).not.toBe(obj); expect(clone).toEqual(obj); expect(Object.isSealed(clone)).toBe(true); }); it('cloning of frozen objects', () => { const obj = Object.freeze({ a: 1, b: 2 }), clone = Object.fastClone(obj, { freezable: true }); expect(clone).toBe(obj); expect(Object.isFrozen(clone)).toBe(true); }); it('cloning of date objects', () => { const obj = new Date(); expect(Object.fastClone(obj)).not.toBe(obj); expect(Object.fastClone(obj)).toEqual(obj); }); it('cloning of functions', () => { const obj = () => 1; expect(Object.fastClone(obj)).toBe(obj); }); it('cloning of map objects', () => { const obj = new Map([[1, 2], [2, { a: 1 }]]); expect(Object.fastClone(obj)).not.toBe(obj); expect(Object.fastClone(obj)).toEqual(obj); }); it('cloning of set objects', () => { const obj = new Set([{ a: 1 }]); expect(Object.fastClone(obj)).not.toBe(obj); expect(Object.fastClone(obj)).toEqual(obj); }); it('custom revivers/replacers', () => { const obj = { a: new Set([1]) }; const clone = Object.fastClone(obj, { replacer: (key, obj) => Object.isSet(obj) ? [...obj] : obj, reviver: (key, obj) => Object.isArray(obj) ? new Set(obj) : obj }); expect(clone).not.toBe(obj); expect(clone).toEqual(obj); }); it('functional overload', () => { const obj = { a: new Set([1]) }; const clone = Object.fastClone(undefined, { replacer: (key, obj) => Object.isSet(obj) ? [...obj] : obj, reviver: (key, obj) => Object.isArray(obj) ? new Set(obj) : obj })(obj); expect(clone).not.toBe(obj); expect(clone).toEqual(obj); }); });