[pkg:js] Refactor export and mock tests to use Strings

Allows for tests to pass with dart2wasm. This CL also adds these
tests to the test_matrix.json.

Change-Id: I970ef26b0fb377095c3889e6f52bef256d618850
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/264604
Reviewed-by: Joshua Litt <joshualitt@google.com>
Reviewed-by: Kevin Moore <kevmoo@google.com>
This commit is contained in:
Srujan Gaddam 2022-10-26 16:34:38 +00:00 committed by Commit Queue
parent 6efce3b407
commit c14c0fdda3
7 changed files with 323 additions and 321 deletions

View file

@ -15,21 +15,22 @@ import 'package:js/js_util.dart';
class Methods {}
extension on Methods {
external int add(int a, int b);
external String concat(String foo, String bar);
// Sanity-check that non-externals are unaffected.
int nonExternal() => 0;
String nonExternal() => 'nonExternal';
@JS('_rename')
external int rename();
external int optionalAdd(int a, int b, [int c = 0, int? d]);
external String rename();
external String optionalConcat(String foo, String bar,
[String boo = '', String? baz]);
}
@JSExport()
class MethodsDart {
int add(int a, int b) => a + b;
int nonExternal() => 1;
int _rename() => 1;
int optionalAdd(int a, int b, [int? c, int? d]) =>
a + b + (c ?? 0) + (d ?? 0);
String concat(String foo, String bar) => foo + bar;
String nonExternal() => 'initialized';
String _rename() => 'initialized';
String optionalConcat(String foo, String bar, [String? boo, String? baz]) =>
foo + bar + (boo ?? '') + (baz ?? '');
}
@JS()
@ -37,20 +38,20 @@ class MethodsDart {
class Fields {}
extension on Fields {
external int field;
external final int finalField;
external String field;
external final String finalField;
@JS('_renamedField')
external int renamedField;
external String renamedField;
@JS('_renamedFinalField')
external final int renamedFinalField;
external final String renamedFinalField;
}
@JSExport()
class FieldsDart {
int field = 1;
int finalField = 1;
int _renamedField = 1;
final int _renamedFinalField = 1;
String field = 'initialized';
String finalField = 'initialized';
String _renamedField = 'initialized';
final String _renamedFinalField = 'initialized';
}
@JS()
@ -58,83 +59,83 @@ class FieldsDart {
class GetSet {}
extension on GetSet {
external int get getSet;
external set getSet(int val);
external String get getSet;
external set getSet(String val);
@JS('_renamedGetSet')
external int get renamedGetSet;
external String get renamedGetSet;
@JS('_renamedGetSet')
external set renamedGetSet(int val);
external set renamedGetSet(String val);
@JS('_sameNameDifferentRenameGet')
external int get sameNameDifferentRename;
external String get sameNameDifferentRename;
@JS('_sameNameDifferentRenameSet')
external set sameNameDifferentRename(int val);
external set sameNameDifferentRename(String val);
@JS('_differentNameSameRename')
external int get differentNameSameRenameGet;
external String get differentNameSameRenameGet;
@JS('_differentNameSameRename')
external set differentNameSameRenameSet(int val);
external set differentNameSameRenameSet(String val);
}
@JSExport()
class GetSetDart {
int getSet = 1;
int _renamedGetSet = 1;
int _sameNameDifferentRenameGet = 1;
int _sameNameDifferentRenameSet = 1;
int _differentNameSameRename = 1;
String getSet = 'initialized';
String _renamedGetSet = 'initialized';
String _sameNameDifferentRenameGet = 'initialized';
String _sameNameDifferentRenameSet = 'initialized';
String _differentNameSameRename = 'initialized';
}
void test([Object? proto]) {
var jsMethods =
createStaticInteropMock<Methods, MethodsDart>(MethodsDart(), proto);
expect(jsMethods.add(1, 1), 2);
expect(jsMethods.nonExternal(), 0);
expect(jsMethods.rename(), 1);
expect(jsMethods.optionalAdd(1, 1), 2);
expect(jsMethods.optionalAdd(1, 1, 1), 3);
expect(jsMethods.optionalAdd(1, 1, 1, 1), 4);
expect(jsMethods.concat('a', 'b'), 'ab');
expect(jsMethods.nonExternal(), 'nonExternal');
expect(jsMethods.rename(), 'initialized');
expect(jsMethods.optionalConcat('a', 'b'), 'ab');
expect(jsMethods.optionalConcat('a', 'b', 'c'), 'abc');
expect(jsMethods.optionalConcat('a', 'b', 'c', 'd'), 'abcd');
var dartFields = FieldsDart();
var jsFields = createStaticInteropMock<Fields, FieldsDart>(dartFields, proto);
expect(jsFields.field, 1);
expect(jsFields.finalField, 1);
expect(jsFields.renamedField, 1);
expect(jsFields.renamedFinalField, 1);
expect(jsFields.field, 'initialized');
expect(jsFields.finalField, 'initialized');
expect(jsFields.renamedField, 'initialized');
expect(jsFields.renamedFinalField, 'initialized');
// Modify the JS mock and check for updates in the Dart mock.
jsFields.field = 2;
jsFields.renamedField = 2;
expect(dartFields.field, 2);
expect(dartFields._renamedField, 2);
jsFields.field = 'jsModified';
jsFields.renamedField = 'jsModified';
expect(dartFields.field, 'jsModified');
expect(dartFields._renamedField, 'jsModified');
// Modify the Dart mock and check for updates in the JS mock.
dartFields.field = 3;
dartFields.finalField = 3;
dartFields._renamedField = 3;
expect(jsFields.field, 3);
expect(jsFields.finalField, 3);
expect(jsFields.renamedField, 3);
dartFields.field = 'dartModified';
dartFields.finalField = 'dartModified';
dartFields._renamedField = 'dartModified';
expect(jsFields.field, 'dartModified');
expect(jsFields.finalField, 'dartModified');
expect(jsFields.renamedField, 'dartModified');
var dartGetSet = GetSetDart();
var jsGetSet = createStaticInteropMock<GetSet, GetSetDart>(dartGetSet, proto);
expect(jsGetSet.getSet, 1);
expect(jsGetSet.renamedGetSet, 1);
expect(jsGetSet.sameNameDifferentRename, 1);
expect(jsGetSet.differentNameSameRenameGet, 1);
expect(jsGetSet.getSet, 'initialized');
expect(jsGetSet.renamedGetSet, 'initialized');
expect(jsGetSet.sameNameDifferentRename, 'initialized');
expect(jsGetSet.differentNameSameRenameGet, 'initialized');
// Modify the JS mock and check for updates in the Dart mock.
jsGetSet.getSet = 2;
jsGetSet.renamedGetSet = 2;
jsGetSet.sameNameDifferentRename = 2;
jsGetSet.differentNameSameRenameSet = 2;
expect(dartGetSet.getSet, 2);
expect(dartGetSet._renamedGetSet, 2);
expect(dartGetSet._sameNameDifferentRenameGet, 1);
expect(dartGetSet._sameNameDifferentRenameSet, 2);
expect(dartGetSet._differentNameSameRename, 2);
jsGetSet.getSet = 'jsModified';
jsGetSet.renamedGetSet = 'jsModified';
jsGetSet.sameNameDifferentRename = 'jsModified';
jsGetSet.differentNameSameRenameSet = 'jsModified';
expect(dartGetSet.getSet, 'jsModified');
expect(dartGetSet._renamedGetSet, 'jsModified');
expect(dartGetSet._sameNameDifferentRenameGet, 'initialized');
expect(dartGetSet._sameNameDifferentRenameSet, 'jsModified');
expect(dartGetSet._differentNameSameRename, 'jsModified');
// Modify the Dart mock and check for updates in the JS mock.
dartGetSet.getSet = 3;
dartGetSet._renamedGetSet = 3;
dartGetSet.getSet = 'dartModified';
dartGetSet._renamedGetSet = 'dartModified';
// Use different values to disambiguate.
dartGetSet._sameNameDifferentRenameGet = 3;
dartGetSet._sameNameDifferentRenameSet = 4;
dartGetSet._differentNameSameRename = 3;
expect(jsGetSet.getSet, 3);
expect(jsGetSet.renamedGetSet, 3);
expect(jsGetSet.sameNameDifferentRename, 3);
expect(jsGetSet.differentNameSameRenameGet, 3);
dartGetSet._sameNameDifferentRenameGet = 'dartModifiedGet';
dartGetSet._sameNameDifferentRenameSet = 'dartModifiedSet';
dartGetSet._differentNameSameRename = 'dartModified';
expect(jsGetSet.getSet, 'dartModified');
expect(jsGetSet.renamedGetSet, 'dartModified');
expect(jsGetSet.sameNameDifferentRename, 'dartModifiedGet');
expect(jsGetSet.differentNameSameRenameGet, 'dartModified');
}

View file

@ -14,11 +14,11 @@ import 'package:js/js_util.dart';
class Extends {}
extension on Extends {
external int extendsMethod(int val);
external int extendsField;
external final int extendsFinalField;
external int get extendsGetSet;
external set extendsGetSet(int val);
external String extendsMethod(String val);
external String extendsField;
external final String extendsFinalField;
external String get extendsGetSet;
external set extendsGetSet(String val);
}
@JS()
@ -26,13 +26,13 @@ extension on Extends {
class Implements {}
extension on Implements {
external int implementsMethod(int val);
external int implementsField;
external final int implementsFinalField;
external String implementsMethod(String val);
external String implementsField;
external final String implementsFinalField;
@JS('implementsGetSet')
external int get implementsGetter;
external String get implementsGetter;
@JS('implementsGetSet')
external set implementsSetter(int val);
external set implementsSetter(String val);
}
@JS()
@ -40,87 +40,87 @@ extension on Implements {
class Inheritance extends Extends implements Implements {}
extension on Inheritance {
external int method(int val);
external int field;
external final int finalField;
external int get getSet;
external set getSet(int val);
external String method(String val);
external String field;
external final String finalField;
external String get getSet;
external set getSet(String val);
}
extension on Inheritance {
external int method2(int val);
external int field2;
external final int finalField2;
external int get getSet2;
external set getSet2(int val);
external String method2(String val);
external String field2;
external final String finalField2;
external String get getSet2;
external set getSet2(String val);
}
@JSExport()
class ExtendsDart {
int extendsMethod(int val) => val;
int extendsField = 0;
final int extendsFinalField = 0;
int extendsGetSet = 0;
String extendsMethod(String val) => val;
String extendsField = 'extends';
final String extendsFinalField = 'extends';
String extendsGetSet = 'extends';
}
@JSExport()
class ImplementsMixin {
int implementsMethod(int val) => val;
int implementsField = 1;
final int implementsFinalField = 1;
int implementsGetSet = 1;
String implementsMethod(String val) => val;
String implementsField = 'implements';
final String implementsFinalField = 'implements';
String implementsGetSet = 'implements';
}
@JSExport()
class InheritanceDart extends ExtendsDart with ImplementsMixin {
int method(int val) => val;
int field = 2;
final int finalField = 2;
int getSet = 2;
int method2(int val) => val;
int field2 = 2;
final int finalField2 = 2;
int getSet2 = 2;
String method(String val) => val;
String field = 'derived';
final String finalField = 'derived';
String getSet = 'derived';
String method2(String val) => val;
String field2 = 'derived';
final String finalField2 = 'derived';
String getSet2 = 'derived';
}
void main() {
var dartMock = InheritanceDart();
var jsMock = createStaticInteropMock<Inheritance, InheritanceDart>(dartMock);
expect(jsMock.extendsMethod(0), 0);
expect(jsMock.extendsField, 0);
jsMock.extendsField = 1;
expect(jsMock.extendsField, 1);
expect(jsMock.extendsFinalField, 0);
expect(jsMock.extendsGetSet, 0);
expect(jsMock.extendsMethod('extends'), 'extends');
expect(jsMock.extendsField, 'extends');
jsMock.extendsField = 'modified';
expect(jsMock.extendsField, 'modified');
expect(jsMock.extendsFinalField, 'extends');
expect(jsMock.extendsGetSet, 'extends');
// Dart mock uses a field for this getter and setter, so it should change.
jsMock.extendsGetSet = 1;
expect(jsMock.extendsGetSet, 1);
jsMock.extendsGetSet = 'modified';
expect(jsMock.extendsGetSet, 'modified');
expect(jsMock.implementsMethod(1), 1);
expect(jsMock.implementsField, 1);
jsMock.implementsField = 2;
expect(jsMock.implementsField, 2);
expect(jsMock.implementsFinalField, 1);
expect(jsMock.implementsGetter, 1);
jsMock.implementsSetter = 2;
expect(jsMock.implementsGetter, 2);
expect(jsMock.implementsMethod('implements'), 'implements');
expect(jsMock.implementsField, 'implements');
jsMock.implementsField = 'modified';
expect(jsMock.implementsField, 'modified');
expect(jsMock.implementsFinalField, 'implements');
expect(jsMock.implementsGetter, 'implements');
jsMock.implementsSetter = 'modified';
expect(jsMock.implementsGetter, 'modified');
expect(jsMock.method(2), 2);
expect(jsMock.field, 2);
jsMock.field = 3;
expect(jsMock.field, 3);
expect(jsMock.finalField, 2);
expect(jsMock.getSet, 2);
jsMock.getSet = 3;
expect(jsMock.getSet, 3);
expect(jsMock.method('derived'), 'derived');
expect(jsMock.field, 'derived');
jsMock.field = 'modified';
expect(jsMock.field, 'modified');
expect(jsMock.finalField, 'derived');
expect(jsMock.getSet, 'derived');
jsMock.getSet = 'modified';
expect(jsMock.getSet, 'modified');
expect(jsMock.method2(2), 2);
expect(jsMock.field2, 2);
jsMock.field2 = 3;
expect(jsMock.field2, 3);
expect(jsMock.finalField2, 2);
expect(jsMock.getSet2, 2);
jsMock.getSet2 = 3;
expect(jsMock.getSet2, 3);
expect(jsMock.method2('derived'), 'derived');
expect(jsMock.field2, 'derived');
jsMock.field2 = 'modified';
expect(jsMock.field2, 'modified');
expect(jsMock.finalField2, 'derived');
expect(jsMock.getSet2, 'derived');
jsMock.getSet2 = 'modified';
expect(jsMock.getSet2, 'modified');
}

View file

@ -17,20 +17,20 @@ extension on StaticInterop {
// We use nullable types here as mockito requires some additional complexity
// or code generation to safely mock non-nullables.
// https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md
external int? method(int? val);
external int? field;
external final int? finalField;
external int? get getSet;
external set getSet(int? val);
external String? method(String? val);
external String? field;
external final String? finalField;
external String? get getSet;
external set getSet(String? val);
}
@JSExport()
class Dart {
int? method(int? val) => throw '';
int? field = throw '';
final int? finalField = throw '';
int? get getSet => throw '';
set getSet(int? val) => throw '';
String? method(String? val) => throw '';
String? field = throw '';
final String? finalField = throw '';
String? get getSet => throw '';
set getSet(String? val) => throw '';
}
// Have the mock class implement the class interface you defined to mock the
@ -42,14 +42,14 @@ void main() {
// Write expectations on the Dart Mock object, not the JS mock object.
var dartMock = DartMock();
var jsMock = createStaticInteropMock<StaticInterop, DartMock>(dartMock);
when(dartMock.method(0)).thenReturn(1);
when(dartMock.field).thenReturn(1);
when(dartMock.finalField).thenReturn(1);
when(dartMock.getSet).thenReturn(1);
expect(jsMock.method(0), 1);
expect(jsMock.field, 1);
expect(jsMock.finalField, 1);
expect(jsMock.getSet, 1);
jsMock.getSet = 1;
verify(dartMock.getSet = 1);
when(dartMock.method('value')).thenReturn('mockValue');
when(dartMock.field).thenReturn('mockValue');
when(dartMock.finalField).thenReturn('mockValue');
when(dartMock.getSet).thenReturn('mockValue');
expect(jsMock.method('value'), 'mockValue');
expect(jsMock.field, 'mockValue');
expect(jsMock.finalField, 'mockValue');
expect(jsMock.getSet, 'mockValue');
jsMock.getSet = 'mockValue';
verify(dartMock.getSet = 'mockValue');
}

View file

@ -15,21 +15,22 @@ import 'package:js/js_util.dart';
class Methods {}
extension on Methods {
external int add(int a, int b);
external String concat(String foo, String bar);
// Sanity-check that non-externals are unaffected.
int nonExternal() => 0;
String nonExternal() => 'nonExternal';
@JS('_rename')
external int rename();
external int optionalAdd(int a, int b, [int c = 0, int? d]);
external String rename();
external String optionalConcat(String foo, String bar,
[String boo = '', String? baz]);
}
@JSExport()
class MethodsDart {
int add(int a, int b) => a + b;
int nonExternal() => 1;
int _rename() => 1;
int optionalAdd(int a, int b, [int? c, int? d]) =>
a + b + (c ?? 0) + (d ?? 0);
String concat(String foo, String bar) => foo + bar;
String nonExternal() => 'initialized';
String _rename() => 'initialized';
String optionalConcat(String foo, String bar, [String? boo, String? baz]) =>
foo + bar + (boo ?? '') + (baz ?? '');
}
@JS()
@ -37,20 +38,20 @@ class MethodsDart {
class Fields {}
extension on Fields {
external int field;
external final int finalField;
external String field;
external final String finalField;
@JS('_renamedField')
external int renamedField;
external String renamedField;
@JS('_renamedFinalField')
external final int renamedFinalField;
external final String renamedFinalField;
}
@JSExport()
class FieldsDart {
int field = 1;
int finalField = 1;
int _renamedField = 1;
final int _renamedFinalField = 1;
String field = 'initialized';
String finalField = 'initialized';
String _renamedField = 'initialized';
final String _renamedFinalField = 'initialized';
}
@JS()
@ -58,83 +59,83 @@ class FieldsDart {
class GetSet {}
extension on GetSet {
external int get getSet;
external set getSet(int val);
external String get getSet;
external set getSet(String val);
@JS('_renamedGetSet')
external int get renamedGetSet;
external String get renamedGetSet;
@JS('_renamedGetSet')
external set renamedGetSet(int val);
external set renamedGetSet(String val);
@JS('_sameNameDifferentRenameGet')
external int get sameNameDifferentRename;
external String get sameNameDifferentRename;
@JS('_sameNameDifferentRenameSet')
external set sameNameDifferentRename(int val);
external set sameNameDifferentRename(String val);
@JS('_differentNameSameRename')
external int get differentNameSameRenameGet;
external String get differentNameSameRenameGet;
@JS('_differentNameSameRename')
external set differentNameSameRenameSet(int val);
external set differentNameSameRenameSet(String val);
}
@JSExport()
class GetSetDart {
int getSet = 1;
int _renamedGetSet = 1;
int _sameNameDifferentRenameGet = 1;
int _sameNameDifferentRenameSet = 1;
int _differentNameSameRename = 1;
String getSet = 'initialized';
String _renamedGetSet = 'initialized';
String _sameNameDifferentRenameGet = 'initialized';
String _sameNameDifferentRenameSet = 'initialized';
String _differentNameSameRename = 'initialized';
}
void test([Object? proto]) {
var jsMethods =
createStaticInteropMock<Methods, MethodsDart>(MethodsDart(), proto);
expect(jsMethods.add(1, 1), 2);
expect(jsMethods.nonExternal(), 0);
expect(jsMethods.rename(), 1);
expect(jsMethods.optionalAdd(1, 1), 2);
expect(jsMethods.optionalAdd(1, 1, 1), 3);
expect(jsMethods.optionalAdd(1, 1, 1, 1), 4);
expect(jsMethods.concat('a', 'b'), 'ab');
expect(jsMethods.nonExternal(), 'nonExternal');
expect(jsMethods.rename(), 'initialized');
expect(jsMethods.optionalConcat('a', 'b'), 'ab');
expect(jsMethods.optionalConcat('a', 'b', 'c'), 'abc');
expect(jsMethods.optionalConcat('a', 'b', 'c', 'd'), 'abcd');
var dartFields = FieldsDart();
var jsFields = createStaticInteropMock<Fields, FieldsDart>(dartFields, proto);
expect(jsFields.field, 1);
expect(jsFields.finalField, 1);
expect(jsFields.renamedField, 1);
expect(jsFields.renamedFinalField, 1);
expect(jsFields.field, 'initialized');
expect(jsFields.finalField, 'initialized');
expect(jsFields.renamedField, 'initialized');
expect(jsFields.renamedFinalField, 'initialized');
// Modify the JS mock and check for updates in the Dart mock.
jsFields.field = 2;
jsFields.renamedField = 2;
expect(dartFields.field, 2);
expect(dartFields._renamedField, 2);
jsFields.field = 'jsModified';
jsFields.renamedField = 'jsModified';
expect(dartFields.field, 'jsModified');
expect(dartFields._renamedField, 'jsModified');
// Modify the Dart mock and check for updates in the JS mock.
dartFields.field = 3;
dartFields.finalField = 3;
dartFields._renamedField = 3;
expect(jsFields.field, 3);
expect(jsFields.finalField, 3);
expect(jsFields.renamedField, 3);
dartFields.field = 'dartModified';
dartFields.finalField = 'dartModified';
dartFields._renamedField = 'dartModified';
expect(jsFields.field, 'dartModified');
expect(jsFields.finalField, 'dartModified');
expect(jsFields.renamedField, 'dartModified');
var dartGetSet = GetSetDart();
var jsGetSet = createStaticInteropMock<GetSet, GetSetDart>(dartGetSet, proto);
expect(jsGetSet.getSet, 1);
expect(jsGetSet.renamedGetSet, 1);
expect(jsGetSet.sameNameDifferentRename, 1);
expect(jsGetSet.differentNameSameRenameGet, 1);
expect(jsGetSet.getSet, 'initialized');
expect(jsGetSet.renamedGetSet, 'initialized');
expect(jsGetSet.sameNameDifferentRename, 'initialized');
expect(jsGetSet.differentNameSameRenameGet, 'initialized');
// Modify the JS mock and check for updates in the Dart mock.
jsGetSet.getSet = 2;
jsGetSet.renamedGetSet = 2;
jsGetSet.sameNameDifferentRename = 2;
jsGetSet.differentNameSameRenameSet = 2;
expect(dartGetSet.getSet, 2);
expect(dartGetSet._renamedGetSet, 2);
expect(dartGetSet._sameNameDifferentRenameGet, 1);
expect(dartGetSet._sameNameDifferentRenameSet, 2);
expect(dartGetSet._differentNameSameRename, 2);
jsGetSet.getSet = 'jsModified';
jsGetSet.renamedGetSet = 'jsModified';
jsGetSet.sameNameDifferentRename = 'jsModified';
jsGetSet.differentNameSameRenameSet = 'jsModified';
expect(dartGetSet.getSet, 'jsModified');
expect(dartGetSet._renamedGetSet, 'jsModified');
expect(dartGetSet._sameNameDifferentRenameGet, 'initialized');
expect(dartGetSet._sameNameDifferentRenameSet, 'jsModified');
expect(dartGetSet._differentNameSameRename, 'jsModified');
// Modify the Dart mock and check for updates in the JS mock.
dartGetSet.getSet = 3;
dartGetSet._renamedGetSet = 3;
dartGetSet.getSet = 'dartModified';
dartGetSet._renamedGetSet = 'dartModified';
// Use different values to disambiguate.
dartGetSet._sameNameDifferentRenameGet = 3;
dartGetSet._sameNameDifferentRenameSet = 4;
dartGetSet._differentNameSameRename = 3;
expect(jsGetSet.getSet, 3);
expect(jsGetSet.renamedGetSet, 3);
expect(jsGetSet.sameNameDifferentRename, 3);
expect(jsGetSet.differentNameSameRenameGet, 3);
dartGetSet._sameNameDifferentRenameGet = 'dartModifiedGet';
dartGetSet._sameNameDifferentRenameSet = 'dartModifiedSet';
dartGetSet._differentNameSameRename = 'dartModified';
expect(jsGetSet.getSet, 'dartModified');
expect(jsGetSet.renamedGetSet, 'dartModified');
expect(jsGetSet.sameNameDifferentRename, 'dartModifiedGet');
expect(jsGetSet.differentNameSameRenameGet, 'dartModified');
}

View file

@ -14,11 +14,11 @@ import 'package:js/js_util.dart';
class Extends {}
extension on Extends {
external int extendsMethod(int val);
external int extendsField;
external final int extendsFinalField;
external int get extendsGetSet;
external set extendsGetSet(int val);
external String extendsMethod(String val);
external String extendsField;
external final String extendsFinalField;
external String get extendsGetSet;
external set extendsGetSet(String val);
}
@JS()
@ -26,13 +26,13 @@ extension on Extends {
class Implements {}
extension on Implements {
external int implementsMethod(int val);
external int implementsField;
external final int implementsFinalField;
external String implementsMethod(String val);
external String implementsField;
external final String implementsFinalField;
@JS('implementsGetSet')
external int get implementsGetter;
external String get implementsGetter;
@JS('implementsGetSet')
external set implementsSetter(int val);
external set implementsSetter(String val);
}
@JS()
@ -40,87 +40,87 @@ extension on Implements {
class Inheritance extends Extends implements Implements {}
extension on Inheritance {
external int method(int val);
external int field;
external final int finalField;
external int get getSet;
external set getSet(int val);
external String method(String val);
external String field;
external final String finalField;
external String get getSet;
external set getSet(String val);
}
extension on Inheritance {
external int method2(int val);
external int field2;
external final int finalField2;
external int get getSet2;
external set getSet2(int val);
external String method2(String val);
external String field2;
external final String finalField2;
external String get getSet2;
external set getSet2(String val);
}
@JSExport()
class ExtendsDart {
int extendsMethod(int val) => val;
int extendsField = 0;
final int extendsFinalField = 0;
int extendsGetSet = 0;
String extendsMethod(String val) => val;
String extendsField = 'extends';
final String extendsFinalField = 'extends';
String extendsGetSet = 'extends';
}
@JSExport()
class ImplementsMixin {
int implementsMethod(int val) => val;
int implementsField = 1;
final int implementsFinalField = 1;
int implementsGetSet = 1;
String implementsMethod(String val) => val;
String implementsField = 'implements';
final String implementsFinalField = 'implements';
String implementsGetSet = 'implements';
}
@JSExport()
class InheritanceDart extends ExtendsDart with ImplementsMixin {
int method(int val) => val;
int field = 2;
final int finalField = 2;
int getSet = 2;
int method2(int val) => val;
int field2 = 2;
final int finalField2 = 2;
int getSet2 = 2;
String method(String val) => val;
String field = 'derived';
final String finalField = 'derived';
String getSet = 'derived';
String method2(String val) => val;
String field2 = 'derived';
final String finalField2 = 'derived';
String getSet2 = 'derived';
}
void main() {
var dartMock = InheritanceDart();
var jsMock = createStaticInteropMock<Inheritance, InheritanceDart>(dartMock);
expect(jsMock.extendsMethod(0), 0);
expect(jsMock.extendsField, 0);
jsMock.extendsField = 1;
expect(jsMock.extendsField, 1);
expect(jsMock.extendsFinalField, 0);
expect(jsMock.extendsGetSet, 0);
expect(jsMock.extendsMethod('extends'), 'extends');
expect(jsMock.extendsField, 'extends');
jsMock.extendsField = 'modified';
expect(jsMock.extendsField, 'modified');
expect(jsMock.extendsFinalField, 'extends');
expect(jsMock.extendsGetSet, 'extends');
// Dart mock uses a field for this getter and setter, so it should change.
jsMock.extendsGetSet = 1;
expect(jsMock.extendsGetSet, 1);
jsMock.extendsGetSet = 'modified';
expect(jsMock.extendsGetSet, 'modified');
expect(jsMock.implementsMethod(1), 1);
expect(jsMock.implementsField, 1);
jsMock.implementsField = 2;
expect(jsMock.implementsField, 2);
expect(jsMock.implementsFinalField, 1);
expect(jsMock.implementsGetter, 1);
jsMock.implementsSetter = 2;
expect(jsMock.implementsGetter, 2);
expect(jsMock.implementsMethod('implements'), 'implements');
expect(jsMock.implementsField, 'implements');
jsMock.implementsField = 'modified';
expect(jsMock.implementsField, 'modified');
expect(jsMock.implementsFinalField, 'implements');
expect(jsMock.implementsGetter, 'implements');
jsMock.implementsSetter = 'modified';
expect(jsMock.implementsGetter, 'modified');
expect(jsMock.method(2), 2);
expect(jsMock.field, 2);
jsMock.field = 3;
expect(jsMock.field, 3);
expect(jsMock.finalField, 2);
expect(jsMock.getSet, 2);
jsMock.getSet = 3;
expect(jsMock.getSet, 3);
expect(jsMock.method('derived'), 'derived');
expect(jsMock.field, 'derived');
jsMock.field = 'modified';
expect(jsMock.field, 'modified');
expect(jsMock.finalField, 'derived');
expect(jsMock.getSet, 'derived');
jsMock.getSet = 'modified';
expect(jsMock.getSet, 'modified');
expect(jsMock.method2(2), 2);
expect(jsMock.field2, 2);
jsMock.field2 = 3;
expect(jsMock.field2, 3);
expect(jsMock.finalField2, 2);
expect(jsMock.getSet2, 2);
jsMock.getSet2 = 3;
expect(jsMock.getSet2, 3);
expect(jsMock.method2('derived'), 'derived');
expect(jsMock.field2, 'derived');
jsMock.field2 = 'modified';
expect(jsMock.field2, 'modified');
expect(jsMock.finalField2, 'derived');
expect(jsMock.getSet2, 'derived');
jsMock.getSet2 = 'modified';
expect(jsMock.getSet2, 'modified');
}

View file

@ -17,20 +17,20 @@ extension on StaticInterop {
// We use nullable types here as mockito requires some additional complexity
// or code generation to safely mock non-nullables.
// https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md
external int? method(int? val);
external int? field;
external final int? finalField;
external int? get getSet;
external set getSet(int? val);
external String? method(String? val);
external String? field;
external final String? finalField;
external String? get getSet;
external set getSet(String? val);
}
@JSExport()
class Dart {
int? method(int? val) => throw '';
int? field = throw '';
final int? finalField = throw '';
int? get getSet => throw '';
set getSet(int? val) => throw '';
String? method(String? val) => throw '';
String? field = throw '';
final String? finalField = throw '';
String? get getSet => throw '';
set getSet(String? val) => throw '';
}
// Have the mock class implement the class interface you defined to mock the
@ -42,14 +42,14 @@ void main() {
// Write expectations on the Dart Mock object, not the JS mock object.
var dartMock = DartMock();
var jsMock = createStaticInteropMock<StaticInterop, DartMock>(dartMock);
when(dartMock.method(0)).thenReturn(1);
when(dartMock.field).thenReturn(1);
when(dartMock.finalField).thenReturn(1);
when(dartMock.getSet).thenReturn(1);
expect(jsMock.method(0), 1);
expect(jsMock.field, 1);
expect(jsMock.finalField, 1);
expect(jsMock.getSet, 1);
jsMock.getSet = 1;
verify(dartMock.getSet = 1);
when(dartMock.method('value')).thenReturn('mockValue');
when(dartMock.field).thenReturn('mockValue');
when(dartMock.finalField).thenReturn('mockValue');
when(dartMock.getSet).thenReturn('mockValue');
expect(jsMock.method('value'), 'mockValue');
expect(jsMock.field, 'mockValue');
expect(jsMock.finalField, 'mockValue');
expect(jsMock.getSet, 'mockValue');
jsMock.getSet = 'mockValue';
verify(dartMock.getSet = 'mockValue');
}

View file

@ -3141,7 +3141,7 @@
"language",
"corelib",
"web/wasm",
"lib/lib/(async|collection|convert|js/static_interop_test|math|typed_data)/",
"lib/lib/(async|collection|convert|js/export|js/static_interop_test|math|typed_data)/",
"co19/co19/(src/)?(Language|LanguageFeatures|LibTest/(async|collection|convert|core|math|typed_data))/"
],
"shards": 10,