// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
define([
"gin/test/expect",
"mojo/public/interfaces/bindings/tests/test_unions.mojom",
"mojo/public/js/codec",
"mojo/public/js/validator",
], function(expect,
unions,
codec,
validator) {
function testConstructors() {
var u = new unions.PodUnion();
expect(u.$data).toEqual(null);
expect(u.$tag).toBeUndefined();
u.f_uint32 = 32;
expect(u.f_uint32).toEqual(32);
expect(u.$tag).toEqual(unions.PodUnion.Tags.f_uint32);
var u = new unions.PodUnion({f_uint64: 64});
expect(u.f_uint64).toEqual(64);
expect(u.$tag).toEqual(unions.PodUnion.Tags.f_uint64);
expect(function() {var v = u.f_uint32;}).toThrow();
expect(function() {
var u = new unions.PodUnion({
f_uint64: 64,
f_uint32: 32,
});
}).toThrow();
expect(function() {
var u = new unions.PodUnion({ foo: 64 }); }).toThrow();
expect(function() {
var u = new unions.PodUnion([1,2,3,4]); }).toThrow();
}
function structEncodeDecode(struct) {
var structClass = struct.constructor;
var builder = new codec.MessageBuilder(1234, structClass.encodedSize);
builder.encodeStruct(structClass, struct);
var message = builder.finish();
var messageValidator = new validator.Validator(message);
var err = structClass.validate(messageValidator, codec.kMessageHeaderSize);
expect(err).toEqual(validator.validationError.NONE);
var reader = new codec.MessageReader(message);
var view = reader.decoder.buffer.dataView;
return reader.decodeStruct(structClass);
}
function testBasicEncoding() {
var s = new unions.WrapperStruct({
pod_union: new unions.PodUnion({
f_uint64: 64})});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_dummy: new unions.DummyStruct({
f_int8: 8})})});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_array_int8: [1, 2, 3]})});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_map_int8: new Map([
["first", 1],
["second", 2],
])})});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
// Encoding a union with no member set is an error.
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion()});
expect(function() {
structEncodeDecode(s); }).toThrow();
}
function testUnionsInArrayEncoding() {
var s = new unions.SmallStruct({
pod_union_array: [
new unions.PodUnion({f_uint32: 32}),
new unions.PodUnion({f_uint64: 64}),
]
});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
}
function testUnionsInMapEncoding() {
var s = new unions.SmallStruct({
pod_union_map: new Map([
["thirty-two", new unions.PodUnion({f_uint32: 32})],
["sixty-four", new unions.PodUnion({f_uint64: 64})],
])
});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
}
function testNestedUnionsEncoding() {
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_pod_union: new unions.PodUnion({f_uint32: 32})
})});
var decoded = structEncodeDecode(s);
expect(decoded).toEqual(s);
}
function structValidate(struct) {
var structClass = struct.constructor;
var builder = new codec.MessageBuilder(1234, structClass.encodedSize);
builder.encodeStruct(structClass, struct);
var message = builder.finish();
var messageValidator = new validator.Validator(message);
return structClass.validate(messageValidator, codec.kMessageHeaderSize);
}
function testNullUnionMemberValidation() {
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_dummy: null})});
var err = structValidate(s);
expect(err).toEqual(validator.validationError.UNEXPECTED_NULL_POINTER);
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_nullable: null})});
var err = structValidate(s);
expect(err).toEqual(validator.validationError.NONE);
}
function testNullUnionValidation() {
var s = new unions.SmallStructNonNullableUnion({
pod_union: null});
var err = structValidate(s);
expect(err).toEqual(validator.validationError.UNEXPECTED_NULL_UNION);
var s = new unions.WrapperStruct({
object_union: new unions.ObjectUnion({
f_pod_union: null})
});
var err = structValidate(s);
expect(err).toEqual(validator.validationError.UNEXPECTED_NULL_UNION);
}
testConstructors();
testBasicEncoding();
testUnionsInArrayEncoding();
testUnionsInMapEncoding();
testNestedUnionsEncoding();
testNullUnionMemberValidation();
testNullUnionValidation();
this.result = "PASS";
});