blob: e7b3db43659af20a904523ae045587bc78a63255 [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_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(CompilationUnitMemberTest);
});
}
@reflectiveTest
class CompilationUnitMemberTest extends AbstractCompletionDriverTest
with CompilationUnitTestCases {}
mixin CompilationUnitTestCases on AbstractCompletionDriverTest {
@FailingTest(reason: 'Unexpected AST structure with no suggestions.')
Future<void> test_afterAbstract() async {
await computeSuggestions('''
abstract ^
''');
assertResponse(r'''
suggestions
base
kind: keyword
class
kind: keyword
final
kind: keyword
interface
kind: keyword
mixin
kind: keyword
''');
}
Future<void> test_afterAbstract_base_prefix() async {
await computeSuggestions('''
abstract b^
''');
assertResponse(r'''
replacement
left: 1
suggestions
base
kind: keyword
''');
}
Future<void> test_afterAbstract_beforeClass() async {
await computeSuggestions('''
abstract ^ class A {}
''');
assertResponse(r'''
suggestions
base
kind: keyword
final
kind: keyword
interface
kind: keyword
mixin
kind: keyword
''');
}
Future<void> test_afterAbstract_beforeMixinClass() async {
await computeSuggestions('''
abstract ^ mixin class A {}
''');
assertResponse('''
suggestions
base
kind: keyword
''');
}
@FailingTest(reason: 'Unexpected AST structure with no suggestions.')
Future<void> test_afterBase() async {
await computeSuggestions('''
abstract base ^
''');
assertResponse(r'''
suggestions
class
kind: keyword
mixin
kind: keyword
''');
}
Future<void> test_afterBase_beforeClass() async {
await computeSuggestions('''
base ^ class A {}
''');
assertResponse(r'''
suggestions
abstract
kind: keyword
mixin
kind: keyword
''');
}
Future<void> test_afterBase_beforeClass_abstract() async {
await computeSuggestions('''
abstract base ^ class A {}
''');
assertResponse(r'''
suggestions
mixin
kind: keyword
''');
}
Future<void> test_afterBase_beforeMixin() async {
await computeSuggestions('''
base ^ mixin A {}
''');
assertResponse('''
suggestions
''');
}
Future<void> test_afterBase_beforeMixinClass() async {
await computeSuggestions('''
base ^ mixin class A {}
''');
assertResponse('''
suggestions
abstract
kind: keyword
''');
}
Future<void> test_afterBOF() async {
await computeSuggestions('''
^
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
library
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
part of '';
kind: keyword
selection: 9
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_afterBOF_beforeIdentifier() async {
await computeSuggestions('''
^
imp
import "package:foo/foo.dart";
''');
// TODO(danrubel): should not suggest declaration keywords
// TODO(brianwilkerson): Should not suggest export or part directives.
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
library
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_afterBOF_beforeImport() async {
await computeSuggestions('''
^
import foo;
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
library
kind: keyword
part '';
kind: keyword
selection: 6
''');
}
Future<void> test_afterBOF_beforeImport_prefix() async {
await computeSuggestions('''
imp^
import "package:foo/foo.dart";
''');
assertResponse(r'''
replacement
left: 3
suggestions
import '';
kind: keyword
selection: 8
''');
}
Future<void> test_afterBOF_prefix() async {
await computeSuggestions('''
cl^
''');
assertResponse(r'''
replacement
left: 2
suggestions
class
kind: keyword
''');
}
Future<void> test_afterBOF_suffix() async {
await computeSuggestions('''
^imp
import "package:foo/foo.dart";
''');
assertResponse(r'''
replacement
right: 3
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
library
kind: keyword
part '';
kind: keyword
selection: 6
''');
}
Future<void> test_afterDeclaration_class() async {
await computeSuggestions('''
class A {}
^
''');
assertResponse(r'''
suggestions
class
kind: keyword
const
kind: keyword
void
kind: keyword
final
kind: keyword
enum
kind: keyword
typedef
kind: keyword
abstract
kind: keyword
base
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
extension
kind: keyword
external
kind: keyword
interface
kind: keyword
late
kind: keyword
mixin
kind: keyword
sealed
kind: keyword
var
kind: keyword
''');
}
Future<void> test_afterDeclaration_class_prefix() async {
await computeSuggestions('''
class A {}
c^
''');
assertResponse(r'''
replacement
left: 1
suggestions
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
''');
}
Future<void> test_afterDirective_import() async {
await computeSuggestions('''
import "foo";
^
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_afterDirective_import_prefix() async {
await computeSuggestions('''
import "foo";
c^
''');
assertResponse(r'''
replacement
left: 1
suggestions
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
''');
}
Future<void> test_afterFinal_beforeClass() async {
await computeSuggestions('''
final ^ class A {}
''');
assertResponse(r'''
suggestions
abstract
kind: keyword
''');
}
Future<void> test_afterFinal_beforeClass_abstract() async {
await computeSuggestions('''
abstract final ^ class A {}
''');
assertResponse('''
suggestions
''');
}
Future<void> test_afterInterface_beforeClass() async {
await computeSuggestions('''
interface ^ class A {}
''');
assertResponse('''
suggestions
abstract
kind: keyword
''');
}
Future<void> test_afterInterface_beforeClass_abstract() async {
await computeSuggestions('''
abstract interface ^ class A {}
''');
assertResponse(r'''
suggestions
''');
}
Future<void> test_afterLibraryDirective_beforeEnd() async {
await computeSuggestions('''
library foo;^
''');
assertResponse(r'''
suggestions
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
export '';
kind: keyword
selection: 8
extension
kind: keyword
external
kind: keyword
final
kind: keyword
import '';
kind: keyword
selection: 8
interface
kind: keyword
late
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_afterLibraryDirective_prefix() async {
await computeSuggestions('''
library a;
cl^
''');
assertResponse(r'''
replacement
left: 2
suggestions
class
kind: keyword
''');
}
Future<void> test_afterMixin_beforeClass() async {
await computeSuggestions('''
mixin ^ class A {}
''');
assertResponse(r'''
suggestions
abstract
kind: keyword
base
kind: keyword
''');
}
Future<void> test_afterPartOf() async {
await computeSuggestions('''
part of foo;
^
''');
// TODO(brianwilkerson): We should not be suggesting directives.
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_afterSealed_beforeClass() async {
await computeSuggestions('''
sealed ^ class A {}
''');
assertResponse('''
suggestions
''');
}
Future<void> test_afterWhitespaceAtBOF_suffix() async {
await computeSuggestions('''
^imp
import "package:foo/foo.dart";
''');
assertResponse(r'''
replacement
right: 3
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
library
kind: keyword
part '';
kind: keyword
selection: 6
''');
}
Future<void> test_base_prefix() async {
await computeSuggestions('''
b^
''');
assertResponse(r'''
replacement
left: 1
suggestions
base
kind: keyword
''');
}
Future<void> test_beforeClass() async {
await computeSuggestions('''
^ class A {}
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
library
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
part of '';
kind: keyword
selection: 9
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_beforeMixin() async {
await computeSuggestions('''
^ mixin M {}
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
library
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
part of '';
kind: keyword
selection: 9
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_beforeMixin_afterClass() async {
await computeSuggestions('''
class A {}
^ mixin M {}
''');
assertResponse(r'''
suggestions
class
kind: keyword
const
kind: keyword
void
kind: keyword
final
kind: keyword
enum
kind: keyword
typedef
kind: keyword
abstract
kind: keyword
base
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
extension
kind: keyword
external
kind: keyword
interface
kind: keyword
late
kind: keyword
mixin
kind: keyword
sealed
kind: keyword
var
kind: keyword
''');
}
Future<void> test_beforeMixin_prefix_base() async {
await computeSuggestions('''
b^ mixin M {}
''');
assertResponse('''
replacement
left: 1
suggestions
base
kind: keyword
''');
}
Future<void> test_beforeMixin_prefix_final() async {
await computeSuggestions('''
f^ mixin M {}
''');
assertResponse('''
replacement
left: 1
suggestions
final
kind: keyword
''');
}
Future<void> test_beforeMixin_prefix_interface() async {
await computeSuggestions('''
i^ mixin M {}
''');
assertResponse('''
replacement
left: 1
suggestions
import '';
kind: keyword
selection: 8
interface
kind: keyword
''');
}
Future<void> test_beforeMixin_prefix_sealed() async {
await computeSuggestions('''
s^ mixin M {}
''');
assertResponse('''
replacement
left: 1
suggestions
sealed
kind: keyword
''');
}
Future<void> test_betweenImports_prefix() async {
await computeSuggestions('''
library bar;
import "zoo.dart";
imp^
import "package:foo/foo.dart";
''');
assertResponse(r'''
replacement
left: 3
suggestions
import '';
kind: keyword
selection: 8
''');
}
Future<void> test_betweenLibraryAndImport_prefix() async {
await computeSuggestions('''
library libA;
imp^
import "package:foo/foo.dart";
''');
assertResponse(r'''
replacement
left: 3
suggestions
import '';
kind: keyword
selection: 8
''');
}
Future<void> test_empty() async {
await computeSuggestions('''
^
''');
assertResponse(r'''
suggestions
import '';
kind: keyword
selection: 8
export '';
kind: keyword
selection: 8
abstract
kind: keyword
base
kind: keyword
class
kind: keyword
const
kind: keyword
covariant
kind: keyword
dynamic
kind: keyword
enum
kind: keyword
extension
kind: keyword
external
kind: keyword
final
kind: keyword
interface
kind: keyword
late
kind: keyword
library
kind: keyword
mixin
kind: keyword
part '';
kind: keyword
selection: 6
part of '';
kind: keyword
selection: 9
sealed
kind: keyword
typedef
kind: keyword
var
kind: keyword
void
kind: keyword
''');
}
Future<void> test_enum_prefix() async {
await computeSuggestions('''
enu^
''');
assertResponse(r'''
replacement
left: 3
suggestions
enum
kind: keyword
''');
}
Future<void> test_final_prefix() async {
await computeSuggestions('''
f^
''');
assertResponse(r'''
replacement
left: 1
suggestions
final
kind: keyword
''');
}
Future<void> test_interface_prefix() async {
await computeSuggestions('''
i^
''');
assertResponse(r'''
replacement
left: 1
suggestions
import '';
kind: keyword
selection: 8
interface
kind: keyword
''');
}
Future<void> test_mixin_prefix() async {
await computeSuggestions('''
m^
''');
assertResponse(r'''
replacement
left: 1
suggestions
mixin
kind: keyword
''');
}
Future<void> test_sealed_prefix() async {
await computeSuggestions('''
s^
''');
assertResponse(r'''
replacement
left: 1
suggestions
sealed
kind: keyword
''');
}
}