blob: 51851767b79f2dd3420b6120d3f44654c63c92ed [file] [log] [blame]
// Copyright (c) 2020, 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.
// Tests inheritance relationships between `JS` and `anonymous` classes/objects.
@JS()
library extends_test;
import 'package:expect/minitest.dart';
import 'package:js/js.dart';
@JS()
external void eval(String code);
@JS()
class JSClass {
external int get a;
external int getA();
external int getAOrB();
}
@JS()
@anonymous
class AnonymousClass {
external int get a;
external int getA();
}
@JS()
class JSExtendJSClass extends JSClass {
external JSExtendJSClass(int a, int b);
external int get b;
external int getB();
external int getAOrB();
}
@JS()
class JSExtendAnonymousClass extends AnonymousClass {
external JSExtendAnonymousClass(int a, int b);
external int get b;
external int getB();
}
@JS()
@anonymous
class AnonymousExtendAnonymousClass extends AnonymousClass {
external int get b;
external int getB();
}
@JS()
@anonymous
class AnonymousExtendJSClass extends JSClass {
external int get b;
external int getB();
external int getAOrB();
}
external AnonymousExtendAnonymousClass get anonExtendAnon;
external AnonymousExtendJSClass get anonExtendJS;
void testInheritance() {
// Note that for the following, there are no meaningful tests for is checks or
// as casts, since the web compilers should return true and succeed for all JS
// types.
var jsExtendJS = JSExtendJSClass(1, 2);
expect(jsExtendJS.a, 1);
expect(jsExtendJS.b, 2);
expect(jsExtendJS.getA(), 1);
expect(jsExtendJS.getB(), 2);
// Test method overrides.
expect(jsExtendJS.getAOrB(), 2);
expect((jsExtendJS as JSClass).getAOrB(), 2);
var jsExtendAnon = JSExtendAnonymousClass(1, 2);
expect(jsExtendAnon.a, 1);
expect(jsExtendAnon.b, 2);
expect(jsExtendAnon.getA(), 1);
expect(jsExtendAnon.getB(), 2);
expect(anonExtendAnon.a, 1);
expect(anonExtendAnon.b, 2);
expect(anonExtendAnon.getA(), 1);
expect(anonExtendAnon.getB(), 2);
expect(anonExtendJS.a, 1);
expect(anonExtendJS.b, 2);
expect(anonExtendJS.getA(), 1);
expect(anonExtendJS.getB(), 2);
expect(anonExtendJS.getAOrB(), 2);
expect((anonExtendJS as JSClass).getAOrB(), 2);
}