@triviality/serializer
Version:
Typescript serializer with an interface
246 lines • 11 kB
JavaScript
;
/* 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