blob: b1a8b1d5fde371d6f3639108a296724e9093d7e6 [file] [log] [blame]
// 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> 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();
}