| // Copyright (c) 2013, 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. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| class S<T> { |
| bool matches(o) { |
| bool isChecked = checkUsingIs(o); |
| if (checkedMode) { |
| Expect.equals(isChecked, checkUsingCheckedMode(o)); |
| } |
| return isChecked; |
| } |
| |
| bool checkUsingIs(o) { |
| return o is T; |
| } |
| |
| bool checkUsingCheckedMode(o) { |
| try { |
| T x = o; |
| } on Error { |
| return false; |
| } |
| return true; |
| } |
| |
| static final bool checkedMode = computeCheckedMode(); |
| static bool computeCheckedMode() { |
| try { |
| int x = "foo" as dynamic; |
| } on Error { |
| return true; |
| } |
| return false; |
| } |
| } |
| |
| class M {} |
| |
| class C0<T> extends S with M {} |
| |
| class C1<T> extends S<T> with M {} |
| |
| class C2<T> extends S<int> with M {} |
| |
| class C3 extends S<String> with M {} |
| |
| main() { |
| var c0 = new C0(); |
| Expect.isTrue(c0 is S); |
| Expect.isFalse(c0 is S<int>); |
| Expect.isFalse(c0 is S<String>); |
| Expect.isTrue(c0.matches(c0)); |
| Expect.isTrue(c0.matches(42)); |
| Expect.isTrue(c0.matches("hello")); |
| |
| var c0_int = new C0<int>(); |
| Expect.isTrue(c0_int is S); |
| Expect.isFalse(c0_int is S<int>); |
| Expect.isFalse(c0_int is S<String>); |
| Expect.isTrue(c0_int.matches(c0)); |
| Expect.isTrue(c0_int.matches(42)); |
| Expect.isTrue(c0_int.matches("hello")); |
| |
| var c0_String = new C0<String>(); |
| Expect.isTrue(c0_String is S); |
| Expect.isFalse(c0_String is S<int>); |
| Expect.isFalse(c0_String is S<String>); |
| Expect.isTrue(c0_String.matches(c0)); |
| Expect.isTrue(c0_String.matches(42)); |
| Expect.isTrue(c0_String.matches("hello")); |
| |
| var c1 = new C1(); |
| Expect.isTrue(c1 is S); |
| Expect.isFalse(c1 is S<int>); |
| Expect.isFalse(c1 is S<String>); |
| Expect.isTrue(c1.matches(c1)); |
| Expect.isTrue(c1.matches(42)); |
| Expect.isTrue(c1.matches("hello")); |
| |
| var c1_int = new C1<int>(); |
| Expect.isTrue(c1_int is S); |
| Expect.isTrue(c1_int is S<int>); |
| Expect.isFalse(c1_int is S<String>); |
| Expect.isFalse(c1_int.matches(c1)); |
| Expect.isTrue(c1_int.matches(42)); |
| Expect.isFalse(c1_int.matches("hello")); |
| |
| var c1_String = new C1<String>(); |
| Expect.isTrue(c1_String is S); |
| Expect.isFalse(c1_String is S<int>); |
| Expect.isTrue(c1_String is S<String>); |
| Expect.isFalse(c1_String.matches(c1)); |
| Expect.isFalse(c1_String.matches(42)); |
| Expect.isTrue(c1_String.matches("hello")); |
| |
| var c2 = new C2(); |
| Expect.isTrue(c2 is S); |
| Expect.isTrue(c2 is S<int>); |
| Expect.isFalse(c2 is S<String>); |
| Expect.isFalse(c2.matches(c2)); |
| Expect.isTrue(c2.matches(42)); |
| Expect.isFalse(c2.matches("hello")); |
| |
| var c2_int = new C2<int>(); |
| Expect.isTrue(c2_int is S); |
| Expect.isTrue(c2_int is S<int>); |
| Expect.isFalse(c2_int is S<String>); |
| Expect.isFalse(c2_int.matches(c2)); |
| Expect.isTrue(c2_int.matches(42)); |
| Expect.isFalse(c2_int.matches("hello")); |
| |
| var c2_String = new C2<String>(); |
| Expect.isTrue(c2_String is S); |
| Expect.isTrue(c2_String is S<int>); |
| Expect.isFalse(c2_String is S<String>); |
| Expect.isFalse(c2_String.matches(c2)); |
| Expect.isTrue(c2_String.matches(42)); |
| Expect.isFalse(c2_String.matches("hello")); |
| |
| var c3 = new C3(); |
| Expect.isTrue(c3 is S); |
| Expect.isFalse(c3 is S<int>); |
| Expect.isTrue(c3 is S<String>); |
| Expect.isFalse(c3.matches(c2)); |
| Expect.isFalse(c3.matches(42)); |
| Expect.isTrue(c3.matches("hello")); |
| } |