blob: 69d5ec91487617a98f4f2c9a3202a8a4b73d93c2 [file] [log] [blame]
// Copyright (c) 2022, 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.
// Test basic functionality of `createStaticInteropMock`. Basic methods, fields
// (final and not), getters, and setters are tested along with potential
// renames.
import 'package:expect/minitest.dart';
import 'package:js/js.dart';
import 'package:js/js_util.dart';
@JS()
@staticInterop
class Methods {}
extension on Methods {
external int add(int a, int b);
// Sanity-check that non-externals are unaffected.
int nonExternal() => 0;
@JS('_rename')
external int rename();
external int optionalAdd(int a, int b, [int c = 0, int? d]);
}
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);
}
@JS()
@staticInterop
class Fields {}
extension on Fields {
external int field;
external final int finalField;
@JS('_renamedField')
external int renamedField;
@JS('_renamedFinalField')
external final int renamedFinalField;
}
class FieldsDart {
int field = 1;
int finalField = 1;
int renamedField = 1;
final int renamedFinalField = 1;
}
@JS()
@staticInterop
class GetSet {}
extension on GetSet {
external int get getSet;
external set getSet(int val);
@JS('_renamedGetSet')
external int get renamedGetSet;
@JS('_renamedGetSet')
external set renamedGetSet(int val);
@JS('_sameNameDifferentRenameGet')
external int get sameNameDifferentRename;
@JS('_sameNameDifferentRenameSet')
external set sameNameDifferentRename(int val);
@JS('_differentNameSameRename')
external int get differentNameSameRenameGet;
@JS('_differentNameSameRename')
external set differentNameSameRenameSet(int val);
}
class GetSetDart {
int getSet = 1;
int renamedGetSet = 1;
int sameNameDifferentRename = 1;
int differentNameSameRenameGet = 1;
int differentNameSameRenameSet = 1;
}
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);
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);
// 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);
// 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);
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);
// 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.sameNameDifferentRename, 2);
expect(dartGetSet.differentNameSameRenameGet, 1);
expect(dartGetSet.differentNameSameRenameSet, 2);
// Modify the Dart mock and check for updates in the JS mock.
dartGetSet.getSet = 3;
dartGetSet.renamedGetSet = 3;
dartGetSet.sameNameDifferentRename = 3;
// Use different values to disambiguate.
dartGetSet.differentNameSameRenameGet = 3;
dartGetSet.differentNameSameRenameSet = 4;
expect(jsGetSet.getSet, 3);
expect(jsGetSet.renamedGetSet, 3);
expect(jsGetSet.sameNameDifferentRename, 3);
expect(jsGetSet.differentNameSameRenameGet, 3);
}