// 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 vom = require('../../src/vom');
var IfaceSigType =
  require('../../src/gen-vdl/v.io/v23/vdlroot/signature').Interface;
var Promise = require('../../src/lib/promise');

test('import paths work', function(assert) {
  // We just need to require the arith package to make sure that
  // require calls in the arith package is exercised. For now
  // we don't have anything interesting to actually check about the
  // result. This file is generated by the vdl tool.
  assert.doesNotThrow(function() {
    require('../vdl-out/v.io/x/ref/lib/vdl/testdata/arith');
  });
  assert.end();
});

test('method signature encode-decode match', function(assert) {
  var arith = require('../vdl-out/v.io/x/ref/lib/vdl/testdata/arith');

  // For every service signature defined...
  var serviceNames = ['Arith', 'Calculator'];
  var promises = [];
  serviceNames.forEach(function(serviceName) {
    if (!arith.hasOwnProperty(serviceName)) {
      assert.fail('Expected interface ' + serviceName + ' to be defined');
      return;
    }
    var signature = arith.AdvancedMath.prototype.
                    _serviceDescription;

    // Encode the signature using the type defined in VDL-generated .js file
    var writer = new vom.ByteMessageWriter();
    var encoder = new vom.Encoder(writer);
    encoder.encode(signature, IfaceSigType.prototype._type);
    var sigEncode = writer.getBytes();

    // Decode the signature.
    var reader = new vom.ByteArrayMessageReader(sigEncode);
    var decoder = new vom.Decoder(reader);
    promises.push(decoder.decode().then(function(sigDecode) {
      // Ensure that what was decoded matches the original signature deeply.
      assert.deepEqual(sigDecode, signature, serviceName + ' signature match');

      // TODO The signature type should be attached to the generated signature
      // This is currently problematic (Issue 432), so manually attaching type
      // for now and NOT passing the type into the encoder.
      var wrappedSignature = new IfaceSigType(signature);

      // Encode the signature as a wrapped struct.
      var writer = new vom.ByteMessageWriter();
      var encoder = new vom.Encoder(writer);
      encoder.encode(wrappedSignature);
      var sigEncode = writer.getBytes();

      // Decode the signature.
      var reader = new vom.ByteArrayMessageReader(sigEncode);
      var decoder = new vom.Decoder(reader);
      return decoder.decode().then(function(sigDecode) {
        assert.deepEqual(sigDecode, wrappedSignature, serviceName +
                         ' wrapped signature match');
      });
    }));
  });
  Promise.all(promises).then(function() {
    assert.end();
  }, assert.end);
});

var expectedAdvancedMathDescription =
  require('../vdl/expected-gen/v.io/x/ref/lib/vdl/testdata/arith').AdvancedMath.
  prototype._serviceDescription;

test('correct service description', function(assert) {
  var arith = require('../vdl-out/v.io/x/ref/lib/vdl/testdata/arith');
  var description = (new arith.AdvancedMath())._serviceDescription;
  assert.deepEqual(description, expectedAdvancedMathDescription,
    'service description matches expectation. (To update the expected ' +
    'service description, run `make gen-vdl-test-expected`.)');
  assert.end();
});
