UNPKG

@civ-clone/core-data-object

Version:

A data exchange object for converting a subset of a class instances to plain JSON.

103 lines (82 loc) 2.75 kB
import AdditionalData from '../AdditionalData'; import AdditionalDataRegistry from '../AdditionalDataRegistry'; import DataObject from '../DataObject'; import { expect } from 'chai'; import reconstituteData from '../lib/reconstituteData'; class A extends DataObject { constructor() { super(); this.addKey('a'); } a(): string { return 'a'; } } class B extends DataObject { constructor() { super(); this.addKey('a'); } a(): string { return 'a'; } } class C extends DataObject { constructor() { super(); } } class D extends C { constructor() { super(); } } describe('AdditionalData', (): void => { it('should allow DataObjects to be augmented', (): void => { const additionalDataRegistry = new AdditionalDataRegistry(), additionalData = new AdditionalData(A, 'b', () => new B()), a = new A(); additionalDataRegistry.register(additionalData); const plainA = reconstituteData( a.toPlainObject((object) => object, additionalDataRegistry) ); expect(plainA).to.a('object').keys('_', '__', 'id', 'a', 'b'); expect(plainA.b).to.a('object').keys('_', '__', 'id', 'a'); expect(plainA.b._).to.equal('B'); expect(plainA.b.a).to.equal('a'); }); it('should allow DataObjects to be augmented and be nested', (): void => { const additionalDataRegistry = new AdditionalDataRegistry(), additionalDataA = new AdditionalData(A, 'b', () => new B()), additionalDataB = new AdditionalData(B, 'b', () => new C()), additionalDataC = new AdditionalData(C, 'a', () => 'static a'), a = new A(); additionalDataRegistry.register( additionalDataA, additionalDataB, additionalDataC ); const plainA = reconstituteData( a.toPlainObject((object) => object, additionalDataRegistry) ); expect(plainA).to.a('object').keys('_', '__', 'id', 'a', 'b'); expect(plainA.b).to.a('object').keys('_', '__', 'id', 'a', 'b'); expect(plainA.b._).to.equal('B'); expect(plainA.b.a).to.equal('a'); expect(plainA.b.b).to.a('object').keys('_', '__', 'id', 'a'); expect(plainA.b.b._).to.equal('C'); expect(plainA.b.b.a).to.equal('static a'); }); it('should allow add `AdditionalData` for child classes too', (): void => { const additionalDataRegistry = new AdditionalDataRegistry(), additionalDataC = new AdditionalData(C, 'a', () => 'a'), d = new D(); additionalDataRegistry.register(additionalDataC); const plainD = reconstituteData( d.toPlainObject((object) => object, additionalDataRegistry) ); expect(plainD).to.a('object').keys('_', '__', 'id', 'a'); expect(plainD._).to.equal('D'); expect(plainD.a).to.equal('a'); }); });