blob: ac1734d791ccc8dfdd448c5ad75bc582fe96db46 [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:analyzer_testing/utilities/utilities.dart';
import 'package:linter/src/lint_names.dart';
import 'package:linter/src/rules.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../../client/completion_driver_test.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(RecordPatternTest);
});
}
@reflectiveTest
class RecordPatternTest extends AbstractCompletionDriverTest
with RecordPatternTestCases {}
mixin RecordPatternTestCases on AbstractCompletionDriverTest {
@override
Future<void> setUp() async {
await super.setUp();
registerLintRules();
var oldFilter = printerConfiguration.filter;
printerConfiguration.filter = (suggestion) {
if (oldFilter(suggestion)) {
return true;
}
var label = suggestion.displayText;
if (label == null) {
return false;
}
return identifierRegExp.hasMatch(label);
};
}
Future<void> test_assignmentContext_namedField_name() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
(^: ) = x0;
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void> test_assignmentContext_namedField_withName_pattern() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
int v01;
(f01: ^) = x0;
}
''');
assertResponse(r'''
suggestions
v01
kind: localVariable
x0
kind: parameter
final
kind: keyword
var
kind: keyword
''');
}
Future<void> test_declarationContext_namedField_name() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
var (^: ) = x0;
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void> test_declarationContext_namedField_name_partial() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
var (f^: ) = x0;
}
''');
assertResponse(r'''
replacement
left: 1
suggestions
f01
kind: identifier
f02
kind: identifier
''');
}
Future<void>
test_declarationContext_namedField_name_type_changesNothing() async {
newAnalysisOptionsYamlFile(
testPackageRootPath,
analysisOptionsContent(rules: [LintNames.always_specify_types]),
);
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
var (^: ) = x0;
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void> test_declarationContext_namedField_withoutName_pattern() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
var (: ^) = x0;
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void>
test_declarationContext_namedField_withoutName_pattern_types() async {
newAnalysisOptionsYamlFile(
testPackageRootPath,
analysisOptionsContent(rules: [LintNames.always_specify_types]),
);
await computeSuggestions('''
void f(({int f01, String f02, double g01}) x0) {
var (: ^) = x0;
}
''');
assertResponse(r'''
suggestions
String f02
kind: identifier
double g01
kind: identifier
int f01
kind: identifier
''');
}
Future<void> test_empty() async {
await computeSuggestions('''
void f(Object o) {
switch (o) {
case (^)
}
}
''');
assertResponse(r'''
suggestions
const
kind: keyword
dynamic
kind: keyword
false
kind: keyword
null
kind: keyword
switch
kind: keyword
true
kind: keyword
''');
}
Future<void> test_expectedType_namedField_forElement() async {
await computeSuggestions('''
List<({int f01})> f() {
return [
for (int i = 0; i < 10; i++)
(^),
];
}
''');
assertResponse(r'''
suggestions
|f01: |
kind: namedArgument
const
kind: keyword
false
kind: keyword
null
kind: keyword
switch
kind: keyword
true
kind: keyword
''');
}
Future<void> test_expectedType_namedField_ifElement() async {
await computeSuggestions('''
List<({int f01})> f() {
return [
if (1 == 1)
(^),
];
}
''');
assertResponse(r'''
suggestions
|f01: |
kind: namedArgument
const
kind: keyword
false
kind: keyword
null
kind: keyword
switch
kind: keyword
true
kind: keyword
''');
}
Future<void> test_matchingContext_namedField_name() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (^: )) {}
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void> test_matchingContext_namedField_name_afterField() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (f01: 0, ^: )) {}
}
''');
assertResponse(r'''
suggestions
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void>
test_matchingContext_namedField_name_afterField_implicitName() async {
await computeSuggestions('''
void f(({int f01, int f02, int f03}) x0) {
if (x0 case (:var f01, ^: )) {}
}
''');
assertResponse(r'''
suggestions
f02
kind: identifier
f03
kind: identifier
''');
}
Future<void> test_matchingContext_namedField_name_beforeField() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (^: , f01: 0)) {}
}
''');
assertResponse(r'''
suggestions
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void> test_matchingContext_namedField_name_partial() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (f^: )) {}
}
''');
assertResponse(r'''
replacement
left: 1
suggestions
f01
kind: identifier
f02
kind: identifier
''');
}
Future<void> test_matchingContext_namedField_withoutName_pattern() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (: ^)) {}
}
''');
assertResponse(r'''
suggestions
final
kind: keyword
var
kind: keyword
var f01
kind: identifier
var f02
kind: identifier
var g01
kind: identifier
''');
}
Future<void>
test_matchingContext_namedField_withoutName_pattern_afterVar() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (: var ^)) {}
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
g01
kind: identifier
''');
}
Future<void>
test_matchingContext_namedField_withoutName_pattern_afterVar_partial() async {
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (: var f^)) {}
}
''');
assertResponse(r'''
replacement
left: 1
suggestions
f01
kind: identifier
f02
kind: identifier
''');
}
Future<void>
test_matchingContext_namedField_withoutName_pattern_final() async {
newAnalysisOptionsYamlFile(
testPackageRootPath,
analysisOptionsContent(rules: [LintNames.prefer_final_locals]),
);
await computeSuggestions('''
void f(({int f01, int f02, int g01}) x0) {
if (x0 case (: ^)) {}
}
''');
assertResponse(r'''
suggestions
final
kind: keyword
final f01
kind: identifier
final f02
kind: identifier
final g01
kind: identifier
var
kind: keyword
''');
}
Future<void>
test_matchingContext_namedField_withoutName_pattern_type() async {
newAnalysisOptionsYamlFile(
testPackageRootPath,
analysisOptionsContent(rules: [LintNames.always_specify_types]),
);
await computeSuggestions('''
void f(({int f01, String f02, double g01}) x0) {
if (x0 case (: ^)) {}
}
''');
assertResponse(r'''
suggestions
String f02
kind: identifier
double g01
kind: identifier
final
kind: keyword
int f01
kind: identifier
var
kind: keyword
''');
}
Future<void>
test_matchingContext_namedField_withoutName_pattern_type_final() async {
newAnalysisOptionsYamlFile(
testPackageRootPath,
analysisOptionsContent(
rules: [LintNames.always_specify_types, LintNames.prefer_final_locals],
),
);
await computeSuggestions('''
void f(({int f01, String f02, double g01}) x0) {
if (x0 case (: ^)) {}
}
''');
assertResponse(r'''
suggestions
final
kind: keyword
final String f02
kind: identifier
final double g01
kind: identifier
final int f01
kind: identifier
var
kind: keyword
''');
}
Future<void> test_noObjectGetters() async {
allowedIdentifiers = {'hashCode'};
await computeSuggestions('''
void f(({int f01, int f02}) record) {
var (:^) = record;
}
''');
assertResponse(r'''
suggestions
f01
kind: identifier
f02
kind: identifier
''');
}
Future<void> test_noVarKeyword_afterVar() async {
await computeSuggestions('''
void f((int, int) record) {
var (:^) = record;
}
''');
assertResponse(r'''
suggestions
''');
}
}