#!/usr/bin/env dart
// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library client_generator_test;

import 'package:protoc_plugin/indenting_writer.dart';
import 'package:protoc_plugin/protoc.dart';
import 'package:test/test.dart';

import 'service_util.dart';

void main() {
  test('testClientGenerator', () {
    // NOTE: Below > 80 cols because it is matching generated code > 80 cols.
    String expected = r'''
class TestApi {
  RpcClient _client;
  TestApi(this._client);

  Future<SomeReply> aMethod(ClientContext ctx, SomeRequest request) {
    var emptyResponse = new SomeReply();
    return _client.invoke(ctx, 'Test', 'AMethod', request, emptyResponse);
  }
  Future<foo$bar.AnotherReply> anotherMethod(ClientContext ctx, foo$bar.EmptyMessage request) {
    var emptyResponse = new foo$bar.AnotherReply();
    return _client.invoke(ctx, 'Test', 'AnotherMethod', request, emptyResponse);
  }
}

''';
    var fd = buildFileDescriptor("testpkg", ["SomeRequest", "SomeReply"]);
    fd.service.add(buildServiceDescriptor());
    var fg = new FileGenerator(fd);

    var fd2 = buildFileDescriptor("foo.bar", ["EmptyMessage", "AnotherReply"]);
    var fg2 = new FileGenerator(fd2);

    link(new GenerationOptions(), [fg, fg2]);

    ClientApiGenerator cag = fg.clientApiGenerators[0];

    IndentingWriter writer = new IndentingWriter();
    cag.generate(writer);
    expect(writer.toString(), expected);
  });
}
