106 lines
2.8 KiB
TypeScript
106 lines
2.8 KiB
TypeScript
|
import {Serializer} from "./main";
|
||
|
|
||
|
class TestSerializerObj1 {
|
||
|
a: number;
|
||
|
constructor(a = 0) {
|
||
|
this.a = a;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class TestSerializerObj2 {
|
||
|
a = () => 1
|
||
|
b = [(obj: any) => 2]
|
||
|
}
|
||
|
|
||
|
class TestSerializerObj3 {
|
||
|
a = [1, 2];
|
||
|
postUnserialize() {
|
||
|
this.a.push(3);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const TEST_NS = {
|
||
|
TestSerializerObj1,
|
||
|
TestSerializerObj2,
|
||
|
TestSerializerObj3
|
||
|
};
|
||
|
|
||
|
describe("Serializer", () => {
|
||
|
function checkReversability(obj: any, namespace = TEST_NS): any {
|
||
|
var serializer = new Serializer(namespace);
|
||
|
var data = serializer.serialize(obj);
|
||
|
serializer = new Serializer(namespace);
|
||
|
var loaded = serializer.unserialize(data);
|
||
|
expect(loaded).toEqual(obj);
|
||
|
return loaded;
|
||
|
}
|
||
|
|
||
|
it("serializes simple objects", () => {
|
||
|
var obj = {
|
||
|
"a": 5,
|
||
|
"b": null,
|
||
|
"c": [{ "a": 2 }, "test"]
|
||
|
};
|
||
|
checkReversability(obj);
|
||
|
});
|
||
|
|
||
|
it("restores objects constructed from class", () => {
|
||
|
var loaded = checkReversability(new TestSerializerObj1(5));
|
||
|
expect(loaded.a).toBe(5);
|
||
|
expect(loaded).toBeInstanceOf(TestSerializerObj1);
|
||
|
});
|
||
|
|
||
|
it("stores one version of the same object", () => {
|
||
|
var a = new TestSerializerObj1(8);
|
||
|
var b = new TestSerializerObj1(8);
|
||
|
var c = {
|
||
|
'r': a,
|
||
|
's': ["test", a],
|
||
|
't': a,
|
||
|
'u': b
|
||
|
};
|
||
|
var loaded = checkReversability(c);
|
||
|
expect(loaded.t).toBe(loaded.r);
|
||
|
expect(loaded.s[1]).toBe(loaded.r);
|
||
|
expect(loaded.u).not.toBe(loaded.r);
|
||
|
});
|
||
|
|
||
|
it("handles circular references", () => {
|
||
|
var a: any = { b: {} };
|
||
|
a.b.c = a;
|
||
|
|
||
|
checkReversability(a);
|
||
|
});
|
||
|
|
||
|
it("ignores some classes", () => {
|
||
|
var serializer = new Serializer(TEST_NS);
|
||
|
serializer.addIgnoredClass("TestSerializerObj1");
|
||
|
|
||
|
var data = serializer.serialize({ a: 5, b: new TestSerializerObj1() });
|
||
|
var loaded = serializer.unserialize(data);
|
||
|
|
||
|
expect(loaded).toEqual({ a: 5, b: undefined });
|
||
|
});
|
||
|
|
||
|
it("ignores functions", () => {
|
||
|
let serializer = new Serializer(TEST_NS);
|
||
|
let data = serializer.serialize({ obj: new TestSerializerObj2() });
|
||
|
let loaded = serializer.unserialize(data);
|
||
|
|
||
|
let expected = <any>new TestSerializerObj2();
|
||
|
expected.a = undefined;
|
||
|
expected.b[0] = undefined;
|
||
|
expect(loaded).toEqual({ obj: expected });
|
||
|
});
|
||
|
|
||
|
it("calls specific postUnserialize", () => {
|
||
|
let serializer = new Serializer(TEST_NS);
|
||
|
let data = serializer.serialize({ obj: new TestSerializerObj3() });
|
||
|
let loaded = serializer.unserialize(data);
|
||
|
|
||
|
let expected = new TestSerializerObj3();
|
||
|
expected.a = [1, 2, 3];
|
||
|
expect(loaded).toEqual({ obj: expected });
|
||
|
});
|
||
|
});
|