package com.jetbrains.lang.dart.refactoring.introduce; import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.codeInsight.template.impl.TemplateState; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import com.intellij.util.Consumer; import com.jetbrains.lang.dart.ide.refactoring.introduce.DartIntroduceHandler; import com.jetbrains.lang.dart.ide.refactoring.introduce.DartIntroduceOperation; import com.jetbrains.lang.dart.psi.DartExpression; import com.jetbrains.lang.dart.util.DartNameSuggesterUtil; import org.jetbrains.annotations.Nullable; import java.util.Collection; public abstract class DartIntroduceTestBase extends LightPlatformCodeInsightFixtureTestCase { protected void doTestSuggestions(Class<? extends DartExpression> parentClass, String... expectedNames) { final Collection<String> names = buildSuggestions(parentClass); for (String expectedName : expectedNames) { assertTrue(StringUtil.join(names, ", "), names.contains(expectedName)); } } protected Collection<String> buildSuggestions(Class<? extends DartExpression> parentClass) { myFixture.configureByFile(getTestName(false) + getFileExtension()); DartExpression expr = PsiTreeUtil.getParentOfType( myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()), parentClass ); return DartNameSuggesterUtil.getSuggestedNames(expr); } protected String getFileExtension() { return ".dart"; } protected abstract DartIntroduceHandler createHandler(); protected void doTest() { doTest(null, true); } protected void doTest(@Nullable Consumer<DartIntroduceOperation> customization, boolean replaceAll) { myFixture.configureByFile(getTestName(false) + getFileExtension()); boolean inplaceEnabled = myFixture.getEditor().getSettings().isVariableInplaceRenameEnabled(); try { myFixture.getEditor().getSettings().setVariableInplaceRenameEnabled(false); DartIntroduceHandler handler = createHandler(); final DartIntroduceOperation operation = new DartIntroduceOperation(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile(), "foo"); operation.setReplaceAll(replaceAll); if (customization != null) { customization.consume(operation); } handler.performAction(operation); doCheck(); } finally { myFixture.getEditor().getSettings().setVariableInplaceRenameEnabled(inplaceEnabled); } } protected void doCheck() { myFixture.checkResultByFile(getTestName(false) + ".after" + getFileExtension()); } protected void doTestInplace(@Nullable Consumer<DartIntroduceOperation> customization) { String name = getTestName(false); myFixture.configureByFile(name + getFileExtension()); final boolean enabled = myFixture.getEditor().getSettings().isVariableInplaceRenameEnabled(); try { TemplateManagerImpl.setTemplateTesting(getProject(), myFixture.getTestRootDisposable()); myFixture.getEditor().getSettings().setVariableInplaceRenameEnabled(true); DartIntroduceHandler handler = createHandler(); final DartIntroduceOperation introduceOperation = new DartIntroduceOperation(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile(), "a"); introduceOperation.setReplaceAll(true); if (customization != null) { customization.consume(introduceOperation); } handler.performAction(introduceOperation); TemplateState state = TemplateManagerImpl.getTemplateState(myFixture.getEditor()); assert state != null; state.gotoEnd(false); myFixture.checkResultByFile(name + ".after" + getFileExtension(), true); } finally { myFixture.getEditor().getSettings().setVariableInplaceRenameEnabled(enabled); } } }