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

// 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> implements Map<K, V> {
  K remove(K key) {
    throw 'Must be implemented';
  }

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

    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>);

    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() {
  // Since method overriding is only checked statically, explicitly check
  // the subtyping relation using a function type alias.
  var x = new MethodOverrideTest();
  Expect.isTrue(x.remove is RemoveFunctionType<String, String>);

  // Perform a few more tests.
  x.Tests();

  var m = new MapBase<int, int>();
  Expect.isTrue(m.remove is RemoveFunctionType<int, int>);

  // Perform a few more tests.
  m.Tests();
}
