// 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('prova');
var types = require('../../src/vdl/types');
var kind = require('../../src/vdl/kind');
var vdlSecurity = require('../vdl-out/v.io/v23/security');
var caveats = require('../../src/security/caveats');
var vom = require('../../src/vom');

test('createCaveat with any-type param', function(t) {
  var desc = {
    id: new Uint8Array([0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
      0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99]),
    paramType: types.ANY,
  };
  var cav = caveats.createCaveat(desc, 9);
  t.deepEqual(cav.id, desc.id, 'Correct id');
  t.deepEqual(vom.decode(cav.paramVom), {val: 9}, 'Correct data');
  t.equal(cav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});

test('createCaveat with incompatible param', function(t) {
  var desc = {
    id: new Uint8Array([0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
      0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99]),
    paramType: types.INT32,
  };
  t.throws(function() {
    caveats.createCaveat(desc, 'AString');
  }, null, 'Should throw when param is incompatible');
  t.end();
});

test('createCaveat with type coversion', function(t) {
  var desc = {
    id: new Uint8Array([0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
      0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99]),
    paramType: {
      kind: kind.INT32,
      name: 'NamedInt'
    },
  };
  var cav = caveats.createCaveat(desc, 9);
  t.deepEqual(cav.id, desc.id, 'Correct id');
  t.deepEqual(vom.decode(cav.paramVom), {val: 9}, 'Correct data');
  t.deepEqual(vom.decode(cav.paramVom)._type, desc.paramType,
    'Correct data type');
  t.equal(cav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});

test('createConstCaveat', function(t) {
  var trueCav = caveats.createConstCaveat(false);
  t.deepEqual(trueCav.id, vdlSecurity.ConstCaveat.id, 'Correct id');
  t.deepEqual(vom.decode(trueCav.paramVom), {val: false}, 'Correct data');
  t.equal(trueCav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});

test('createUnconstrainedUseCaveat', function(t) {
  var unCon = caveats.unconstrainedUse;
  t.deepEqual(unCon.id, vdlSecurity.ConstCaveat.id, 'Correct id');
  t.deepEqual(vom.decode(unCon.paramVom), {val: true}, 'Correct data');
  t.equal(unCon._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});

test('createExpiryCaveat w/ date', function(t) {
  var date = new Date(1920, 3, 4, 9, 10);
  var expiryCav = caveats.createExpiryCaveat(date);
  t.deepEqual(expiryCav.id, vdlSecurity.ExpiryCaveat.id, 'Correct id');
  t.deepEqual(vom.decode(expiryCav.paramVom), date, 'Correct data');
  t.equal(expiryCav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});

test('createExpiryCaveat w/ millisecond representation', function(t) {
  var date = new Date(1920, 3, 4, 9, 10);
  t.throws(function() {
    caveats.createExpiryCaveat(date.getTime());
  }, null, 'Should not be able to pass milliseconds in as a date');
  t.end();
});

test('createMethodCaveat', function(t) {
  var methodList = ['A', 'B', 'C'];
  var methodCav = caveats.createMethodCaveat(methodList);
  t.deepEqual(methodCav.id, vdlSecurity.MethodCaveat.id, 'Correct id');
  t.deepEqual(vom.decode(methodCav.paramVom), {val: methodList},
    'Correct data');
  t.equal(methodCav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
  t.end();
});
