// 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);
  }
}
