// 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 of VOM encoding and decoding.
 */

var test = require('tape');

var kind = require('./../../src/vdl/kind.js');
var registry = require('./../../src/vdl/registry.js');
var Type = require('./../../src/vdl/type.js');
var types = require('./../../src/vdl/types.js');
var typeUtil = require('./../../src/vdl/type-util.js');
var stringify = require('./../../src/vdl/stringify.js');
var canonicalize = require('./../../src/vdl/canonicalize.js');
var Deferred = require('../../src/lib/deferred');

var ByteMessageWriter = require(
    './../../src/vom/byte-message-writer.js');
var ByteArrayMessageReader = require(
    './../../src/vom/byte-array-message-reader.js');

var Encoder = require('./../../src/vom/encoder.js');
var Decoder = require('./../../src/vom/decoder.js');

var linkedListNodeType = {
  kind: kind.STRUCT,
  name: 'LinkedListNode',
  fields: [
    {
    name: 'Value',
    type: types.ANY
  },
  {
    name: 'Next'
  }
  ]
};
linkedListNodeType.fields[1].type = {
  kind: kind.OPTIONAL,
  elem: linkedListNodeType
};

var treeNodeType = new Type({
  kind: kind.STRUCT,
  name: 'TreeNodeType',
  fields: [
    {
    name: 'Value',
    type: types.ANY
  },
  {
    name: 'Left'
  },
  {
    name: 'Right'
  }
  ]
});
var nextTreeNodeType = new Type({
  kind: kind.OPTIONAL,
  elem: treeNodeType
});
treeNodeType.fields[1].type = nextTreeNodeType;
treeNodeType.fields[2].type = nextTreeNodeType;

// Define a type with _type on the prototype to test type look up in one of.
function NamedUintConstructor(val) {
  this.val = val;
}
NamedUintConstructor.prototype._type = {
  kind: kind.UINT32,
  name: 'namedUint32'
};
NamedUintConstructor.prototype._wrappedType = true;

