blob: 82aceb516de4c851d05652951a50189b3b1928a0 [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.
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
import '../completion_printer.dart' as printer;
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(FieldFormalParameterTest);
});
}
@reflectiveTest
class FieldFormalParameterTest extends AbstractCompletionDriverTest
with FieldFormalParameterTestCases {}
mixin FieldFormalParameterTestCases on AbstractCompletionDriverTest {
@override
Future<void> setUp() async {
await super.setUp();
printerConfiguration = printer.Configuration(
filter: (suggestion) => true,
withReturnType: true,
);
}
Future<void> test_class_replacement_left() async {
await _checkContainers(
declarations: 'var foo = 0;',
constructorParameters: 'this.f^',
validator: () {
assertResponse(r'''
replacement
left: 1
suggestions
foo
kind: field
returnType: int
''');
},
);
}
Future<void> test_class_replacement_right() async {
await _checkContainers(
declarations: 'var foo = 0;',
constructorParameters: 'this.^f',
validator: () {
assertResponse(r'''
replacement
right: 1
suggestions
foo
kind: field
returnType: int
''');
},
);
}
Future<void> test_class_suggestions_instanceFields_local() async {
await computeSuggestions('''
class A {
static final superStatic = 0;
var inherited = 0;
void superMethod() {}
int get superGetter => 0;
void superSetter(int _) {}
}
class B extends A {
static final thisStatic = 0;
var first = 0;
var second = 1.2;
B(this.^);
B.otherConstructor() {}
void thisMethod() {}
int get thisGetter => 0;
void thisSetter(int _) {}
}
''');
assertResponse(r'''
suggestions
first
kind: field
returnType: int
second
kind: field
returnType: double
''');
}
Future<void> test_class_suggestions_onlyNotSpecified_optionalNamed() async {
await _checkContainers(
declarations: 'final int x; final int y;',
constructorParameters: '{this.x, this.^}',
validator: () {
assertResponse(r'''
suggestions
y
kind: field
returnType: int
''');
},
);
}
Future<void>
test_class_suggestions_onlyNotSpecified_requiredPositional() async {
await _checkContainers(
declarations: 'final int x; final int y;',
constructorParameters: 'this.x, this.^',
validator: () {
assertResponse(r'''
suggestions
y
kind: field
returnType: int
''');
},
);
}
Future<void> test_enum_suggestions_instanceFields() async {
await computeSuggestions('''
enum E {
v();
static final zero = 0;
final int first;
final double second;
E(this.^);
E.otherConstructor();
void myMethod() {}
int get myGetter => 0;
void mySetter(int _) {}
}
''');
assertResponse(r'''
suggestions
first
kind: field
returnType: int
second
kind: field
returnType: double
''');
}
Future<void> test_requiredNamed_keywordName_in() async {
allowedIdentifiers = {'in01', 'out01'};
await computeSuggestions('''
class A {
final int in01;
final int out01;
A({required this.in^});
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
in01
kind: field
returnType: int
''');
}
Future<void> test_requiredPositional_keywordName_in() async {
allowedIdentifiers = {'in01', 'out01'};
await computeSuggestions('''
class A {
final int in01;
final int out01;
A(this.in^);
}
''');
assertResponse(r'''
replacement
left: 2
suggestions
in01
kind: field
returnType: int
''');
}
Future<void> _checkContainers({
required String declarations,
required String constructorParameters,
required void Function() validator,
}) async {
// class
{
await computeSuggestions('''
class A {
$declarations
A($constructorParameters);
}
''');
validator();
}
// enum
{
await computeSuggestions('''
enum E {
v;
$declarations
E($constructorParameters);
}
''');
validator();
}
}
}