// 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 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 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(); }