[
  {
    n: 'Decode(Encode(Byte))',
    v:  1,
    expectedOutput: {
      val:  1
    },
    t: types.BYTE
  },
  {
    n: 'Decode(Encode(Uint16))',
    v:  1000,
    expectedOutput: {
      val:  1000
    },
    t: types.UINT16
  },
  {
    n: 'Decode(Encode(Float32))',
    v:  0.3,
    expectedOutput: {
      val:  0.3
    },
    t: types.FLOAT32
  },
  {
    n: 'Decode(Encode(Int32))',
    v:  -1,
    expectedOutput: {
      val:  -1
    },
    t: types.INT32
  },
  {
    n: 'Decode(Encode(Complex64))',
    v: {
      real: 1.9,
      imag: -0.4
    },
    expectedOutput: {
      val: {
        real: 1.9,
        imag: -0.4
      }
    },
    t: types.COMPLEX64
  },
  {
    n: 'Decode(Encode(String))',
    v:  'a string',
    expectedOutput: {
      val:  'a string'
    },
    t: types.STRING
  },
  {
    n: 'Decode(Encode(Bool))',
    v:  true,
    expectedOutput: {
      val:  true
    },
    t: types.BOOL
  },
  {
    n: 'Decode(Encode(typeObject))',
    v: {
      kind: kind.LIST,
      name: 'A list',
      elem: types.STRING
    },
    expectedOutput: {
      kind: kind.LIST,
      name: 'A list',
      elem: types.STRING
    },
    t: types.TYPEOBJECT
  },
  {
    n: 'Decode(Encode(Struct{X: typeObject(nil)}))',
    v: {
      x: undefined
    },
    expectedOutput: {
      x: types.ANY
    },
    t: {
      kind: kind.STRUCT,
      fields: [
        {
        name: 'X',
        type: types.TYPEOBJECT
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Struct w/ Private field))',
    v: {
      x: 'val',
      _privateField: 99
    },
    expectedOutput: {
      x: 'val'
    },
    t: {
      kind: kind.STRUCT,
      fields: [
        {
        name: 'X',
        type: types.STRING
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Object w/ Private field [no type]))',
    v: {
      x: 'val',
      _privateField: 99
    },
    expectedOutput: {
      x: 'val'
    }
  },
  {
    n: 'Decode(Encode(List<Uint32>))',
    v:  [2, 3, 4],
    expectedOutput: {
      val:  [2, 3, 4]
    },
    t: {
      kind: kind.LIST,
      elem: types.UINT32
    }
  },
  {
    n: 'Decode(Encode(Array<Int32>))',
    v:  [2, 3, 4],
    expectedOutput: {
      val:  [2, 3, 4]
    },
    t: {
      kind: kind.ARRAY,
      elem: types.INT32,
      len: 3
    }
  },
  {
    n: 'Decode(Encode(List<Byte>))',
    v:  new Uint8Array([0x80, 0x90]),
    expectedOutput: {
      val:  new Uint8Array([0x80, 0x90])
    },
    t: {
      kind: kind.LIST,
      elem: types.BYTE
    }
  },
  {
    n: 'Decode(Encode(Array<Byte>))',
    v:  new Uint8Array([0x80, 0x90]),
    expectedOutput: {
      val:  new Uint8Array([0x80, 0x90])
    },
    t: {
      kind: kind.ARRAY,
      elem: types.BYTE,
      len: 2
    }
  },
  {
    n: 'Decode(Encode(Set<String> as Object))',
    v:  {
      'b': true,
      'a': true
    },
    expectedOutput: {
      val:  new Set(['B', 'A'])
    },
    t: {
      kind: kind.SET,
      key: types.STRING
    },
  },
  {
    n: 'Decode(Encode(Set<Uint32> as Set))',
    v:  new Set([3, 5]),
    expectedOutput: {
      val:  new Set([3, 5])
    },
    t: {
      kind: kind.SET,
      key: types.UINT32
    }
  },
  {
    n: 'Decode(Encode(Map[String]String as Object))',
    v: {
      'key1': 'value1',
      'key2': 'value2'
    },
    expectedOutput: {
      val: new Map([
        ['Key1', 'value1'],
        ['Key2', 'value2']
      ]),
    },
    t: {
      kind: kind.MAP,
      key: types.STRING,
      elem: types.STRING
    },
  },
  {
    n: 'Decode(Encode(Map[Uint16]Float32 as Map))',
    v: new Map([
      [3, 1.3],
      [2, -5.6]
    ]),
    expectedOutput: {
      val: new Map([
        [3, 1.3],
        [2, -5.6]
      ])
    },
    t: {
      kind: kind.MAP,
      key: types.UINT16,
      elem: types.FLOAT32
    }
  },
  {
    n: 'Decode(Encode(Struct as Object))',
    v: {
      field1: 8,
      field2: 'str',
      field3: [4, 5]
    },
    t: {
      kind: kind.STRUCT,
      name: 'testStruct',
      fields: [
        {
        name: 'Field1',
        type: types.UINT16
      },
      {
        name: 'Field2',
        type: types.STRING
      },
      {
        name: 'Field3',
        type: {
          kind: kind.LIST,
          elem: types.FLOAT64
        }
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Enum))',
    v: 'alabel',
    expectedOutput: {
      val: 'alabel'
    },
    t: {
      kind: kind.ENUM,
      name: 'enumtype',
      labels: ['alabel', 'blabel']
    }
  },
  {
    n: 'Decode(Encode(Optional String w/ value))',
    v: 'optionalString',
    expectedOutput: {
      val: 'optionalString'
    },
    t: {
      kind: kind.OPTIONAL,
      elem: types.STRING
    }
  },
  {
    n: 'Decode(Encode(Optional String w/ null))',
    v: null,
    expectedOutput: {
      val: null
    },
    t: {
      kind: kind.OPTIONAL,
      elem: types.STRING
    }
  },
  {
    n: 'Decode(Encode(Array<Byte>) w/o type)',
    v:  new Uint8Array([0x80, 0x90]),
    expectedOutput: new Uint8Array([0x80, 0x90])
  },
  {
    n: 'Decode(Encode(Bool w/o type))',
    v: true,
    expectedOutput: true
  },
  {
    n: 'Decode(Encode(Map w/o type))',
    v: new Map([
      ['x', [4, 5, 3]],
      ['y', 'test']
    ]),
    expectedOutput: new Map([
      ['x', [4, 5, 3]],
      ['y', 'test']
    ])
  },
  {
    n: 'Decode(Encode(Set w/o type))',
    v: new Set([3, 4, 0]),
    expectedOutput: new Set([3, 4, 0])
  },
  {
    n: 'Decode(Encode(Map w/o type))',
    v: new Map([
      ['string', false],
      [2, ['mixed', 3, 'list']]
    ]),
    expectedOutput: new Map([
      ['string', false],
      [2, ['mixed', 3, 'list']]
    ])
  },
  {
    n: 'Decode(Encode(Object w/o type))',
    v: {
      a: 'a',
      b: 3,
      c: true
    },
    expectedOutput: {
      a: 'a',
      b: 3,
      c: true
    }
  },
  {
    n: 'Decode(Encode(List))',
    v: [
      {
      aa: 2,
      bb: 3
    },
    'something else'
    ],
    expectedOutput: {
      val: [
        {
        aa: 2,
        bb: 3
      },
      'something else'
      ]
    },
    t: {
      kind: kind.LIST,
      elem: types.ANY
    }
  },
  {
    n: 'Decode(Encode(Union<String, Uint16> w/ Uint16))',
    v: {
      'uInt': 5
    },
    t: {
      kind: kind.UNION,
      name: 'unionName',
      fields: [
        {
        name: 'StringInt',
        type: types.STRING
      },
      {
        name: 'UInt',
        type: types.UINT16
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Union<String, Bool> w/ String))',
    v: {
      'stringBool': 'str'
    },
    t: {
      kind: kind.UNION,
      name: 'unionName',
      fields: [
        {
        name: 'StringBool',
        type: types.STRING
      },
      {
        name: 'Boolean',
        type: types.BOOL
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Union<String, Bool> w/ Bool))',
    v: {
      'boolean': true
    },
    t: {
      kind: kind.UNION,
      name: 'UnionName',
      fields: [
        {
        name: 'StringBool',
        type: types.STRING
      },
      {
        name: 'Boolean',
        type: types.BOOL
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Union<Map[Uint16]Uint32, List<Float64>> w/ List))',
    v: {
      'list': [4,3,5]
    },
    t: {
      kind: kind.UNION,
      name: 'UnionName',
      fields: [
        {
        name: 'Map',
        type: {
          kind: kind.MAP,
          key: types.STRING,
          elem: types.UINT32
        }
      },
      {
        name: 'List',
        type: {
          kind: kind.LIST,
          elem: types.FLOAT64
        }
      }
      ]
    }
  },
  {
    n: 'Decode(Encode(Union<Map[Uint16]Uint32, List<Float64>> w/ Map))',
    v: {
      'map': {                   // This is a native object; the fields
        'a': 9,                  // are capitalized upon conversion to Map.
        'b': 10,
        _type: {
          kind: kind.MAP,
          key: types.STRING,
          elem: types.UINT32
        }
      }
    },
    t: {
      kind: kind.UNION,
      name: 'UnionName',
      fields: [
        {
        name: 'Map',
        type: {
          kind: kind.MAP,
          key: types.STRING,
          elem: types.UINT32
        }
      },
      {
        name: 'List',
        type: {
          kind: kind.LIST,
          elem: types.FLOAT64
        }
      }
      ]
    },
    expectedOutput: {
      'map': new Map([
        ['A', 9],
        ['B', 10]
      ])
    }
  },
  {
    n: 'Decode(Encode(Linked List Nodes))',
    v: {
      value: 9,
      next: {
        value: 10,
        next: {
          value: 11,
          next: null
        }
      }
    },
    expectedOutput: {
      value: 9,
      next: {
        value: 10,
        next: {
          value: 11,
          next: null
        }
      }
    },
    t: linkedListNodeType
  },
  {
    n: 'Decode(Encode(Tree Nodes))',
    v: {
      value: 4,
      left: {
        value: 5,
        left: null,
        right: null
      },
      right: {
        value: false,
        left: {
          value: true,
          left: null,
          right: null
        },
        right: null
      }
    },
    expectedOutput: {
      value: 4,
      left: {
        value: 5,
        left: null,
        right: null
      },
      right: {
        value: false,
        left: {
          value: true,
          left: null,
          right: null
        },
        right: null
      }
    },
    t: treeNodeType
  },
  {
    n: 'Decode(Encode(Any))',
    v: 5,
    expectedOutput: { // any with JSValue(number)
      val: 5
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any)) - wrapLike',
    v: {
      val: 5
    },
    expectedOutput: { // any with JSValue(object with field val: 5)
      val: {
        val: 5
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any)) - INT32 wrap',
    v: {
      val: 5,
      _type: types.INT32, // pretend this is on the prototype
      _wrappedType: true  // pretend this is on the prototype
    },
    expectedOutput: {
      val: {
        val: 5
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any)) - Optional wrap',
    v: {
      val: 'not null',
      _type: {              // pretend this is on the prototype
        kind: kind.OPTIONAL,
        elem: types.STRING
      },
      _wrappedType: true    // pretend this is on the prototype
    },
    expectedOutput: {
      val: {
        val: 'not null'
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any)) - Struct wrap',
    v: {
      a: 'abc',
      _type: {              // pretend this is on the prototype
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.STRING
        }
        ]
      }
    },
    expectedOutput: {
      val: {
        a: 'abc'
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any)) - Struct w/ Any wrap',
    v: {
      a: 'abc',
      _type: {              // pretend this is on the prototype
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.ANY
        }
        ]
      }
    },
    expectedOutput: {
      val: {
        a: 'abc'
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(JSValue w/ null))',
    expectedOutput: null,
    v: null,
    t: types.JSVALUE
  },
  {
    n: 'Decode(Encode(Any w/ null))',
    expectedOutput: {
      val: null
    },
    v: null,            // guesses to be a null of type ANY
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any w/ null)) - wrapLike))',
    expectedOutput: {
      val: {
        val: null
      }
    },
    v: {
      val: null         // is not a null of type ANY; it's a struct
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any w/ null)) - ANY wrap',
    expectedOutput: {
      val: null
    },
    v: {
      val: null,
      _type: types.ANY,  // pretend this is on the prototype
      _wrappedType: true // pretend this is on the prototype
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any w/ null)) - OPTIONAL wrap',
    expectedOutput: {
      val: {
        val: null
      }
    },
    v: {
      val: null,
      _type: {              // pretend this is on the prototype
        kind: kind.OPTIONAL,
        elem: types.STRING
      },
      _wrappedType: true    // pretend this is on the prototype
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any w/ null)) - in a struct',
    v: {
      a: null,
      _type: {              // pretend this is on the prototype
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.ANY
        }
        ]
      }
    },
    expectedOutput: {
      val: {
        a: null
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Any w/ null)) - wrapped null in a struct',
    v: {
      a: {
        val: null,
        _type: types.ANY,   // pretend this is on the prototype
        _wrappedType: true  // pretend this is on the prototype
      },
      _type: {              // pretend this is on the prototype
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.ANY
        }
        ]
      }
    },
    expectedOutput: {
      val: {
        a: null
      }
    },
    t: types.ANY
  },
  {
    n: 'Decode(Encode(Map in Map))',
    expectedOutput: {
      val: new Map([
        [
        'testMethod',
        new Map([
          ['numInArgs', 3],
          ['numOutArgs', 3],
          ['isStreaming', false]
        ])
      ],
      [
        'testMethod2',
        new Map([
          ['numInArgs', 2],
          ['numOutArgs', 1],
          ['isStreaming', true]
        ])
      ]
      ])
    },
    v: new Map([
      [
      'testMethod',
      new Map([
        ['numInArgs', 3],
        ['numOutArgs', 3],
        ['isStreaming', false]
      ])
    ],
    [
      'testMethod2',
      new Map([
        ['numInArgs', 2],
        ['numOutArgs', 1],
        ['isStreaming', true]
      ])
    ]
    ]),
    t: {
      kind: kind.MAP,
      key: types.STRING,
      elem: {
        kind: kind.MAP,
        key: types.STRING,
        elem: types.ANY,
      },
    },
  },
  {
    n: 'Struct zero-values are filled post-decode',
    v: {
      c: true,
      _type: {
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.UINT32
        },
        {
          name: 'B',
          type: types.STRING
        },
        {
          name: 'C',
          type: types.BOOL
        }
        ]
      }
    },
    expectedOutput: {
      a: 0,
      b: '',
      c: true
    }
  },
  {
    n: 'Internal struct zero-values are filled post-decode',
    v: [
      {
      c: true
    },
    {
      a: 3
    },
    {
      b: 'hello'
    },
    {
      a: 42,
      b: 'all here',
      c: false
    }
    ],
    expectedOutput: {
      val: [
        {
        a: 0,
        b: '',
        c: true
      },
      {
        a: 3,
        b: '',
        c: false
      },
      {
        a: 0,
        b: 'hello',
        c: false
      },
      {
        a: 42,
        b: 'all here',
        c: false
      }
      ]
    },
    t: {
      kind: kind.LIST,
      elem: {
        kind: kind.STRUCT,
        fields: [
          {
          name: 'A',
          type: types.UINT32
        },
        {
          name: 'B',
          type: types.STRING
        },
        {
          name: 'C',
          type: types.BOOL
        }
        ]
      }
    }
  },
  {
    n: 'native string',
    v: 'hi',
    expectedOutput: 'hi'
  },
  {
    n: 'native number',
    v: 4,
    expectedOutput: 4
  },
  {
    n: 'native bool',
    v: true,
    expectedOutput: true
  },
  {
    n: 'native list',
    v: [{}, 'f', true],
    expectedOutput: [{}, 'f', true]
  },
  {
    n: 'native object',
    v: {
      a: 'three',
      A: 'THREE',
      b: 3
    },
    expectedOutput: {
      a: 'three',
      A: 'THREE',
      b: 3
    }
  },
  {
    n: 'native map',
    v: new Map([
      [null, 3],
      ['asdf', 'jkle']
    ]),
    expectedOutput: new Map([
      [null, 3],
      ['asdf', 'jkle']
    ])
  },
  {
    n: 'native set',
    v: new Set([null, 3, true, ['asdf', 'jkle']]),
    expectedOutput: new Set([null, 3, true, ['asdf', 'jkle']])
  },
  {
    n: 'typed string',
    v: new (registry.lookupOrCreateConstructor(types.STRING))(''),
    expectedOutput: new (registry.lookupOrCreateConstructor(types.STRING))('')
  },
  {
    n: 'typed number',
    v: new (registry.lookupOrCreateConstructor(types.INT16))(4),
    expectedOutput: new (registry.lookupOrCreateConstructor(types.INT16))(4)
  },
  {
    n: 'typed boolean',
    v: new (registry.lookupOrCreateConstructor(types.BOOL))(true),
    expectedOutput: new (registry.lookupOrCreateConstructor(types.BOOL))(true)
  },
].forEach(function(testCase) {
  test('encode and decode - ' + testCase.n, function(t) {
    var promises = [];
    function runTestCase(test, useCb) {
      var messageWriter = new ByteMessageWriter();
      var encoder = new Encoder(messageWriter);
      encoder.encode(test.v, test.t); // encode to messageWriter

      var messageReader = new ByteArrayMessageReader(messageWriter.getBytes());

      var decoder = new Decoder(messageReader);
      if (useCb) {
        var def = new Deferred();
        decoder.decode(function(err, result) {
          def.resolve();
          if (err) {
            return t.fail('(cb) failed with ' + err.stack);
          }
          handleResult(result);
        });
        promises.push(def.promise);
      } else {
        promises.push(decoder.decode().then(handleResult, function(err) {
          t.fail(' (promise) failed with ' + err.stack);
        }));
      }


      function handleResult(result) {
        var asyncType = useCb ? ' (cb)' : ' (promise)';
        var resultStr = stringify(result);
        var expected = test.expectedOutput || test.v;
        var expectedStr = stringify(expected);
        t.equals(resultStr, expectedStr, asyncType +
                 ' - decode value match');

        // Then validate that we were given a canonicalized value.
        // Note that some results are native post-decode; if so, use
        // types.JSVALUE.
        var resultType = types.JSVALUE;
        if (typeUtil.isTyped(result)) {
          resultType = result._type;
        }
        t.deepEqual(
          canonicalize.reduce(result, resultType),
          expected,
          asyncType + ' - decode value validation'
        );

        // If given a type, check that the decoded object's type matches it.
        // TODO(bprosnitz) Even if test.t isn't defined, we should still know
        // what the expected type ought to be.
        if (test.t) {
          var resultTypeStr = stringify(resultType);
          var expectedTypeStr = stringify(canonicalize.type(test.t));
          t.equals(resultTypeStr, expectedTypeStr, asyncType +
                   ' - decode type match');
        }
      }
    }
    runTestCase(testCase, true);
    runTestCase(testCase, false);
    Promise.all(promises).then(function() {
      t.end();
    }, t.end);
  });
});
var Str = registry.lookupOrCreateConstructor(types.STRING);
var IntList = registry.lookupOrCreateConstructor(new Type({
  kind: kind.LIST,
  elem: types.INT16
}));

