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