// 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 for canonicalize.js
 */

var test = require('prova');

var BigInt = require('./../../src/vdl/big-int.js');
var Complex = require('./../../src/vdl/complex.js');
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 canonicalize = require('./../../src/vdl/canonicalize.js');
var stringify = require('./../../src/vdl/stringify.js');
require('../../src/vom/native-types');
var Time = require('../../src/gen-vdl/v.io/v23/vdlroot/time').Time;
var makeError = require('../../src/verror/make-errors');
var actions = require('../../src/verror/actions');

// A helper function that shallow copies an object into an object with the
// JSValue prototype. It makes the test cases a lot more readable.
function JS(obj) {
  var JSValue = registry.lookupOrCreateConstructor(types.JSVALUE);
  var jsval = Object.create(JSValue.prototype);
  Object.keys(obj).forEach(function(key) {
    jsval[key] = obj[key];
  });
  return jsval;
}
[
  {
  name: 'null',
  input: null,
  output: null,
  outputDeep: JS({
    'null': {}
  })
},
{
  name: 'number',
  input: 4,
  output: 4,
  outputDeep: JS({
    'number': {
      val: 4
    }
  })
},
{
  name: 'string',
  input: 'fadasa',
  output: 'fadasa',
  outputDeep: JS({
    'string': {
      val: 'fadasa'
    }
  })
},
{
  name: 'list',
  input: [3, false, null, 'abc', undefined],
  output: [3, false, null, 'abc', null],
  outputDeep: JS({
    'list': {
      val: [
        {
        val: JS({
          'number': { val: 3 }
        })
      },
      {
        val: JS({
          'boolean': { val: false }
        })
      },
      {
        val: JS({
          'null': {}
        })
      },
      {
        val: JS({
          'string': { val: 'abc' }
        })
      },
      {
        val: JS({
          'null': {}
        })
      }
      ]
    }
  })
},
{
  name: 'map',
  input: new Map([
    [345, '345'],
    [null, null]
  ]),
  output: new Map([
    [345, '345'],
    [null, null]
  ]),
  outputDeep: JS({
    'map': {
      val: [
        {
        key: {
          val: JS({ 'number': { val: 345 } })
        },
        value: {
          val: JS({ 'string': { val: '345' } })
        }
      },
      {
        key: {
          val: JS({ 'null': {} })
        },
        value: {
          val: JS({ 'null': {} })
        }
      }
      ]
    }
  })
},
{
  name: 'object',
  input: { name: '', servers: [], mT: false },
  output: { name: '', servers: [], mT: false },
  outputDeep: JS({
    'object': {
      val: [
        {
        key: {
          val: 'name'
        },
        value: {
          val: JS({ 'string': { val: '' } })
        }
      },
      {
        key: {
          val: 'servers'
        },
        value: {
          val: JS({ 'list': { val: [] } })
        }
      },
      {
        key: {
          val: 'mT'
        },
        value: {
          val: JS({ 'boolean': { val: false } })
        }
      }
      ]
    }
  })
}
].forEach(function(testCase) {
  // Test basic JSValue canonicalization. Pure JSValues are used.
  // TODO(alexfandrianto): It would be good to test a JSValue inside another
  // type. For example, []JSValue or a struct with JSValues.
  test('canonicalize JSValue - basic functionality - ' +
       testCase.name, function(t) {
    var input = testCase.input;
    var expected = testCase.output;
    var expectedDeep = testCase.outputDeep;

    var type = types.JSVALUE;

    // The input canonicalizes to the expected output.
    var output = canonicalize.reduce(input, type);
    t.deepEqual(output, expected, 'canon match');

    // Canonicalize is idempotent.
    var output2 = canonicalize.reduce(output, type);
    t.deepEqual(output2, output, 'idempotent');

    // The deep wrapped output should also match the expected deep output.
    var outputDeep = canonicalize.fill(input, type);
    t.deepEqual(outputDeep, expectedDeep, 'deep');

    // This is also idempotent.
    var outputDeep2 = canonicalize.fill(outputDeep, type);
    t.deepEqual(outputDeep2, outputDeep, 'deep idempotent');

    // DeepWrap(output) === outputDeep
    var outputToDeep = canonicalize.fill(output, type);
    t.deepEqual(outputToDeep, outputDeep, 'shallow to deep');

    // Unwrap(outputDeep) === output
    var outputDeepToShallow = canonicalize.reduce(outputDeep, type);
    t.deepEqual(outputDeepToShallow, output, 'deep to shallow');


    // The type of the deep output must match. (Shallow lacks type.)
    var expectedTypeStr = stringify(type);
    var outputDeepTypeStr = stringify(outputDeep._type);
    t.equal(outputDeepTypeStr, expectedTypeStr, 'top-level type match');
    t.end();
  });
});

