| // 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_POINTER); |
| } |
| |
| testConstructors(); |
| testBasicEncoding(); |
| testUnionsInArrayEncoding(); |
| testUnionsInMapEncoding(); |
| testNestedUnionsEncoding(); |
| testNullUnionMemberValidation(); |
| testNullUnionValidation(); |
| this.result = "PASS"; |
| }); |