// 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');
  vom.decode(cav.paramVom).then(function(res) {
    t.deepEqual(res, {val: 9}, 'Correct data');
    t.equal(cav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
    t.end();
  }).catch(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');
  vom.decode(cav.paramVom).then(function(res) {
    t.deepEqual(res, {val: 9}, 'Correct data');
    t.deepEqual(res._type, desc.paramType, 'Correct data type');
    t.equal(cav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
    t.end();
  }).catch(t.end);
});

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

test('createUnconstrainedUseCaveat', function(t) {
  var unCon = caveats.unconstrainedUse;
  t.deepEqual(unCon.id, vdlSecurity.ConstCaveat.id, 'Correct id');
  vom.decode(unCon.paramVom).then(function(res) {
    t.deepEqual(res, {val: true}, 'Correct data');
    t.equal(unCon._type, (new vdlSecurity.Caveat())._type, 'Correct type');
    t.end();
  }).catch(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');
  vom.decode(expiryCav.paramVom).then(function(res) {
    t.deepEqual(res, date, 'Correct data');
    t.equal(expiryCav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
    t.end();
  }).catch(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');
  vom.decode(methodCav.paramVom).then(function(res) {
    t.deepEqual(res, {val: methodList}, 'Correct data');
    t.equal(methodCav._type, (new vdlSecurity.Caveat())._type, 'Correct type');
    t.end();
  }).catch(t.end);
});
