f205141a42
Change-Id: Ib798b9573ee8ec924f87104684934785fadc8189 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141702 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Leaf Petersen <leafp@google.com> Reviewed-by: Erik Ernst <eernst@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Commit-Queue: Bob Nystrom <rnystrom@google.com>
171 lines
4.0 KiB
Dart
171 lines
4.0 KiB
Dart
// Copyright (c) 2017, 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';
|
|
|
|
class C {
|
|
dynamic f(int x) => x + 1;
|
|
dynamic g(int x) => x + 2;
|
|
}
|
|
|
|
class D extends C {
|
|
f(int x) => x + 41;
|
|
get superF => super.f;
|
|
get superG => super.g;
|
|
}
|
|
|
|
tearoffEquals(f1, f2) {
|
|
Expect.equals(f1, f2);
|
|
Expect.equals(f1.hashCode, f2.hashCode);
|
|
}
|
|
|
|
tearoffNotEquals(f1, f2) {
|
|
Expect.notEquals(f1, f2);
|
|
Expect.notEquals(f1.hashCode, f2.hashCode);
|
|
}
|
|
|
|
testDynamic() {
|
|
C c = new C();
|
|
|
|
dynamic f1 = c.f;
|
|
Expect.throws(() => f1(2.5));
|
|
Expect.equals(f1(41), 42);
|
|
|
|
dynamic f2 = (c as dynamic).f;
|
|
Expect.throws(() => f2(2.5));
|
|
Expect.equals(f2(41), 42);
|
|
|
|
tearoffEquals(f1, f1);
|
|
tearoffEquals(f1, f2);
|
|
tearoffEquals(f1, c.f);
|
|
tearoffEquals(c.g, (c as dynamic).g);
|
|
|
|
tearoffNotEquals(f1, new C().f);
|
|
tearoffNotEquals(f1, (new C() as dynamic).f);
|
|
tearoffNotEquals(f1, c.g);
|
|
tearoffNotEquals(f1, (c as dynamic).g);
|
|
tearoffNotEquals(null, f1);
|
|
tearoffNotEquals(f1, null);
|
|
}
|
|
|
|
testSuper() {
|
|
D d = new D();
|
|
dynamic superF1 = d.superF;
|
|
dynamic superF2 = (d as dynamic).superF;
|
|
|
|
Expect.throws(() => superF1(2.5));
|
|
Expect.throws(() => superF2(2.5));
|
|
Expect.equals(superF1(41), 42);
|
|
Expect.equals(superF2(41), 42);
|
|
|
|
tearoffEquals(superF1, superF1);
|
|
tearoffEquals(superF1, superF2);
|
|
tearoffEquals(superF1, d.superF);
|
|
tearoffEquals(d.f, (d as dynamic).f);
|
|
|
|
tearoffNotEquals(superF1, d.f);
|
|
tearoffNotEquals(superF1, (d as dynamic).f);
|
|
tearoffNotEquals(superF1, new D().superF);
|
|
tearoffNotEquals(superF1, (new D() as dynamic).superF);
|
|
tearoffNotEquals(superF1, d.superG);
|
|
tearoffNotEquals(superF1, (d as dynamic).superG);
|
|
|
|
tearoffEquals(d.superG, (d as dynamic).superG);
|
|
tearoffEquals(d.g, d.superG);
|
|
}
|
|
|
|
class S {
|
|
final int id;
|
|
S(this.id);
|
|
toString() => 'S#$id';
|
|
}
|
|
|
|
testToString() {
|
|
testType<T>(T c) {
|
|
dynamic d = c;
|
|
Object? o = c;
|
|
tearoffEquals(c.toString, d.toString);
|
|
tearoffEquals(c.toString, o.toString);
|
|
|
|
var expected = c.toString();
|
|
dynamic f = d.toString;
|
|
tearoffEquals(f(), expected);
|
|
f = o.toString;
|
|
tearoffEquals(f(), expected);
|
|
var g = c.toString;
|
|
tearoffEquals(g(), expected);
|
|
}
|
|
|
|
testType(new C());
|
|
testType(new D());
|
|
testType(new S(1));
|
|
testType(new S(2));
|
|
testType(new Object());
|
|
testType(null);
|
|
testType(Object); // Type
|
|
testType(C); // Type
|
|
testType(42);
|
|
testType('hi');
|
|
testType(true);
|
|
testType([1, 2, 3]);
|
|
testType({'a': 'b'});
|
|
testType((x) => x + 1);
|
|
testType(testType as dynamic); // illegal inferred type for T otherwise
|
|
}
|
|
|
|
class N {
|
|
noSuchMethod(i) => i;
|
|
}
|
|
|
|
testNoSuchMethod() {
|
|
// Create an invocation.
|
|
Invocation i = (new N() as dynamic).foo(1, bar: 2);
|
|
tearoffEquals(i.memberName, #foo);
|
|
|
|
testType<T>(T c) {
|
|
dynamic d = c;
|
|
Object? o = c;
|
|
tearoffEquals(c.noSuchMethod, d.noSuchMethod);
|
|
tearoffEquals(c.noSuchMethod, o.noSuchMethod);
|
|
|
|
var expected;
|
|
try {
|
|
c.noSuchMethod(i);
|
|
} on NoSuchMethodError catch (error) {
|
|
var nsm = '$error';
|
|
Expect.isTrue(nsm.startsWith("NoSuchMethodError: "));
|
|
Expect.isTrue(nsm.contains("'foo'"));
|
|
expected = (e) => e is NoSuchMethodError && '$e' == nsm;
|
|
}
|
|
dynamic f = d.noSuchMethod;
|
|
Expect.throws(() => f(i), expected);
|
|
f = o.noSuchMethod;
|
|
Expect.throws(() => f(i), expected);
|
|
var g = c.noSuchMethod;
|
|
Expect.throws(() => g(i), expected);
|
|
}
|
|
|
|
testType(new C());
|
|
testType(new D());
|
|
testType(new S(1));
|
|
testType(new S(2));
|
|
testType(new Object());
|
|
testType(null);
|
|
testType(Object); // Type
|
|
testType(C); // Type
|
|
testType(42);
|
|
testType('hi');
|
|
testType(true);
|
|
testType([1, 2, 3]);
|
|
testType({'a': 'b'});
|
|
testType((x) => x + 1);
|
|
testType(testType as dynamic); // illegal inferred type for T otherwise
|
|
}
|
|
|
|
main() {
|
|
testDynamic();
|
|
testSuper();
|
|
testToString();
|
|
testNoSuchMethod();
|
|
}
|