// 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.

import 'package:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'abstract_rename.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(RenameLibraryTest);
    defineReflectiveTests(RenameLibraryTest_UseCFE);
  });
}

@reflectiveTest
class RenameLibraryTest extends RenameRefactoringTest {
  test_checkNewName() async {
    await indexTestUnit('''
library my.app;
''');
    _createRenameRefactoring();
    // null
    refactoring.newName = null;
    assertRefactoringStatus(
        refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
        expectedMessage: "Library name must not be null.");
    // empty
    refactoring.newName = '';
    assertRefactoringStatus(
        refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
        expectedMessage: "Library name must not be blank.");
    // same name
    refactoring.newName = 'my.app';
    assertRefactoringStatus(
        refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
        expectedMessage:
            "The new name must be different than the current name.");
  }

  test_createChange() async {
    addSource('/project/part.dart', '''
part of my.app;
''');
    await indexTestUnit('''
library my.app;
part 'part.dart';
''');
    // configure refactoring
    _createRenameRefactoring();
    expect(refactoring.refactoringName, 'Rename Library');
    expect(refactoring.elementKindName, 'library');
    refactoring.newName = 'the.new.name';
    // validate change
    await assertSuccessfulRefactoring('''
library the.new.name;
part 'part.dart';
''');
    assertFileChangeResult('/project/part.dart', '''
part of the.new.name;
''');
  }

  test_createChange_hasWhitespaces() async {
    addSource('/project/part.dart', '''
part of my .  app;
''');
    await indexTestUnit('''
library my    . app;
part 'part.dart';
''');
    // configure refactoring
    _createRenameRefactoring();
    expect(refactoring.refactoringName, 'Rename Library');
    expect(refactoring.elementKindName, 'library');
    refactoring.newName = 'the.new.name';
    // validate change
    await assertSuccessfulRefactoring('''
library the.new.name;
part 'part.dart';
''');
    assertFileChangeResult('/project/part.dart', '''
part of the.new.name;
''');
  }

  void _createRenameRefactoring() {
    createRenameRefactoringForElement(testUnitElement.library);
  }
}

@reflectiveTest
class RenameLibraryTest_UseCFE extends RenameLibraryTest {
  @override
  bool get useCFE => true;

  @failingTest
  @override
  test_createChange() => super.test_createChange();

  @failingTest
  @override
  test_createChange_hasWhitespaces() =>
      super.test_createChange_hasWhitespaces();
}
