133 lines
3.5 KiB
JavaScript

var tape = require("tape");
var protobuf = require("..");
var root = protobuf.Root.fromJSON({
nested: {
Inner: {
fields: {
key: {
type: "string",
id: 1
},
values: {
rule: "repeated",
type: "string",
id: 2
}
}
},
Outer: {
fields: {
value: {
keyType: "string",
type: "Inner",
id: 1
}
}
}
}
});
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
function randomString(len) {
var str = "";
for (var i = 0; i < len; ++i)
str += chars.charAt((Math.random() * chars.length)|0);
return str;
}
function randomMap() {
var map = {};
for (var i = 0; i < 10; ++i) {
var values = [];
for (var j = 0; j < 10; ++j)
values.push(randomString(10));
var key; do { key = randomString(10); } while(map[key]);
map[key] = {
key: randomString(10),
values: values
};
}
return map;
}
tape.test("maps", function(test) {
var Inner = root.lookup("Inner"),
Outer = root.lookup("Outer");
test.test("randomly generated", function(test) {
var outer = { value: randomMap() };
var buf = Outer.encode(outer).finish();
var dec = Outer.decode(buf);
test.deepEqual(dec, outer, "should decode back the original random map");
test.end();
});
test.test("specifically crafted", function(test) {
var outer = {
value: {
b: {
key: "1",
values: ["c", "d"]
},
a: {
key: "2",
values: ["a", "b"]
}
}
};
var buf = Outer.encode(outer).finish();
verifyEncode(test, buf);
var dec = Outer.decode(buf);
test.deepEqual(dec, outer, "should decode back the original map");
test.end();
});
test.end();
});
function verifyEncode(test, buf) {
test.test("should encode", function(test) {
test.equal(buf.length, 32, "a total of 30 bytes");
// first kv:
/*
b: {
key: "1",
values: ["c", "d"]
},
*/
test.equal(buf[ 0], 10, "id 1, wireType 2"); // Outer.value
test.equal(buf[ 1], 14, "a length of 14");
test.equal(buf[ 2], 10, "id 1, wireType 2"); // Outer.value $key
test.equal(buf[ 3], 1, "a length of 1");
test.equal(buf[ 4], 98, "'b'");
test.equal(buf[ 5], 18, "id 2, wireType 2"); // Outer.value $value
test.equal(buf[ 6], 9, "a length of 9");
test.equal(buf[ 7], 10, "id 1, wireType 2"); // Inner.key
test.equal(buf[ 8], 1 , "a length of 1");
test.equal(buf[ 9], 49, "'1'");
test.equal(buf[10], 18, "id 2, wireType 2"); // Inner.values (1)
test.equal(buf[11], 1, "a length of 1");
test.equal(buf[12], 99, "'c'");
test.equal(buf[13], 18, "id 2, wireType 2"); // Inner.values (2)
test.equal(buf[14], 1, "a length of 1");
test.equal(buf[15],100, "'d'");
// second
test.equal(buf[16], 10, "id 1, wireType 2"); // Outer.value
// ...
test.end();
});
}