// 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';

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 = new ResultMerger();

  void test_mergeAnalysisErrorFixes() {
    AnalysisError createError(int offset) {
      AnalysisErrorSeverity severity = AnalysisErrorSeverity.ERROR;
      AnalysisErrorType type = AnalysisErrorType.HINT;
      Location location = new Location('test.dart', offset, 2, 3, 4);
      return new AnalysisError(severity, type, location, '', '');
    }

    AnalysisError error1 = createError(10);
    AnalysisError error2 = createError(20);
    AnalysisError error3 = createError(30);
    AnalysisError error4 = createError(40);
    plugin.PrioritizedSourceChange change1 =
        new plugin.PrioritizedSourceChange(1, new SourceChange('a'));
    plugin.PrioritizedSourceChange change2 =
        new plugin.PrioritizedSourceChange(2, new SourceChange('b'));
    plugin.PrioritizedSourceChange change3 =
        new plugin.PrioritizedSourceChange(3, new SourceChange('c'));
    plugin.PrioritizedSourceChange change4 =
        new plugin.PrioritizedSourceChange(4, new SourceChange('d'));
    plugin.PrioritizedSourceChange change5 =
        new plugin.PrioritizedSourceChange(5, new SourceChange('e'));
    plugin.AnalysisErrorFixes fix1 =
        new plugin.AnalysisErrorFixes(error1, fixes: [change1]);
    plugin.AnalysisErrorFixes fix2 =
        new plugin.AnalysisErrorFixes(error2, fixes: [change2]);
    plugin.AnalysisErrorFixes fix3 =
        new plugin.AnalysisErrorFixes(error2, fixes: [change3]);
    plugin.AnalysisErrorFixes fix4 =
        new plugin.AnalysisErrorFixes(error3, fixes: [change4]);
    plugin.AnalysisErrorFixes fix5 =
        new plugin.AnalysisErrorFixes(error4, fixes: [change5]);
    plugin.AnalysisErrorFixes fix2and3 =
        new 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) {
      AnalysisErrorSeverity severity = AnalysisErrorSeverity.ERROR;
      AnalysisErrorType type = AnalysisErrorType.HINT;
      Location location = new Location('test.dart', offset, 2, 3, 4);
      return new AnalysisError(severity, type, location, '', '');
    }

    AnalysisError error1 = createError(10);
    AnalysisError error2 = createError(20);
    AnalysisError error3 = createError(30);
    AnalysisError 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) =>
        new CompletionSuggestion(CompletionSuggestionKind.IDENTIFIER, 50,
            completion, 0, 3, false, false);

    CompletionSuggestion suggestion1 = createSuggestion('a');
    CompletionSuggestion suggestion2 = createSuggestion('b');
    CompletionSuggestion suggestion3 = createSuggestion('c');
    CompletionSuggestion suggestion4 = createSuggestion('d');

    void runTest() {
      expect(
          merger.mergeCompletionSuggestions([
            [suggestion1],
            [suggestion2, suggestion3, suggestion4],
            []
          ]),
          unorderedEquals(
              [suggestion1, suggestion2, suggestion3, suggestion4]));
    }

    runTest();
    runTest();
  }

  void test_mergeFoldingRegion() {
    FoldingKind kind = FoldingKind.FILE_HEADER;
    FoldingRegion region1 = new FoldingRegion(kind, 30, 5);
    FoldingRegion region2 = new FoldingRegion(kind, 0, 4);
    FoldingRegion region3 = new FoldingRegion(kind, 20, 6);
    FoldingRegion region4 = new FoldingRegion(kind, 10, 3);
    FoldingRegion region5 = new 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() {
    HighlightRegionType type = HighlightRegionType.COMMENT_BLOCK;
    HighlightRegion region1 = new HighlightRegion(type, 30, 5);
    HighlightRegion region2 = new HighlightRegion(type, 0, 4);
    HighlightRegion region3 = new HighlightRegion(type, 20, 6);
    HighlightRegion region4 = new 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 new NavigationTarget(
          ElementKind.CLASS, fileIndex, offset, 1, 0, 0);
    }

    //
    // Create the parameters from the server.
    //
    NavigationTarget target1_1 = target(0, 1);
    NavigationTarget target1_2 = target(0, 2);
    NavigationTarget target2_1 = target(1, 3);
    NavigationTarget target2_2 = target(1, 4);
    NavigationRegion region1_1 = new NavigationRegion(10, 4, [0]);
    NavigationRegion region1_2 = new NavigationRegion(20, 4, [1]);
    NavigationRegion region2_1 = new NavigationRegion(30, 4, [2]);
    NavigationRegion region2_2 = new NavigationRegion(40, 4, [3]);
    AnalysisNavigationParams params1 = new 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
    NavigationTarget target2_3 = target(0, 4);
    NavigationTarget target2_4 = target(0, 5);
    NavigationTarget target3_1 = target(1, 6);
    NavigationTarget target3_2 = target(1, 7);
    // same region and target as region2_2
    NavigationRegion region2_3 = new NavigationRegion(40, 4, [0]);
    // same region as region2_2, but a different target
    NavigationRegion region2_4 = new NavigationRegion(40, 4, [2]);
    NavigationRegion region2_5 = new NavigationRegion(50, 4, [1]);
    NavigationRegion region3_1 = new NavigationRegion(60, 4, [2]);
    NavigationRegion region3_2 = new NavigationRegion(70, 4, [3]);
    AnalysisNavigationParams params2 = new 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']);
    AnalysisNavigationParams expected = new AnalysisNavigationParams('a.dart', [
      region1_1,
      region1_2,
      region2_1,
      new NavigationRegion(40, 4, [3, 5]), // union of region2_2 and region2_4
      new NavigationRegion(50, 4, [4]), // region2_5
      new NavigationRegion(60, 4, [5]), // region3_1
      new 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() {
    Element element1 = new Element(ElementKind.CLASS, 'e1', 0);
    Element element2 = new Element(ElementKind.CLASS, 'e2', 0);
    Element element3 = new Element(ElementKind.CLASS, 'e3', 0);
    Occurrences occurrence1 = new Occurrences(element1, [1, 2, 4], 2);
    Occurrences occurrence2 = new Occurrences(element2, [5], 2);
    Occurrences occurrence3 = new Occurrences(element1, [2, 3], 2);
    Occurrences occurrence4 = new Occurrences(element3, [8], 2);
    Occurrences occurrence5 = new Occurrences(element2, [6], 2);
    Occurrences occurrence6 = new Occurrences(element3, [7, 9], 2);
    Occurrences result1 = new Occurrences(element1, [1, 2, 3, 4], 2);
    Occurrences result2 = new Occurrences(element2, [5, 6], 2);
    Occurrences result3 = new 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) {
      Location location = new Location('', offset, 0, 0, 0);
      return new Element(kind, '', 0, location: location);
    }

    Element element1 = element(ElementKind.CLASS, 100);
    Element element1_1 = element(ElementKind.METHOD, 110);
    Element element1_2 = element(ElementKind.METHOD, 120);
    Element element2 = element(ElementKind.CLASS, 200);
    Element element2_1 = element(ElementKind.METHOD, 210);
    Element element2_2 = element(ElementKind.METHOD, 220);
    Element element3_1 = element(ElementKind.METHOD, 220); // same as 2_2
    Element element3_2 = element(ElementKind.METHOD, 230);
    Element element4 = element(ElementKind.CLASS, 300);
    Element element4_1 = element(ElementKind.METHOD, 310);
    //
    // Unique, contributed from first plugin.
    //
    // element1
    // - element1_1
    // - element1_2
    //
    Outline outline1_1 = new Outline(element1_1, 0, 0, 0, 0, children: []);
    Outline outline1_2 = new Outline(element1_2, 0, 0, 0, 0, children: []);
    Outline outline1 =
        new 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
    //
    Outline outline2_1 = new Outline(element2_1, 0, 0, 0, 0, children: []);
    Outline outline2_2 = new Outline(element2_2, 0, 0, 0, 0, children: []);
    Outline outline3_1 = new Outline(element3_1, 0, 0, 0, 0, children: []);
    Outline outline3_2 = new Outline(element3_2, 0, 0, 0, 0, children: []);
    Outline outline2 =
        new Outline(element2, 0, 0, 0, 0, children: [outline2_1, outline2_2]);
    Outline outline3 =
        new Outline(element2, 0, 0, 0, 0, children: [outline3_1, outline3_2]);
    Outline outline2and3 = new Outline(element2, 0, 0, 0, 0,
        children: [outline2_1, outline2_2, outline3_2]);
    //
    // Unique, contributed from second plugin.
    //
    // element4
    // - element4_1
    //
    Outline outline4_1 = new Outline(element4_1, 0, 0, 0, 0, children: []);
    Outline outline4 =
        new 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() {
    plugin.PrioritizedSourceChange kind1 =
        new plugin.PrioritizedSourceChange(1, new SourceChange(''));
    plugin.PrioritizedSourceChange kind2 =
        new plugin.PrioritizedSourceChange(1, new SourceChange(''));
    plugin.PrioritizedSourceChange kind3 =
        new plugin.PrioritizedSourceChange(1, new SourceChange(''));
    plugin.PrioritizedSourceChange kind4 =
        new plugin.PrioritizedSourceChange(1, new SourceChange(''));

    void runTest() {
      expect(
          merger.mergePrioritizedSourceChanges([
            [kind3, kind2],
            [],
            [kind4],
            [kind1]
          ]),
          unorderedEquals([kind1, kind2, kind3, kind4]));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_convertGetterToMethodFeedback() {
    RefactoringFeedback feedback1 = new ConvertGetterToMethodFeedback();
    RefactoringFeedback feedback2 = new ConvertGetterToMethodFeedback();

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(feedback1));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_convertMethodToGetterFeedback() {
    RefactoringFeedback feedback1 = new ConvertMethodToGetterFeedback();
    RefactoringFeedback feedback2 = new ConvertMethodToGetterFeedback();

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(feedback1));
    }

    runTest();
    runTest();
  }

  void
      test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_addEverything() {
    List<String> names1 = <String>['a', 'b', 'c'];
    List<int> offsets1 = <int>[10, 20];
    List<int> lengths1 = <int>[4, 5];
    List<int> coveringOffsets1 = <int>[100, 150, 200];
    List<int> coveringLengths1 = <int>[200, 100, 20];
    RefactoringFeedback feedback1 = new ExtractLocalVariableFeedback(
        names1, offsets1, lengths1,
        coveringExpressionOffsets: coveringOffsets1,
        coveringExpressionLengths: coveringLengths1);
    List<String> names2 = <String>['c', 'd'];
    List<int> offsets2 = <int>[30];
    List<int> lengths2 = <int>[6];
    List<int> coveringOffsets2 = <int>[210];
    List<int> coveringLengths2 = <int>[5];
    RefactoringFeedback feedback2 = new ExtractLocalVariableFeedback(
        names2, offsets2, lengths2,
        coveringExpressionOffsets: coveringOffsets2,
        coveringExpressionLengths: coveringLengths2);
    List<String> resultNames = <String>['a', 'b', 'c', 'd'];
    List<int> resultOffsets = new List<int>.from(offsets1)..addAll(offsets2);
    List<int> resultLengths = new List<int>.from(lengths1)..addAll(lengths2);
    List<int> resultCoveringOffsets = new List<int>.from(coveringOffsets1)
      ..addAll(coveringOffsets2);
    List<int> resultCoveringLengths = new List<int>.from(coveringLengths1)
      ..addAll(coveringLengths2);
    RefactoringFeedback result = new ExtractLocalVariableFeedback(
        resultNames, resultOffsets, resultLengths,
        coveringExpressionOffsets: resultCoveringOffsets,
        coveringExpressionLengths: resultCoveringLengths);

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(result));
    }

    runTest();
    runTest();
  }

  void
      test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_addOffsetsAndLengths() {
    List<String> names1 = <String>['a', 'b', 'c'];
    List<int> offsets1 = <int>[10, 20];
    List<int> lengths1 = <int>[4, 5];
    List<int> coveringOffsets1 = <int>[100, 150, 200];
    List<int> coveringLengths1 = <int>[200, 100, 20];
    RefactoringFeedback feedback1 = new ExtractLocalVariableFeedback(
        names1, offsets1, lengths1,
        coveringExpressionOffsets: coveringOffsets1,
        coveringExpressionLengths: coveringLengths1);
    List<String> names2 = <String>[];
    List<int> offsets2 = <int>[30];
    List<int> lengths2 = <int>[6];
    RefactoringFeedback feedback2 =
        new ExtractLocalVariableFeedback(names2, offsets2, lengths2);
    List<int> resultOffsets = new List<int>.from(offsets1)..addAll(offsets2);
    List<int> resultLengths = new List<int>.from(lengths1)..addAll(lengths2);
    RefactoringFeedback result = new ExtractLocalVariableFeedback(
        names1, resultOffsets, resultLengths,
        coveringExpressionOffsets: coveringOffsets1,
        coveringExpressionLengths: coveringLengths1);

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(result));
    }

    runTest();
    runTest();
  }

  void
      test_mergeRefactoringFeedbacks_extractLocalVariableFeedback_noCoverings() {
    List<String> names1 = <String>['a', 'b', 'c'];
    List<int> offsets1 = <int>[10, 20];
    List<int> lengths1 = <int>[4, 5];
    RefactoringFeedback feedback1 =
        new ExtractLocalVariableFeedback(names1, offsets1, lengths1);
    List<String> names2 = <String>[];
    List<int> offsets2 = <int>[30];
    List<int> lengths2 = <int>[6];
    RefactoringFeedback feedback2 =
        new ExtractLocalVariableFeedback(names2, offsets2, lengths2);
    List<int> resultOffsets = new List<int>.from(offsets1)..addAll(offsets2);
    List<int> resultLengths = new List<int>.from(lengths1)..addAll(lengths2);
    RefactoringFeedback result =
        new ExtractLocalVariableFeedback(names1, resultOffsets, resultLengths);

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(result));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_extractMethodFeedback() {
    int offset1 = 20;
    int length1 = 5;
    String returnType1 = 'int';
    List<String> names1 = <String>['a', 'b', 'c'];
    bool canCreateGetter1 = false;
    List<RefactoringMethodParameter> parameters1 =
        <RefactoringMethodParameter>[];
    List<int> offsets1 = <int>[10, 20];
    List<int> lengths1 = <int>[4, 5];
    RefactoringFeedback feedback1 = new ExtractMethodFeedback(offset1, length1,
        returnType1, names1, canCreateGetter1, parameters1, offsets1, lengths1);
    List<String> names2 = <String>['c', 'd'];
    bool canCreateGetter2 = true;
    List<RefactoringMethodParameter> parameters2 =
        <RefactoringMethodParameter>[];
    List<int> offsets2 = <int>[30];
    List<int> lengths2 = <int>[6];
    RefactoringFeedback feedback2 = new ExtractMethodFeedback(
        0, 0, '', names2, canCreateGetter2, parameters2, offsets2, lengths2);
    List<String> resultNames = <String>['a', 'b', 'c', 'd'];
    List<int> resultOffsets = new List<int>.from(offsets1)..addAll(offsets2);
    List<int> resultLengths = new List<int>.from(lengths1)..addAll(lengths2);
    RefactoringFeedback result = new 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 = new InlineLocalVariableFeedback('a', 2);
    RefactoringFeedback feedback2 = new InlineLocalVariableFeedback('a', 3);
    RefactoringFeedback result = new InlineLocalVariableFeedback('a', 5);

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(result));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_inlineMethodFeedback() {
    RefactoringFeedback feedback1 = new InlineMethodFeedback('a', false);
    RefactoringFeedback feedback2 = new InlineMethodFeedback('a', false);

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(feedback1));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_moveFileFeedback() {
    RefactoringFeedback feedback1 = new MoveFileFeedback();
    RefactoringFeedback feedback2 = new MoveFileFeedback();

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(feedback1));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringFeedbacks_renameFeedback() {
    RefactoringFeedback feedback1 = new RenameFeedback(10, 0, '', '');
    RefactoringFeedback feedback2 = new RenameFeedback(20, 0, '', '');

    void runTest() {
      expect(merger.mergeRefactoringFeedbacks([feedback1, feedback2]),
          equals(feedback1));
    }

    runTest();
    runTest();
  }

  void test_mergeRefactoringKinds() {
    RefactoringKind kind1 = RefactoringKind.CONVERT_GETTER_TO_METHOD;
    RefactoringKind kind2 = RefactoringKind.EXTRACT_LOCAL_VARIABLE;
    RefactoringKind kind3 = RefactoringKind.INLINE_LOCAL_VARIABLE;
    RefactoringKind kind4 = RefactoringKind.MOVE_FILE;
    RefactoringKind 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) =>
        new RefactoringProblem(RefactoringProblemSeverity.ERROR, message);
    RefactoringProblem problem1 = problem('1');
    RefactoringProblem problem2 = problem('2');
    RefactoringProblem problem3 = problem('3');
    RefactoringProblem problem4 = problem('4');
    RefactoringProblem problem5 = problem('5');
    RefactoringProblem problem6 = problem('6');

    List<RefactoringProblem> initialProblems1 = <RefactoringProblem>[
      problem1,
      problem2
    ];
    List<RefactoringProblem> optionsProblems1 = <RefactoringProblem>[problem3];
    List<RefactoringProblem> finalProblems1 = <RefactoringProblem>[problem4];
    RefactoringFeedback feedback1 = new RenameFeedback(10, 0, '', '');
    SourceFileEdit edit1 =
        new SourceFileEdit('file1.dart', 11, edits: <SourceEdit>[
      new SourceEdit(12, 2, 'w', id: 'e1'),
      new SourceEdit(13, 3, 'x'),
    ]);
    SourceChange change1 =
        new SourceChange('c1', edits: <SourceFileEdit>[edit1]);
    List<String> potentialEdits1 = <String>['e1'];
    EditGetRefactoringResult result1 = new EditGetRefactoringResult(
        initialProblems1, optionsProblems1, finalProblems1,
        feedback: feedback1, change: change1, potentialEdits: potentialEdits1);
    List<RefactoringProblem> initialProblems2 = <RefactoringProblem>[problem5];
    List<RefactoringProblem> optionsProblems2 = <RefactoringProblem>[];
    List<RefactoringProblem> finalProblems2 = <RefactoringProblem>[problem6];
    RefactoringFeedback feedback2 = new RenameFeedback(20, 0, '', '');
    SourceFileEdit edit2 =
        new SourceFileEdit('file2.dart', 21, edits: <SourceEdit>[
      new SourceEdit(12, 2, 'y', id: 'e2'),
      new SourceEdit(13, 3, 'z'),
    ]);
    SourceChange change2 =
        new SourceChange('c2', edits: <SourceFileEdit>[edit2]);
    List<String> potentialEdits2 = <String>['e2'];
    EditGetRefactoringResult result2 = new EditGetRefactoringResult(
        initialProblems2, optionsProblems2, finalProblems2,
        feedback: feedback2, change: change2, potentialEdits: potentialEdits2);
    List<RefactoringProblem> mergedInitialProblems = <RefactoringProblem>[
      problem1,
      problem2,
      problem5
    ];
    List<RefactoringProblem> mergedOptionsProblems = <RefactoringProblem>[
      problem3
    ];
    List<RefactoringProblem> mergedFinalProblems = <RefactoringProblem>[
      problem4,
      problem6
    ];
    SourceChange mergedChange =
        new SourceChange('c1', edits: <SourceFileEdit>[edit1, edit2]);
    List<String> mergedPotentialEdits = <String>['e1', 'e2'];
    EditGetRefactoringResult mergedResult = new 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() {
    SourceChange kind1 = new SourceChange('');
    SourceChange kind2 = new SourceChange('');
    SourceChange kind3 = new SourceChange('');
    SourceChange kind4 = new 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);
  }
}