var Float32 = registry.lookupOrCreateConstructor(types.FLOAT32);
[
  {
    name: 'list w/ typed values',
    input: [3, false, null, 'abc', undefined, new Float32(3.14)],
    output: [3, false, null, 'abc', null, new Float32(3.14)],
    outputDeep: JS({
      'list': {
        val: [
          {
            val: JS({
              'number': { val: 3 }
            })
          },
          {
            val: JS({
              'boolean': { val: false }
            })
          },
          {
            val: JS({
              'null': {}
            })
          },
          {
            val: JS({
              'string': { val: 'abc' }
            })
          },
          {
            val: JS({
              'null': {}
            })
          },
          {
            val: new Float32(3.14)// any with wrapped float32
          }
        ]
      }
    })
  },
].forEach(function(testCase) {
  var name = 'canonicalize JSValue - mixed JSValue and non-JSValue ' +
    'functionality - ' + testCase.name;
  test(name, function(t) {
    var input = testCase.input;
    var expected = testCase.output;
    var expectedDeep = testCase.outputDeep;
    var type = types.JSVALUE;

    // The input canonicalizes to the expected output.
    var output = canonicalize.reduce(input, type);
    t.deepEqual(output, expected);

    // Canonicalize is idempotent.
    var output2 = canonicalize.reduce(output, type);
    t.deepEqual(output2, output, 'idempotent');

    // The deep wrapped output should also match the expected deep output.
    var outputDeep = canonicalize.fill(input, type);
    t.deepEqual(outputDeep, expectedDeep, 'deep');

    // This is also idempotent.
    var outputDeep2 = canonicalize.fill(outputDeep, type);
    t.deepEqual(outputDeep2, outputDeep, 'deep idempotent');

    // DeepWrap(output) === outputDeep
    var outputToDeep = canonicalize.fill(output, type);
    t.deepEqual(outputToDeep, outputDeep, 'shallow to deep');

    // Unwrap(outputDeep) === output
    var outputDeepToShallow = canonicalize.reduce(outputDeep, type);
    t.deepEqual(outputDeepToShallow, output, 'deep to shallow');


    // The type of the deep output must match. (Shallow lacks type.)
    var expectedTypeStr = stringify(type);
    var outputDeepTypeStr = stringify(outputDeep._type);
    t.equal(outputDeepTypeStr, expectedTypeStr, 'top-level type match');
    t.end();
  });
});

var OptStringType = new Type({
  kind: kind.OPTIONAL,
  elem: types.STRING
});
var OptStr = registry.lookupOrCreateConstructor(OptStringType);
var AnyListType = new Type({
  kind: kind.LIST,
  elem: types.ANY
});
var BoolListType = new Type({
  kind: kind.LIST,
  elem: types.BOOL
});

var ComplicatedStringStructType = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'JSValueString',
      type: types.ANY
    },
    {
      name: 'WrappedString',
      type: types.STRING
    },
    {
      name: 'NativeString',
      type: types.STRING
    },
    {
      name: 'AnyString',
      type: types.ANY
    },
    {
      name: 'NullOptionalAny',
      type: OptStringType
    },
    {
      name: 'OptionalToString',
      type: OptStringType
    },
    {
      name: 'UndefinedToZeroString',
      type: types.STRING
    },
    {
      name: 'UndefinedToZeroStringAny',
      type: types.STRING
    }
  ]
});
var ComplicatedBoolAnyListType = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'BoolToAny',
      type: BoolListType
    },
    {
      name: 'BoolToBool',
      type: BoolListType
    },
    {
      name: 'AnyToBool',
      type: AnyListType
    },
    {
      name: 'AnyToAny',
      type: AnyListType
    }
  ]
});

var Bool = registry.lookupOrCreateConstructor(types.BOOL);
var Str = registry.lookupOrCreateConstructor(types.STRING);
var ComplicatedStringStruct = registry.lookupOrCreateConstructor(
  ComplicatedStringStructType);
var ComplicatedBoolAnyList = registry.lookupOrCreateConstructor(
  ComplicatedBoolAnyListType);
