// Copyright (c) 2016, 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.

import 'package:expect/expect.dart';

typedef O Convert<I, O>(I input);
typedef Other(a, b);

class Mixin<E> {
  E convert1<I>(I input) => null;
}

class Class<F> extends Object with Mixin<F> {
  O convert2<O>(F input) => null;
}

O convert<I, O>(I input) => null;

test1() {
  var val = new Class<String>();
  Expect.isTrue(val.convert1 is Convert);
  Expect.isTrue(val.convert1 is Convert<String, String>);
  Expect.isTrue(val.convert1 is Convert<int, String>);
  Expect.isFalse(val.convert1 is Convert<String, int>);
  Expect.isFalse(val.convert1 is Other);
}

test2() {
  var val = new Class<String>();
  Expect.isTrue(val.convert2 is Convert);
  Expect.isTrue(val.convert2 is Convert<String, String>);
  Expect.isTrue(val.convert2 is Convert<String, int>);
  Expect.isFalse(val.convert2 is Convert<int, String>);
  Expect.isFalse(val.convert2 is Other);
}

test3() {
  Expect.isTrue(convert is Convert);
  Expect.isTrue(convert is Convert<String, String>);
  Expect.isTrue(convert is Convert<String, int>);
  Expect.isTrue(convert is Convert<int, String>);
  Expect.isFalse(convert is Other);
}

main() {
  test1(); /// 01: ok
  test2(); /// 02: ok
  test3(); /// 03: ok
}