cerialize
Version:
Easy serialization throught ES7/Typescript annotations
206 lines (170 loc) • 6.98 kB
text/typescript
///<reference path="./typings/jasmine.d.ts"/>
import {__TypeMap, autoserialize, Serialize, Deserialize, DeserializeInto, autoserializeAs} from '../src/serialize';
class T {
public x: number;
}
class Vector2 {
x: number;
y: number;
}
class AsTest {
(Vector2) v: Vector2;
}
class AsTest2 {
(Vector2, "VECTOR") v: Vector2;
}
class AsTest3 {
("z") y: number;
}
class Test3 {
public primitiveArray: Array<number>;
}
describe('autoserialize', function () {
it('should create meta data for serialize and deserialize', function () {
expect(__TypeMap.get(T)).toBeDefined();
expect(__TypeMap.get(T).length).toBe(1);
expect(__TypeMap.get(T)[0].serializedKey).toBe('x');
expect(__TypeMap.get(T)[0].serializedType).toBe(null);
expect(__TypeMap.get(T)[0].deserializedType).toBe(null);
expect(__TypeMap.get(T)[0].deserializedKey).toBe('x');
});
});
describe('autoserializeAs', function () {
it('should create meta data', function () {
expect(__TypeMap.get(AsTest)).toBeDefined();
expect(__TypeMap.get(AsTest).length).toBe(1);
expect(__TypeMap.get(AsTest)[0].serializedKey).toBe('v');
expect(__TypeMap.get(AsTest)[0].serializedType).toBe(Vector2);
expect(__TypeMap.get(AsTest)[0].deserializedKey).toBe('v');
expect(__TypeMap.get(AsTest)[0].deserializedType).toBe(Vector2);
});
it('should create meta data with a different key', function () {
expect(__TypeMap.get(AsTest3)).toBeDefined();
expect(__TypeMap.get(AsTest3).length).toBe(1);
expect(__TypeMap.get(AsTest3)[0].serializedKey).toBe('z');
expect(__TypeMap.get(AsTest3)[0].serializedType).toBe(null);
expect(__TypeMap.get(AsTest3)[0].deserializedKey).toBe('z');
expect(__TypeMap.get(AsTest3)[0].deserializedType).toBe(null);
});
it('should create meta data with a different key and type', function () {
expect(__TypeMap.get(AsTest2)).toBeDefined();
expect(__TypeMap.get(AsTest2).length).toBe(1);
expect(__TypeMap.get(AsTest2)[0].serializedKey).toBe('VECTOR');
expect(__TypeMap.get(AsTest2)[0].serializedType).toBe(Vector2);
expect(__TypeMap.get(AsTest2)[0].deserializedKey).toBe('VECTOR');
expect(__TypeMap.get(AsTest2)[0].deserializedType).toBe(Vector2);
});
it("handles strings", function() {
})
});
/* [Weichx 12/9/15] credit to @garkin for contributing the rest of this file */
// ES6 Set stub
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
// https://github.com/cloud9ide/typescript/blob/master/typings/lib.d.ts
interface Set<T> {
add(value: T): Set<T>;
clear(): void;
delete(value: T): boolean;
forEach(callbackfn: (value: T, index: T, set: Set<T>) => void, thisArg?: any): void;
has(value: T): boolean;
size: number;
}
declare var Set: {
new <T>(data?: T[]): Set<T>;
};
module Utility {
export function unpackSet<T>(_set: Set<T>): T[] {
const result: T[] = [];
_set.forEach(v => result.push(v));
return result;
}
}
describe('autoserializeAs using Serializer', () => {
describe('to wrapped data', () => {
const JSON = {
children: {
wrap: [11, 22, 33]
}
};
const Serializer = {
Serialize(_set: Set<any>){
return {wrap: Utility.unpackSet(_set)};
},
Deserialize(json: any, instance?: any) {
return new Set<any>(<any>json.wrap);
}
};
class TestClass {
(Serializer) children: Set<number> = new Set();
}
it("will be serialized", () => {
const instance = new TestClass();
JSON.children.wrap.forEach(v => instance.children.add(v));
const json = Serialize(instance);
expect(json).toEqual(JSON);
});
it("will be deserialized", () => {
const result = Deserialize(JSON, TestClass);
expect(result instanceof TestClass).toBeTruthy();
expect(result.children instanceof Set).toBeTruthy();
expect(Utility.unpackSet(result.children)).toEqual(JSON.children.wrap);
});
it("will be deserializedInto", () => {
const result = DeserializeInto(JSON, TestClass, new TestClass());
expect(result instanceof TestClass).toBeTruthy();
expect(result.children instanceof Set).toBeTruthy();
expect(Utility.unpackSet(result.children)).toEqual(JSON.children.wrap);
});
});
describe('should handle primitive arrays', function () {
it('should handle serializing a primitive array', function () {
var t = new Test3();
t.primitiveArray = [1, 2, 3];
var result = Serialize(t);
expect(result.primitiveArray.length).toBe(3);
expect(result.primitiveArray[0]).toBe(1);
expect(result.primitiveArray[1]).toBe(2);
expect(result.primitiveArray[2]).toBe(3);
});
it('should handle deserializing a primitive array', function () {
var t = new Test3();
t.primitiveArray = [1, 2, 3];
var result = Deserialize({primitiveArray: [1, 2, 3]}, Test3);
expect(Array.isArray(result.primitiveArray)).toBe(true);
});
});
describe('to plain array data', () => {
const JSON = {
children: [11, 22, 33]
};
const Serializer = {
Serialize(_set: Set<any>){
return Utility.unpackSet(_set);
},
Deserialize(json: any, instance?: any) {
return new Set(json);
}
};
class TestClass {
(Serializer) children: Set<number> = new Set();
}
it("will be serialized", () => {
const instance = new TestClass();
JSON.children.forEach(v => instance.children.add(v));
const json = Serialize(instance);
expect(json).toEqual(JSON);
});
it("will be deserialized", () => {
const result = Deserialize(JSON, TestClass);
expect(result instanceof TestClass).toBeTruthy();
expect(result.children instanceof Set).toBeTruthy();
expect(Utility.unpackSet(result.children)).toEqual(JSON.children);
});
it("will be deserializedInto", () => {
const result = DeserializeInto(JSON, TestClass, new TestClass());
expect(result instanceof TestClass).toBeTruthy();
expect(result.children instanceof Set).toBeTruthy();
expect(Utility.unpackSet(result.children)).toEqual(JSON.children);
});
});
});