[pkg:js] Amend lowerings tests to use @JS on all top-levels and refactory trustTypes tests out

dart2wasm does not allow top-level externals to not be annotated
with @JS, even if the library is. trustTypes also is not supported
on dart2wasm.

Change-Id: I8c1d146dcf5d9f97559e854be690bb98726513b1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/279757
Commit-Queue: Srujan Gaddam <srujzs@google.com>
Reviewed-by: Joshua Litt <joshualitt@google.com>
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
index d3ad5e8..7f6fd20 100644
--- a/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart
@@ -9,7 +9,7 @@
 import 'dart:_js_interop';
 
 import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
 
 @JS()
 external dynamic eval(String code);
@@ -44,23 +44,18 @@
   external String get initialValue;
 }
 
-@JS('ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
-  external static double field;
-  external static double get getSet;
-  external static double method();
-}
-
 // Top-level fields.
+@JS()
 external String field;
 @JS('field')
 external String renamedField;
+@JS()
 external final String finalField;
 
 // Top-level getters and setters.
+@JS()
 external String get getSet;
+@JS()
 external set getSet(String val);
 @JS('getSet')
 external String get renamedGetSet;
@@ -68,7 +63,9 @@
 external set renamedGetSet(String val);
 
 // Top-level methods.
+@JS()
 external String method();
+@JS()
 external String differentArgsMethod(String a, [String b = '']);
 @JS('method')
 external String renamedMethod();
@@ -129,14 +126,6 @@
       'optionalmethod');
   expect(ExternalStatic.renamedMethod(), 'method');
   expect((ExternalStatic.renamedMethod)(), 'method');
-
-  // Use wrong return type in conjunction with `@trustTypes`.
-  expect(ExternalStaticTrustType.field, 'renamedField');
-
-  expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
-  expect(ExternalStaticTrustType.method(), 'method');
-  expect((ExternalStaticTrustType.method)(), 'method');
 }
 
 void testTopLevelMembers() {
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
new file mode 100644
index 0000000..074416d
--- /dev/null
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2023, 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.
+
+@JS()
+library external_static_member_lowerings_trusttypes_test;
+
+// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_interop';
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart' show trustTypes, staticInterop;
+
+@JS()
+external dynamic eval(String code);
+
+@JS('ExternalStatic')
+@staticInterop
+@trustTypes
+class ExternalStaticTrustType {
+  external static double field;
+  external static double get getSet;
+  external static double method();
+}
+
+// dart2js is smart enough to see that the expectations below will never be true
+// as the types are incompatible. Therefore, it optimizes the expectation code
+// to *always fail*, even if the values are the same! Since we're breaking
+// soundness with @trustTypes, we need to confuse dart2js enough that it doesn't
+// do those optimizations, hence this.
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+confuse(x) => x;
+
+void main() {
+  eval('''
+    globalThis.ExternalStatic = function ExternalStatic() {}
+    globalThis.ExternalStatic.method = function() {
+      return 'method';
+    }
+    globalThis.ExternalStatic.field = 'field';
+    globalThis.ExternalStatic.getSet = 'getSet';
+  ''');
+
+  // Use wrong return type in conjunction with `@trustTypes`.
+  expect(confuse(ExternalStaticTrustType.field), 'field');
+
+  expect(confuse(ExternalStaticTrustType.getSet), 'getSet');
+
+  expect(confuse(ExternalStaticTrustType.method()), 'method');
+  expect(confuse((ExternalStaticTrustType.method)()), 'method');
+}
diff --git a/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart b/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
index b5ada37..663b19f 100644
--- a/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
+++ b/tests/lib/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
@@ -13,7 +13,7 @@
 import 'dart:js_util' as js_util;
 
 import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
 
 @JS('library3.ExternalStatic')
 @staticInterop
@@ -45,15 +45,6 @@
   external String get initialValue;
 }
 
-@JS('library3.ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
-  external static double field;
-  external static double get getSet;
-  external static double method();
-}
-
 void main() {
   // Use `callMethod` instead of top-level external to `eval` since the library
   // is namespaced.
@@ -107,7 +98,9 @@
 external final String finalField;
 
 // Top-level getters and setters.
+@JS()
 external String get getSet;
+@JS()
 external set getSet(String val);
 @JS('library3.namespacedGetSet')
 external String get namespacedGetSet;
@@ -115,7 +108,9 @@
 external set namespacedGetSet(String val);
 
 // Top-level methods.
+@JS()
 external String method();
+@JS()
 external String differentArgsMethod(String a, [String b = '']);
 @JS('library3.namespacedMethod')
 external String namespacedMethod();
@@ -146,14 +141,6 @@
       'optionalmethod');
   expect(ExternalStatic.renamedMethod(), 'method');
   expect((ExternalStatic.renamedMethod)(), 'method');
-
-  // Use wrong return type in conjunction with `@trustTypes`.
-  expect(ExternalStaticTrustType.field, 'renamedField');
-
-  expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
-  expect(ExternalStaticTrustType.method(), 'method');
-  expect((ExternalStaticTrustType.method)(), 'method');
 }
 
 void testTopLevelMembers() {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index cad10e6..f7dd64e 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -8,8 +8,7 @@
 convert/utf85_test: Skip # Pass, Slow Issue 12644.
 
 [ $compiler == dart2wasm ]
-js/static_interop_test/external_static_member_lowerings_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm. TODO(srujzs): Refactor that code out.
-js/static_interop_test/external_static_member_lowerings_with_namespaces_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm. TODO(srujzs): Refactor that code out.
+js/static_interop_test/external_static_member_lowerings_trusttypes_test: SkipByDesign # Tests @trustTypes, which is unsupported on dart2wasm.
 
 [ $mode == product ]
 developer/timeline_test: Skip # Not supported
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
index d3ad5e8..7f6fd20 100644
--- a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_test.dart
@@ -9,7 +9,7 @@
 import 'dart:_js_interop';
 
 import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
 
 @JS()
 external dynamic eval(String code);
@@ -44,23 +44,18 @@
   external String get initialValue;
 }
 
