blob: 1a0945519474b2613c643cd33262d5bd37e09aae [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> {
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();
}