// 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 ByteArrayMessageWriter = require(
    './../../src/vom/byte-array-message-writer');
var ByteArrayMessageReader = require(
    './../../src/vom/byte-array-message-reader');
var Encoder = require('./../../src/vom/encoder');
var Decoder = require('./../../src/vom/decoder');
var Time = require('../../src/gen-vdl/v.io/v23/vdlroot/time').Time;
var vdl = require('../../src/vdl');
var registry = require('../../src/vdl/native-type-registry');
require('../../src/vom/native-types'); // Register native types.

var expectedDate = new Date(1999, 9, 9, 9, 9, 999);

function encodeDecodeDate(encodeType) {
  var input = expectedDate;
  var messageWriter = new ByteArrayMessageWriter();
  var encoder = new Encoder(messageWriter);
  encoder.encode(input, encodeType);

  var messageReader = new ByteArrayMessageReader(
    messageWriter.getBytes());
  var decoder = new Decoder(messageReader);
  return decoder.decode();
}

// TODO(bprosnitz) Implement native type guessing and enable this test.
test('date - test encoding and decoding without type',
  function(t) {
  var result = encodeDecodeDate();
  t.ok(result instanceof Date, 'Decoded date should be a date object');
  var diff = Math.abs(expectedDate - result);
  t.ok(diff < 1, 'Should decode to the expected date');
  t.end();
});

test('date - test encoding and decoding with type',
  function(t) {
  var result = encodeDecodeDate(Time.prototype._type);
  t.ok(result instanceof Date, 'Decoded date should be a date object');
  t.equal(result.getTime(), expectedDate.getTime(),
    'Should decode to the expected date');
  t.end();
});

test('date - test fromWireValue', function(t) {
  var tests = [
    {expected: '0001-01-01'},
    {seconds: 0, nanos: 0, expected: '0001-01-01'},
    {nanos: 0, expected: '0001-01-01'},
    {seconds: 0, expected: '0001-01-01'},
    {seconds: vdl.BigInt.fromNativeNumber(0), nanos: 0, expected: '0001-01-01'},
    {nanos: 123000000, expected: '0001-01-01T00:00:00.123Z'},
    {seconds: 10, nanos: 345000000, expected: '0001-01-01T00:00:10.345Z'}
  ];
  tests.forEach(function(test) {
    var date = registry.fromWireValue(
      Time.prototype._type, test);
    t.equal(date.getTime(), Date.parse(test.expected), test.expected);
  });
  t.end();
});

test('date - test toWireValue', function(t) {
  var tests = [
    {seconds: 0, nanos: 0, date: '0001-01-01'},
    {seconds: 0, nanos: 123000000, date: '0001-01-01T00:00:00.123Z'},
    {seconds: 10, nanos: 345000000, date: '0001-01-01T00:00:10.345Z'},
    {seconds: 62135596800, nanos: 0, date: '1970-01-01'}
  ];
  tests.forEach(function(test) {
    var time = registry.fromNativeValue(Time.prototype._type,
      new Date(test.date));
    t.equal(time.seconds.val.toNativeNumberApprox(), test.seconds, test.date);
    t.equal(time.nanos.val, test.nanos, test.date);
  });
  t.end();
});
