Index: tests/language_strong/tearoff_dynamic_test.dart |
diff --git a/tests/language_strong/tearoff_dynamic_test.dart b/tests/language_strong/tearoff_dynamic_test.dart |
index e23c22fc493d09ab14e32bdac5903831391748b6..cfb0ec507bf67dac69fd327c7f6b1ba5ee01b920 100644 |
--- a/tests/language_strong/tearoff_dynamic_test.dart |
+++ b/tests/language_strong/tearoff_dynamic_test.dart |
@@ -1,29 +1,168 @@ |
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// 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 Foo { |
- dynamic method(int x) {} |
- dynamic method2(int x) {} |
+class C { |
+ dynamic f(int x) => x + 1; |
+ dynamic g(int x) => x + 2; |
} |
-main() { |
- Foo foo = new Foo(); |
+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 dynamicMethod1 = foo.method; |
- Expect.throws(() => dynamicMethod1(2.5)); |
+ dynamic f2 = (c as dynamic).f; |
+ Expect.throws(() => f2(2.5)); |
+ Expect.equals(f2(41), 42); |
- dynamic dynamicMethod2 = (foo as dynamic).method; |
- Expect.throws(() => dynamicMethod2(2.5)); |
+ tearoffEquals(f1, f1); |
+ tearoffEquals(f1, f2); |
+ tearoffEquals(f1, c.f); |
+ tearoffEquals(c.g, (c as dynamic).g); |
- Expect.equals(dynamicMethod1, dynamicMethod1); |
- Expect.equals(dynamicMethod1, dynamicMethod2); |
- Expect.equals(dynamicMethod1, foo.method); |
- Expect.equals(foo.method2, (foo as dynamic).method2); |
+ tearoffNotEquals(f1, new C().f); |
+ tearoffNotEquals(f1, (new C() as dynamic).f); |
+ tearoffNotEquals(f1, c.g); |
+ tearoffNotEquals(f1, (c as dynamic).g); |
+} |
+ |
+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); |
+} |
- Expect.notEquals(dynamicMethod1, new Foo().method); |
- Expect.notEquals(dynamicMethod1, (new Foo() as dynamic).method); |
- Expect.notEquals(dynamicMethod1, foo.method2); |
- Expect.notEquals(dynamicMethod1, (foo as dynamic).method2); |
+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); |
+} |
+ |
+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); |
+} |
+ |
+main() { |
+ testDynamic(); |
+ testSuper(); |
+ testToString(); |
+ testNoSuchMethod(); |
} |