| // Copyright (c) 2017, 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/src/generated/source.dart'; |
| import 'package:analyzer_plugin/protocol/protocol_common.dart'; |
| import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart'; |
| import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; |
| import 'package:test/test.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| void main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(ChangeBuilderImplTest); |
| defineReflectiveTests(EditBuilderImplTest); |
| defineReflectiveTests(FileEditBuilderImplTest); |
| defineReflectiveTests(LinkedEditBuilderImplTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class ChangeBuilderImplTest { |
| Future<void> test_createFileEditBuilder() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| String path = '/test.dart'; |
| FileEditBuilderImpl fileEditBuilder = |
| await builder.createFileEditBuilder(path); |
| expect(fileEditBuilder, const TypeMatcher<FileEditBuilder>()); |
| SourceFileEdit fileEdit = fileEditBuilder.fileEdit; |
| expect(fileEdit.file, path); |
| } |
| |
| void test_getLinkedEditGroup() { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| LinkedEditGroup group = builder.getLinkedEditGroup('a'); |
| expect(identical(builder.getLinkedEditGroup('b'), group), isFalse); |
| expect(identical(builder.getLinkedEditGroup('a'), group), isTrue); |
| } |
| |
| void test_setSelection() { |
| Position position = Position('test.dart', 3); |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| builder.setSelection(position); |
| expect(builder.sourceChange.selection, position); |
| } |
| |
| void test_sourceChange_emptyEdit() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| String path = '/test.dart'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) {}); |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| expect(sourceChange.edits, isEmpty); |
| expect(sourceChange.linkedEditGroups, isEmpty); |
| expect(sourceChange.message, isEmpty); |
| expect(sourceChange.selection, isNull); |
| } |
| |
| void test_sourceChange_noEdits() { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| expect(sourceChange.edits, isEmpty); |
| expect(sourceChange.linkedEditGroups, isEmpty); |
| expect(sourceChange.message, isEmpty); |
| expect(sourceChange.selection, isNull); |
| } |
| |
| Future<void> test_sourceChange_oneChange() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| String path = '/test.dart'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addSimpleInsertion(0, '_'); |
| }); |
| builder.getLinkedEditGroup('a'); |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| expect(sourceChange.edits, hasLength(1)); |
| expect(sourceChange.linkedEditGroups, hasLength(1)); |
| expect(sourceChange.message, isEmpty); |
| expect(sourceChange.selection, isNull); |
| } |
| } |
| |
| @reflectiveTest |
| class EditBuilderImplTest { |
| String path = '/test.dart'; |
| |
| Future<void> test_addLinkedEdit() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| int offset = 10; |
| String text = 'content'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.addLinkedEdit('a', (LinkedEditBuilder builder) { |
| builder.write(text); |
| }); |
| SourceEdit sourceEdit = (builder as EditBuilderImpl).sourceEdit; |
| expect(sourceEdit.replacement, text); |
| }); |
| }); |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| List<LinkedEditGroup> groups = sourceChange.linkedEditGroups; |
| expect(groups, hasLength(1)); |
| LinkedEditGroup group = groups[0]; |
| expect(group, isNotNull); |
| expect(group.length, text.length); |
| List<Position> positions = group.positions; |
| expect(positions, hasLength(1)); |
| expect(positions[0].offset, offset); |
| } |
| |
| Future<void> test_addSimpleLinkedEdit() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| int offset = 10; |
| String text = 'content'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.addSimpleLinkedEdit('a', text); |
| SourceEdit sourceEdit = (builder as EditBuilderImpl).sourceEdit; |
| expect(sourceEdit.replacement, text); |
| }); |
| }); |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| List<LinkedEditGroup> groups = sourceChange.linkedEditGroups; |
| expect(groups, hasLength(1)); |
| LinkedEditGroup group = groups[0]; |
| expect(group, isNotNull); |
| expect(group.length, text.length); |
| List<Position> positions = group.positions; |
| expect(positions, hasLength(1)); |
| expect(positions[0].offset, offset); |
| } |
| |
| Future<void> test_createLinkedEditBuilder() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| LinkedEditBuilderImpl linkBuilder = |
| (builder as EditBuilderImpl).createLinkedEditBuilder(); |
| expect(linkBuilder, const TypeMatcher<LinkedEditBuilder>()); |
| }); |
| }); |
| } |
| |
| Future<void> test_selectHere() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.selectHere(); |
| }); |
| }); |
| expect(builder.sourceChange.selection.offset, 10); |
| } |
| |
| Future<void> test_write() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| int offset = 10; |
| String text = 'write'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(offset, (EditBuilder builder) { |
| builder.write(text); |
| }); |
| }); |
| |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| |
| List<SourceFileEdit> fileEdits = sourceChange.edits; |
| expect(fileEdits, hasLength(1)); |
| SourceFileEdit fileEdit = fileEdits[0]; |
| expect(fileEdit, isNotNull); |
| expect(fileEdit.file, path); |
| |
| List<SourceEdit> edits = fileEdit.edits; |
| expect(edits, hasLength(1)); |
| SourceEdit edit = edits[0]; |
| expect(edit, isNotNull); |
| expect(edit.offset, offset); |
| expect(edit.length, 0); |
| expect(edit.replacement, text); |
| } |
| |
| Future<void> test_writeln_withoutText() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| int offset = 52; |
| int length = 12; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addReplacement(SourceRange(offset, length), |
| (EditBuilder builder) { |
| builder.writeln(); |
| }); |
| }); |
| |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| |
| List<SourceFileEdit> fileEdits = sourceChange.edits; |
| expect(fileEdits, hasLength(1)); |
| SourceFileEdit fileEdit = fileEdits[0]; |
| expect(fileEdit, isNotNull); |
| expect(fileEdit.file, path); |
| |
| List<SourceEdit> edits = fileEdit.edits; |
| expect(edits, hasLength(1)); |
| SourceEdit edit = edits[0]; |
| expect(edit, isNotNull); |
| expect(edit.offset, offset); |
| expect(edit.length, length); |
| expect(edit.replacement == '\n' || edit.replacement == '\r\n', isTrue); |
| } |
| |
| Future<void> test_writeln_withText() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| int offset = 52; |
| int length = 12; |
| String text = 'writeln'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addReplacement(SourceRange(offset, length), |
| (EditBuilder builder) { |
| builder.writeln(text); |
| }); |
| }); |
| |
| SourceChange sourceChange = builder.sourceChange; |
| expect(sourceChange, isNotNull); |
| |
| List<SourceFileEdit> fileEdits = sourceChange.edits; |
| expect(fileEdits, hasLength(1)); |
| SourceFileEdit fileEdit = fileEdits[0]; |
| expect(fileEdit, isNotNull); |
| expect(fileEdit.file, path); |
| |
| List<SourceEdit> edits = fileEdit.edits; |
| expect(edits, hasLength(1)); |
| SourceEdit edit = edits[0]; |
| expect(edit, isNotNull); |
| expect(edit.offset, offset); |
| expect(edit.length, length); |
| expect(edit.replacement == '$text\n' || edit.replacement == '$text\r\n', |
| isTrue); |
| } |
| } |
| |
| @reflectiveTest |
| class FileEditBuilderImplTest { |
| String path = '/test.dart'; |
| |
| Future<void> test_addDeletion() async { |
| int offset = 23; |
| int length = 7; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addDeletion(SourceRange(offset, length)); |
| }); |
| List<SourceEdit> edits = builder.sourceChange.edits[0].edits; |
| expect(edits, hasLength(1)); |
| expect(edits[0].offset, offset); |
| expect(edits[0].length, length); |
| expect(edits[0].replacement, isEmpty); |
| } |
| |
| Future<void> test_addInsertion() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| expect(builder, isNotNull); |
| }); |
| }); |
| } |
| |
| Future<void> test_addLinkedPosition() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| String groupName = 'a'; |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addLinkedPosition(SourceRange(3, 6), groupName); |
| }); |
| |
| LinkedEditGroup group = builder.getLinkedEditGroup(groupName); |
| List<Position> positions = group.positions; |
| expect(positions, hasLength(1)); |
| Position position = positions[0]; |
| expect(position.file, path); |
| expect(position.offset, 3); |
| expect(group.length, 6); |
| } |
| |
| Future<void> test_addReplacement() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addReplacement(SourceRange(4, 5), (EditBuilder builder) { |
| expect(builder, isNotNull); |
| }); |
| }); |
| } |
| |
| Future<void> test_addSimpleInsertion() async { |
| int offset = 23; |
| String text = 'xyz'; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addSimpleInsertion(offset, text); |
| }); |
| List<SourceEdit> edits = builder.sourceChange.edits[0].edits; |
| expect(edits, hasLength(1)); |
| expect(edits[0].offset, offset); |
| expect(edits[0].length, 0); |
| expect(edits[0].replacement, text); |
| } |
| |
| Future<void> test_addSimpleReplacement() async { |
| int offset = 23; |
| int length = 7; |
| String text = 'xyz'; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addSimpleReplacement(SourceRange(offset, length), text); |
| }); |
| List<SourceEdit> edits = builder.sourceChange.edits[0].edits; |
| expect(edits, hasLength(1)); |
| expect(edits[0].offset, offset); |
| expect(edits[0].length, length); |
| expect(edits[0].replacement, text); |
| } |
| |
| Future<void> test_createEditBuilder() async { |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| int offset = 4; |
| int length = 5; |
| EditBuilderImpl editBuilder = |
| (builder as FileEditBuilderImpl).createEditBuilder(offset, length); |
| expect(editBuilder, const TypeMatcher<EditBuilder>()); |
| SourceEdit sourceEdit = editBuilder.sourceEdit; |
| expect(sourceEdit.length, length); |
| expect(sourceEdit.offset, offset); |
| expect(sourceEdit.replacement, isEmpty); |
| }); |
| } |
| } |
| |
| @reflectiveTest |
| class LinkedEditBuilderImplTest { |
| String path = '/test.dart'; |
| |
| Future<void> test_addSuggestion() async { |
| String groupName = 'a'; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.addLinkedEdit(groupName, (LinkedEditBuilder builder) { |
| builder.write('A'); |
| builder.addSuggestion(LinkedEditSuggestionKind.TYPE, 'B'); |
| }); |
| }); |
| }); |
| |
| LinkedEditGroup group = builder.getLinkedEditGroup(groupName); |
| expect(group.suggestions, hasLength(1)); |
| } |
| |
| Future<void> test_addSuggestion_zeroLength() async { |
| String groupName = 'a'; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.addLinkedEdit(groupName, (LinkedEditBuilder builder) { |
| builder.addSuggestion(LinkedEditSuggestionKind.TYPE, 'A'); |
| }); |
| }); |
| }); |
| |
| expect(builder.sourceChange.linkedEditGroups, isEmpty); |
| } |
| |
| Future<void> test_addSuggestions() async { |
| String groupName = 'a'; |
| ChangeBuilderImpl builder = ChangeBuilderImpl(); |
| await builder.addFileEdit(path, (FileEditBuilder builder) { |
| builder.addInsertion(10, (EditBuilder builder) { |
| builder.addLinkedEdit(groupName, (LinkedEditBuilder builder) { |
| builder.write('A'); |
| builder.addSuggestions(LinkedEditSuggestionKind.TYPE, ['B', 'C']); |
| }); |
| }); |
| }); |
| |
| LinkedEditGroup group = builder.getLinkedEditGroup(groupName); |
| expect(group.suggestions, hasLength(2)); |
| } |
| } |