// Copyright (c) 2014, 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.

// @dart = 2.9

import 'package:analysis_server/src/protocol_server.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../constants.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ChangeTest);
    defineReflectiveTests(EditTest);
    defineReflectiveTests(FileEditTest);
    defineReflectiveTests(LinkedEditGroupTest);
    defineReflectiveTests(LinkedEditSuggestionTest);
    defineReflectiveTests(PositionTest);
  });
}

@reflectiveTest
class ChangeTest {
  void test_addEdit() {
    var change = SourceChange('msg');
    var edit1 = SourceEdit(1, 2, 'a');
    var edit2 = SourceEdit(4, 2, 'b');
    expect(change.edits, hasLength(0));
    change.addEdit('/a.dart', 0, edit1);
    expect(change.edits, hasLength(1));
    change.addEdit('/a.dart', 0, edit2);
    expect(change.edits, hasLength(1));
    {
      var fileEdit = change.getFileEdit('/a.dart');
      expect(fileEdit, isNotNull);
      expect(fileEdit.edits, unorderedEquals([edit1, edit2]));
    }
  }

  void test_getFileEdit() {
    var change = SourceChange('msg');
    var fileEdit = SourceFileEdit('/a.dart', 0);
    change.addFileEdit(fileEdit);
    expect(change.getFileEdit('/a.dart'), fileEdit);
  }

  void test_getFileEdit_empty() {
    var change = SourceChange('msg');
    expect(change.getFileEdit('/some.dart'), isNull);
  }

  void test_toJson() {
    var change = SourceChange('msg');
    change.addFileEdit(SourceFileEdit('/a.dart', 1)
      ..add(SourceEdit(1, 2, 'aaa'))
      ..add(SourceEdit(10, 20, 'bbb')));
    change.addFileEdit(SourceFileEdit('/b.dart', 2)
      ..add(SourceEdit(21, 22, 'xxx'))
      ..add(SourceEdit(210, 220, 'yyy')));
    {
      var group = LinkedEditGroup.empty();
      change.addLinkedEditGroup(group
        ..addPosition(Position('/ga.dart', 1), 2)
        ..addPosition(Position('/ga.dart', 10), 2));
      group.addSuggestion(
          LinkedEditSuggestion('AA', LinkedEditSuggestionKind.TYPE));
      group.addSuggestion(
          LinkedEditSuggestion('BB', LinkedEditSuggestionKind.TYPE));
    }
    change.addLinkedEditGroup(LinkedEditGroup.empty()
      ..addPosition(Position('/gb.dart', 10), 5)
      ..addPosition(Position('/gb.dart', 100), 5));
    change.selection = Position('/selection.dart', 42);
    var expectedJson = {
      'message': 'msg',
      'edits': [
        {
          'file': '/a.dart',
          'fileStamp': 1,
          'edits': [
            {'offset': 10, 'length': 20, 'replacement': 'bbb'},
            {'offset': 1, 'length': 2, 'replacement': 'aaa'}
          ]
        },
        {
          'file': '/b.dart',
          'fileStamp': 2,
          'edits': [
            {'offset': 210, 'length': 220, 'replacement': 'yyy'},
            {'offset': 21, 'length': 22, 'replacement': 'xxx'}
          ]
        }
      ],
      'linkedEditGroups': [
        {
          'length': 2,
          'positions': [
            {'file': '/ga.dart', 'offset': 1},
            {'file': '/ga.dart', 'offset': 10}
          ],
          'suggestions': [
            {'kind': 'TYPE', 'value': 'AA'},
            {'kind': 'TYPE', 'value': 'BB'}
          ]
        },
        {
          'length': 5,
          'positions': [
            {'file': '/gb.dart', 'offset': 10},
            {'file': '/gb.dart', 'offset': 100}
          ],
          'suggestions': []
        }
      ],
      'selection': {'file': '/selection.dart', 'offset': 42}
    };
    expect(change.toJson(), expectedJson);
    // some toString()
    change.toString();
  }
}

@reflectiveTest
class EditTest {
  void test_applySequence() {
    var edit1 = SourceEdit(5, 2, 'abc');
    var edit2 = SourceEdit(1, 0, '!');
    expect(
        SourceEdit.applySequence('0123456789', [edit1, edit2]), '0!1234abc789');
  }

  void test_editFromRange() {
    var range = SourceRange(1, 2);
    var edit = newSourceEdit_range(range, 'foo');
    expect(edit.offset, 1);
    expect(edit.length, 2);
    expect(edit.replacement, 'foo');
  }

  void test_eqEq() {
    var a = SourceEdit(1, 2, 'aaa');
    expect(a == a, isTrue);
    expect(a == SourceEdit(1, 2, 'aaa'), isTrue);
    // ignore: unrelated_type_equality_checks
    expect(a == this, isFalse);
    expect(a == SourceEdit(1, 2, 'bbb'), isFalse);
    expect(a == SourceEdit(10, 2, 'aaa'), isFalse);
  }

  void test_new() {
    var edit = SourceEdit(1, 2, 'foo', id: 'my-id');
    expect(edit.offset, 1);
    expect(edit.length, 2);
    expect(edit.replacement, 'foo');
    expect(edit.toJson(),
        {'offset': 1, 'length': 2, 'replacement': 'foo', 'id': 'my-id'});
  }

