/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart

https://github.com/dart-lang/sdk · Dart · 145 lines · 107 code · 17 blank · 21 comment · 16 complexity · 35594189f2b8a12e95501c3f9cb1751a MD5 · raw file

  1. // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
  2. // for details. All rights reserved. Use of this source code is governed by a
  3. // BSD-style license that can be found in the LICENSE file.
  4. import 'package:analysis_server/src/services/correction/status.dart';
  5. import 'package:analysis_server/src/services/refactoring/refactoring.dart';
  6. import 'package:analysis_server/src/services/search/search_engine.dart';
  7. import 'package:analysis_server/src/services/search/search_engine_internal.dart';
  8. import 'package:analyzer/src/generated/source.dart';
  9. import 'package:analyzer/src/test_utilities/platform.dart';
  10. import 'package:analyzer_plugin/protocol/protocol_common.dart'
  11. show RefactoringProblemSeverity, SourceChange, SourceEdit;
  12. import 'package:test/test.dart';
  13. import '../../abstract_single_unit.dart';
  14. int findIdentifierLength(String search) {
  15. var length = 0;
  16. while (length < search.length) {
  17. var c = search.codeUnitAt(length);
  18. if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
  19. c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
  20. c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
  21. break;
  22. }
  23. length++;
  24. }
  25. return length;
  26. }
  27. /// The base class for all [Refactoring] tests.
  28. abstract class RefactoringTest extends AbstractSingleUnitTest {
  29. SearchEngine searchEngine;
  30. SourceChange refactoringChange;
  31. Refactoring get refactoring;
  32. /// Asserts that [refactoringChange] contains a [FileEdit] for the file
  33. /// with the given [path], and it results the [expectedCode].
  34. void assertFileChangeResult(String path, String expectedCode) {
  35. if (useLineEndingsForPlatform) {
  36. expectedCode = normalizeNewlinesForPlatform(expectedCode);
  37. }
  38. // prepare FileEdit
  39. var fileEdit = refactoringChange.getFileEdit(convertPath(path));
  40. expect(fileEdit, isNotNull, reason: 'No file edit for $path');
  41. // validate resulting code
  42. var file = getFile(path);
  43. var ini = file.readAsStringSync();
  44. var actualCode = SourceEdit.applySequence(ini, fileEdit.edits);
  45. expect(actualCode, expectedCode);
  46. }
  47. /// Asserts that [refactoringChange] does not contain a [FileEdit] for the
  48. /// file with the given [path].
  49. void assertNoFileChange(String path) {
  50. var fileEdit = refactoringChange.getFileEdit(path);
  51. expect(fileEdit, isNull);
  52. }
  53. /// Asserts that [refactoring] initial/final conditions status is OK.
  54. Future assertRefactoringConditionsOK() async {
  55. var status = await refactoring.checkInitialConditions();
  56. assertRefactoringStatusOK(status);
  57. status = await refactoring.checkFinalConditions();
  58. assertRefactoringStatusOK(status);
  59. }
  60. /// Asserts that [refactoring] final conditions status is OK.
  61. Future assertRefactoringFinalConditionsOK() async {
  62. var status = await refactoring.checkFinalConditions();
  63. assertRefactoringStatusOK(status);
  64. }
  65. /// Asserts that [status] has expected severity and message.
  66. void assertRefactoringStatus(
  67. RefactoringStatus status, RefactoringProblemSeverity expectedSeverity,
  68. {String expectedMessage,
  69. SourceRange expectedContextRange,
  70. String expectedContextSearch}) {
  71. expect(status.severity, expectedSeverity, reason: status.toString());
  72. if (expectedSeverity != null) {
  73. var problem = status.problem;
  74. expect(problem.severity, expectedSeverity);
  75. if (expectedMessage != null) {
  76. expect(problem.message, expectedMessage);
  77. }
  78. if (expectedContextRange != null) {
  79. expect(problem.location.offset, expectedContextRange.offset);
  80. expect(problem.location.length, expectedContextRange.length);
  81. }
  82. if (expectedContextSearch != null) {
  83. var expectedOffset = findOffset(expectedContextSearch);
  84. var expectedLength = findIdentifierLength(expectedContextSearch);
  85. expect(problem.location.offset, expectedOffset);
  86. expect(problem.location.length, expectedLength);
  87. }
  88. }
  89. }
  90. /// Asserts that [refactoring] status is OK.
  91. void assertRefactoringStatusOK(RefactoringStatus status) {
  92. assertRefactoringStatus(status, null);
  93. }
  94. /// Checks that all conditions of [refactoring] are OK and the result of
  95. /// applying the [Change] to [testUnit] is [expectedCode].
  96. Future assertSuccessfulRefactoring(String expectedCode) async {
  97. await assertRefactoringConditionsOK();
  98. var change = await refactoring.createChange();
  99. refactoringChange = change;
  100. assertTestChangeResult(expectedCode);
  101. }
  102. /// Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
  103. /// it results the [expectedCode].
  104. void assertTestChangeResult(String expectedCode) {
  105. if (useLineEndingsForPlatform) {
  106. expectedCode = normalizeNewlinesForPlatform(expectedCode);
  107. }
  108. // prepare FileEdit
  109. var fileEdit = refactoringChange.getFileEdit(testFile);
  110. expect(fileEdit, isNotNull);
  111. // validate resulting code
  112. var actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
  113. expect(actualCode, expectedCode);
  114. }
  115. Future<void> indexTestUnit(String code) async {
  116. await resolveTestUnit(code);
  117. }
  118. Future<void> indexUnit(String file, String code) async {
  119. addSource(file, code);
  120. }
  121. @override
  122. void setUp() {
  123. super.setUp();
  124. // TODO(dantup): Get these tests passing with either line ending and change this to true.
  125. useLineEndingsForPlatform = false;
  126. searchEngine = SearchEngineImpl([driver]);
  127. }
  128. }