blob: 0802d652dcb462312dc0a12ca3c51269d5620f17 [file] [log] [blame]
// Copyright (c) 2020, 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:linter/src/rules.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'server_abstract.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(PubspecCompletionTest);
defineReflectiveTests(AnalysisOptionsCompletionTest);
defineReflectiveTests(FixDataCompletionTest);
});
}
@reflectiveTest
class AnalysisOptionsCompletionTest extends AbstractLspAnalysisServerTest
with CompletionTestMixin {
@override
void setUp() {
registerLintRules();
super.setUp();
}
Future<void> test_nested() async {
final content = '''
linter:
rules:
- ^''';
final expected = '''
linter:
rules:
- annotate_overrides''';
await verifyCompletions(
analysisOptionsUri,
content,
expectCompletions: [
'always_declare_return_types',
'annotate_overrides',
],
verifyEditsFor: 'annotate_overrides',
expectedContent: expected,
);
}
Future<void> test_nested_prefix() async {
final content = '''
linter:
rules:
- ann^''';
final expected = '''
linter:
rules:
- annotate_overrides''';
await verifyCompletions(
analysisOptionsUri,
content,
expectCompletions: ['annotate_overrides'],
verifyEditsFor: 'annotate_overrides',
expectedContent: expected,
);
}
Future<void> test_topLevel() async {
final content = '''
^''';
final expected = '''
linter: ''';
await verifyCompletions(
analysisOptionsUri,
content,
expectCompletions: ['linter: '],
verifyEditsFor: 'linter: ',
expectedContent: expected,
);
}
Future<void> test_topLevel_prefix() async {
final content = '''
li^''';
final expected = '''
linter: ''';
await verifyCompletions(
analysisOptionsUri,
content,
expectCompletions: ['linter: '],
verifyEditsFor: 'linter: ',
expectedContent: expected,
);
}
}
mixin CompletionTestMixin on AbstractLspAnalysisServerTest {
Future<void> verifyCompletions(
Uri fileUri,
String content, {
List<String> expectCompletions,
String verifyEditsFor,
String expectedContent,
}) async {
await initialize();
await openFile(fileUri, withoutMarkers(content));
final res = await getCompletion(fileUri, positionFromMarker(content));
for (final expectedCompletion in expectCompletions) {
expect(
res.any((c) => c.label == expectedCompletion),
isTrue,
reason:
'"$expectedCompletion" was not in ${res.map((c) => '"${c.label}"')}',
);
}
// Check the edits apply correctly.
if (verifyEditsFor != null) {
final item = res.singleWhere((c) => c.label == verifyEditsFor);
expect(item.insertTextFormat, isNull);
expect(item.insertText, isNull);
final updated = applyTextEdits(withoutMarkers(content), [item.textEdit]);
expect(updated, equals(expectedContent));
}
}
}
@reflectiveTest
class FixDataCompletionTest extends AbstractLspAnalysisServerTest
with CompletionTestMixin {
Uri fixDataUri;
@override
void setUp() {
super.setUp();
fixDataUri = Uri.file(join(projectFolderPath, 'lib', 'fix_data.yaml'));
}
Future<void> test_nested() async {
final content = '''
version: 1.0.0
transforms:
- changes:
- ^''';
final expected = '''
version: 1.0.0
transforms:
- changes:
- kind: ''';
await verifyCompletions(
fixDataUri,
content,
expectCompletions: ['kind: '],
verifyEditsFor: 'kind: ',
expectedContent: expected,
);
}
Future<void> test_nested_prefix() async {
final content = '''
version: 1.0.0
transforms:
- changes:
- ki^''';
final expected = '''
version: 1.0.0
transforms:
- changes:
- kind: ''';
await verifyCompletions(
fixDataUri,
content,
expectCompletions: ['kind: '],
verifyEditsFor: 'kind: ',
expectedContent: expected,
);
}
Future<void> test_topLevel() async {
final content = '''
version: 1.0.0
^''';
final expected = '''
version: 1.0.0
transforms:''';
await verifyCompletions(
fixDataUri,
content,
expectCompletions: ['transforms:'],
verifyEditsFor: 'transforms:',
expectedContent: expected,
);
}
Future<void> test_topLevel_prefix() async {
final content = '''
tra^''';
final expected = '''
transforms:''';
await verifyCompletions(
fixDataUri,
content,
expectCompletions: ['transforms:'],
verifyEditsFor: 'transforms:',
expectedContent: expected,
);
}
}
@reflectiveTest
class PubspecCompletionTest extends AbstractLspAnalysisServerTest
with CompletionTestMixin {
Future<void> test_nested() async {
final content = '''
name: foo
version: 1.0.0
environment:
^''';
final expected = '''
name: foo
version: 1.0.0
environment:
sdk: ''';
await verifyCompletions(
pubspecFileUri,
content,
expectCompletions: ['flutter: ', 'sdk: '],
verifyEditsFor: 'sdk: ',
expectedContent: expected,
);
}
Future<void> test_nested_prefix() async {
final content = '''
name: foo
version: 1.0.0
environment:
sd^''';
final expected = '''
name: foo
version: 1.0.0
environment:
sdk: ''';
await verifyCompletions(
pubspecFileUri,
content,
expectCompletions: ['flutter: ', 'sdk: '],
verifyEditsFor: 'sdk: ',
expectedContent: expected,
);
}
Future<void> test_topLevel() async {
final content = '''
version: 1.0.0
^''';
final expected = '''
version: 1.0.0
name: ''';
await verifyCompletions(
pubspecFileUri,
content,
expectCompletions: ['name: ', 'description: '],
verifyEditsFor: 'name: ',
expectedContent: expected,
);
}
Future<void> test_topLevel_prefix() async {
final content = '''
na^''';
final expected = '''
name: ''';
await verifyCompletions(
pubspecFileUri,
content,
expectCompletions: ['name: ', 'description: '],
verifyEditsFor: 'name: ',
expectedContent: expected,
);
}
}