[
  {
    name: 'empty object, no fields',
    inputObject: {},
    inputFields: [],
    outputObject: {},
    outputObjectDeep: {}
  },
  {
    name: 'object w/ private properties, no fields',
    inputObject: {_private: 'I persist!'},
    inputFields: [],
    outputObject: {_private: 'I persist!'},
    outputObjectDeep: {_private: 'I persist!'}
  },
  {
    name: 'normal object, no extra fields',
    inputObject: {
      a: 4,
      b: 'can',
      e: 'plan'
    },
    inputFields: [
      {
        name: 'A',
        type: types.UINT32
      },
      {
        name: 'B',
        type: types.STRING
      },
      {
        name: 'E',
        type: types.ANY
      },
    ],
    outputObject: {
      a: 4,
      b: 'can',
      e: 'plan'       // JSValue in ANY has no wrapping in shallow mode.
    },
    outputObjectDeep: {
      a: { val: 4 },
      b: { val: 'can' },
      e: {            // any
        val: {        // INFERRED: JSValue(string).
          string: { val: 'plan' }
        }
      }
    }
  },
  {
    name: 'empty object, some fields',
    inputObject: {},
    inputFields: [
      {
        name: 'Man',
        type: types.ANY
      },
      {
        name: 'Ban',
        type: types.BOOL
      },
      {
        name: 'Dan',
        type: types.COMPLEX64
      }
    ],
    outputObject: {
      man: null,
      ban: false,
      dan: new Complex(0, 0)
    },
    outputObjectDeep: {
      man: { val: null },
      ban: { val: false },
      dan: { val: new Complex(0, 0) }
    }
  },
  {
    name: 'struct with internal string/any',
    inputObject: new ComplicatedStringStruct({
      jSValueString: 'go as JSValue',
      wrappedString: new Str('overly wrapped input'),
      nativeString: 'true string',
      anyString: new Str('string any'),
      nullOptionalAny: null,
      optionalToString: new OptStr('non-empty string'),
      undefinedToZeroString: undefined,
      undefinedToZeroStringAny: undefined
    }),
    inputFields: [
      {
        name: 'JSValueString',
        type: types.ANY
      },
      {
        name: 'WrappedString',
        type: types.ANY
      },
      {
        name: 'NativeString',
        type: types.ANY
      },
      {
        name: 'AnyString',
        type: types.STRING
      },
      {
        name: 'NullOptionalAny',
        type: types.ANY
      },
      {
        name: 'OptionalToString',
        type: types.STRING
      },
      {
        name: 'UndefinedToZeroString',
        type: types.STRING
      },
      {
        name: 'UndefinedToZeroStringAny',
        type: types.ANY
      }
    ],
    outputObject: {
      jSValueString: 'go as JSValue',
      wrappedString: new Str('overly wrapped input'),
      nativeString: new Str('true string'),
      anyString: 'string any',
      nullOptionalAny: {
        val: null
      },
      optionalToString: 'non-empty string',
      undefinedToZeroString: '',
      undefinedToZeroStringAny: new Str('')
    },
    outputObjectDeep: {
      jSValueString: {
        val: {
          string: {
            val: 'go as JSValue'
          }
        }
      },
      wrappedString: {
        val: new Str('overly wrapped input')
      },
      nativeString: {
        val: new Str('true string')
      },
      anyString: new Str('string any'),
      nullOptionalAny: {
        val: {
          val: null
        }
      },
      optionalToString: new Str('non-empty string'),
      undefinedToZeroString: new Str(''),
      undefinedToZeroStringAny: {
        val: new Str('')
      }
    }
  },
  {
    name: 'struct with internal []any and []bool',
    inputObject: new ComplicatedBoolAnyList({
      boolToAny: [true, false, true],
      boolToBool: [false, false],
      anyToBool: [new Bool(true), new Bool(true), new Bool(false)],
      anyToAny: [new Bool(true)]
    }),
    inputFields: [
      {
        name: 'BoolToAny',
        type: AnyListType
      },
      {
        name: 'BoolToBool',
        type: BoolListType
      },
      {
        name: 'AnyToBool',
        type: BoolListType
      },
      {
        name: 'AnyToAny',
        type: AnyListType
      },
    ],
    outputObject: {
      boolToAny: [new Bool(true), new Bool(false), new Bool(true)],
      boolToBool: [false, false],
      anyToBool: [true, true, false],
      anyToAny: [new Bool(true)]
    },
    outputObjectDeep: {
      boolToAny: {
        val: [
          { val: new Bool(true) },
          { val: new Bool(false) },
          { val: new Bool(true) }
        ]
      },
      boolToBool: {
        val: [new Bool(false), new Bool(false)]
      },
      anyToBool: {
        val: [new Bool(true), new Bool(true), new Bool(false)]
      },
      anyToAny: {
        val: [{ val: new Bool(true) }]
      },
    }
  },
  {
    name: 'simple zero values',
    inputObject: {},
    inputFields: [
      {
        name: 'Enum',
        type: {
          kind: kind.ENUM,
          labels: ['Sunday', 'Monday', 'Tuesday']
        }
      },
      {
        name: 'Optional',
        type: {
          kind: kind.OPTIONAL,
          elem: types.STRING
        }
      },
      {
        name: 'String',
        type: types.STRING
      },
      {
        name: 'Array',
        type: {
          kind: kind.ARRAY,
          elem: types.BOOL,
          len: 3
        }
      },
      {
        name: 'List',
        type: {
          kind: kind.LIST,
          elem: types.BOOL
        }
      },
      {
        name: 'Set',
        type: {
          kind: kind.SET,
          key: types.UINT64
        }
      },
      {
        name: 'Map',
        type: {
          kind: kind.MAP,
          key: types.STRING,
          elem: types.STRING
        }
      },
      {
        name: 'TypeObject',
        type: types.TYPEOBJECT
      }
    ],
    outputObject: {
      'enum': 'Sunday',
      'optional': null,
      'string': '',
      'array': [false, false, false],
      'list': [],
      'set': new Set(),
      'map': new Map(),
      'typeObject': types.ANY
    },
    outputObjectDeep: {
      'enum': { val: 'Sunday' },
      'optional': { val: null },
      'string': { val: '' },
      'array': {
        val: [
          { val: false },
          { val: false },
          { val: false }
        ]
      },
      'list': {
        val: []
      },
      'set': {
        val: new Set()
      },
      'map': {
        val: new Map()
      },
      'typeObject': types.ANY
    }
  },
  {
    name: 'byte slice',
    inputObject: {},
    inputFields: [
      {
        name: 'ByteSlice',
        type: {
          kind: kind.LIST,
          elem: types.BYTE
        }
      }
    ],
    outputObject: {
      'byteSlice': new Uint8Array()
    },
    outputObjectDeep: {
      'byteSlice': {
        val: new Uint8Array()
      }
    }
  },
  {
    name: 'byte array',
    inputObject: {},
    inputFields: [
      {
        name: 'ByteArray',
        type: {
          kind: kind.ARRAY,
          elem: types.BYTE,
          len: 4
        }
      }
    ],
    outputObject: {
      'byteArray': new Uint8Array([0, 0, 0, 0])
    },
    outputObjectDeep: {
      'byteArray': {
        val: new Uint8Array([0, 0, 0, 0])
      }
    }
  },
  {
    name: 'recursive canonicalize - struct, union',
    inputObject: {},
    inputFields: [
      {
        name: 'Struct',
        type: {
          kind: kind.STRUCT,
          fields: [
            {
              name: 'A',
              type: types.BOOL
            },
            {
              name: 'B',
              type: types.UINT64
            }
          ]
        }
      },
      {
        name: 'Union',
        type: {
          kind: kind.UNION,
          fields: [
            {
              name: 'A',
              type: types.BOOL
            },
            {
              name: 'B',
              type: types.UINT64
            }
          ]
        }
      }
    ],
    outputObject: {
      'struct': {
        a: false,
        b: new BigInt(0, new Uint8Array())
      },
      'union': {
        a: false
      }
    },
    outputObjectDeep: {
      'struct': {
        a: { val: false },
        b: { val: new BigInt(0, new Uint8Array()) }
      },
      'union': {
        a: { val: false }
      }
    }
  }
].forEach(function(testCase) {
  test('canonicalize struct - basic functionality - ' + testCase.name,
       function(t) {
     var type = new Type({
       kind: kind.STRUCT,
       fields: testCase.inputFields
     });
     runNativeWireTest(testCase, type, t);
     t.end();
   });
});

