| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /** |
| * @fileoverview Tests create-constructor.js |
| */ |
| |
| var test = require('prova'); |
| |
| var BigInt = require('./../../src/vdl/big-int.js'); |
| var createConstructor = require('./../../src/vdl/create-constructor.js'); |
| var kind = require('./../../src/vdl/kind.js'); |
| var types = require('./../../src/vdl/types.js'); |
| var Complex = require('./../../src/vdl/complex.js'); |
| |
| test('create constructor', function(assert) { |
| var tests = [ |
| { |
| type: types.UINT32, |
| value: 23, |
| expectedValue: { |
| val: 23 |
| }, |
| expectedValueDeep: { |
| val: 23 |
| } |
| }, |
| { |
| type: types.UINT32, |
| value: { |
| val: 24, |
| _type: types.UINT32, |
| _wrappedType: true |
| }, |
| expectedValue: { |
| val: 24 |
| }, |
| expectedValueDeep: { |
| val: 24 |
| } |
| }, |
| { // Ensure that we can pass constructed values as arguments |
| type: types.UINT32, |
| value: new (createConstructor(types.UINT32))(25), |
| expectedValue: { |
| val: 25 |
| }, |
| expectedValueDeep: { |
| val: 25 |
| } |
| }, |
| { |
| type: types.UINT64, |
| value: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| _type: types.UINT64, |
| _wrappedType: true |
| }, |
| expectedValue: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| }, |
| expectedValueDeep: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| } |
| }, |
| { |
| type: types.UINT64, |
| value: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| _type: { |
| name: 'NamedBigInt', |
| kind: kind.UINT64 |
| }, |
| _wrappedType: true |
| }, |
| expectedValue: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| }, |
| expectedValueDeep: { |
| val: new BigInt(1, new Uint8Array([4, 3])), |
| } |
| }, |
| { // Ensure that we can pass constructed values as arguments |
| type: types.UINT64, |
| value: new (createConstructor(types.UINT64))( |
| new BigInt(1, new Uint8Array([1, 2]))), |
| expectedValue: { |
| val: new BigInt(1, new Uint8Array([1, 2])) |
| }, |
| expectedValueDeep: { |
| val: new BigInt(1, new Uint8Array([1, 2])) |
| } |
| }, |
| { |
| type: types.COMPLEX64, |
| value: { |
| val: new Complex(2, 3), |
| _type: types.COMPLEX64, |
| _wrappedType: true |
| }, |
| expectedValue: { |
| val: new Complex(2, 3) |
| }, |
| expectedValueDeep: { |
| val: new Complex(2, 3) |
| } |
| }, |
| { |
| type: types.STRING, |
| value: { |
| val: 'testString', |
| _type: types.STRING, |
| _wrappedType: true |
| }, |
| expectedValue: { |
| val: 'testString' |
| }, |
| expectedValueDeep: { |
| val: 'testString' |
| } |
| }, |
| { |
| type: { |
| kind: kind.MAP, |
| name: 'aMap', |
| key: types.STRING, |
| elem: types.INT64, |
| }, |
| value: { |
| 'a': 3, |
| 'b': -23, |
| }, |
| expectedValue: { |
| val: new Map([ |
| ['a', BigInt.fromNativeNumber(3)], |
| ['b', BigInt.fromNativeNumber(-23)] |
| ]) |
| }, |
| expectedValueDeep: { |
| val: new Map([ |
| [{ val: 'a' }, { val: BigInt.fromNativeNumber(3) }], |
| [{ val: 'b' }, { val: BigInt.fromNativeNumber(-23) }] |
| ]) |
| } |
| }, |
| { |
| type: { |
| kind: kind.STRUCT, |
| name: 'aStruct', |
| fields: [ |
| { |
| name: 'UsedField', |
| type: types.STRING |
| }, |
| { |
| name: 'UnusedField', |
| type: types.UINT16 |
| } |
| ] |
| }, |
| value: { |
| usedField: 'value' |
| }, |
| expectedValue: { |
| usedField: 'value', |
| unusedField: 0 |
| }, |
| expectedValueDeep: { |
| usedField: { val: 'value' }, |
| unusedField: { val: 0 } |
| } |
| } |
| ]; |
| for (var index = 0; index < tests.length; index++) { |
| var test = tests[index]; |
| var type = test.type; |
| var value = test.value; |
| var expectedValue = test.expectedValue; |
| var expectedValueDeep = test.expectedValueDeep; |
| |
| var Constructor = createConstructor(type); |
| if (type.hasOwnProperty('name')) { |
| assert.deepEqual( |
| Constructor.displayName, |
| 'TypeConstructor[' + type.name + ']' |
| ); |
| } else { |
| assert.deepEqual(Constructor.displayName, 'TypeConstructor'); |
| } |
| |
| // Standard use of the constructor; constructedValues are shallow. |
| var constructedValue = new Constructor(value); |
| if (type.kind === kind.STRUCT) { |
| assert.deepEqual(constructedValue, expectedValue); |
| assert.notOk(constructedValue.hasOwnProperty('_wrappedType')); |
| } else { |
| assert.deepEqual(constructedValue, expectedValue); |
| assert.ok(constructedValue._wrappedType); |
| } |
| assert.deepEqual(constructedValue._type, type); |
| |
| // deepWrap use of the constructor; constructedValues are deep. |
| var constructedValueDeep = new Constructor(value, true); |
| if (type.kind === kind.STRUCT) { |
| assert.deepEqual(constructedValueDeep, expectedValueDeep); |
| assert.notOk(constructedValue.hasOwnProperty('_wrappedType')); |
| } else { |
| assert.deepEqual(constructedValueDeep, expectedValueDeep); |
| assert.ok(constructedValueDeep._wrappedType); |
| } |
| assert.deepEqual(constructedValueDeep._type, type); |
| } |
| assert.end(); |
| }); |
| |
| test('created constructor fails on invalid data - struct', function(assert) { |
| var type = { |
| kind: kind.STRUCT, |
| name: 'aStruct', |
| fields: [ |
| { |
| name: 'usedField', |
| type: types.STRING |
| } |
| ] |
| }; |
| var constructor = createConstructor(type); |
| var value = [255, 0, 35]; // array, not an object/map/set |
| assert.throws(function() { |
| constructor(value); |
| }); |
| assert.end(); |
| }); |
| |
| test('created constructor fails on invalid data - bool', function(assert) { |
| var type = { |
| kind: kind.BOOL, |
| name: 'aBool' |
| }; |
| var constructor = createConstructor(type); |
| var value = 'This is not a bool! This is a string!'; |
| assert.throws(function() { |
| constructor(value); |
| }); |
| assert.end(); |
| }); |