UNPKG

@triviality/serializer

Version:
246 lines 11 kB
"use strict"; /* tslint:disable:max-classes-per-file */ var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); require("jest"); var TransitJSSerializer_1 = require("../TransitJSSerializer"); var immutable_1 = require("immutable"); var createClassHandlers_1 = require("../createClassHandlers"); var Serializeable_1 = require("../../Serializeable"); var SerializerError_1 = require("../../Error/SerializerError"); describe('TransitJSSerializer', function () { it('Can serialize normal javascript objects', function () { var serializer = new TransitJSSerializer_1.TransitJSSerializer([]); var date = new Date(); date.setTime(1518770045540); var target = { date: date, arrays: [1, 2, 3], objects: { test: 2 }, }; var serialized = serializer.serialize(target); expect(serialized).toMatchSnapshot(); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toEqual(target); }); it('Can serialize records', function () { var testRecord = immutable_1.Record({ name: 'foo' }, 'test'); var test = new testRecord({ name: 'bar' }); var serializer = new TransitJSSerializer_1.TransitJSSerializer([testRecord]); var serialized = serializer.serialize(test); expect(serialized).toMatchSnapshot(); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toEqual(test); }); it('Should name a record', function () { var testRecord = immutable_1.Record({}); expect(function () { return new TransitJSSerializer_1.TransitJSSerializer([testRecord]); }).toThrowError(); }); it('Name should not be empty', function () { var testRecord = immutable_1.Record({}, ''); expect(function () { return new TransitJSSerializer_1.TransitJSSerializer([testRecord]); }).toThrowError(); }); it('Cannot name same class twice', function () { var testRecord = immutable_1.Record({}, 'test'); expect(function () { return new TransitJSSerializer_1.TransitJSSerializer([testRecord, testRecord]); }).toThrowError(); }); it('Can serialize a random class', function () { var TestClass = /** @class */ (function () { function TestClass(foo) { if (foo === void 0) { foo = 'bar'; } this.foo = foo; this.t = 2; this.name = 55; } return TestClass; }()); var test = new TestClass('d'); var date = new Date(); date.setTime(1518770045540); test.date = date; var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ TestClass: TestClass })); var serialized = serializer.serialize(test); expect(serialized).toMatchSnapshot(); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toEqual(test); expect(deSerialized).toBeInstanceOf(TestClass); expect(deSerialized.date).toBeInstanceOf(Date); }); it('Can serialize a different classes', function () { var TestBase = /** @class */ (function () { function TestBase(foo) { if (foo === void 0) { foo = 'bar'; } this.foo = foo; this.t = 2; this.name = 55; } return TestBase; }()); var TestChild = /** @class */ (function (_super) { __extends(TestChild, _super); function TestChild() { return _super !== null && _super.apply(this, arguments) || this; } return TestChild; }(TestBase)); var test = new TestBase('d'); var test2 = new TestChild('e'); var date = new Date(); date.setTime(1518770045540); test.date = date; var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ TestClass2: TestChild, TestClass: TestBase })); var serialized = serializer.serialize([test, test2]); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toEqual([test, test2]); expect(deSerialized[0]).toBeInstanceOf(TestBase); expect(deSerialized[1]).toBeInstanceOf(TestChild); expect(deSerialized[0]).not.toBeInstanceOf(TestChild); }); var TestObject = /** @class */ (function () { function TestObject(value) { this.value = value; } TestObject.deNormalize = function (data) { return new this(data.v); }; TestObject.prototype.normalize = function () { return { v: this.value }; }; __decorate([ Serializeable_1.Normalize, __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Object) ], TestObject.prototype, "normalize", null); __decorate([ Serializeable_1.DeNormalize, __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], TestObject, "deNormalize", null); return TestObject; }()); it('Can serialize with custom serializer functions', function () { var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ TestObject: TestObject })); var serialized = serializer.serialize(new TestObject(2323)); expect(serialized).toMatch('["~#TestObject",["^ ","v",2323]]'); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toBeInstanceOf(TestObject); expect(deSerialized).toEqual(new TestObject(2323)); }); it('Can serialize with custom serializer functions of extended class', function () { var TestObject2 = /** @class */ (function (_super) { __extends(TestObject2, _super); function TestObject2() { return _super !== null && _super.apply(this, arguments) || this; } return TestObject2; }(TestObject)); var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ TestObject2: TestObject2 })); var serialized = serializer.serialize(new TestObject2(2323)); expect(serialized).toMatch('["~#TestObject2",["^ ","v",2323]]'); var deSerialized = serializer.deserialize(serialized); expect(deSerialized).toBeInstanceOf(TestObject2); expect(deSerialized).toEqual(new TestObject2(2323)); }); it('Can serialize nested classes', function () { var Cat = /** @class */ (function () { function Cat(legs) { this.legs = legs; } return Cat; }()); var Leg = /** @class */ (function () { function Leg(claws, hairColor) { this.claws = claws; this.hairColor = hairColor; } return Leg; }()); var Claw = /** @class */ (function () { function Claw() { } return Claw; }()); var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ Cat: Cat, Leg: Leg, Claw: Claw })); var serialized = serializer.serialize(new Cat([ new Leg(new Claw(), 'red'), new Leg(new Claw(), 'brown'), new Leg(new Claw(), 'white'), new Leg(new Claw(), 'black'), ])); var deserialized = serializer.deserialize(serialized); expect(deserialized).toEqual(new Cat([ new Leg(new Claw(), 'red'), new Leg(new Claw(), 'brown'), new Leg(new Claw(), 'white'), new Leg(new Claw(), 'black'), ])); }); it('Should re-throw deserialize error as SerializerError', function () { var serializer = new TransitJSSerializer_1.TransitJSSerializer([]); var error; try { serializer.deserialize(''); } catch (e) { error = e; } expect(error).toBeInstanceOf(SerializerError_1.SerializerError); if (!error) { return; } expect(error.getOriginalError()).toBeInstanceOf(SyntaxError); }); it('Should re-throw serialize error as SerializerError', function () { var TestObject2 = /** @class */ (function () { function TestObject2() { } TestObject2.prototype.normalize = function () { throw new SyntaxError('Test'); }; __decorate([ Serializeable_1.Normalize, __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Object) ], TestObject2.prototype, "normalize", null); return TestObject2; }()); var serializer = new TransitJSSerializer_1.TransitJSSerializer([], createClassHandlers_1.createClassHandlers({ TestObject2: TestObject2 })); var error; try { serializer.serialize([new TestObject2()]); } catch (e) { error = e; } expect(error).toBeInstanceOf(SerializerError_1.SerializerError); if (!error) { return; } expect(error.getOriginalError()).toBeInstanceOf(SyntaxError); }); }); //# sourceMappingURL=Serializer.test.js.map