function runNativeWireTest(test, type, t) {
  var input = test.inputObject;
  var expected = test.outputObject;
  var expectedDeep = test.outputObjectDeep;

  // The input object and its fields canonicalize to the expected output.
  var output = canonicalize.reduce(input, type);
  t.deepEqual(output, expected);

  // Canonicalize is idempotent.
  var output2 = canonicalize.reduce(output, type);
  t.deepEqual(output2, output, 'idempotent');

  // The deep wrapped output should also match the expected deep output.
  var outputDeep = canonicalize.fill(input, type);
  t.deepEqual(outputDeep, expectedDeep, 'deep');

  // This is also idempotent.
  var outputDeep2 = canonicalize.fill(outputDeep, type);
  t.deepEqual(outputDeep2, outputDeep, 'deep idempotent');

  // DeepWrap(output) === outputDeep
  var outputToDeep = canonicalize.fill(output, type);
  t.deepEqual(outputToDeep, outputDeep, ' - shallow to deep');

  // Unwrap(outputDeep) === output
  var outputDeepToShallow = canonicalize.reduce(outputDeep, type);
  t.deepEqual(outputDeepToShallow, output, ' - deep to shallow');
}
[
  {
    name: 'filled union A, some fields',
    inputObject: {
      a: 4
    },
    inputFields: [
      {
        name: 'A',
        type: types.UINT32
      },
      {
        name: 'B',
        type: types.STRING
      },
      {
        name: 'E',
        type: types.ANY
      }
    ],
    outputObject: {
      a: 4
    },
    outputObjectDeep: {
      a: {
        val: 4
      }
    }
  },
  {
    name: 'filled union E, some fields',
    inputObject: {
      e: [4, 'asdf']
    },
    inputFields: [
      {
        name: 'A',
        type: types.UINT32
      },
      {
        name: 'B',
        type: types.STRING
      },
      {
        name: 'E',
        type: types.ANY
      }
    ],
    outputObject: {         // any with []JSValue
      e: [4, 'asdf']
    },
    outputObjectDeep: {
      e: {                  // any
        val: {              // INFERRED: JSValue(list)
          list: {
            val: [
              {
                val: {      // any
                  number: { // JSValue(float64)
                    val: 4
                  }
                }
              },
              {
                val: {      // any
                  string: { // JSValue(string)
                    val: 'asdf'
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    name: 'filled union with explicitly undefined fields',
    inputObject: {
      a: undefined,
      b: 'and',
      e: undefined
    },
    inputFields: [
      {
        name: 'A',
        type: types.UINT32
      },
      {
        name: 'B',
        type: types.STRING
      },
      {
        name: 'E',
        type: types.ANY
      }
    ],
    outputObject: {
      b: 'and'
    },
    outputObjectDeep: {
      b: { val: 'and' }
    }
  },
  {
    name: 'union with private properties',
    inputObject: {
      a: undefined,
      b: 'foo',
      _private1: 'I LIVE!',
      _private2: 'ME TOO!'
    },
    inputFields: [
      {
        name: 'A',
        type: types.UINT32
      },
      {
        name: 'B',
        type: types.STRING
      },
      {
        name: 'E',
        type: types.ANY
      }
    ],
    outputObject: {
      b: 'foo',
      _private1: 'I LIVE!',
      _private2: 'ME TOO!'
    },
    outputObjectDeep: {
      b: { val: 'foo' },
      _private1: 'I LIVE!',
      _private2: 'ME TOO!'
    }
  }
].forEach(function(testCase) {
  test('canonicalize union - basic functionality ' + testCase.name,
       function(t) {
    var type = new Type({
      kind: kind.UNION,
      fields: testCase.inputFields
    });
    runNativeWireTest(testCase, type, t);
    t.end();
  });
});

var loopyList = {
  kind: kind.LIST
};
loopyList.elem = loopyList;
var expectedLoopyList = {
  name: '',
  kind: kind.LIST
};
expectedLoopyList.elem = expectedLoopyList;

// Ensures that valid types don't error out when canonicalizing.
[
  {
    name: 'undefined type => any',
    inputType: undefined,
    outputType: types.ANY
  },
  {
    name: 'simple list',
    inputType: {
      kind: kind.LIST,
      elem: types.INT16
    },
    outputType: {
      name: '',
      kind: kind.LIST,
      elem: types.INT16
    }
  },
  {
    name: 'typeobject',
    inputType: {
      kind: kind.TYPEOBJECT
    },
    outputType: types.TYPEOBJECT
  },
  {
    name: 'loopyList',
    inputType: loopyList,
    outputType: expectedLoopyList
  }
].forEach(function(testCase) {
  test('canonicalize type - basic functionality - ' + testCase.name,
       function(t) {
    var input = testCase.inputType;
    var expected = testCase.outputType;

    // The input object and its fields canonicalize to the expected output.
    // Since TypeObjects can be recursive, it's best to stringify them.
    var output = canonicalize.type(input);
    var outputStr = stringify(output);
    var expectedStr = stringify(expected);
    t.equal(outputStr, expectedStr);

    // Canonicalize Type is idempotent.
    var output2 = canonicalize.type(output);
    var output2Str = stringify(output2);
    t.equal(output2Str, expectedStr, 'idempotent');

    // Post-canonicalization, the type is still a TypeObject.
    t.deepEqual(output._type, types.TYPEOBJECT, 'type is TypeObject');
    t.end();
  });
});

// TODO(alexfandrianto): Add a general idempotency test since we always expect
// canonicalize and canonicalizeType to be idempotent when successful.


// TODO(alexfandrianto): Perhaps this test is not necessary anymore; we have
// other coverage, and it seems like it's just checking that deep wrap converts
// to shallow wrap.
var Int16 = registry.lookupOrCreateConstructor(types.INT16);
var Int64 = registry.lookupOrCreateConstructor(types.INT64);
var Uint32 = registry.lookupOrCreateConstructor(types.UINT32);
var Complex64 = registry.lookupOrCreateConstructor(types.COMPLEX64);
var Uint32Uint32Map = registry.lookupOrCreateConstructor({
  kind: kind.MAP,
  name: '',
  key: types.INT32,
  elem: types.INT32
});
var KindNameStruct = registry.lookupOrCreateConstructor({
  kind: kind.STRUCT,
  name: '',
  fields: [
    {
    name: 'kind',
    type: types.UINT32
  },
  {
    name: 'Name',
    type: types.STRING
  }
  ]
});
var ABUnion = registry.lookupOrCreateConstructor({
  kind: kind.UNION,
  name: '',
  fields: [
    {
    name: 'A',
    type: types.UINT32
  },
  {
    name: 'B',
    type: types.STRING
  }
  ]
});
var ABStruct = registry.lookupOrCreateConstructor({
  kind: kind.STRUCT,
  name: '',
  fields: [
    {
    name: 'A',
    type: types.UINT32
  },
  {
    name: 'B',
    type: types.STRING
  }
  ]
});
var AnyStrStruct = registry.lookupOrCreateConstructor({
  kind: kind.STRUCT,
  name: '',
  fields: [
    {
    name: 'Any',
    type: types.ANY
  },
  {
    name: 'Normal',
    type: types.STRING
  }
  ]
});
[
  {
    name: 'top-level only',
    input: new Int16(5, true),
    expected: new Int16(5)
  },
  {
    name: 'wrapped big int',
    input: new Int64(new BigInt(1, new Uint8Array([0x10, 0xff])), true),
    expected: new Int64(new BigInt(1, new Uint8Array([0x10, 0xff])))
  },
  {
    name: 'wrapped complex',
    input: new Complex64(new Complex(4, 5), true),
    expected: new Complex64(new Complex(4, 5))
  },
  {
    name: 'map',
    input: new Uint32Uint32Map(new Map([[3, 4], [6, 3]]), true),
    expected: new Uint32Uint32Map(new Map([[3, 4], [6, 3]]))
  },
  {
    name: 'fake typeobject',
    input: new KindNameStruct({
      kind: new Uint32(3, true),
      name: new Str('Boolean', true)
    }, true),
    expected: {
      kind: 3,
      name: 'Boolean'
    }
  },
  {
    name: 'union',
    input: new ABUnion({
      b: new Str('abc', true),
    }, true),
    expected: {
      b: 'abc'
    }
  },
  {
    name: 'struct',
    input: new ABStruct({
      a: new Uint32(3, true),
      b: new Str('abc', true)
    }, true),
    expected: {
      a: 3,
      b: 'abc',
    }
  },
  {
    name: 'Struct with ANY',
    input: new AnyStrStruct({
      any: new Str('wrapped', true),
      normal: new Str('shallow', true)
    }, true),
    expected: {
      any: new Str('wrapped'),
      normal: 'shallow'
    }
  }
].forEach(function(testCase) {
  test('canonicalize deep to shallow - basic functionality ' + testCase.name,
       function(t) {
    testDeepWrapToUnwrap(t, testCase);
    t.end();
  });
});

// TODO(alexfandrianto): DeepWrapToUnwrap can be expanded to test more, just
// like the canonicalize struct and union tests. In fact, this tests basic
// canonicalization, since it includes more types than just struct/union.
// So the TODO is to convert this into a basic canonicalization test.
function testDeepWrapToUnwrap(t, test) {
  var input = test.input;
  var expected = test.expected;

  // Canonicalize without wrapping deeply.
  var output = canonicalize.reduce(input, input._type);

  // Compare with stringify; the output/expected could be recursive.
  var expectedStr = stringify(expected);
  var outputStr = stringify(output);
  t.equal(outputStr, expectedStr);

  // The types must also match.
  var type = input._type;
  var expectedTypeStr = stringify(type);
  var outputTypeStr = stringify(output._type);
  t.equal(outputTypeStr, expectedTypeStr, 'top-level type match');
}


// This test checks the successful cases of value to type conversion.
// For example, some structs can convert to maps, and non-null optionals convert
// to their base type.
// This test supplements the cross-language conversion tests cases in
// test-vom-compatible.js
//
var StringListType = new Type({
  kind: kind.LIST,
  elem: types.STRING
});
var ByteListType = new Type({
  kind: kind.LIST,
  elem: types.BYTE
});
var MyEnumType = new Type({
  kind: kind.ENUM,
  labels: ['M', 'A', 'G']
});
var IntSetType = new Type({
  kind: kind.SET,
  key: types.INT16
});
var FloatBoolMapType = new Type({
  kind: kind.MAP,
  key: types.FLOAT32,
  elem: types.BOOL
});
var StringSetType = new Type({
  kind: kind.SET,
  key: types.STRING
});
var StringyStructType = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Ma',
      type: types.STRING
    },
    {
      name: 'Bu',
      type: ByteListType
    },
    {
      name: 'Fu',
      type: MyEnumType
    }
  ]
});
var StringStringMapType = new Type({
  kind: kind.MAP,
  key: types.STRING,
  elem: types.STRING
});
var StringAnyMapType = new Type({
  kind: kind.MAP,
  key: types.STRING,
  elem: types.ANY
});
var Byte10ArrayType = new Type({
  kind: kind.ARRAY,
  elem: types.BYTE,
  len: 10
});
var StructABCType = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'A',
      type: types.BOOL
    },
    {
      name: 'B',
      type: types.STRING
    },
    {
      name: 'C',
      type: types.UINT32
    }
  ]
});
var StructCDBType = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'C',
      type: types.UINT32
    },
    {
      name: 'D',
      type: OptStringType
    },
    {
      name: 'B',
      type: types.STRING
    }
  ]
});

