| /* |
| * Copyright (c) 2013, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.dart.engine.services.internal.refactoring; |
| |
| import com.google.dart.engine.services.assist.AssistContext; |
| import com.google.dart.engine.services.change.Change; |
| import com.google.dart.engine.services.refactoring.ExtractLocalRefactoring; |
| import com.google.dart.engine.services.status.RefactoringStatus; |
| import com.google.dart.engine.services.status.RefactoringStatusSeverity; |
| |
| import static org.fest.assertions.Assertions.assertThat; |
| |
| /** |
| * Test for {@link ExtractLocalRefactoringImpl}. |
| */ |
| public class ExtractLocalRefactoringImplTest extends RefactoringImplTest { |
| private ExtractLocalRefactoringImpl refactoring; |
| private int selectionStart = -1; |
| private int selectionEnd = -1; |
| private String localName = "res"; |
| private boolean replaceAllOccurences = true; |
| private RefactoringStatus refactoringStatus; |
| |
| public void test_bad_assignmentLeftHandSize() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f(p) {", |
| " var v = 0;", |
| " v = 1;", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset("v = 1"); |
| selectionEnd = findOffset(" = 1;"); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Cannot extract the left-hand side of an assignment."); |
| } |
| |
| public void test_bad_methodName_reference() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " main();", |
| "}", |
| ""); |
| selectionStart = findOffset("main();"); |
| selectionEnd = selectionStart + "main".length(); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Cannot extract a single method name."); |
| } |
| |
| public void test_bad_nameOfProperty_prefixedIdentifier() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f(p) {", |
| " p.value = 1;", |
| " print(p.value); // marker", |
| "}", |
| "print(x) {}"); |
| // create refactoring |
| selectionStart = findOffset("value);"); |
| selectionEnd = findOffset("); // marker"); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Can not extract name part of a property access."); |
| } |
| |
| public void test_bad_nameOfProperty_propertyAccess() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f(p) {", |
| " foo().value = 1;", |
| " print(foo().value); // marker", |
| "}", |
| "foo() {}", |
| "print(x) {}"); |
| // create refactoring |
| selectionStart = findOffset("value);"); |
| selectionEnd = findOffset("); // marker"); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Can not extract name part of a property access."); |
| } |
| |
| public void test_bad_namePartOfDeclaration_variable() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int vvv = 0;", |
| "}", |
| ""); |
| selectionStart = findOffset("vvv ="); |
| selectionEnd = selectionStart + "vvv".length(); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Cannot extract the name part of a declaration."); |
| } |
| |
| public void test_bad_stringSelection_leadingQuote() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var vvv = 'abc';", |
| "}", |
| ""); |
| setSelectionString("'a"); |
| selectionEnd--; |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Cannot extract only leading or trailing quote of string literal."); |
| } |
| |
| public void test_bad_stringSelection_trailingQuote() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var vvv = 'abc';", |
| "}", |
| ""); |
| setSelectionString("c'"); |
| selectionStart++; |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Cannot extract only leading or trailing quote of string literal."); |
| } |
| |
| public void test_checkFinalConditions_sameVariable_after() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2;", |
| " var res;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // conflicting name |
| { |
| refactoring.setLocalName("res"); |
| refactoringStatus = refactoring.checkFinalConditions(pm); |
| assert_warning_alreadyDefined(); |
| } |
| // unique name |
| { |
| refactoring.setLocalName("uniqueName"); |
| refactoringStatus = refactoring.checkFinalConditions(pm); |
| assertRefactoringStatusOK(refactoringStatus); |
| } |
| } |
| |
| public void test_checkFinalConditions_sameVariable_before() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res;", |
| " int a = 1 + 2;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // conflicting name |
| { |
| refactoring.setLocalName("res"); |
| refactoringStatus = refactoring.checkAllConditions(pm); |
| assert_warning_alreadyDefined(); |
| } |
| // unique name |
| { |
| refactoring.setLocalName("uniqueName"); |
| refactoringStatus = refactoring.checkAllConditions(pm); |
| assertRefactoringStatusOK(refactoringStatus); |
| } |
| } |
| |
| public void test_checkFinalConditions_variableName_warning() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| localName = "Res"; |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.WARNING, |
| "Variable name should start with a lowercase letter."); |
| } |
| |
| public void test_checkInitialConditions_notPartOfFunction() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int a = 1 + 2;", |
| ""); |
| // create refactoring |
| selectionStart = findOffset("1 + 2"); |
| selectionEnd = findOffset(";"); |
| createRefactoring(); |
| // check conditions |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.FATAL, |
| "Expression inside of function must be selected to activate this refactoring."); |
| } |
| |
| public void test_checkLocalName() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // null |
| assertRefactoringStatus( |
| refactoring.checkLocalName(null), |
| RefactoringStatusSeverity.ERROR, |
| "Variable name must not be null."); |
| // empty |
| assertRefactoringStatus( |
| refactoring.checkLocalName(""), |
| RefactoringStatusSeverity.ERROR, |
| "Variable name must not be empty."); |
| // warning |
| assertRefactoringStatus( |
| refactoring.checkLocalName("Res"), |
| RefactoringStatusSeverity.WARNING, |
| "Variable name should start with a lowercase letter."); |
| // OK |
| assertRefactoringStatusOK(refactoring.checkLocalName("res")); |
| } |
| |
| public void test_completeStatementExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " Object o;", |
| " o.toString();", |
| "}"); |
| // create refactoring |
| setSelectionString("o.toString()"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " Object o;", |
| " var res = o.toString();", |
| "}"); |
| } |
| |
| public void test_const_argument_inConstInstanceCreation() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " const A(int a, int b);", |
| "}", |
| "main() {", |
| " const A(1, 2);", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " const A(int a, int b);", |
| "}", |
| "main() {", |
| " const res = 1;", |
| " const A(res, 2);", |
| "}"); |
| } |
| |
| public void test_const_element_inBinaryExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const [1 + 2, 3];", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = 1;", |
| " const [res + 2, 3];", |
| "}"); |
| } |
| |
| public void test_const_element_inConditionalExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main(bool b) {", |
| " const [b ? 1 : 2, 3];", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main(bool b) {", |
| " const res = 1;", |
| " const [b ? res : 2, 3];", |
| "}"); |
| } |
| |
| public void test_const_element_inConstListLiteral() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const [1, 2];", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = 1;", |
| " const [res, 2];", |
| "}"); |
| } |
| |
| public void test_const_element_inParenthesis() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const [(1), 2];", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = 1;", |
| " const [(res), 2];", |
| "}"); |
| } |
| |
| public void test_const_element_inPrefixExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const [!true, 3];", |
| "}"); |
| // create refactoring |
| setSelectionString("true"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = true;", |
| " const [!res, 3];", |
| "}"); |
| } |
| |
| public void test_const_key_inConstMapLiteral() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const {1: 2};", |
| "}"); |
| // create refactoring |
| setSelectionString("1"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = 1;", |
| " const {res: 2};", |
| "}"); |
| } |
| |
| public void test_const_value_inConstMapLiteral() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const {1: 2};", |
| "}"); |
| // create refactoring |
| setSelectionString("2"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " const res = 2;", |
| " const {1: res};", |
| "}"); |
| } |
| |
| public void test_fragmentExpression_leadingNotWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("+ 2"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_fragmentExpression_leadingPartialSelection() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 111 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("11 + 2"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_fragmentExpression_leadingWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString(" 2 + 3"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 2 + 3;", |
| " int a = 1 +res + 4;", |
| "}"); |
| } |
| |
| public void test_fragmentExpression_notAssociativeOperator() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 - 2 - 3 - 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("2 - 3"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_fragmentExpression_OK() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("2 + 3"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 2 + 3;", |
| " int a = 1 + res + 4;", |
| "}"); |
| } |
| |
| public void test_fragmentExpression_trailingNotWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("2 + 3 +"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_fragmentExpression_trailingPartialSelection() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 444;", |
| "}"); |
| // create refactoring |
| setSelectionString("2 + 3 + 44"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_fragmentExpression_trailingWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("2 + 3 "); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 2 + 3 ;", |
| " int a = 1 + res+ 4;", |
| "}"); |
| } |
| |
| public void test_getRefactoringName() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " print(1 + 2);", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // access |
| assertEquals("Extract Local Variable", refactoring.getRefactoringName()); |
| } |
| |
| public void test_guessNames_fragmentExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class TreeItem {}", |
| "TreeItem getSelectedItem() => null;", |
| "process(arg) {}", |
| "main() {", |
| " process(111 + 222 + 333 + 444); // marker", |
| "}"); |
| // create refactoring |
| setSelectionString("222 + 333"); |
| createRefactoring(); |
| // no guesses |
| String[] names = refactoring.guessNames(); |
| assertThat(names).isEmpty(); |
| } |
| |
| public void test_guessNames_singleExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class TreeItem {}", |
| "TreeItem getSelectedItem() => null;", |
| "process(arg) {}", |
| "main() {", |
| " process(getSelectedItem()); // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset("getSelectedItem()); // marker"); |
| selectionEnd = findOffset("); // marker"); |
| createRefactoring(); |
| // check guesses |
| String[] names = refactoring.guessNames(); |
| assertThat(names).contains("selectedItem", "item", "arg", "treeItem"); |
| } |
| |
| public void test_guessNames_stringPart() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f() {", |
| " var s = 'Hello Bob... welcome to Dart!';", |
| "}"); |
| // create refactoring |
| setSelectionString("Hello Bob"); |
| createRefactoring(); |
| // check guesses |
| String[] names = refactoring.guessNames(); |
| assertThat(names).contains("helloBob", "bob"); |
| } |
| |
| public void test_hasSeveralOccurrences_false() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| assertFalse(refactoring.hasSeveralOccurrences()); |
| } |
| |
| public void test_hasSeveralOccurrences_true() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2;", |
| " int b = 1 + 2;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| assertTrue(refactoring.hasSeveralOccurrences()); |
| } |
| |
| public void test_occurences_disableOccurences() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " int a = 1 + foo();", |
| " int b = 2 + foo(); // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset(" foo();") + 2; |
| selectionEnd = findOffset("; // marker"); |
| replaceAllOccurences = false; |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " int a = 1 + foo();", |
| " var res = foo();", |
| " int b = 2 + res; // marker", |
| "}"); |
| } |
| |
| public void test_occurences_fragmentExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " int a = 11 + 2 + foo() + 3;", |
| " int b = 12 + 2 + foo() + 3; // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset(" 2 +") + 2; |
| selectionEnd = findOffset("; // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " var res = 2 + foo() + 3;", |
| " int a = 11 + res;", |
| " int b = 12 + res; // marker", |
| "}"); |
| } |
| |
| public void test_occurences_ignore_assignmentLeftHandSize() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int v = 1;", |
| " v = 2;", |
| " print(() {v = 2;});", |
| " print(1 + (() {v = 2; return 3;})());", |
| " print(v); // marker", |
| "}", |
| "print(x) {}"); |
| // create refactoring |
| selectionStart = findOffset("v);"); |
| selectionEnd = findOffset("); // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int v = 1;", |
| " v = 2;", |
| " print(() {v = 2;});", |
| " print(1 + (() {v = 2; return 3;})());", |
| " var res = v;", |
| " print(res); // marker", |
| "}", |
| "print(x) {}"); |
| } |
| |
| public void test_occurences_ignore_nameOfVariableDeclariton() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int v = 1;", |
| " print(v); // marker", |
| "}", |
| "print(x) {}"); |
| // create refactoring |
| selectionStart = findOffset("v);"); |
| selectionEnd = findOffset("); // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int v = 1;", |
| " var res = v;", |
| " print(res); // marker", |
| "}", |
| "print(x) {}"); |
| } |
| |
| public void test_occurences_singleExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " int a = 1 + foo();", |
| " int b = 2 + foo(); // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset(" foo();") + 2; |
| selectionEnd = findOffset("; // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " var res = foo();", |
| " int a = 1 + res;", |
| " int b = 2 + res; // marker", |
| "}"); |
| } |
| |
| public void test_occurences_useDominator() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " if (true) {", |
| " print(42);", |
| " } else {", |
| " print(42);", |
| " }", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset("42"); |
| selectionEnd = findOffset("42);") + "42".length(); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 42;", |
| " if (true) {", |
| " print(res);", |
| " } else {", |
| " print(res);", |
| " }", |
| "}"); |
| } |
| |
| public void test_occurences_whenComment() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " /*int a = 1 + foo();*/", |
| " int b = 2 + foo(); // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset(" foo();") + 2; |
| selectionEnd = findOffset("; // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo() => 42;", |
| "main() {", |
| " /*int a = 1 + foo();*/", |
| " var res = foo();", |
| " int b = 2 + res; // marker", |
| "}"); |
| } |
| |
| public void test_occurences_whenSpace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo(String s) => 42;", |
| "main() {", |
| " int a = 1 + foo('has space');", |
| " int b = 2 + foo('has space'); // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset(" foo('has space');") + 2; |
| selectionEnd = findOffset("; // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int foo(String s) => 42;", |
| "main() {", |
| " var res = foo('has space');", |
| " int a = 1 + res;", |
| " int b = 2 + res; // marker", |
| "}"); |
| } |
| |
| public void test_singleExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " print(1 + 2);", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 1 + 2;", |
| " print(res);", |
| "}"); |
| } |
| |
| public void test_singleExpression_getter() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int get foo => 42;", |
| "}", |
| "main() {", |
| " A a = new A();", |
| " int b = 1 + a.foo; // marker", |
| "}"); |
| // create refactoring |
| selectionStart = findOffset("a.foo;"); |
| selectionEnd = findOffset("; // marker"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int get foo => 42;", |
| "}", |
| "main() {", |
| " A a = new A();", |
| " var res = a.foo;", |
| " int b = 1 + res; // marker", |
| "}"); |
| } |
| |
| public void test_singleExpression_inMethod() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " main() {", |
| " print(1 + 2);", |
| " }", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " main() {", |
| " var res = 1 + 2;", |
| " print(res);", |
| " }", |
| "}"); |
| } |
| |
| public void test_singleExpression_leadingNotWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 12 + 345; // marker", |
| "}"); |
| // create refactoring |
| setSelectionString("+ 345"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_singleExpression_leadingWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2; // marker", |
| "}"); |
| // create refactoring |
| setSelectionString(" 1 + 2"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 1 + 2;", |
| " int a =res; // marker", |
| "}"); |
| } |
| |
| /** |
| * We use here knowledge how exactly <code>1 + 2 + 3 + 4</code> is parsed. We know that |
| * <code>1 + 2</code> will be separate and complete {@link DartBinaryExpression}, so can be |
| * handled as single expression. |
| */ |
| public void test_singleExpression_partOfBinaryExpression() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 + 3 + 4;", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 1 + 2;", |
| " int a = res + 3 + 4;", |
| "}"); |
| } |
| |
| public void test_singleExpression_trailingComment() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 12 /*abc*/ + 345;", |
| "}"); |
| // create refactoring |
| setSelectionString("12 /*abc*/"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 12 /*abc*/;", |
| " int a = res + 345;", |
| "}"); |
| } |
| |
| public void test_singleExpression_trailingNotWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 12 + 345; // marker", |
| "}"); |
| // create refactoring |
| setSelectionString("12 +"); |
| createRefactoring(); |
| // check conditions |
| assert_fatalError_selection(); |
| } |
| |
| public void test_singleExpression_trailingWhitespace() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int a = 1 + 2 ; // marker", |
| "}"); |
| // create refactoring |
| setSelectionString("1 + 2 "); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 1 + 2 ;", |
| " int a = res; // marker", |
| "}"); |
| } |
| |
| public void test_stringLiteral_part() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " print('abcdefgh');", |
| "}"); |
| // create refactoring |
| setSelectionString("cde"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 'cde';", |
| " print('ab${res}fgh');", |
| "}"); |
| } |
| |
| public void test_stringLiteral_whole() throws Exception { |
| parseTestUnit( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " print('abc');", |
| "}"); |
| // create refactoring |
| setSelectionString("'abc'"); |
| createRefactoring(); |
| // apply refactoring |
| assertSuccessfulRefactoring( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var res = 'abc';", |
| " print(res);", |
| "}"); |
| } |
| |
| /** |
| * Checks that all conditions are <code>OK</code> and applying {@link Change} to the |
| * {@link #testUnit} is same source as given lines. |
| */ |
| protected final void assertSuccessfulRefactoring(String... lines) throws Exception { |
| assertRefactoringStatus(refactoringStatus, RefactoringStatusSeverity.OK, null); |
| Change change = refactoring.createChange(pm); |
| assertTestChangeResult(change, makeSource(lines)); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| refactoring = null; |
| refactoringStatus = null; |
| super.tearDown(); |
| } |
| |
| /** |
| * Asserts that {@link refactoringStatus} has fatal error caused by selection. |
| */ |
| private void assert_fatalError_selection() throws Exception { |
| RefactoringStatus status = refactoring.checkInitialConditions(pm); |
| assertRefactoringStatus( |
| status, |
| RefactoringStatusSeverity.FATAL, |
| "Expression must be selected to activate this refactoring."); |
| } |
| |
| private void assert_warning_alreadyDefined() { |
| assertRefactoringStatus( |
| refactoringStatus, |
| RefactoringStatusSeverity.WARNING, |
| "A variable with name 'res' is already defined in the visible scope."); |
| } |
| |
| /** |
| * Creates {@link ExtractLocalRefactoring} in {@link #refactoring}. |
| */ |
| private void createRefactoring() throws Exception { |
| int selectionLength = selectionEnd - selectionStart; |
| AssistContext context = new AssistContext( |
| searchEngine, |
| analysisContext, |
| null, |
| testSource, |
| testUnit, |
| selectionStart, |
| selectionLength); |
| refactoring = new ExtractLocalRefactoringImpl(context); |
| refactoring.setLocalName(localName); |
| refactoring.setReplaceAllOccurrences(replaceAllOccurences); |
| // prepare status |
| refactoringStatus = refactoring.checkAllConditions(pm); |
| } |
| |
| /** |
| * Prints result of {@link #refactoring} in the way ready to parse into test expectations. |
| */ |
| @SuppressWarnings("unused") |
| private void printRefactoringResultSource() throws Exception { |
| printRefactoringTestSourceResult(getAnalysisContext(), refactoring); |
| } |
| |
| /** |
| * Sets selection to the start of the first occurrence of the given string. |
| */ |
| private void setSelectionString(String pattern) { |
| selectionStart = findOffset(pattern); |
| selectionEnd = findEnd(pattern); |
| } |
| } |