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

library analysis_server.test.src.utilities.change_builder_core_test;

import 'package:analysis_server/plugin/edit/utilities/change_builder_core.dart';
import 'package:analysis_server/plugin/protocol/protocol.dart';
import 'package:analysis_server/src/utilities/change_builder_core.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'package:unittest/unittest.dart';

import '../../domain_execution_test.dart';
import '../../utils.dart';

main() {
  initializeTestEnvironment();
  defineReflectiveTests(ChangeBuilderImplTest);
  defineReflectiveTests(EditBuilderImplTest);
  defineReflectiveTests(FileEditBuilderImplTest);
  defineReflectiveTests(LinkedEditBuilderImplTest);
}

@reflectiveTest
class ChangeBuilderImplTest {
  void test_createFileEditBuilder() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    TestSource source = new TestSource('/test.dart');
    int timeStamp = 54;
    FileEditBuilderImpl fileEditBuilder =
        builder.createFileEditBuilder(source, timeStamp);
    expect(fileEditBuilder, new isInstanceOf<FileEditBuilder>());
    SourceFileEdit fileEdit = fileEditBuilder.fileEdit;
    expect(fileEdit.file, source.fullName);
    expect(fileEdit.fileStamp, timeStamp);
  }

  void test_getLinkedEditGroup() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    LinkedEditGroup group = builder.getLinkedEditGroup('a');
    expect(identical(builder.getLinkedEditGroup('b'), group), isFalse);
    expect(identical(builder.getLinkedEditGroup('a'), group), isTrue);
  }

  void test_sourceChange_noChanges() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);
    expect(sourceChange.edits, isEmpty);
    expect(sourceChange.linkedEditGroups, isEmpty);
    expect(sourceChange.message, isEmpty);
    expect(sourceChange.selection, isNull);
  }

  void test_sourceChange_oneChange() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    TestSource source = new TestSource('/test.dart');
    builder.addFileEdit(source, 0, (FileEditBuilder builder) {});
    builder.getLinkedEditGroup('a');
    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);
    expect(sourceChange.edits, hasLength(1));
    expect(sourceChange.linkedEditGroups, hasLength(1));
    expect(sourceChange.message, isEmpty);
    expect(sourceChange.selection, isNull);
  }
}

@reflectiveTest
class EditBuilderImplTest {
  TestSource source = new TestSource('/test.dart');

  void test_addLinkedEdit() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    int offset = 10;
    String text = 'content';
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addInsertion(10, (EditBuilderImpl builder) {
        builder.addLinkedEdit('a', (LinkedEditBuilder builder) {
          builder.write(text);
        });
        SourceEdit sourceEdit = builder.sourceEdit;
        expect(sourceEdit.replacement, text);
      });
    });
    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);
    List<LinkedEditGroup> groups = sourceChange.linkedEditGroups;
    expect(groups, hasLength(1));
    LinkedEditGroup group = groups[0];
    expect(group, isNotNull);
    expect(group.length, text.length);
    List<Position> positions = group.positions;
    expect(positions, hasLength(1));
    expect(positions[0].offset, offset);
  }

  void test_createLinkedEditBuilder() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addInsertion(10, (EditBuilderImpl builder) {
        LinkedEditBuilderImpl linkBuilder = builder.createLinkedEditBuilder();
        expect(linkBuilder, new isInstanceOf<LinkedEditBuilder>());
      });
    });
  }

  void test_write() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    int timeStamp = 93;
    int offset = 10;
    String text = 'write';
    builder.addFileEdit(source, timeStamp, (FileEditBuilderImpl builder) {
      builder.addInsertion(offset, (EditBuilderImpl builder) {
        builder.write(text);
      });
    });

    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);

    List<SourceFileEdit> fileEdits = sourceChange.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = fileEdits[0];
    expect(fileEdit, isNotNull);
    expect(fileEdit.file, source.fullName);
    expect(fileEdit.fileStamp, timeStamp);

    List<SourceEdit> edits = fileEdit.edits;
    expect(edits, hasLength(1));
    SourceEdit edit = edits[0];
    expect(edit, isNotNull);
    expect(edit.offset, offset);
    expect(edit.length, 0);
    expect(edit.replacement, text);
  }

  void test_writeln_withoutText() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    int timeStamp = 39;
    int offset = 52;
    int length = 12;
    builder.addFileEdit(source, timeStamp, (FileEditBuilderImpl builder) {
      builder.addReplacement(offset, length, (EditBuilderImpl builder) {
        builder.writeln();
      });
    });

    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);

    List<SourceFileEdit> fileEdits = sourceChange.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = fileEdits[0];
    expect(fileEdit, isNotNull);
    expect(fileEdit.file, source.fullName);
    expect(fileEdit.fileStamp, timeStamp);

    List<SourceEdit> edits = fileEdit.edits;
    expect(edits, hasLength(1));
    SourceEdit edit = edits[0];
    expect(edit, isNotNull);
    expect(edit.offset, offset);
    expect(edit.length, length);
    expect(edit.replacement == '\n' || edit.replacement == '\r\n', isTrue);
  }

  void test_writeln_withText() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    int timeStamp = 39;
    int offset = 52;
    int length = 12;
    String text = 'writeln';
    builder.addFileEdit(source, timeStamp, (FileEditBuilderImpl builder) {
      builder.addReplacement(offset, length, (EditBuilderImpl builder) {
        builder.writeln(text);
      });
    });

    SourceChange sourceChange = builder.sourceChange;
    expect(sourceChange, isNotNull);

    List<SourceFileEdit> fileEdits = sourceChange.edits;
    expect(fileEdits, hasLength(1));
    SourceFileEdit fileEdit = fileEdits[0];
    expect(fileEdit, isNotNull);
    expect(fileEdit.file, source.fullName);
    expect(fileEdit.fileStamp, timeStamp);

    List<SourceEdit> edits = fileEdit.edits;
    expect(edits, hasLength(1));
    SourceEdit edit = edits[0];
    expect(edit, isNotNull);
    expect(edit.offset, offset);
    expect(edit.length, length);
    expect(edit.replacement == '$text\n' || edit.replacement == '$text\r\n',
        isTrue);
  }
}