var Any = registry.lookupOrCreateConstructor(types.ANY);
var AnyList = registry.lookupOrCreateConstructor(AnyListType);
var StrList = registry.lookupOrCreateConstructor(StringListType);
var IntSet = registry.lookupOrCreateConstructor(IntSetType);
var FloatBoolMap = registry.lookupOrCreateConstructor(FloatBoolMapType);
var ByteList = registry.lookupOrCreateConstructor(ByteListType);
var Byte10Array = registry.lookupOrCreateConstructor(Byte10ArrayType);
var MyEnum = registry.lookupOrCreateConstructor(MyEnumType);
var StructABC = registry.lookupOrCreateConstructor(StructABCType);
var StructCDB = registry.lookupOrCreateConstructor(StructCDBType);
var StringSet = registry.lookupOrCreateConstructor(StringSetType);
var StringStringMap = registry.lookupOrCreateConstructor(StringStringMapType);
var StringAnyMap = registry.lookupOrCreateConstructor(StringAnyMapType);
var StringyStruct = registry.lookupOrCreateConstructor(StringyStructType);

[
  {
    name: 'Any(String) to String',
    inValue: new Any(new Str('fff')),
    outValue: new Str('fff'),
    targetType: types.STRING
  },
  {
    name: 'String to Any(String)',
    inValue: new Str('fff'),
    outValue: new Any(new Str('fff')),
    targetType: types.ANY
  },
  {
    name: '[]Any to []String',
    // Note: 'jsval' is a JSValue that happens to convert to a string.
    // This cannot always be expected to work, however.
    inValue: new AnyList([new Str('fff'), 'jsval']),
    outValue: new StrList(['fff', 'jsval']),
    targetType: StringListType
  },
  {
    name: '[]string to []any',
    inValue: new StrList(['fff', 'not jsval']),
    outValue: new AnyList([new Str('fff'), new Str('not jsval')]),
    targetType: AnyListType
  },
  {
    name: 'OptString to String',
    inValue: new OptStr('abc'),
    outValue: new Str('abc'),
    targetType: types.STRING
  },
  {
    name: 'String to ByteArray',
    inValue: '1234567',
    outValue: new Byte10Array(
      new Uint8Array([49, 50, 51, 52, 53, 54, 55, 0, 0, 0])
    ),
    targetType: Byte10ArrayType
  },
  {
    name: 'Set to Map',
    inValue: new IntSet(new Set([4, -5, 8])),
    outValue: new FloatBoolMap(new Map([[4, true], [-5, true], [8, true]])),
    targetType: FloatBoolMapType
  },
  {
    name: 'Map to Set',
    inValue: new FloatBoolMap(new Map([[4, false], [-5, true], [8, true]])),
    outValue: new IntSet(new Set([-5, 8])),
    targetType: IntSetType
  },
  {
    name: 'StructABC to StructCDB',
    inValue: new StructABC({
      a: true,
      b: 'boom',
      c: 5
    }),
    outValue: new StructCDB({
      b: 'boom',
      c: 5,
      d: undefined
    }),
    targetType: StructCDBType
  },
  {
    name: 'StructCDB to StructABC',
    inValue: new StructCDB({
      d: null,
      b: 'doom',
      c: 6
    }),
    outValue: new StructABC({
      a: undefined,
      b: 'doom',
      c: 6
    }),
    targetType: StructABCType
  },
  {
    name: 'set[string] to map[string]any',
    inValue: new StringSet(
      new Set(['me', 'di', 'a'])
    ),
    outValue: new StringAnyMap(
      new Map([
        ['me', new Bool(true)],
        ['di', new Bool(true)],
        ['a', new Bool(true)]
      ])
    ),
    targetType: StringAnyMapType
  },
  {
    name: 'struct with string-y fields to map[string]any',
    inValue: new StringyStruct({
      ma: 'Pool', // string
      bu: 'imp',  // bytelist 105 109 112
      fu: 'A'     // autoconverts to enum
    }),
    outValue: new StringAnyMap(new Map([
      ['Ma', new Str('Pool')],
      ['Bu', new ByteList(new Uint8Array([105, 109, 112]))],
      ['Fu', new MyEnum('A')]
    ])),
    targetType: StringAnyMapType
  },
  {
    name: 'struct with string-y fields to map[string]string',
    inValue: new StringyStruct({
      ma: 'Pool',
      bu: 'imp',
      fu: 'A'
    }),
    outValue: new StringStringMap(new Map([
      ['Ma', 'Pool'],
      ['Bu', 'imp'],
      ['Fu', 'A']
    ])),
    targetType: StringStringMapType
  },
  {
    name: 'map[string]any to struct with stringy-fields',
    inValue: new StringAnyMap(new Map([
      ['Ma', 'V'], // JSValue happens to be string-compatible.
      ['Bu', new ByteList(new Uint8Array([79]))],
      ['Fu', new MyEnum('M')]
    ])),
    outValue: new StringyStruct({
      ma: 'V',
      bu: 'O', // bytelist 79
      fu: 'M'  // enum with M
    }),
    targetType: StringyStructType
  },
  {
    name: 'map[string]any to set[string]',
    inValue: new StringAnyMap(new Map([
      ['Z', true], // JSValue that happens to be bool-compatible
      ['o', new Bool(true)],
      ['nga', false], // Will not appear since it's false
      ['dine', new Bool(true)]
    ])),
    outValue: new StringSet(new Set([
      'Z', 'o', 'dine'
    ])),
    targetType: StringSetType
  }
].forEach(function(testCase) {
  var testName = 'canonicalize conversion - success - ' + testCase.name;
  test(testName, function(t) {
    var reduced = canonicalize.reduce(testCase.inValue, testCase.targetType);
    var outValue = testCase.outValue;
    t.deepEqual(
      stringify(reduced),
      stringify(outValue),
      test.name + ' converts correctly'
    );
    t.end();
  });
});