[
  {
    n: 'converting null to non-optional type',
    v: null,
    t: types.UINT64
  },
  {
    n: 'encoding float as int',
    v: 3.5,
    t: types.INT32
  },
  {
    n: 'converting string to complex type',
    v: 'a string cannot convert to Complex',
    t: types.COMPLEX64
  },
  {
    n: 'converting wrapped string to complex type',
    v: new Str('a string cannot convert to Complex'),
    t: types.COMPLEX64,
    e: 'are not compatible'
  },
  {
    n: 'using value as typeobject',
    v: [3, 4, 90],
    t: types.TYPEOBJECT
  },
  {
    n: 'using wrapped value as typeobject',
    v: new IntList([3, 4, 90]),
    t: types.TYPEOBJECT,
    e: 'are not compatible'
  },
  {
    n: 'using label not in enum',
    v: 'Thursday',
    t: {
      kind: kind.ENUM,
      labels: ['Sunday', 'Monday', 'Tuesday']
    }
  },
  {
    n: 'array size mismatch',
    v: [2, -4, 9, 34],
    t: {
      kind: kind.ARRAY,
      elem: types.INT16,
      len: 3
    }
  },
  {
    n: 'map does not convert to set',
    v: new Map([
      ['a', true],
      ['b', true],
      ['c', true]
    ]),
    t: {
      kind: kind.SET,
      key: types.STRING
    }
  },
  {
    n: 'object cannot be converted to non-string keyed sets',
    v: {
      a: true,
      b: true,
      c: true
    },
    t: {
      kind: kind.SET,
      key: types.FLOAT64
    }
  },
  {
    n: 'object cannot be converted to non-string keyed maps',
    v: {
      a: 3,
      b: true,
      c: 'asf'
    },
    t: {
      kind: kind.MAP,
      key: types.UINT32,
      elem: types.ANY
    }
  },
  {
    n: 'extra struct entry', // TODO(alexfandrianto): Should we drop the field
    v: {                     // instead of throwing an error?
      a: 3,
      b: 0,
      c: 'asf',
      d: 'KABOOM! This cannot be here!'
    },
    t: {
      kind: kind.STRUCT,
      fields: [
        {
          name: 'A',
          type: types.INT16
        },
        {
          name: 'B',
          type: types.BYTE
        },
        {
          name: 'C',
          type: types.STRING
        }
      ]
    }
  },
  {
    n: 'Union is not TwoOrMoreOf',
    v: {
      a: 3,
      c: 'asf'
    },
    t: {
      kind: kind.UNION,
      fields: [
        {
          name: 'A',
          type: types.INT16
        },
        {
          name: 'B',
          type: types.BYTE
        },
        {
          name: 'C',
          type: types.STRING
        }
      ]
    }
  },
  {
    n: 'Union is not NoneOf',
    v: {},
    t: {
      kind: kind.UNION,
      fields: [
        {
          name: 'A',
          type: types.INT16
        },
        {
          name: 'B',
          type: types.BYTE
        },
        {
          name: 'C',
          type: types.STRING
        }
      ]
    }
  }
].forEach(function(testCase) {
  test('encode error cases - ' + test.n, function(t) {
    var messageWriter = new ByteMessageWriter();
    var encoder = new Encoder(messageWriter);
    t.throws(encoder.encode.bind(encoder, testCase.v, testCase.t),
             new RegExp('.*' + (testCase.e || '') + '.*'));
    t.end();
  });
});
