// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:test/test.dart';
import 'package:fidl/fidl.dart' show MethodException;
import 'package:fidl_fidl_examples_bindingstest/fidl_async.dart';

import './server.dart';

void main() async {
  TestServerInstance server;

  group('error', () {
    setUpAll(() async {
      server = TestServerInstance();
      await server.start();
    });

    tearDownAll(() async {
      await server.stop();
      server = null;
    });

    test('zero arguments, int error', () {
      expect(server.proxy.replyWithErrorZero(false), completion(anything));
      expect(server.proxy.replyWithErrorZero(true),
          throwsA(predicate((err) => err is MethodException && err.value == 23)));
    });

    test('one argument, int error', () {
      expect(server.proxy.replyWithErrorOne(false, 'hello'),
          completion(equals('hello')));
      expect(server.proxy.replyWithErrorOne(true, 'hello'),
          throwsA(predicate((err) => err is MethodException && err.value == 42)));
    });

    test('more arguments, int error', () {
      expect(
          server.proxy.replyWithErrorMore(false, 'hello', false),
          completion(predicate(
              (TestServer$ReplyWithErrorMore$Response response) =>
                  response.value == 'hello' && response.otherValue == false)));
      expect(server.proxy.replyWithErrorMore(true, 'hello', false),
          throwsA(predicate((err) => err is MethodException && err.value == 666)));
    });

    test('zero arguments, enum error', () {
      expect(server.proxy.replyWithErrorEnumZero(false), completion(anything));
      expect(server.proxy.replyWithErrorEnumZero(true),
          throwsA(predicate((err) => err is MethodException && err.value ==
              EnumOne.one)));
    });

    test('one argument, enum error', () {
      expect(server.proxy.replyWithErrorEnumOne(false, 'hello'),
          completion(equals('hello')));
      expect(server.proxy.replyWithErrorEnumOne(true, 'hello'),
          throwsA(predicate((err) => err is MethodException && err.value ==
              EnumOne.two)));
    });

    test('more arguments, enum error', () {
      expect(
          server.proxy.replyWithErrorEnumMore(false, 'hello', false),
          completion(predicate(
              (TestServer$ReplyWithErrorEnumMore$Response response) =>
                  response.value == 'hello' && response.otherValue == false)));
      expect(server.proxy.replyWithErrorEnumMore(true, 'hello', false),
          throwsA(predicate((err) => err is MethodException && err.value ==
              EnumOne.three)));
    });
  });
}