test('canonicalize error', function(t) {
  var E = makeError('MyId', actions.NO_RETRY, '', [
    types.STRING, types.INT32 ]);

  // There are two different values of native errors we expect.  The first is
  // the value that the developer will pass in.  It's paramList will not have
  // any wrapped elements.  The second is the result of the conversion from the
  // wire format to the native format.  In this form, the individual values of
  // in the paramList will be wrapped since they are of type any.  This is
  // strictly correct, but cumbersome.  This is probably ok since we want to
  // strongly discourage the use of the paramList programmatically.
  var err = new E(null, 'foo', 32);
  err.msg = 'My awesome message!!!';
  Object.defineProperty(err, 'message', { value: err.msg });
  var wrappedErr = err.clone();
  wrappedErr.paramList = wrappedErr.paramList.map(function(v) {
    return { val: v };
  });

  var VerrorConstructor = registry.lookupOrCreateConstructor(types.ERROR.elem);
  var Int32 = registry.lookupOrCreateConstructor(types.INT32);

  var wrappedMessage = new VerrorConstructor({
    id: 'MyId',
    retryCode: actions.NO_RETRY,
    msg: 'My awesome message!!!',
    paramList: [new Str('app'), new Str('op'), new Str('foo'), new Int32(32)]
  }, true);

  var wrappedMessageWithLangId = new VerrorConstructor({
    id: 'MyId',
    retryCode: actions.NO_RETRY,
    msg: 'My awesome message!!!',
    paramList: [new Str('app'), new Str('op'), new Str('foo'), new Int32(32)]
  }, true);

  // When we convert from native type to wire type we transfer the _
  wrappedMessageWithLangId._langId = 'en-US';
  var tests = [
    {
      name: 'err, deepWrap = false',
      inValue: err,
      deepWrap: false,
      outValue: { val: wrappedErr }, // any(error)
    }, {
      name: 'err, deepWrap = true',
      inValue: err,
      deepWrap: true,
      outValue: { val: wrappedMessageWithLangId }, // any(error) deep
    }, {
      name: 'wrappedMessage, deepWrap = false',
      inValue: wrappedMessage,
      deepWrap: false,
      outValue: { val: wrappedErr }, // any(error)
    }, {
      name: 'wrappedMessage, deepWrap = true',
      inValue: wrappedMessage,
      deepWrap: true,
      outValue: { val: wrappedMessage }, // any(error) deep
    },
    {
      name: '?err, deepWrap = false',
      inValue: err,
      type: types.ERROR,
      deepWrap: false,
      outValue: { val: wrappedErr } // optional(error)
    },
    {
      name: '?err, deepWrap = true',
      inValue: err,
      type: types.ERROR,
      deepWrap: true,
      outValue: { val: wrappedMessageWithLangId } // optional(error) deep
    }
  ];

  for (var i = 0; i < tests.length; i++) {
    var test = tests[i];

    var type = test.type || types.ANY;
    var canon = canonicalize.value(test.inValue, type, test.deepWrap);
    var outValue = test.outValue;
    t.deepEqual(
      stringify(canon),
      stringify(outValue),
      test.name);
  }
  t.end();
});

