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