protobuf.js/tests/api_enum.js

201 lines
5.7 KiB
JavaScript

var tape = require("tape");
var protobuf = require("..");
tape.test("reflected enums", function(test) {
var enm = new protobuf.Enum("Test", {
a: 1,
b: 2,
});
var enm_allow_alias = new protobuf.Enum( 'AliasTest',
{ a: 0 }, { allow_alias: true } );
test.throws(function() {
new protobuf.Enum("Test", true);
}, TypeError, "should throw if values is specified but not an object");
test.same(enm.valuesById, {
1: "a",
2: "b"
}, "should also expose their values by id");
test.throws(function() {
enm.add(2, 2);
}, TypeError, "should throw if name is not a string");
test.throws(function() {
enm.add("c", 1.5);
}, TypeError, "should throw if id is not an integer");
test.throws(function() {
enm.add("b", 2);
}, Error, "should throw if name is a duplicate");
test.throws(function() {
enm.add("c", 2);
}, Error, "should throw if id is a duplicate, without allow_alias option");
enm.add("c", 3);
test.same(enm.values, {
a: 1,
b: 2,
c: 3
}, "should allow adding new values");
test.same(enm.valuesById, {
1: "a",
2: "b",
3: "c"
}, "should also expose any new values by id");
test.throws(function() {
enm.remove(1);
}, TypeError, "should throw if name is not a string");
test.throws(function() {
enm.remove("d");
}, Error, "should throw if name is not present");
enm.remove("b");
test.same(enm.values, {
a: 1,
c: 3
}, "should allow removing existing values");
test.same(enm.valuesById, {
1: "a",
3: "c"
}, "should no longer expose any removed values by id");
test.same(enm.toJSON(), {
values: {
a: 1,
c: 3
}
}, "should export values to JSON");
enm_allow_alias.add( 'b', 0 );
test.same( enm_allow_alias.values, {
a: 0,
b: 0
});
enm.add('e', 4, undefined, {'(test_option)': 'test_value'});
test.same( enm.valuesOptions, {
'e': {
'(test_option)': 'test_value'
}
});
enm.remove("e");
test.same( enm.valuesOptions, {}, "should clean up value options");
enm.reserved = [[100,200], "BAD_NAME"];
test.throws(function() {
enm.add("d", 101);
}, Error, "should throw if id is a reserved number");
test.throws(function() {
enm.add("BAD_NAME", 5);
}, Error, "should throw if id is a reserved name");
test.end();
});
tape.test("feature resolution legacy proto3", function(test) {
var json = {
values: {
a: 0, b: 1
}
};
var messageJson = {
fields: {},
nested: { Enum: { values: {
a: 0, b:1
} } }
};
var root = new protobuf.Root();
var Enum = protobuf.Enum.fromJSON("Enum", json);
var Message = protobuf.Type.fromJSON("Message", messageJson)
var Nested = Message.nested.Enum;
root.add(Enum).add(Message).resolveAll();
test.same(Enum.toJSON(), json, "JSON should roundtrip");
test.same(Message.toJSON(), messageJson, "container JSON should roundtrip");
test.same(Nested.toJSON(), messageJson.nested.Enum, "nested JSON should roundtrip");
test.equal(Enum._edition, "proto3", "should infer proto3 syntax");
test.equal(Enum._features.enum_type, "OPEN", "should be open by default");
test.equal(Nested._edition, null, "should not set edition");
test.equal(Nested._features.enum_type, "OPEN", "should be open by default");
test.end();
});
tape.test("feature resolution proto2", function(test) {
var json = {
edition: "proto2",
values: {
a: 0, b: 1
}
};
var messageJson = {
edition: "proto2",
fields: {},
nested: { Enum: { values: {
a: 0, b: 1
} } }
};
var root = new protobuf.Root();
var Enum = protobuf.Enum.fromJSON("Enum", json);
var Message = protobuf.Type.fromJSON("Message", messageJson)
var Nested = Message.nested.Enum;
root.add(Enum).add(Message).resolveAll();
test.same(Enum.toJSON(), json, "JSON should roundtrip");
test.same(Message.toJSON(), messageJson, "container JSON should roundtrip");
test.same(Nested.toJSON(), messageJson.nested.Enum, "nested JSON should roundtrip");
test.equal(Enum._edition, "proto2", "should set edition");
test.equal(Enum._features.enum_type, "CLOSED", "should be closed by default");
test.equal(Nested._edition, null, "should not set edition");
test.equal(Nested._features.enum_type, "CLOSED", "should be closed by default");
test.end();
});
tape.test("feature resolution legacy proto3", function(test) {
var json = {
edition: "2023",
values: {
a: 0, b: 1
}
};
var messageJson = {
edition: "2023",
options: { features: { enum_type: "CLOSED" } },
fields: {},
nested: { Enum: { values: {
a: 0, b: 1
} } }
};
var root = new protobuf.Root();
var Enum = protobuf.Enum.fromJSON("Enum", json);
var Message = protobuf.Type.fromJSON("Message", messageJson)
var Nested = Message.nested.Enum;
root.add(Enum).add(Message).resolveAll();
test.same(Enum.toJSON(), json, "JSON should roundtrip");
test.same(Message.toJSON(), messageJson, "container JSON should roundtrip");
test.same(Nested.toJSON(), messageJson.nested.Enum, "nested JSON should roundtrip");
test.equal(Enum._edition, "2023", "should set edition");
test.equal(Enum._features.enum_type, "OPEN", "should be open by default");
test.equal(Nested._edition, null, "should not set edition");
test.equal(Nested._features.enum_type, "CLOSED", "should inherit override");
test.end();
});