| // 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:analysis_server/protocol/protocol_generated.dart'; | |
| import 'package:analysis_server/src/plugin/result_merger.dart'; | |
| import 'package:analyzer_plugin/protocol/protocol_common.dart'; | |
| import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin; | |
| import 'package:test/test.dart'; | |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| void main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(ResultMergerTest); | |
| }); | |
| } | |
| @reflectiveTest | |
| class ResultMergerTest { | |
| // | |
| // The tests in this class should always perform the merge operation twice | |
| // using the same input values in order to ensure that the input values are | |
| // not modified by the merge operation. | |
| // | |
| ResultMerger merger = ResultMerger(); | |
| void test_mergeAnalysisErrorFixes() { | |
| AnalysisError createError(int offset) { | |
| var severity = AnalysisErrorSeverity.ERROR; | |
| var type = AnalysisErrorType.HINT; | |
| var location = Location( | |
| 'test.dart', | |
| offset, | |
| 2, | |
| 3, | |
| 4, | |
| endLine: 5, | |
| endColumn: 6, | |
| ); | |
| return AnalysisError(severity, type, location, '', ''); | |
| } | |
| var error1 = createError(10); | |
| var error2 = createError(20); | |
| var error3 = createError(30); | |
| var error4 = createError(40); | |
| var change1 = plugin.PrioritizedSourceChange(1, SourceChange('a')); | |
| var change2 = plugin.PrioritizedSourceChange(2, SourceChange('b')); | |
| var change3 = plugin.PrioritizedSourceChange(3, SourceChange('c')); | |
| var change4 = plugin.PrioritizedSourceChange(4, SourceChange('d')); | |
| var change5 = plugin.PrioritizedSourceChange(5, SourceChange('e')); | |
| var fix1 = plugin.AnalysisErrorFixes(error1, fixes: [change1]); | |
| var fix2 = plugin.AnalysisErrorFixes(error2, fixes: [change2]); | |
| var fix3 = plugin.AnalysisErrorFixes(error2, fixes: [change3]); | |
| var fix4 = plugin.AnalysisErrorFixes(error3, fixes: [change4]); | |
| var fix5 = plugin.AnalysisErrorFixes(error4, fixes: [change5]); | |
| var fix2and3 = plugin.AnalysisErrorFixes(error2, fixes: [change2, change3]); | |
| void runTest() { | |
| expect( | |
| merger.mergeAnalysisErrorFixes([ | |
| [fix1, fix2], | |
| [fix3, fix4], | |
| [fix5], | |
| [], | |
| ]), | |
| unorderedEquals([fix1, fix2and3, fix4, fix5]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeAnalysisErrors() { | |
| AnalysisError createError(int offset) { | |
| var severity = AnalysisErrorSeverity.ERROR; | |
| var type = AnalysisErrorType.HINT; | |
| var location = Location( | |
| 'test.dart', | |
| offset, | |
| 2, | |
| 3, | |
| 4, | |
| endLine: 5, | |
| endColumn: 6, | |
| ); | |
| return AnalysisError(severity, type, location, '', ''); | |
| } | |
| var error1 = createError(10); | |
| var error2 = createError(20); | |
| var error3 = createError(30); | |
| var error4 = createError(40); | |
| void runTest() { | |
| expect( | |
| merger.mergeAnalysisErrors([ | |
| [error1, error2], | |
| [error3], | |
| [], | |
| [error4], | |
| ]), | |
| unorderedEquals([error1, error2, error3, error4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeCompletionSuggestions() { | |
| CompletionSuggestion createSuggestion(String completion) => | |
| CompletionSuggestion( | |
| CompletionSuggestionKind.IDENTIFIER, | |
| 50, | |
| completion, | |
| 0, | |
| 3, | |
| false, | |
| false, | |
| ); | |
| var suggestion1 = createSuggestion('a'); | |
| var suggestion2 = createSuggestion('b'); | |
| var suggestion3 = createSuggestion('c'); | |
| var suggestion4 = createSuggestion('d'); | |
| void runTest() { | |
| expect( | |
| merger.mergeCompletionSuggestions([ | |
| [suggestion1], | |
| [suggestion2, suggestion3, suggestion4], | |
| [], | |
| ]), | |
| unorderedEquals([suggestion1, suggestion2, suggestion3, suggestion4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeFoldingRegion() { | |
| var kind = FoldingKind.FILE_HEADER; | |
| var region1 = FoldingRegion(kind, 30, 5); | |
| var region2 = FoldingRegion(kind, 0, 4); | |
| var region3 = FoldingRegion(kind, 20, 6); | |
| var region4 = FoldingRegion(kind, 10, 3); | |
| var region5 = FoldingRegion(kind, 2, 6); // overlaps | |
| void runTest() { | |
| expect( | |
| merger.mergeFoldingRegions([ | |
| [region1, region2], | |
| [], | |
| [region3], | |
| [region4, region5], | |
| ]), | |
| unorderedEquals([region1, region2, region3, region4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeHighlightRegions() { | |
| var type = HighlightRegionType.COMMENT_BLOCK; | |
| var region1 = HighlightRegion(type, 30, 5); | |
| var region2 = HighlightRegion(type, 0, 4); | |
| var region3 = HighlightRegion(type, 20, 6); | |
| var region4 = HighlightRegion(type, 10, 3); | |
| void runTest() { | |
| expect( | |
| merger.mergeHighlightRegions([ | |
| [region1, region2], | |
| [], | |
| [region3], | |
| [region4], | |
| ]), | |
| unorderedEquals([region1, region2, region3, region4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeNavigation() { | |
| NavigationTarget target(int fileIndex, int offset) { | |
| return NavigationTarget( | |
| ElementKind.CLASS, | |
| fileIndex, | |
| offset, | |
| 1, | |
| 0, | |
| 0, | |
| codeOffset: offset, | |
| codeLength: 1, | |
| ); | |
| } | |
| // | |
| // Create the parameters from the server. | |
| // | |
| var target1_1 = target(0, 1); | |
| var target1_2 = target(0, 2); | |
| var target2_1 = target(1, 3); | |
| var target2_2 = target(1, 4); | |
| var region1_1 = NavigationRegion(10, 4, [0]); | |
| var region1_2 = NavigationRegion(20, 4, [1]); | |
| var region2_1 = NavigationRegion(30, 4, [2]); | |
| var region2_2 = NavigationRegion(40, 4, [3]); | |
| var params1 = AnalysisNavigationParams( | |
| 'a.dart', | |
| [region1_1, region1_2, region2_1, region2_2], | |
| [target1_1, target1_2, target2_1, target2_2], | |
| ['one.dart', 'two.dart'], | |
| ); | |
| // | |
| // Create the parameters from the second plugin. | |
| // | |
| // same file and offset as target 2_2 | |
| var target2_3 = target(0, 4); | |
| var target2_4 = target(0, 5); | |
| var target3_1 = target(1, 6); | |
| var target3_2 = target(1, 7); | |
| // same region and target as region2_2 | |
| var region2_3 = NavigationRegion(40, 4, [0]); | |
| // same region as region2_2, but a different target | |
| var region2_4 = NavigationRegion(40, 4, [2]); | |
| var region2_5 = NavigationRegion(50, 4, [1]); | |
| var region3_1 = NavigationRegion(60, 4, [2]); | |
| var region3_2 = NavigationRegion(70, 4, [3]); | |
| var params2 = AnalysisNavigationParams( | |
| 'a.dart', | |
| [region2_3, region2_4, region2_5, region3_1, region3_2], | |
| [target2_3, target2_4, target3_1, target3_2], | |
| ['two.dart', 'three.dart'], | |
| ); | |
| var expected = AnalysisNavigationParams( | |
| 'a.dart', | |
| [ | |
| region1_1, | |
| region1_2, | |
| region2_1, | |
| NavigationRegion(40, 4, [3, 5]), // union of region2_2 and region2_4 | |
| NavigationRegion(50, 4, [4]), // region2_5 | |
| NavigationRegion(60, 4, [5]), // region3_1 | |
| NavigationRegion(70, 4, [6]), // region3_2 | |
| ], | |
| [ | |
| target1_1, | |
| target1_2, | |
| target2_1, | |
| target2_2, | |
| target(1, 5), // target2_4 | |
| target(2, 6), // target3_1 | |
| target(2, 7), // target3_2 | |
| ], | |
| ['one.dart', 'two.dart', 'three.dart'], | |
| ); | |
| void runTest() { | |
| expect(merger.mergeNavigation([params1, params2]), expected); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeOccurrences() { | |
| var element1 = Element(ElementKind.CLASS, 'e1', 0); | |
| var element2 = Element(ElementKind.CLASS, 'e2', 0); | |
| var element3 = Element(ElementKind.CLASS, 'e3', 0); | |
| var occurrence1 = Occurrences(element1, [1, 2, 4], 2); | |
| var occurrence2 = Occurrences(element2, [5], 2); | |
| var occurrence3 = Occurrences(element1, [2, 3], 2); | |
| var occurrence4 = Occurrences(element3, [8], 2); | |
| var occurrence5 = Occurrences(element2, [6], 2); | |
| var occurrence6 = Occurrences(element3, [7, 9], 2); | |
| var result1 = Occurrences(element1, [1, 2, 3, 4], 2); | |
| var result2 = Occurrences(element2, [5, 6], 2); | |
| var result3 = Occurrences(element3, [7, 8, 9], 2); | |
| void runTest() { | |
| expect( | |
| merger.mergeOccurrences([ | |
| [occurrence1, occurrence2], | |
| [], | |
| [occurrence3, occurrence4], | |
| [occurrence5, occurrence6], | |
| ]), | |
| unorderedEquals([result1, result2, result3]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeOutline() { | |
| Element element(ElementKind kind, int offset) { | |
| var location = Location('', offset, 0, 0, 0, endLine: 0, endColumn: 0); | |
| return Element(kind, '', 0, location: location); | |
| } | |
| var element1 = element(ElementKind.CLASS, 100); | |
| var element1_1 = element(ElementKind.METHOD, 110); | |
| var element1_2 = element(ElementKind.METHOD, 120); | |
| var element2 = element(ElementKind.CLASS, 200); | |
| var element2_1 = element(ElementKind.METHOD, 210); | |
| var element2_2 = element(ElementKind.METHOD, 220); | |
| var element3_1 = element(ElementKind.METHOD, 220); // same as 2_2 | |
| var element3_2 = element(ElementKind.METHOD, 230); | |
| var element4 = element(ElementKind.CLASS, 300); | |
| var element4_1 = element(ElementKind.METHOD, 310); | |
| // | |
| // Unique, contributed from first plugin. | |
| // | |
| // element1 | |
| // - element1_1 | |
| // - element1_2 | |
| // | |
| var outline1_1 = Outline(element1_1, 0, 0, 0, 0, children: []); | |
| var outline1_2 = Outline(element1_2, 0, 0, 0, 0, children: []); | |
| var outline1 = Outline( | |
| element1, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| children: [outline1_1, outline1_2], | |
| ); | |
| // | |
| // Same top level element, common child. | |
| // | |
| // element2 | |
| // - element2_1 | |
| // - element2_2 | |
| // element2 | |
| // - element3_1 | |
| // - element3_2 | |
| // | |
| var outline2_1 = Outline(element2_1, 0, 0, 0, 0, children: []); | |
| var outline2_2 = Outline(element2_2, 0, 0, 0, 0, children: []); | |
| var outline3_1 = Outline(element3_1, 0, 0, 0, 0, children: []); | |
| var outline3_2 = Outline(element3_2, 0, 0, 0, 0, children: []); | |
| var outline2 = Outline( | |
| element2, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| children: [outline2_1, outline2_2], | |
| ); | |
| var outline3 = Outline( | |
| element2, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| children: [outline3_1, outline3_2], | |
| ); | |
| var outline2and3 = Outline( | |
| element2, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| children: [outline2_1, outline2_2, outline3_2], | |
| ); | |
| // | |
| // Unique, contributed from second plugin. | |
| // | |
| // element4 | |
| // - element4_1 | |
| // | |
| var outline4_1 = Outline(element4_1, 0, 0, 0, 0, children: []); | |
| var outline4 = Outline(element4, 0, 0, 0, 0, children: [outline4_1]); | |
| void runTest() { | |
| expect( | |
| merger.mergeOutline([ | |
| [outline1, outline2], | |
| [], | |
| [outline3, outline4], | |
| ]), | |
| unorderedEquals([outline1, outline2and3, outline4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergePrioritizedSourceChanges() { | |
| var kind1 = plugin.PrioritizedSourceChange(1, SourceChange('')); | |
| var kind2 = plugin.PrioritizedSourceChange(1, SourceChange('')); | |
| var kind3 = plugin.PrioritizedSourceChange(1, SourceChange('')); | |
| var kind4 = plugin.PrioritizedSourceChange(1, SourceChange('')); | |
| void runTest() { | |
| expect( | |
| merger.mergePrioritizedSourceChanges([ | |
| [kind3, kind2], | |
| [], | |
| [kind4], | |
| [kind1], | |
| ]), | |
| unorderedEquals([kind1, kind2, kind3, kind4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_convertGetterToMethodFeedback() { | |
| RefactoringFeedback feedback1 = ConvertGetterToMethodFeedback(); | |
| RefactoringFeedback feedback2 = ConvertGetterToMethodFeedback(); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(feedback1), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_convertMethodToGetterFeedback() { | |
| RefactoringFeedback feedback1 = ConvertMethodToGetterFeedback(); | |
| RefactoringFeedback feedback2 = ConvertMethodToGetterFeedback(); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(feedback1), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void | |
| test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_addEverything() { | |
| var names1 = <String>['a', 'b', 'c']; | |
| var offsets1 = <int>[10, 20]; | |
| var lengths1 = <int>[4, 5]; | |
| var coveringOffsets1 = <int>[100, 150, 200]; | |
| var coveringLengths1 = <int>[200, 100, 20]; | |
| RefactoringFeedback feedback1 = ExtractLocalVariableFeedback( | |
| names1, | |
| offsets1, | |
| lengths1, | |
| coveringExpressionOffsets: coveringOffsets1, | |
| coveringExpressionLengths: coveringLengths1, | |
| ); | |
| var names2 = <String>['c', 'd']; | |
| var offsets2 = <int>[30]; | |
| var lengths2 = <int>[6]; | |
| var coveringOffsets2 = <int>[210]; | |
| var coveringLengths2 = <int>[5]; | |
| RefactoringFeedback feedback2 = ExtractLocalVariableFeedback( | |
| names2, | |
| offsets2, | |
| lengths2, | |
| coveringExpressionOffsets: coveringOffsets2, | |
| coveringExpressionLengths: coveringLengths2, | |
| ); | |
| var resultNames = <String>['a', 'b', 'c', 'd']; | |
| var resultOffsets = List<int>.from(offsets1)..addAll(offsets2); | |
| var resultLengths = List<int>.from(lengths1)..addAll(lengths2); | |
| var resultCoveringOffsets = List<int>.from(coveringOffsets1) | |
| ..addAll(coveringOffsets2); | |
| var resultCoveringLengths = List<int>.from(coveringLengths1) | |
| ..addAll(coveringLengths2); | |
| RefactoringFeedback result = ExtractLocalVariableFeedback( | |
| resultNames, | |
| resultOffsets, | |
| resultLengths, | |
| coveringExpressionOffsets: resultCoveringOffsets, | |
| coveringExpressionLengths: resultCoveringLengths, | |
| ); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(result), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void | |
| test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_addOffsetsAndLengths() { | |
| var names1 = <String>['a', 'b', 'c']; | |
| var offsets1 = <int>[10, 20]; | |
| var lengths1 = <int>[4, 5]; | |
| var coveringOffsets1 = <int>[100, 150, 200]; | |
| var coveringLengths1 = <int>[200, 100, 20]; | |
| RefactoringFeedback feedback1 = ExtractLocalVariableFeedback( | |
| names1, | |
| offsets1, | |
| lengths1, | |
| coveringExpressionOffsets: coveringOffsets1, | |
| coveringExpressionLengths: coveringLengths1, | |
| ); | |
| var names2 = <String>[]; | |
| var offsets2 = <int>[30]; | |
| var lengths2 = <int>[6]; | |
| RefactoringFeedback feedback2 = ExtractLocalVariableFeedback( | |
| names2, | |
| offsets2, | |
| lengths2, | |
| ); | |
| var resultOffsets = List<int>.from(offsets1)..addAll(offsets2); | |
| var resultLengths = List<int>.from(lengths1)..addAll(lengths2); | |
| RefactoringFeedback result = ExtractLocalVariableFeedback( | |
| names1, | |
| resultOffsets, | |
| resultLengths, | |
| coveringExpressionOffsets: coveringOffsets1, | |
| coveringExpressionLengths: coveringLengths1, | |
| ); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(result), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void | |
| test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_noCoverings() { | |
| var names1 = <String>['a', 'b', 'c']; | |
| var offsets1 = <int>[10, 20]; | |
| var lengths1 = <int>[4, 5]; | |
| RefactoringFeedback feedback1 = ExtractLocalVariableFeedback( | |
| names1, | |
| offsets1, | |
| lengths1, | |
| ); | |
| var names2 = <String>[]; | |
| var offsets2 = <int>[30]; | |
| var lengths2 = <int>[6]; | |
| RefactoringFeedback feedback2 = ExtractLocalVariableFeedback( | |
| names2, | |
| offsets2, | |
| lengths2, | |
| ); | |
| var resultOffsets = List<int>.from(offsets1)..addAll(offsets2); | |
| var resultLengths = List<int>.from(lengths1)..addAll(lengths2); | |
| RefactoringFeedback result = ExtractLocalVariableFeedback( | |
| names1, | |
| resultOffsets, | |
| resultLengths, | |
| ); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(result), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_extractMethodFeedback() { | |
| var offset1 = 20; | |
| var length1 = 5; | |
| var returnType1 = 'int'; | |
| var names1 = <String>['a', 'b', 'c']; | |
| var canCreateGetter1 = false; | |
| var parameters1 = <RefactoringMethodParameter>[]; | |
| var offsets1 = <int>[10, 20]; | |
| var lengths1 = <int>[4, 5]; | |
| RefactoringFeedback feedback1 = ExtractMethodFeedback( | |
| offset1, | |
| length1, | |
| returnType1, | |
| names1, | |
| canCreateGetter1, | |
| parameters1, | |
| offsets1, | |
| lengths1, | |
| ); | |
| var names2 = <String>['c', 'd']; | |
| var canCreateGetter2 = true; | |
| var parameters2 = <RefactoringMethodParameter>[]; | |
| var offsets2 = <int>[30]; | |
| var lengths2 = <int>[6]; | |
| RefactoringFeedback feedback2 = ExtractMethodFeedback( | |
| 0, | |
| 0, | |
| '', | |
| names2, | |
| canCreateGetter2, | |
| parameters2, | |
| offsets2, | |
| lengths2, | |
| ); | |
| var resultNames = <String>['a', 'b', 'c', 'd']; | |
| var resultOffsets = List<int>.from(offsets1)..addAll(offsets2); | |
| var resultLengths = List<int>.from(lengths1)..addAll(lengths2); | |
| RefactoringFeedback result = ExtractMethodFeedback( | |
| offset1, | |
| length1, | |
| returnType1, | |
| resultNames, | |
| false, | |
| parameters1, | |
| resultOffsets, | |
| resultLengths, | |
| ); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(result), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_inlineLocalVariableFeedback() { | |
| RefactoringFeedback feedback1 = InlineLocalVariableFeedback('a', 2); | |
| RefactoringFeedback feedback2 = InlineLocalVariableFeedback('a', 3); | |
| RefactoringFeedback result = InlineLocalVariableFeedback('a', 5); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(result), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_inlineMethodFeedback() { | |
| RefactoringFeedback feedback1 = InlineMethodFeedback('a', false); | |
| RefactoringFeedback feedback2 = InlineMethodFeedback('a', false); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(feedback1), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_moveFileFeedback() { | |
| RefactoringFeedback feedback1 = MoveFileFeedback(); | |
| RefactoringFeedback feedback2 = MoveFileFeedback(); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(feedback1), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringFeedbacks_renameFeedback() { | |
| RefactoringFeedback feedback1 = RenameFeedback(10, 0, '', ''); | |
| RefactoringFeedback feedback2 = RenameFeedback(20, 0, '', ''); | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| equals(feedback1), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactoringKinds() { | |
| var kind1 = RefactoringKind.CONVERT_GETTER_TO_METHOD; | |
| var kind2 = RefactoringKind.EXTRACT_LOCAL_VARIABLE; | |
| var kind3 = RefactoringKind.INLINE_LOCAL_VARIABLE; | |
| var kind4 = RefactoringKind.MOVE_FILE; | |
| var kind5 = RefactoringKind.EXTRACT_LOCAL_VARIABLE; | |
| void runTest() { | |
| expect( | |
| merger.mergeRefactoringKinds([ | |
| [kind1, kind2], | |
| [kind3], | |
| [], | |
| [kind4, kind5], | |
| ]), | |
| unorderedEquals([kind1, kind2, kind3, kind4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeRefactorings() { | |
| RefactoringProblem problem(String message) => | |
| RefactoringProblem(RefactoringProblemSeverity.ERROR, message); | |
| var problem1 = problem('1'); | |
| var problem2 = problem('2'); | |
| var problem3 = problem('3'); | |
| var problem4 = problem('4'); | |
| var problem5 = problem('5'); | |
| var problem6 = problem('6'); | |
| var initialProblems1 = <RefactoringProblem>[problem1, problem2]; | |
| var optionsProblems1 = <RefactoringProblem>[problem3]; | |
| var finalProblems1 = <RefactoringProblem>[problem4]; | |
| RefactoringFeedback feedback1 = RenameFeedback(10, 0, '', ''); | |
| var edit1 = SourceFileEdit( | |
| 'file1.dart', | |
| 11, | |
| edits: <SourceEdit>[ | |
| SourceEdit(12, 2, 'w', id: 'e1'), | |
| SourceEdit(13, 3, 'x'), | |
| ], | |
| ); | |
| var change1 = SourceChange('c1', edits: <SourceFileEdit>[edit1]); | |
| var potentialEdits1 = <String>['e1']; | |
| var result1 = EditGetRefactoringResult( | |
| initialProblems1, | |
| optionsProblems1, | |
| finalProblems1, | |
| feedback: feedback1, | |
| change: change1, | |
| potentialEdits: potentialEdits1, | |
| ); | |
| var initialProblems2 = <RefactoringProblem>[problem5]; | |
| var optionsProblems2 = <RefactoringProblem>[]; | |
| var finalProblems2 = <RefactoringProblem>[problem6]; | |
| RefactoringFeedback feedback2 = RenameFeedback(20, 0, '', ''); | |
| var edit2 = SourceFileEdit( | |
| 'file2.dart', | |
| 21, | |
| edits: <SourceEdit>[ | |
| SourceEdit(12, 2, 'y', id: 'e2'), | |
| SourceEdit(13, 3, 'z'), | |
| ], | |
| ); | |
| var change2 = SourceChange('c2', edits: <SourceFileEdit>[edit2]); | |
| var potentialEdits2 = <String>['e2']; | |
| var result2 = EditGetRefactoringResult( | |
| initialProblems2, | |
| optionsProblems2, | |
| finalProblems2, | |
| feedback: feedback2, | |
| change: change2, | |
| potentialEdits: potentialEdits2, | |
| ); | |
| var mergedInitialProblems = <RefactoringProblem>[ | |
| problem1, | |
| problem2, | |
| problem5, | |
| ]; | |
| var mergedOptionsProblems = <RefactoringProblem>[problem3]; | |
| var mergedFinalProblems = <RefactoringProblem>[problem4, problem6]; | |
| var mergedChange = SourceChange( | |
| 'c1', | |
| edits: <SourceFileEdit>[edit1, edit2], | |
| ); | |
| var mergedPotentialEdits = <String>['e1', 'e2']; | |
| var mergedResult = EditGetRefactoringResult( | |
| mergedInitialProblems, | |
| mergedOptionsProblems, | |
| mergedFinalProblems, | |
| feedback: merger.mergeRefactoringFeedbacks([feedback1, feedback2]), | |
| change: mergedChange, | |
| potentialEdits: mergedPotentialEdits, | |
| ); | |
| void runTest() { | |
| expect(merger.mergeRefactorings([result1, result2]), mergedResult); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_mergeSourceChanges() { | |
| var kind1 = SourceChange(''); | |
| var kind2 = SourceChange(''); | |
| var kind3 = SourceChange(''); | |
| var kind4 = SourceChange(''); | |
| void runTest() { | |
| expect( | |
| merger.mergeSourceChanges([ | |
| [kind1, kind2], | |
| [], | |
| [kind3], | |
| [kind4], | |
| ]), | |
| unorderedEquals([kind1, kind2, kind3, kind4]), | |
| ); | |
| } | |
| runTest(); | |
| runTest(); | |
| } | |
| void test_overlaps_false_nested_left() { | |
| expect(merger.overlaps(3, 5, 1, 7, allowNesting: true), isFalse); | |
| } | |
| void test_overlaps_false_nested_right() { | |
| expect(merger.overlaps(1, 7, 3, 5, allowNesting: true), isFalse); | |
| } | |
| void test_overlaps_false_onLeft() { | |
| expect(merger.overlaps(1, 3, 5, 7), isFalse); | |
| } | |
| void test_overlaps_false_onRight() { | |
| expect(merger.overlaps(5, 7, 1, 3), isFalse); | |
| } | |
| void test_overlaps_true_nested_left() { | |
| expect(merger.overlaps(3, 5, 1, 7), isTrue); | |
| } | |
| void test_overlaps_true_nested_right() { | |
| expect(merger.overlaps(1, 7, 3, 5), isTrue); | |
| } | |
| void test_overlaps_true_onLeft() { | |
| expect(merger.overlaps(1, 5, 3, 7), isTrue); | |
| } | |
| void test_overlaps_true_onRight() { | |
| expect(merger.overlaps(3, 7, 1, 5), isTrue); | |
| } | |
| } |