Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions LibTest/js_interop/JSExport/jsExport_A05_t01.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright (c) 2025, 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.

/// @assertion If members are overridden, only the overriding member will be
/// wrapped as long as it or its class has this annotation.
///
/// @description Checks that if members are overridden, only the overriding
/// members are wrapped. Test that invocation of wrapping JS object member
/// invokes corresponding overridden member of the Dart object.
/// @author sgrekhov22@gmail.com

import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import '../../../Utils/expect.dart';
import '../js_utils.dart';

String log = "";

@JSExport()
class A {
int variable = 0;
String method(String v) => "method($v);";
String get getter => "getter";
void set setter(bool value) {
log = "setter($value);";
}
}

@JSExport()
class C extends A {
@override
int variable = 42;

@override
String method(String v) => "Overridden method($v);";

@override
String get getter => "Overridden getter";

@override
void set setter(bool value) {
log = "Overridden setter($value);";
}
}

void main() {
doTest(createJSInteropWrapper<C>(C()));
doTest(createJSInteropWrapper<A>(C()));
}

void doTest(JSObject jsC) {
globalContext["jsC"] = jsC;
eval(r'''
globalThis.v1 = globalThis.jsC.variable;
globalThis.v2 = globalThis.jsC.method('x');
globalThis.v3 = globalThis.jsC.getter;
globalThis.jsC.setter = false;
''');
Expect.equals(42, (globalContext["v1"] as JSNumber).toDartInt);
Expect.equals(
"Overridden method(x);",
(globalContext["v2"] as JSString).toDart,
);
Expect.equals("Overridden getter", (globalContext["v3"] as JSString).toDart);
Expect.equals("Overridden setter(false);", log);
}
66 changes: 66 additions & 0 deletions LibTest/js_interop/JSExport/jsExport_A05_t02.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright (c) 2025, 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.

/// @assertion If members are overridden, only the overriding member will be
/// wrapped as long as it or its class has this annotation.
///
/// @description Checks that if members are overridden, only the overriding
/// members are wrapped. Test a mixin.
/// @author sgrekhov22@gmail.com

import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import '../../../Utils/expect.dart';
import '../js_utils.dart';

String log = "";

@JSExport()
mixin M {
int variable = 0;
String method(String v) => "method($v);";
String get getter => "getter";
void set setter(bool value) {
log = "setter($value);";
}
}

@JSExport()
class C with M {
@override
int variable = 42;

@override
String method(String v) => "Overridden method($v);";

@override
String get getter => "Overridden getter";

@override
void set setter(bool value) {
log = "Overridden setter($value);";
}
}

void main() {
doTest(createJSInteropWrapper<C>(C()));
doTest(createJSInteropWrapper<M>(C()));
}

void doTest(JSObject jsC) {
globalContext["jsC"] = jsC;
eval(r'''
globalThis.v1 = globalThis.jsC.variable;
globalThis.v2 = globalThis.jsC.method('x');
globalThis.v3 = globalThis.jsC.getter;
globalThis.jsC.setter = false;
''');
Expect.equals(42, (globalContext["v1"] as JSNumber).toDartInt);
Expect.equals(
"Overridden method(x);",
(globalContext["v2"] as JSString).toDart,
);
Expect.equals("Overridden getter", (globalContext["v3"] as JSString).toDart);
Expect.equals("Overridden setter(false);", log);
}
78 changes: 78 additions & 0 deletions LibTest/js_interop/JSExport/jsExport_A05_t03.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (c) 2025, 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.

/// @assertion If members are overridden, only the overriding member will be
/// wrapped as long as it or its class has this annotation.
///
/// @description Checks that if members are overridden, but overriding members
/// are not annotated with `JSExport()` then the original members are not
/// wrapped.
/// @author sgrekhov22@gmail.com

import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import '../../../Utils/expect.dart';
import '../js_utils.dart';

String log = "";

@JSExport()
class A {
int variable = 0;
String method(String v) => "method($v);";
String get getter => "getter";
void set setter(bool value) {
log = "setter($value);";
}
}

class C extends A {
@override
int variable = 42;

@override
String method(String v) => "Overridden method($v);";

@override
String get getter => "Overridden getter";

@override
void set setter(bool value) {
log = "Overridden setter($value);";
}

@JSExport()
String s = "Dummy member to allow C to be passed to createJSInteropWrapper";
}

void main() {
var jsC = createJSInteropWrapper<C>(C());
globalContext["jsC"] = jsC;
eval(r'''
globalThis.v1 = globalThis.jsC.variable;
globalThis.v2 = globalThis.jsC.method;
globalThis.v3 = globalThis.jsC.getter;
globalThis.jsC.setter = false;
''');
Expect.isNull(globalContext["v1"]);
Expect.isNull(globalContext["v2"]);
Expect.isNull(globalContext["v3"]);
Expect.equals("", log);

var jsA = createJSInteropWrapper<A>(C());
globalContext["jsA"] = jsA;
eval(r'''
globalThis.v4 = globalThis.jsA.variable;
globalThis.v5 = globalThis.jsA.method('x');
globalThis.v6 = globalThis.jsA.getter;
globalThis.jsA.setter = false;
''');
Expect.equals(42, (globalContext["v4"] as JSNumber).toDartInt);
Expect.equals(
"Overridden method(x);",
(globalContext["v5"] as JSString).toDart,
);
Expect.equals("Overridden getter", (globalContext["v6"] as JSString).toDart);
Expect.equals("Overridden setter(false);", log);
}
78 changes: 78 additions & 0 deletions LibTest/js_interop/JSExport/jsExport_A05_t04.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (c) 2025, 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.

/// @assertion If members are overridden, only the overriding member will be
/// wrapped as long as it or its class has this annotation.
///
/// @description Checks that if members are overridden, but overriding members
/// are not annotated with `JSExport()` then the original members are not
/// wrapped. Test a mixin.
/// @author sgrekhov22@gmail.com

import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import '../../../Utils/expect.dart';
import '../js_utils.dart';

String log = "";

@JSExport()
mixin M {
int variable = 0;
String method(String v) => "method($v);";
String get getter => "getter";
void set setter(bool value) {
log = "setter($value);";
}
}

class C with M {
@override
int variable = 42;

@override
String method(String v) => "Overridden method($v);";

@override
String get getter => "Overridden getter";

@override
void set setter(bool value) {
log = "Overridden setter($value);";
}

@JSExport()
String s = "Dummy member to allow C to be passed to createJSInteropWrapper";
}

void main() {
var jsC = createJSInteropWrapper<C>(C());
globalContext["jsC"] = jsC;
eval(r'''
globalThis.v1 = globalThis.jsC.variable;
globalThis.v2 = globalThis.jsC.method;
globalThis.v3 = globalThis.jsC.getter;
globalThis.jsC.setter = false;
''');
Expect.isNull(globalContext["v1"]);
Expect.isNull(globalContext["v2"]);
Expect.isNull(globalContext["v3"]);
Expect.equals("", log);

var jsM = createJSInteropWrapper<M>(C());
globalContext["jsM"] = jsM;
eval(r'''
globalThis.v4 = globalThis.jsM.variable;
globalThis.v5 = globalThis.jsM.method('x');
globalThis.v6 = globalThis.jsM.getter;
globalThis.jsM.setter = false;
''');
Expect.equals(42, (globalContext["v4"] as JSNumber).toDartInt);
Expect.equals(
"Overridden method(x);",
(globalContext["v5"] as JSString).toDart,
);
Expect.equals("Overridden getter", (globalContext["v6"] as JSString).toDart);
Expect.equals("Overridden setter(false);", log);
}
Loading