You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.9 KiB

#!/usr/bin/env mocha -R spec
var assert = require("assert");
var msgpackJS = "../index";
var isBrowser = ("undefined" !== typeof window);
var msgpack = isBrowser && window.msgpack || require(msgpackJS);
var TITLE = __filename.replace(/^.*\//, "");
var HAS_UINT8ARRAY = ("undefined" !== typeof Uint8Array);
describe(TITLE, function() {
it("createCodec()", function() {
var codec = msgpack.createCodec();
var options = {codec: codec};
assert.ok(codec);
// this codec does not have preset codec
for (var i = 0; i < 256; i++) {
test(i);
}
function test(type) {
// fixext 1 -- 0xd4
var source = new Buffer([0xd4, type, type]);
var decoded = msgpack.decode(source, options);
assert.equal(decoded.type, type);
assert.equal(decoded.buffer.length, 1);
var encoded = msgpack.encode(decoded, options);
assert.deepEqual(toArray(encoded), toArray(source));
}
});
it("addExtPacker()", function() {
var codec = msgpack.createCodec();
codec.addExtPacker(0, MyClass, myClassPacker);
codec.addExtUnpacker(0, myClassUnpacker);
var options = {codec: codec};
[0, 1, 127, 255].forEach(test);
function test(type) {
var source = new MyClass(type);
var encoded = msgpack.encode(source, options);
var decoded = msgpack.decode(encoded, options);
assert.ok(decoded instanceof MyClass);
assert.equal(decoded.value, type);
}
});
// The safe mode works as same as the default mode. It'd be hard for test it.
it("createCodec({safe: true})", function() {
var options = {codec: msgpack.createCodec({safe: true})};
var source = 1;
var encoded = msgpack.encode(source, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, source);
});
it("createCodec({preset: true})", function() {
var options1 = {codec: msgpack.createCodec({preset: true})};
var options2 = {codec: msgpack.createCodec({preset: false})};
var source = new Date();
var encoded = msgpack.encode(source, options1);
assert.equal(encoded[0], 0xC7, "preset ext format failure. (128 means map format)"); // ext 8
assert.equal(encoded[1], 0x09); // 1+8
assert.equal(encoded[2], 0x0D); // Date
// decode as Boolean instance
var decoded = msgpack.decode(encoded, options1);
assert.equal(decoded - 0, source - 0);
assert.ok(decoded instanceof Date);
// decode as ExtBuffer
decoded = msgpack.decode(encoded, options2);
assert.ok(!(decoded instanceof Date));
assert.equal(decoded.type, 0x0D);
});
});
function MyClass(value) {
this.value = value & 0xFF;
}
function myClassPacker(obj) {
return new Buffer([obj.value]);
}
function myClassUnpacker(buffer) {
return new MyClass(buffer[0]);
}
function toArray(array) {
if (HAS_UINT8ARRAY && array instanceof ArrayBuffer) array = new Uint8Array(array);
return Array.prototype.slice.call(array);
}