62f84880ef
Closes #40520 Closes #40948 Closes #40425 Change-Id: I0aa3cfa51b410c90dd0bea963846eeb6b2e73efb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140540 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
177 lines
4.4 KiB
Dart
177 lines
4.4 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
library test.abstract_class_test;
|
|
|
|
import 'dart:mirrors';
|
|
import 'package:expect/expect.dart';
|
|
|
|
void main() {
|
|
testSimple();
|
|
testFunctionType();
|
|
testFakeFunction();
|
|
testGeneric();
|
|
testAnonMixinApplication();
|
|
testNamedMixinApplication();
|
|
}
|
|
|
|
abstract class Foo {
|
|
foo();
|
|
}
|
|
|
|
class Bar extends Foo {
|
|
foo() {}
|
|
}
|
|
|
|
testSimple() {
|
|
Expect.isTrue(reflectClass(Foo).isAbstract);
|
|
Expect.isFalse(reflectClass(Bar).isAbstract);
|
|
Expect.isTrue(reflect(new Bar()).type.superclass!.isAbstract);
|
|
Expect.isFalse(reflect(new Bar()).type.isAbstract);
|
|
}
|
|
|
|
void baz() {}
|
|
|
|
testFunctionType() {
|
|
Expect.isFalse(reflect(baz).type.isAbstract);
|
|
}
|
|
|
|
abstract class FunctionFoo implements Function {
|
|
call();
|
|
}
|
|
|
|
class FunctionBar extends FunctionFoo {
|
|
call() {}
|
|
}
|
|
|
|
testFakeFunction() {
|
|
Expect.isTrue(reflectClass(FunctionFoo).isAbstract);
|
|
Expect.isFalse(reflectClass(FunctionBar).isAbstract);
|
|
Expect.isTrue(reflect(new FunctionBar()).type.superclass!.isAbstract);
|
|
Expect.isFalse(reflect(new FunctionBar()).type.isAbstract);
|
|
}
|
|
|
|
abstract class GenericFoo<T> {
|
|
T genericFoo(T t);
|
|
}
|
|
|
|
class GenericBar<T> extends GenericFoo<T> {
|
|
T genericFoo(T t) => t;
|
|
}
|
|
|
|
testGeneric() {
|
|
// Unbound.
|
|
Expect.isTrue(reflectClass(GenericFoo).isAbstract);
|
|
Expect.isFalse(reflectClass(GenericBar).isAbstract);
|
|
// Bound.
|
|
Expect.isTrue(reflect(new GenericBar<int>()).type.superclass!.isAbstract);
|
|
Expect.isFalse(reflect(new GenericBar<int>()).type.isAbstract);
|
|
}
|
|
|
|
class S {}
|
|
|
|
abstract class M {
|
|
mixinFoo();
|
|
}
|
|
|
|
abstract class MA extends S with M {}
|
|
|
|
class SubMA extends MA {
|
|
mixinFoo() {}
|
|
}
|
|
|
|
class ConcreteMA extends S with M {
|
|
mixinFoo() {}
|
|
}
|
|
|
|
class M2 {
|
|
mixin2Foo() {}
|
|
}
|
|
|
|
abstract class MA2 extends S with M2 {
|
|
mixinBar();
|
|
}
|
|
|
|
class SubMA2 extends MA2 {
|
|
mixinBar() {}
|
|
}
|
|
|
|
class ConcreteMA2 extends S with M2 {
|
|
mixin2Foo() {}
|
|
}
|
|
|
|
testAnonMixinApplication() {
|
|
// Application is abstract.
|
|
{
|
|
// Mixin is abstract.
|
|
Expect.isFalse(reflectClass(SubMA).isAbstract);
|
|
Expect.isTrue(reflectClass(SubMA).superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(SubMA).superclass!.superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(MA).isAbstract);
|
|
Expect.isTrue(reflectClass(MA).superclass!.isAbstract);
|
|
|
|
// Mixin is concrete.
|
|
Expect.isFalse(reflectClass(SubMA2).isAbstract);
|
|
Expect.isTrue(reflectClass(SubMA2).superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(SubMA2).superclass!.superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(MA2).isAbstract);
|
|
Expect.isTrue(reflectClass(MA2).superclass!.isAbstract);
|
|
}
|
|
|
|
// Application is concrete.
|
|
{
|
|
// Mixin is abstract.
|
|
Expect.isFalse(reflectClass(ConcreteMA).isAbstract);
|
|
Expect.isTrue(reflectClass(ConcreteMA).superclass!.isAbstract);
|
|
Expect.isFalse(reflectClass(ConcreteMA).superclass!.superclass!.isAbstract);
|
|
|
|
// Mixin is concrete.
|
|
Expect.isFalse(reflectClass(ConcreteMA2).isAbstract);
|
|
Expect.isTrue(reflectClass(ConcreteMA2).superclass!.isAbstract);
|
|
Expect.isFalse(
|
|
reflectClass(ConcreteMA2).superclass!.superclass!.isAbstract);
|
|
}
|
|
}
|
|
|
|
abstract class NamedMA = S with M;
|
|
|
|
class SubNamedMA extends NamedMA {
|
|
mixinFoo() {}
|
|
}
|
|
|
|
abstract class NamedMA2 = S with M2;
|
|
|
|
class SubNamedMA2 extends NamedMA2 {
|
|
mixinFoo() {}
|
|
}
|
|
|
|
class ConcreteNamedMA2 = S with M2;
|
|
|
|
testNamedMixinApplication() {
|
|
// Application is abstract.
|
|
{
|
|
// Mixin is abstract.
|
|
Expect.isFalse(reflectClass(SubNamedMA).isAbstract);
|
|
Expect.isTrue(reflectClass(SubNamedMA).superclass!.isAbstract);
|
|
Expect.isFalse(reflectClass(SubNamedMA).superclass!.superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(NamedMA).isAbstract);
|
|
Expect.isFalse(reflectClass(NamedMA).superclass!.isAbstract);
|
|
|
|
// Mixin is concrete.
|
|
Expect.isFalse(reflectClass(SubNamedMA2).isAbstract);
|
|
Expect.isTrue(reflectClass(SubNamedMA2).superclass!.isAbstract);
|
|
Expect.isFalse(
|
|
reflectClass(SubNamedMA2).superclass!.superclass!.isAbstract);
|
|
Expect.isTrue(reflectClass(NamedMA2).isAbstract);
|
|
Expect.isFalse(reflectClass(NamedMA2).superclass!.isAbstract);
|
|
}
|
|
|
|
// Application is concrete.
|
|
{
|
|
// Mixin is concrete.
|
|
Expect.isFalse(reflectClass(ConcreteNamedMA2).isAbstract);
|
|
Expect.isFalse(reflectClass(ConcreteNamedMA2).superclass!.isAbstract);
|
|
}
|
|
}
|