Skip to content

Commit 50623f0

Browse files
srujzsCommit Queue
authored and
Commit Queue
committed
Do simple type tests using T in non-external methods in js_interop_non_external_test
It's possible with changes in how we handle generics in DDC that T might not be the type we expect at runtime. So, we should test to make sure that it is by doing some simple type tests in the body of non-external methods of JS interop classes. Change-Id: I0220b2bced4e5769e3728833204dfb3ac19f26d3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/378572 Reviewed-by: Nicholas Shahan <[email protected]> Commit-Queue: Srujan Gaddam <[email protected]>
1 parent b39f386 commit 50623f0

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

tests/dartdevc/js_interop_non_external_lib.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,24 @@
99
@JS()
1010
library js_interop_non_external_lib;
1111

12+
import 'package:expect/expect.dart';
1213
import 'package:js/js.dart';
1314

1415
@JS('JSClass')
15-
class OtherJSClass<T> {
16+
class OtherJSClass<T extends num> {
1617
external OtherJSClass.cons(T t);
1718
factory OtherJSClass(T t) {
19+
// Do a simple test using T.
20+
Expect.type<T>(t);
21+
Expect.notType<T>('');
1822
field = 'unnamed';
1923
return OtherJSClass.cons(t);
2024
}
2125

2226
factory OtherJSClass.named(T t) {
27+
// Do a simple test using T.
28+
Expect.type<T>(t);
29+
Expect.notType<T>('');
2330
field = 'named';
2431
return OtherJSClass.cons(t);
2532
}
@@ -37,5 +44,10 @@ class OtherJSClass<T> {
3744

3845
static String method() => field;
3946

40-
static T genericMethod<T>(T t) => t;
47+
static T genericMethod<T extends num>(T t) {
48+
// Do a simple test using T.
49+
Expect.type<T>(t);
50+
Expect.notType<T>('');
51+
return t;
52+
}
4153
}

tests/dartdevc/js_interop_non_external_test.dart

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
@JS()
88
library js_interop_non_external_test;
99

10+
import 'package:expect/expect.dart';
1011
import 'package:expect/minitest.dart'; // ignore: deprecated_member_use_from_same_package
1112
import 'package:js/js.dart';
1213

@@ -41,7 +42,12 @@ class JSClass {
4142

4243
static String method() => field;
4344

44-
static T genericMethod<T>(T t) => t;
45+
static T genericMethod<T extends num>(T t) {
46+
// Do a simple test using T.
47+
Expect.type<T>(t);
48+
Expect.notType<T>('');
49+
return t;
50+
}
4551
}
4652

4753
@JS('JSClass')
@@ -103,10 +109,10 @@ void testLocal() {
103109

104110
// Test methods and their tear-offs.
105111
expect(JSClass.method(), JSClass.field);
106-
expect(JSClass.genericMethod(JSClass.field), JSClass.field);
112+
expect(JSClass.genericMethod(0), 0);
107113

108114
expect((JSClass.method)(), JSClass.field);
109-
expect((JSClass.genericMethod)(JSClass.field), JSClass.field);
115+
expect((JSClass.genericMethod)(0), 0);
110116

111117
// Briefly check that other interop classes work too.
112118
expect(StaticInterop.field, '');
@@ -133,28 +139,28 @@ void testNonLocal() {
133139

134140
OtherJSClass<int>(0);
135141
expect(OtherJSClass.field, 'unnamed');
136-
OtherJSClass.named('');
142+
OtherJSClass.named(0);
137143
expect(OtherJSClass.field, 'named');
138-
OtherJSClass<bool>.redirecting(true);
144+
OtherJSClass<double>.redirecting(0.1);
139145
expect(OtherJSClass.field, 'unnamed');
140146

141147
(OtherJSClass.cons)(0);
142148
(OtherJSClass<int>.new)(0);
143149
expect(OtherJSClass.field, 'unnamed');
144-
(OtherJSClass.named)('');
150+
(OtherJSClass.named)(0);
145151
expect(OtherJSClass.field, 'named');
146-
(OtherJSClass<bool>.redirecting)(true);
152+
(OtherJSClass<double>.redirecting)(0.1);
147153
expect(OtherJSClass.field, 'unnamed');
148154

149155
expect(OtherJSClass.getSet, OtherJSClass.field);
150156
OtherJSClass.getSet = 'set';
151157
expect(OtherJSClass.field, 'set');
152158

153159
expect(OtherJSClass.method(), OtherJSClass.field);
154-
expect(OtherJSClass.genericMethod(OtherJSClass.field), OtherJSClass.field);
160+
expect(OtherJSClass.genericMethod(0), 0);
155161

156162
expect((OtherJSClass.method)(), OtherJSClass.field);
157-
expect((OtherJSClass.genericMethod)(OtherJSClass.field), OtherJSClass.field);
163+
expect((OtherJSClass.genericMethod)(0), 0);
158164
}
159165

160166
void main() {

0 commit comments

Comments
 (0)