import { JsonSerializer } from './json-serializer' ; class Contract { readonly c : Date ; testFn : ( ) => void ; constructor ( readonly a , readonly b , c ) { this . c = c ; } } describe ( 'JsonSerializer' , ( ) => { let sut ; const date = new Date ( 2000 , 2 , 1 , 10 , 0 , 0 , 0 ) ; const contract = new Contract ( 'a' , 1 , date ) ; beforeEach ( ( ) => { sut = new JsonSerializer ( ) ; } ) ; describe ( 'when serializing' , ( ) => { let result ; beforeEach ( ( ) => { result = sut . serialize ( { a : 'a' , b : 1 , c : date } ) ; } ) ; it ( 'should convert an object to a string' , ( ) => { expect ( result ) . toEqual ( `{"a":"a","b":1,"c":"${ date . toISOString ( ) }"}` ) ; } ) ; } ) ; describe ( 'when deserializing' , ( ) => { let result ; const date = new Date ( 200 ) ; beforeEach ( ( ) => { result = sut . deserialize ( `{"a":"a","b":1,"c":"${ date . toISOString ( ) }"}` , Contract ) ; } ) ; it ( 'should deserialize to a plain object' , ( ) => { expect ( result ) . toMatchObject ( { a : 'a' , b : 1 } ) ; expect ( result . c ) . toBeDefined ( ) ; } ) ; it ( 'should be unable to deserilize strong types' , ( ) => { expect ( result . c . toUTCString ) . toBeUndefined ( ) ; } ) ; } ) ; describe ( 'when converting typed object to plain' , ( ) => { let result ; beforeEach ( ( ) => { result = sut . toPlain ( contract ) ; } ) ; it ( 'should strip out additional fields' , ( ) => { expect ( Object . keys ( result ) ) . not . toContain ( 'testFn' ) ; } ) ; } ) ; describe ( 'when converting plain object to typed' , ( ) => { let result ; beforeEach ( ( ) => { const plain = sut . toPlain ( contract ) ; result = sut . toClass ( plain , Contract ) ; } ) ; it ( 'should strip out additional fields' , ( ) => { expect ( result ) . toBeInstanceOf ( Contract ) ; } ) ; } ) ; } ) ;