@reflectiveTest
class FileEditBuilderImplTest {
  TestSource source = new TestSource('/test.dart');

  void test_addInsertion() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addInsertion(10, (EditBuilderImpl builder) {
        expect(builder, isNotNull);
      });
    });
  }

  void test_addLinkedPosition() {
    ChangeBuilderImpl changeBuilder = new ChangeBuilderImpl();
    String groupName = 'a';
    changeBuilder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addLinkedPosition(3, 6, groupName);
    });

    LinkedEditGroup group = changeBuilder.getLinkedEditGroup(groupName);
    List<Position> positions = group.positions;
    expect(positions, hasLength(1));
    Position position = positions[0];
    expect(position.file, source.fullName);
    expect(position.offset, 3);
    expect(group.length, 6);
  }

  void test_addReplacement() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addReplacement(4, 5, (EditBuilderImpl builder) {
        expect(builder, isNotNull);
      });
    });
  }

  void test_createEditBuilder() {
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      int offset = 4;
      int length = 5;
      EditBuilderImpl editBuilder = builder.createEditBuilder(offset, length);
      expect(editBuilder, new isInstanceOf<EditBuilder>());
      SourceEdit sourceEdit = editBuilder.sourceEdit;
      expect(sourceEdit.length, length);
      expect(sourceEdit.offset, offset);
      expect(sourceEdit.replacement, isEmpty);
    });
  }
}

@reflectiveTest
class LinkedEditBuilderImplTest {
  TestSource source = new TestSource('/test.dart');

  void test_addSuggestion() {
    String groupName = 'a';
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addInsertion(10, (EditBuilderImpl builder) {
        builder.addLinkedEdit(groupName, (LinkedEditBuilderImpl builder) {
          builder.addSuggestion(LinkedEditSuggestionKind.TYPE, 'A');
        });
      });
    });

    LinkedEditGroup group = builder.getLinkedEditGroup(groupName);
    expect(group.suggestions, hasLength(1));
  }

  void test_addSuggestions() {
    String groupName = 'a';
    ChangeBuilderImpl builder = new ChangeBuilderImpl();
    builder.addFileEdit(source, 0, (FileEditBuilderImpl builder) {
      builder.addInsertion(10, (EditBuilderImpl builder) {
        builder.addLinkedEdit(groupName, (LinkedEditBuilderImpl builder) {
          builder.addSuggestions(LinkedEditSuggestionKind.TYPE, ['A', 'B']);
        });
      });
    });

    LinkedEditGroup group = builder.getLinkedEditGroup(groupName);
    expect(group.suggestions, hasLength(2));
  }
}
