// 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.

var test = require('tape');
var base = require('../vdl-out/v.io/x/ref/lib/vdl/testdata/base');
var context = require('../../src/context');
var SharedContextKeys = require('../../src/runtime/shared-context-keys');
var actions = require('../../src/verror/actions');

var kind = require('../../src/vdl').kind;
var types = require('../../src/vdl').types;
var BigInt = require('../../src/vdl').BigInt;

test('named primitive types', function(assert) {
  var res = new base.NamedBool(false);
  assert.deepEqual(res._type, {
    kind: kind.BOOL,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedBool',
  });
  assert.equal(res.val, false);

  res = new base.NamedByte(1);
  assert.deepEqual(res._type,{
    kind: kind.BYTE,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedByte',
  });
  assert.equal(res.val, 1);

  res = new base.NamedUint16(1);
  assert.deepEqual(res._type, {
    kind: kind.UINT16,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedUint16',
  });
  assert.equal(res.val, 1);

  res = new base.NamedUint32(1);
  assert.deepEqual(res._type, {
    kind: kind.UINT32,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedUint32',
  });
  assert.equal(res.val, 1);

  res = new base.NamedUint64(1);
  assert.deepEqual(res._type, {
    kind: kind.UINT64,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedUint64',
  });
  assert.deepEqual(res.val, BigInt.fromNativeNumber(1));

  res = new base.NamedInt8(1);
  assert.deepEqual(res._type, {
    kind: kind.INT8,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedInt8',
  });
  assert.equal(res.val, 1);

  res = new base.NamedInt16(1);
  assert.deepEqual(res._type, {
    kind: kind.INT16,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedInt16',
  });
  assert.equal(res.val, 1);

  res = new base.NamedInt32(1);
  assert.deepEqual(res._type, {
    kind: kind.INT32,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedInt32',
  });
  assert.equal(res.val, 1);

  res = new base.NamedInt64(1);
  assert.deepEqual(res._type, {
    kind: kind.INT64,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedInt64',
  });
  assert.deepEqual(res.val, BigInt.fromNativeNumber(1));

  res = new base.NamedFloat32(1);
  assert.deepEqual(res._type, {
    kind: kind.FLOAT32,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedFloat32',
  });
  assert.equal(res.val, 1);

  res = new base.NamedFloat64(1);
  assert.deepEqual(res._type, {
    kind: kind.FLOAT64,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedFloat64',
  });
  assert.equal(res.val, 1);

  res = new base.NamedComplex64();
  assert.deepEqual(res._type, {
    kind: kind.COMPLEX64,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedComplex64',
  });
  assert.deepEqual(res.val, { real: 0, imag: 0 });

  res = new base.NamedComplex128();
  assert.deepEqual(res._type, {
    kind: kind.COMPLEX128,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedComplex128',
  });
  assert.deepEqual(res.val, { real: 0, imag: 0 });

  res = new base.NamedString('foo');
  assert.deepEqual(res._type, {
    kind: kind.STRING,
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedString',
  });
  assert.equal(res.val, 'foo');
  assert.end();
});

test('named composite types', function(assert) {
  var res = new base.NamedArray([false, true]);
  assert.deepEqual(res._type, {
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedArray',
    kind: kind.ARRAY,
    elem: types.BOOL,
    len: 2,
  });
  assert.deepEquals(res.val, [false, true]);

  res = new base.NamedList([]);
  assert.deepEqual(res._type, {
    name: 'v.io/x/ref/lib/vdl/testdata/base.NamedList',
    kind: kind.LIST,
    elem: types.UINT32
  });
  assert.deepEquals(res.val, []);
  assert.end();
});

test('enum', function(assert) {
    assert.deepEqual(base.NamedEnum.A._type, {
      name: 'v.io/x/ref/lib/vdl/testdata/base.NamedEnum',
      kind: kind.ENUM,
      labels: ['A','B','C']
    });
    assert.deepEqual(base.NamedEnum.A, {val:'A'});
    assert.notDeepEqual(base.NamedEnum.A, base.NamedEnum.B);
    assert.end();
});

// The vdl behavior in createConstructor is to set the fields to their 0-value.
test('struct constructor', function(assert) {
  var res = new base.NamedStruct();
  // Make sure the default values are set.
  assert.equal(res.a, false);
  assert.equal(res.b, '');
  assert.equal(res.c, 0);

  res = new base.NamedStruct({a: true});
  // Make sure overrides are applied
  assert.equal(res.a, true);
  assert.equal(res.b, '');
  assert.equal(res.c, 0);
  assert.end();
});

test('errors', function(assert) {
  var rootContext = new context.Context();
  var enContext = rootContext.withValue(SharedContextKeys.LANG_KEY, 'en');
  var e = new base.WithParams2Error(enContext, 1, 2);
  assert.equal(e._argTypes.length, 2);
  assert.equal(e.message, 'app:op: en x=1 y=2');
  var frContext = rootContext.withValue(SharedContextKeys.LANG_KEY, 'fr');
  e = new base.WithParams2Error(frContext, 1, 2);
  assert.equal(e._argTypes.length, 2);
  assert.equal(e.message, 'app:op: fr y=2 x=1');
  assert.end();

  e = new base.NoParams2Error(rootContext);
  assert.equal(e.retryCode, actions.RETRY_REFETCH);
});
