blob: 2d5b7513723d87c8f294e5e4fa5a48457582e167 [file] [log] [blame]
// 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.
// TODO(srujzs): There's a decent amount of code duplication in this test. We
// should combine this with
// tests/lib/js/static_interop_test/external_static_member_lowerings_test.dart.
@JS()
library external_static_member_test;
import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import 'package:expect/minitest.dart'; // ignore: deprecated_member_use_from_same_package
import 'external_static_member_with_namespaces.dart' as namespace;
@JS()
external void eval(String code);
@JS()
extension type ExternalStatic._(JSObject obj) implements JSObject {
external ExternalStatic();
external factory ExternalStatic.factory();
external ExternalStatic.multipleArgs(double a, String b);
ExternalStatic.nonExternal() : this.obj = ExternalStatic() as JSObject;
external static String field;
@JS('field')
external static String renamedField;
external static final String finalField;
external static String get getSet;
external static set getSet(String val);
@JS('getSet')
external static String get renamedGetSet;
@JS('getSet')
external static set renamedGetSet(String val);
external static String method();
@JS('method')
external static String renamedMethod();
}
void testStaticMembers() {
// Constructors.
void testExternalConstructorCall(ExternalStatic externalStatic) {
expect((externalStatic['a'] as JSNumber).toDartInt, 0);
expect((externalStatic['b'] as JSString).toDart, '');
}
testExternalConstructorCall(ExternalStatic());
testExternalConstructorCall(ExternalStatic.factory());
testExternalConstructorCall(ExternalStatic.multipleArgs(0, ''));
testExternalConstructorCall(ExternalStatic.nonExternal());
// Fields.
expect(ExternalStatic.field, 'field');
ExternalStatic.field = 'modified';
expect(ExternalStatic.field, 'modified');
expect(ExternalStatic.renamedField, 'modified');
ExternalStatic.renamedField = 'renamedField';
expect(ExternalStatic.renamedField, 'renamedField');
expect(ExternalStatic.finalField, 'finalField');
// Getters and setters.
expect(ExternalStatic.getSet, 'getSet');
ExternalStatic.getSet = 'modified';
expect(ExternalStatic.getSet, 'modified');
expect(ExternalStatic.renamedGetSet, 'modified');
ExternalStatic.renamedGetSet = 'renamedGetSet';
expect(ExternalStatic.renamedGetSet, 'renamedGetSet');
// Methods.
expect(ExternalStatic.method(), 'method');
expect(ExternalStatic.renamedMethod(), 'method');
}
void testNamespacedStaticMembers() {
// Constructors.
void testExternalConstructorCall(namespace.ExternalStatic externalStatic) {
expect((externalStatic['a'] as JSNumber).toDartInt, 0);
expect((externalStatic['b'] as JSString).toDart, '');
}
testExternalConstructorCall(namespace.ExternalStatic());
testExternalConstructorCall(namespace.ExternalStatic.factory());
testExternalConstructorCall(namespace.ExternalStatic.multipleArgs(0, ''));
testExternalConstructorCall(namespace.ExternalStatic.nonExternal());
// Fields.
expect(namespace.ExternalStatic.field, 'field');
namespace.ExternalStatic.field = 'modified';
expect(namespace.ExternalStatic.field, 'modified');
expect(namespace.ExternalStatic.renamedField, 'modified');
namespace.ExternalStatic.renamedField = 'renamedField';
expect(namespace.ExternalStatic.renamedField, 'renamedField');
expect(namespace.ExternalStatic.finalField, 'finalField');
// Getters and setters.
expect(namespace.ExternalStatic.getSet, 'getSet');
namespace.ExternalStatic.getSet = 'modified';
expect(namespace.ExternalStatic.getSet, 'modified');
expect(namespace.ExternalStatic.renamedGetSet, 'modified');
namespace.ExternalStatic.renamedGetSet = 'renamedGetSet';
expect(namespace.ExternalStatic.renamedGetSet, 'renamedGetSet');
// Methods.
expect(namespace.ExternalStatic.method(), 'method');
expect(namespace.ExternalStatic.renamedMethod(), 'method');
}
void main() {
eval('''
globalThis.ExternalStatic = function ExternalStatic(a, b) {
var len = arguments.length;
this.a = len < 1 ? 0 : a;
this.b = len < 2 ? '' : b;
}
globalThis.ExternalStatic.method = function() {
return 'method';
}
globalThis.ExternalStatic.field = 'field';
globalThis.ExternalStatic.finalField = 'finalField';
globalThis.ExternalStatic.getSet = 'getSet';
''');
testStaticMembers();
eval('''
var library3 = {};
var library2 = {library3: library3};
var library1 = {library2: library2};
globalThis.library1 = library1;
library3.ExternalStatic = globalThis.ExternalStatic;
library3.ExternalStatic.field = 'field';
library3.ExternalStatic.finalField = 'finalField';
library3.ExternalStatic.getSet = 'getSet';
delete globalThis.ExternalStatic;
''');
testNamespacedStaticMembers();
}