blob: e2c2dabf43c3673aaef158b76ea18d1f0ebd96d4 [file] [log] [blame]
// Copyright (c) 2023, 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.
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'dartdoc_test_base.dart';
import 'src/utils.dart';
void main() {
defineReflectiveSuite(() {
if (classModifiersAllowed) {
defineReflectiveTests(ClassModifiersTest);
}
});
}
@reflectiveTest
class ClassModifiersTest extends DartdocTestBase {
@override
String get libraryName => 'class_modifiers';
@override
String get sdkConstraint => '>=3.0.0-0.0-dev <4.0.0';
@override
List<String> get experiments => ['class-modifiers', 'sealed-class'];
/// From the table in the class modifiers feature specification.
void test_tableOfModifiers() async {
var library = await bootPackageWithLibrary('''
class A {}
base class B {}
interface class C {}
final class D {}
sealed class E {}
abstract class F {}
abstract base class G {}
abstract interface class H {}
abstract final class I {}
mixin class J {}
base mixin class K {}
abstract mixin class L {}
abstract base mixin class M {}
mixin N {}
base mixin O {}
''');
// This almost seems worth a map and loop, but leaving expanded for now for
// test clarity.
var Aclass = library.classes.named('A');
var Bclass = library.classes.named('B');
var Cclass = library.classes.named('C');
var Dclass = library.classes.named('D');
var Eclass = library.classes.named('E');
var Fclass = library.classes.named('F');
var Gclass = library.classes.named('G');
var Hclass = library.classes.named('H');
var Iclass = library.classes.named('I');
var Jclass = library.classes.named('J');
var Kclass = library.classes.named('K');
var Lclass = library.classes.named('L');
var Mclass = library.classes.named('M');
var Nmixin = library.mixins.named('N');
var Omixin = library.mixins.named('O');
expect(Aclass.fullkind, equals('class'));
expect(Bclass.fullkind, equals('base class'));
expect(Cclass.fullkind, equals('interface class'));
expect(Dclass.fullkind, equals('final class'));
expect(Eclass.fullkind, equals('sealed class'));
expect(Fclass.fullkind, equals('abstract class'));
expect(Gclass.fullkind, equals('abstract base class'));
expect(Hclass.fullkind, equals('abstract interface class'));
expect(Iclass.fullkind, equals('abstract final class'));
expect(Jclass.fullkind, equals('mixin class'));
expect(Kclass.fullkind, equals('base mixin class'));
expect(Lclass.fullkind, equals('abstract mixin class'));
expect(Mclass.fullkind, equals('abstract base mixin class'));
expect(Nmixin.fullkind, equals('mixin'));
expect(Omixin.fullkind, equals('base mixin'));
}
void test_abstractSealed() async {
var library = await bootPackageWithLibrary('''
abstract class A {}
sealed class B extends A {}
''');
var Bclass = library.classes.named('B');
expect(Bclass.fullkind, equals('sealed class')); // *not* sealed abstract
}
void test_inferredModifiers() async {
var library = await bootPackageWithLibrary('''
base class A {}
sealed class B extends A {}
base class C extends B {}
interface class D {}
sealed class E extends D {}
interface class F extends E {}
final class G {}
sealed class H extends G {}
final class I extends H {}
class J {}
base mixin K on J {}
sealed class L extends J with K {}
base class M extends L {}
''');
var Bclass = library.classes.named('B');
var Cclass = library.classes.named('C');
var Eclass = library.classes.named('E');
var Fclass = library.classes.named('F');
var Hclass = library.classes.named('H');
var Iclass = library.classes.named('I');
var Lclass = library.classes.named('L');
var Mclass = library.classes.named('M');
expect(Bclass.fullkind, equals('sealed class')); // *not* sealed base
expect(Cclass.fullkind, equals('base class'));
expect(Eclass.fullkind, equals('sealed class'));
expect(Fclass.fullkind, equals('interface class'));
expect(Hclass.fullkind, equals('sealed class'));
expect(Iclass.fullkind, equals('final class'));
expect(Lclass.fullkind, equals('sealed class'));
expect(Mclass.fullkind, equals('base class'));
}
}