-@JS('ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
-  external static double field;
-  external static double get getSet;
-  external static double method();
-}
-
 // Top-level fields.
+@JS()
 external String field;
 @JS('field')
 external String renamedField;
+@JS()
 external final String finalField;
 
 // Top-level getters and setters.
+@JS()
 external String get getSet;
+@JS()
 external set getSet(String val);
 @JS('getSet')
 external String get renamedGetSet;
@@ -68,7 +63,9 @@
 external set renamedGetSet(String val);
 
 // Top-level methods.
+@JS()
 external String method();
+@JS()
 external String differentArgsMethod(String a, [String b = '']);
 @JS('method')
 external String renamedMethod();
@@ -129,14 +126,6 @@
       'optionalmethod');
   expect(ExternalStatic.renamedMethod(), 'method');
   expect((ExternalStatic.renamedMethod)(), 'method');
-
-  // Use wrong return type in conjunction with `@trustTypes`.
-  expect(ExternalStaticTrustType.field, 'renamedField');
-
-  expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
-  expect(ExternalStaticTrustType.method(), 'method');
-  expect((ExternalStaticTrustType.method)(), 'method');
 }
 
 void testTopLevelMembers() {
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
new file mode 100644
index 0000000..074416d
--- /dev/null
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_trusttypes_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2023, 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.
+
+@JS()
+library external_static_member_lowerings_trusttypes_test;
+
+// ignore: IMPORT_INTERNAL_LIBRARY
+import 'dart:_js_interop';
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart' show trustTypes, staticInterop;
+
+@JS()
+external dynamic eval(String code);
+
+@JS('ExternalStatic')
+@staticInterop
+@trustTypes
+class ExternalStaticTrustType {
+  external static double field;
+  external static double get getSet;
+  external static double method();
+}
+
+// dart2js is smart enough to see that the expectations below will never be true
+// as the types are incompatible. Therefore, it optimizes the expectation code
+// to *always fail*, even if the values are the same! Since we're breaking
+// soundness with @trustTypes, we need to confuse dart2js enough that it doesn't
+// do those optimizations, hence this.
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+confuse(x) => x;
+
+void main() {
+  eval('''
+    globalThis.ExternalStatic = function ExternalStatic() {}
+    globalThis.ExternalStatic.method = function() {
+      return 'method';
+    }
+    globalThis.ExternalStatic.field = 'field';
+    globalThis.ExternalStatic.getSet = 'getSet';
+  ''');
+
+  // Use wrong return type in conjunction with `@trustTypes`.
+  expect(confuse(ExternalStaticTrustType.field), 'field');
+
+  expect(confuse(ExternalStaticTrustType.getSet), 'getSet');
+
+  expect(confuse(ExternalStaticTrustType.method()), 'method');
+  expect(confuse((ExternalStaticTrustType.method)()), 'method');
+}
diff --git a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
index b5ada37..663b19f 100644
--- a/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
+++ b/tests/lib_2/js/static_interop_test/external_static_member_lowerings_with_namespaces_test.dart
@@ -13,7 +13,7 @@
 import 'dart:js_util' as js_util;
 
 import 'package:expect/minitest.dart';
-import 'package:js/js.dart' show trustTypes, staticInterop;
+import 'package:js/js.dart' show staticInterop;
 
 @JS('library3.ExternalStatic')
 @staticInterop
@@ -45,15 +45,6 @@
   external String get initialValue;
 }
 
-@JS('library3.ExternalStatic')
-@staticInterop
-@trustTypes
-class ExternalStaticTrustType {
-  external static double field;
-  external static double get getSet;
-  external static double method();
-}
-
 void main() {
   // Use `callMethod` instead of top-level external to `eval` since the library
   // is namespaced.
@@ -107,7 +98,9 @@
 external final String finalField;
 
 // Top-level getters and setters.
+@JS()
 external String get getSet;
+@JS()
 external set getSet(String val);
 @JS('library3.namespacedGetSet')
 external String get namespacedGetSet;
@@ -115,7 +108,9 @@
 external set namespacedGetSet(String val);
 
 // Top-level methods.
+@JS()
 external String method();
+@JS()
 external String differentArgsMethod(String a, [String b = '']);
 @JS('library3.namespacedMethod')
 external String namespacedMethod();
@@ -146,14 +141,6 @@
       'optionalmethod');
   expect(ExternalStatic.renamedMethod(), 'method');
   expect((ExternalStatic.renamedMethod)(), 'method');
-
-  // Use wrong return type in conjunction with `@trustTypes`.
-  expect(ExternalStaticTrustType.field, 'renamedField');
-
-  expect(ExternalStaticTrustType.getSet, 'renamedGetSet');
-
-  expect(ExternalStaticTrustType.method(), 'method');
-  expect((ExternalStaticTrustType.method)(), 'method');
 }
 
 void testTopLevelMembers() {