blob: 302d76f047d15258f2c058273305cac51181d72e [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.
// Basic inheritance test where @staticInterop class inherits extension methods
// which are then defined in the Dart class' inheritance chain, with some
// overrides.
import 'package:expect/minitest.dart';
import 'package:js/js.dart';
import 'package:js/js_util.dart';
@JS()
@staticInterop
class Extends {}
extension on Extends {
external int extendsMethod(int val);
external int extendsField;
external final int extendsFinalField;
external int get getSet;
external set getSet(int val);
}
@JS()
@staticInterop
class Implements {}
extension on Implements {
@JS('_implementsMethod')
external int implementsMethod(int val);
@JS('_implementsField')
external int implementsField;
@JS('_implementsFinalField')
external final int implementsFinalField;
@JS('_implementsGetter')
external int get implementsGetter;
@JS('_implementsSetter')
external set implementsSetter(int val);
}
@JS()
@staticInterop
class Inheritance extends Extends implements Implements {}
extension on Inheritance {
external int method(int val);
external int field;
external final int finalField;
// Overrides
external int get getSet;
external set getSet(int val);
}
class ExtendsDart {
int extendsMethod(int val) => val;
int extendsField = 0;
final int extendsFinalField = 0;
int getSet = 0;
}
class ImplementsMixin {
int implementsMethod(int val) => val;
int implementsField = 1;
final int implementsFinalField = 1;
int _implementsGetSet = 1;
int get implementsGetter => _implementsGetSet;
set implementsSetter(int val) => _implementsGetSet = val;
}
class InheritanceDart extends ExtendsDart with ImplementsMixin {
int method(int val) => val;
int field = 2;
final int finalField = 2;
@override
int getSet = 2;
}
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.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;
// Dart mock uses a field for this getter and setter, so it should change.
expect(jsMock.implementsGetter, 2);
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);
}