// 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 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();
});
