| // Copyright (c) 2021, 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 |
| |
| // Tests subtyping relationships between JS and anonymous classes. |
| |
| @JS() |
| library subtyping_test_util; |
| |
| import 'package:js/js.dart'; |
| import 'package:expect/minitest.dart'; |
| |
| @JS() |
| class JSClassA {} |
| |
| @JS() |
| class JSClassB {} |
| |
| @JS() |
| @anonymous |
| class AnonymousClassA {} |
| |
| @JS() |
| @anonymous |
| class AnonymousClassB {} |
| |
| class DartClass {} |
| |
| JSClassA returnJS() => throw ''; |
| |
| AnonymousClassA returnAnon() => throw ''; |
| |
| DartClass returnDartClass() => throw ''; |
| |
| // Avoid static type optimization by running all tests using this. |
| @pragma('dart2js:noInline') |
| @pragma('dart2js:assumeDynamic') |
| confuse(x) => x; |
| |
| void testSubtyping() { |
| // Checks subtyping with the same type. |
| expect(returnJS is JSClassA Function(), true); |
| expect(returnAnon is AnonymousClassA Function(), true); |
| |
| // Subtyping between JS and anonymous classes. |
| expect(returnJS is AnonymousClassA Function(), true); |
| expect(returnAnon is JSClassA Function(), true); |
| |
| // Subtyping between same type of package:js classes. |
| expect(returnJS is JSClassB Function(), true); |
| expect(returnAnon is AnonymousClassB Function(), true); |
| |
| // No subtyping between JS/anonymous classes and Dart classes. |
| expect(returnJS is DartClass Function(), false); |
| expect(returnDartClass is JSClassA Function(), false); |
| expect(returnAnon is DartClass Function(), false); |
| expect(returnDartClass is AnonymousClassA Function(), false); |
| |
| // Repeat the checks but using `confuse` to coerce runtime checks instead of |
| // compile-time like above. |
| expect(confuse(returnJS) is JSClassA Function(), true); |
| expect(confuse(returnAnon) is AnonymousClassA Function(), true); |
| |
| expect(confuse(returnJS) is AnonymousClassA Function(), true); |
| expect(confuse(returnAnon) is JSClassA Function(), true); |
| |
| expect(confuse(returnJS) is JSClassB Function(), true); |
| expect(confuse(returnAnon) is AnonymousClassB Function(), true); |
| |
| expect(confuse(returnJS) is DartClass Function(), false); |
| expect(confuse(returnDartClass) is JSClassA Function(), false); |
| expect(confuse(returnAnon) is DartClass Function(), false); |
| expect(confuse(returnDartClass) is AnonymousClassA Function(), false); |
| } |