Files
hcapEnv/node_modules/msgpack-lite/test/20.roundtrip.js
2026-02-21 18:27:49 +08:00

221 lines
6.7 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 STRING_ASCII = "a";
var STRING_GREEK = "α";
var STRING_ASIAN = "亜";
// 128K characters
for (var i = 0; i < 17; i++) {
STRING_ASCII = STRING_ASCII + STRING_ASCII;
STRING_GREEK = STRING_GREEK + STRING_GREEK;
STRING_ASIAN = STRING_ASIAN + STRING_ASIAN;
}
function pattern(min, max, offset) {
var array = [];
var check = {};
var val = min - 1;
while (val <= max) {
if (min <= val && !check[val]) array.push(val);
check[val++] = 1;
if (val <= max && !check[val]) array.push(val);
check[val++] = 1;
if (val <= max && !check[val]) array.push(val);
check[val--] = 1;
val = val ? val * 2 - 1 : 1;
}
return array;
}
var HAS_UINT8ARRAY = ("undefined" !== typeof Uint8Array);
describe(TITLE, function() {
describe("Buffer", function() {
run_tests();
});
var describe_Uint8Array = HAS_UINT8ARRAY ? describe : describe.skip;
describe_Uint8Array("Uint8Array", function() {
run_tests({uint8array: true});
});
});
function run_tests(codecopt) {
var options;
if (codecopt) it(JSON.stringify(codecopt), function() {
var codec = msgpack.createCodec(codecopt);
assert.ok(codec);
options = {codec: codec};
});
it("null", function() {
[null, undefined].forEach(function(value) {
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("boolean", function() {
[true, false].forEach(function(value) {
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("positive int (small)", function() {
pattern(0, 0x40000000).forEach(function(value) {
value = value | 0; // integer
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("positive int (large)", function() {
pattern(0x40000000, 0xFFFFFFFF).forEach(function(value) {
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("negative int (small)", function() {
pattern(0, 0x40000000).forEach(function(value) {
value = -value | 0; // integer
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("negative int (large)", function() {
pattern(0x40000000, 0xFFFFFFFF).forEach(function(value) {
value = -value;
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("float", function() {
[1.1, 10.01, 100.001, 1000.0001, 10000.00001, 100000.000001, 1000000.0000001].forEach(function(value) {
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("string (ASCII)", function() {
this.timeout(30000);
pattern(0, 65537).forEach(function(length) {
var value = STRING_ASCII.substr(0, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("string (GREEK)", function() {
this.timeout(30000);
pattern(0, 65537).forEach(function(length) {
var value = STRING_GREEK.substr(0, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("string (ASIAN)", function() {
this.timeout(30000);
pattern(0, 65537).forEach(function(length) {
var value = STRING_ASIAN.substr(0, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded, value);
});
});
it("array (small)", function() {
pattern(0, 257).forEach(function(length, idx) {
var value = new Array(length);
for (var i = 0; i < length; i++) {
value[i] = String.fromCharCode(i);
}
assert.equal(value.length, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded.length, length);
assert.equal(decoded[0], value[0]);
assert.equal(decoded[length - 1], value[length - 1]);
});
});
it("array (large)", function() {
this.timeout(30000);
pattern(0, 65537).forEach(function(length) {
var value = new Array(length);
assert.equal(value.length, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded.length, length);
assert.equal(decoded[0], value[0]);
assert.equal(decoded[length - 1], value[length - 1]);
});
});
it("object map (small)", function() {
pattern(0, 257).forEach(function(length) {
var value = {};
for (var i = 0; i < length; i++) {
var key = String.fromCharCode(i);
value[key] = length;
}
assert.equal(Object.keys(value).length, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(Object.keys(decoded).length, length);
assert.equal(decoded[0], value[0]);
assert.equal(decoded[length - 1], value[length - 1]);
});
});
it("object map (large)", function() {
this.timeout(30000);
pattern(65536, 65537).forEach(function(length) {
var value = {};
for (var i = 0; i < length; i++) {
value[i] = length;
}
assert.equal(Object.keys(value).length, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(Object.keys(decoded).length, length);
assert.equal(decoded[0], value[0]);
assert.equal(decoded[length - 1], value[length - 1]);
});
});
it("buffer", function() {
this.timeout(30000);
pattern(2, 65537).forEach(function(length, idx) {
var value = new Buffer(length);
value.fill(idx);
assert.equal(value.length, length);
var encoded = msgpack.encode(value, options);
var decoded = msgpack.decode(encoded, options);
assert.equal(decoded.length, length);
assert.equal(decoded[0], value[0]);
assert.equal(decoded[length - 1], value[length - 1]);
});
});
}