// Copyright (c) 2011, 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";

// Checks that a method with an instantiated return type can override a method
// with a generic return type.

typedef V RemoveFunctionType<K, V>(K key);

class MapBase<K, V> {
  K remove(K key) {
    throw 'Must be implemented';
  }

  void tests() {
    Expect.isTrue(this is MapBase<int, int>);

    // `remove` takes an argument which is covariant-by-class, so
    // the tear-off has dynamic type `int Function(Object)`.

    Expect.isTrue(remove is RemoveFunctionType);
    Expect.isTrue(remove is RemoveFunctionType<int, int>);
    Expect.isTrue(remove is RemoveFunctionType<String, int>);
    Expect.isTrue(remove is RemoveFunctionType<MapBase<int, int>, int>);
  }
}

class MethodOverrideTest extends MapBase<String, String> {
  String remove(String key) {
    throw 'Must be implemented';
  }

  void tests() {
    Expect.isTrue(this is MethodOverrideTest);
    Expect.isTrue(this is MapBase<String, String>);

    // `remove` takes an argument which is covariant-by-class because
    // an overridden method does so, and hence the tear-off has dynamic
    // type `String Function(Object)`; so does `super.remove`.

    Expect.isTrue(remove is RemoveFunctionType);
    Expect.isTrue(remove is RemoveFunctionType<String, String>);
    Expect.isTrue(remove is! RemoveFunctionType<int, int>);
    Expect.isTrue(super.remove is RemoveFunctionType);
    Expect.isTrue(super.remove is RemoveFunctionType<String, String>);
    Expect.isTrue(super.remove is! RemoveFunctionType<int, int>);
  }
}

main() {
  new MapBase<int, int>().tests();
  new MethodOverrideTest().tests();
}