test('canonicalize time (to any)', function(t) {
  var d = new Date(1999,11,30,23,59,59);
  var conv = Date.parse('0001-01-01') / 1000;
  var millis = d.getTime();
  var timeStruct = new Time({
    seconds: millis / 1000 - conv,
    nanos: 0,
  }, true);

  var tests = [{
    name: 'date deepWrap = true',
    inValue: d,
    deepWrap: true,
    outValue: {
      val: timeStruct
    }
  }, {
    name: 'date deepWrap = false',
    inValue: d,
    deepWrap: false,
    outValue: { val: d }
  }, {
    name: 'time.Time deepWrap = true',
    inValue: timeStruct,
    deepWrap: true,
    outValue: {
      val: timeStruct
    },
  },{
    name: 'time.Time deepWrap = false',
    inValue: timeStruct,
    deepWrap: false,
    outValue: {
      val: d
    }
  }];

  for (var i = 0; i < tests.length; i++) {
    var test = tests[i];

    var canon = canonicalize.value(test.inValue, types.ANY, test.deepWrap);
    var outValue = test.outValue;
    t.deepEqual(
      stringify(canon),
      stringify(outValue),
      test.name);
  }
  t.end();
});

// Tests the combination of native and vdl values.
var TimeType = Time.prototype._type;
var TimeArray = new Type({
  kind: kind.ARRAY,
  elem: TimeType,
  len: 3
});
var TimeErrStruct = new Type({
  kind: kind.STRUCT,
  fields: [
    {
      name: 'Time',
      type: TimeType
    },
    {
      name: 'Err',
      type: types.ERROR
    }
  ]
});

// The canonical error (input) and its wrapped paramList form.
var CanonError = makeError(
  'cerrID',
  actions.RETRY_BACKOFF,
  'Canonical Error',
  [ types.STRING, types.INT32 ]
);
var cError = new CanonError(null, 'blue', -1); // no ctx, string, int32
var cErrorN = cError.clone(); // The reduced cError params should be wrapped.
cErrorN.paramList = cError.paramList.map(function(p) {
  return { val: p };
});