  void test_toJson() {
    var edit = SourceEdit(1, 2, 'foo');
    var expectedJson = {OFFSET: 1, LENGTH: 2, REPLACEMENT: 'foo'};
    expect(edit.toJson(), expectedJson);
  }
}

@reflectiveTest
class FileEditTest {
  void test_add_sorts() {
    var edit1a = SourceEdit(1, 0, 'a1');
    var edit1b = SourceEdit(1, 0, 'a2');
    var edit10 = SourceEdit(10, 1, 'b');
    var edit100 = SourceEdit(100, 2, 'c');
    var fileEdit = SourceFileEdit('/test.dart', 0);
    fileEdit.add(edit100);
    fileEdit.add(edit1a);
    fileEdit.add(edit1b);
    fileEdit.add(edit10);
    expect(fileEdit.edits, [edit100, edit10, edit1b, edit1a]);
  }

  void test_addAll() {
    var edit1a = SourceEdit(1, 0, 'a1');
    var edit1b = SourceEdit(1, 0, 'a2');
    var edit10 = SourceEdit(10, 1, 'b');
    var edit100 = SourceEdit(100, 2, 'c');
    var fileEdit = SourceFileEdit('/test.dart', 0);
    fileEdit.addAll([edit100, edit1a, edit10, edit1b]);
    expect(fileEdit.edits, [edit100, edit10, edit1b, edit1a]);
  }

  void test_new() {
    var fileEdit = SourceFileEdit('/test.dart', 100);
    fileEdit.add(SourceEdit(1, 2, 'aaa'));
    fileEdit.add(SourceEdit(10, 20, 'bbb'));
    expect(
        fileEdit.toString(),
        '{"file":"/test.dart","fileStamp":100,"edits":['
        '{"offset":10,"length":20,"replacement":"bbb"},'
        '{"offset":1,"length":2,"replacement":"aaa"}]}');
  }

  void test_toJson() {
    var fileEdit = SourceFileEdit('/test.dart', 100);
    fileEdit.add(SourceEdit(1, 2, 'aaa'));
    fileEdit.add(SourceEdit(10, 20, 'bbb'));
    var expectedJson = {
      FILE: '/test.dart',
      FILE_STAMP: 100,
      EDITS: [
        {OFFSET: 10, LENGTH: 20, REPLACEMENT: 'bbb'},
        {OFFSET: 1, LENGTH: 2, REPLACEMENT: 'aaa'},
      ]
    };
    expect(fileEdit.toJson(), expectedJson);
  }
}

@reflectiveTest
class LinkedEditGroupTest {
  void test_new() {
    var group = LinkedEditGroup.empty();
    group.addPosition(Position('/a.dart', 1), 2);
    group.addPosition(Position('/b.dart', 10), 2);
    expect(
        group.toString(),
        '{"positions":['
        '{"file":"/a.dart","offset":1},'
        '{"file":"/b.dart","offset":10}],"length":2,"suggestions":[]}');
  }

  void test_toJson() {
    var group = LinkedEditGroup.empty();
    group.addPosition(Position('/a.dart', 1), 2);
    group.addPosition(Position('/b.dart', 10), 2);
    group.addSuggestion(
        LinkedEditSuggestion('AA', LinkedEditSuggestionKind.TYPE));
    group.addSuggestion(
        LinkedEditSuggestion('BB', LinkedEditSuggestionKind.TYPE));
    expect(group.toJson(), {
      'length': 2,
      'positions': [
        {'file': '/a.dart', 'offset': 1},
        {'file': '/b.dart', 'offset': 10}
      ],
      'suggestions': [
        {'kind': 'TYPE', 'value': 'AA'},
        {'kind': 'TYPE', 'value': 'BB'}
      ]
    });
  }
}

@reflectiveTest
class LinkedEditSuggestionTest {
  void test_eqEq() {
    var a = LinkedEditSuggestion('a', LinkedEditSuggestionKind.METHOD);
    var a2 = LinkedEditSuggestion('a', LinkedEditSuggestionKind.METHOD);
    var b = LinkedEditSuggestion('a', LinkedEditSuggestionKind.TYPE);
    var c = LinkedEditSuggestion('c', LinkedEditSuggestionKind.METHOD);
    expect(a == a, isTrue);
    expect(a == a2, isTrue);
    // ignore: unrelated_type_equality_checks
    expect(a == this, isFalse);
    expect(a == b, isFalse);
    expect(a == c, isFalse);
  }
}

@reflectiveTest
class PositionTest {
  void test_eqEq() {
    var a = Position('/a.dart', 1);
    var a2 = Position('/a.dart', 1);
    var b = Position('/b.dart', 1);
    expect(a == a, isTrue);
    expect(a == a2, isTrue);
    expect(a == b, isFalse);
    // ignore: unrelated_type_equality_checks
    expect(a == this, isFalse);
  }

  void test_hashCode() {
    var position = Position('/test.dart', 1);
    position.hashCode;
  }

  void test_new() {
    var position = Position('/test.dart', 1);
    expect(position.file, '/test.dart');
    expect(position.offset, 1);
    expect(position.toString(), '{"file":"/test.dart","offset":1}');
  }

  void test_toJson() {
    var position = Position('/test.dart', 1);
    var expectedJson = {FILE: '/test.dart', OFFSET: 1};
    expect(position.toJson(), expectedJson);
  }
}
