// 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.

/**
 * @fileoverview Tests the invoker and signature generation on the
 * vdl-generated testdata/base.js file.
 * This test is primarily to ensure that the vdl-generated format remains
 * compatible with that expected by the JavaScript signature generator.
 */

var test = require('prova');
var Invoker = require('../../src/invocation/invoker.js');
var Context = require('../../src/context').Context;
var vdl = require('../../src/vdl');
var stringify = require('../../src/vdl/stringify');
var base = require('../vdl-out/v.io/x/ref/lib/vdl/testdata/base');

function BasePartialImpl() {
}

BasePartialImpl.prototype.methodA3 = function(ctx, serverCall, $stream, a) {
    return ['methodA3', $stream, a];
};

BasePartialImpl.prototype.methodA4 = function(ctx, serverCall, $stream, a) {
  return;
};

BasePartialImpl.prototype.methodB1 = function(ctx, serverCall, a, b, cb) {
  cb(null);
};

test('Invoker and signature for vdl-generated base.js',
    function(t) {
    var impl = new BasePartialImpl();

    // We attach service description directly because we want to implement only
    // part of ServiceB. We check the generated signature and see that the
    // unimplemented methods were properly removed.
    // The alternative, BasePartialImpl.prototype = new base.ServiceB();
    // would not work because ServiceB has method stubs on its prototype.
    impl._serviceDescription = base.ServiceB.prototype._serviceDescription;
    var injections = {
      context: new Context(),
      stream: 'stream'
    };
    var invoker = new Invoker(impl);

    invoker.invoke('MethodA3', ['a'], injections, function(err, res) {
        t.error(err);
        t.deepEquals(res, [['methodA3', 'stream', 'a']]);

        var scalarsType = new base.Scalars()._type;
        var compositesType = new base.Composites()._type;
        var compCompType = new base.CompComp()._type;

        var sig = invoker.signature();
        var expectedSig = [{
            'name': 'ServiceB',
            'pkgPath': 'v.io/x/ref/lib/vdl/testdata/base',
            'doc': '',
            'embeds': [
                {
                    'name': 'ServiceA',
                    'pkgPath': 'v.io/x/ref/lib/vdl/testdata/base',
                    'doc': ''
                }
            ],
            'methods': [
                {
                    'name': 'MethodA3',
                    'doc': '',
                    'inArgs': [
                        {
                            'name': 'a',
                            'doc': '',
                            'type': vdl.types.INT32
                        }
                    ],
                    'outArgs': [
                        {
                            'name': 's',
                            'doc': '',
                            'type': vdl.types.STRING
                        }
                    ],
                    'inStream': null,
                    'outStream': {
                        'name': '',
                        'doc': '',
                        'type': scalarsType
                    },
                    'tags': [
                        {
                            val: 'tag'
                        },
                        {
                            val: new vdl.BigInt(1, new Uint8Array([0x6]))
                        }
                    ]
                },
                {
                    'name': 'MethodA4',
                    'doc': '',
                    'inArgs': [
                        {
                            'name': 'a',
                            'doc': '',
                            'type': vdl.types.INT32
                        }
                    ],
                    'outArgs': [],
                    'inStream': {
                        'name': '',
                        'doc': '',
                        'type': vdl.types.INT32
                    },
                    'outStream': {
                        'name': '',
                        'doc': '',
                        'type': vdl.types.STRING
                    },
                    'tags': []
                },
                {
                    'name': 'MethodB1',
                    'doc': '',
                    'inArgs': [
                        {
                            'name': 'a',
                            'doc': '',
                            'type': scalarsType
                        },
                        {
                            'name': 'b',
                            'doc': '',
                            'type': compositesType
                        }
                    ],
                    'outArgs': [
                        {
                            'name': 'c',
                            'doc': '',
                            'type': compCompType
                        }
                    ],
                    'inStream': null,
                    'outStream': null,
                    'tags': []
                }
            ]
        }];

        var expectedStr = stringify(expectedSig);
        var resultStr = stringify(sig);

        t.equals(resultStr, expectedStr);
        t.end();
    });
});