// Additional constants
var MILLI_TO_NANO = 1000*1000;
var zeroDateOffset = Date.parse('0001-01-01');

[
  {
    name: 'TimeArray',
    type: TimeArray,
    inputObject: [
      new Date(zeroDateOffset),
      new Date(zeroDateOffset+100),
      new Date(zeroDateOffset-2001)
    ],
    outputObject: {
      val: [
        new Date(zeroDateOffset),
        new Date(zeroDateOffset+100),
        new Date(zeroDateOffset-2001)
      ]
    },
    outputObjectDeep: {
      val: [
        {
          seconds: { val: BigInt.fromNativeNumber(0) },
          nanos: { val: 0 }
        },
        {
          seconds: { val: BigInt.fromNativeNumber(0) },
          nanos: { val: 100*MILLI_TO_NANO }
        },
        {
          seconds: { val: BigInt.fromNativeNumber(-3) },
          nanos: { val: 999*MILLI_TO_NANO }
        }
      ]
    }
  },
  {
    name: 'TimeArray (empty)',
    type: TimeArray,
    inputObject: undefined,
    outputObject: {
      val: [new Date(zeroDateOffset), new Date(zeroDateOffset),
      new Date(zeroDateOffset)]
    },
    outputObjectDeep: {
      val: [
        {
          seconds: { val: BigInt.fromNativeNumber(0) },
          nanos: { val: 0 }
        },
        {
          seconds: { val: BigInt.fromNativeNumber(0) },
          nanos: { val: 0 }
        },
        {
          seconds: { val: BigInt.fromNativeNumber(0) },
          nanos: { val: 0 }
        },
      ]
    }
  },
  {
    name: 'TimeErrStruct (empty)',
    type: TimeErrStruct,
    inputObject: undefined,
    outputObject: {
      time: new Date(zeroDateOffset),
      err: null,
    },
    outputObjectDeep: {
      time: {
        seconds: { val: BigInt.fromNativeNumber(0) },
        nanos: { val: 0 }
      },
      err: { val: null }
    }
  },
  {
    name: 'TimeErrStruct',
    type: TimeErrStruct,
    inputObject: {
      time: new Date(zeroDateOffset+4024),
      err: cError
    },
    outputObject: {
      time: new Date(zeroDateOffset+4024),
      err: cErrorN
    },
    outputObjectDeep: {
      time: {
        seconds: { val: BigInt.fromNativeNumber(4) },
        nanos: { val: 24 * MILLI_TO_NANO }
      },
      err: { // optional error
         val: { // error
          _langId: 'en-US',
          id: { val: 'cerrID' },
          retryCode: { val: actions.RETRY_BACKOFF },
          msg: { val: 'Canonical Error' },
          paramList: {
            val: [
              { // any(string)
                val: { val: 'app' }
              },
              { // any(string)
                val: { val: 'op' }
              },
              { // any(string)
                val: { val: 'blue' }
              },
              { // any(int32)
                val: { val: -1 }
              }
            ]
          }
        }
      }
    }
  }
].forEach(function(testCase) {
  test('canonicalize native and vdl -' + testCase.name, function(t) {
    runNativeWireTest(testCase, testCase.type, t);
    t.end();
  });
});

var IntListType = new Type({
  kind: kind.LIST,
  elem: types.INT32
});
var Int3ArrType = new Type({
  kind: kind.ARRAY,
  elem: types.INT32,
  len: 3
});

var IntList = registry.lookupOrCreateConstructor(IntListType);
// This test checks the failure cases of value to type conversion.
// For example, some maps fail to convert to sets, and null optional values
// cannot convert to their base type.
// This test supplements the cross-language conversion tests cases in
// test-vom-compatible.js
[
  {
    name: 'number larger than MAX_FLOAT32',
    inValue: 1e40,
    targetType: types.FLOAT32,
    expectedErr: 'is too large'
  },
  {
    name: 'imag smaller than MAX_FLOAT32 in Complex64',
    inValue: { real: 0, imag: -1e40 },
    targetType: types.COMPLEX64,
    expectedErr: 'is too small'
  },
  {
    name: 'negative, real Complex to uint',
    inValue: new Complex(-4, 0),
    targetType: types.UINT16,
    expectedErr: 'value cannot be negative'
  },
  {
    name: 'null OptString to String',
    inValue: new OptStr(null),
    targetType: types.STRING,
    expectedErr: 'value is null for non-optional type'
  },
  {
    name: 'String to Bool',
    inValue: new Str('not a boolean'),
    targetType: types.BOOL,
    expectedErr: 'not compatible'
  },
  {
    name: 'String to Bool - native',
    inValue: 'not a boolean',
    targetType: types.BOOL,
    expectedErr: 'value is not a boolean'
  },
  {
    name: 'large list to smaller array',
    inValue: new IntList([3, 4, 8, 1]),
    targetType: Int3ArrType,
    expectedErr: 'exceeds type length 3'
  },
  {
    name: 'large list to smaller array - native',
    inValue: [3, 4, 8, 1],
    targetType: Int3ArrType,
    expectedErr: 'exceeds type length 3'
  },
  {
    name: 'map to set',
    inValue: new Map([[4, 'not a bool'], [5, true]]),
    targetType: IntSetType,
    expectedErr: 'this Map value cannot convert to Set'
  }
].forEach(function(testCase) {
  test('canonicalize conversion - failure -' + testCase.name, function(t) {
    t.throws(
      canonicalize.reduce.bind(null, testCase.inValue, testCase.targetType),
      new RegExp('.*' + (testCase.expectedErr || '') + '.*'),
      'fails to convert'
    );
    t.end();
  });
});
