replaced <code></code> with more concise {@code}
[idea/community.git] / platform / testGuiFramework / src / com / intellij / testGuiFramework / fixtures / RenameDialogFixture.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.testGuiFramework.fixtures;
17
18 import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
19 import com.intellij.openapi.util.Ref;
20 import com.intellij.openapi.util.text.StringUtil;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.refactoring.RefactoringBundle;
23 import com.intellij.refactoring.rename.RenameDialog;
24 import com.intellij.refactoring.rename.RenameHandler;
25 import com.intellij.ui.EditorTextField;
26 import org.fest.swing.core.GenericTypeMatcher;
27 import org.fest.swing.core.Robot;
28 import org.fest.swing.edt.GuiQuery;
29 import org.fest.swing.edt.GuiTask;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32
33 import javax.swing.*;
34
35 import static com.intellij.testGuiFramework.framework.GuiTestUtil.waitUntilFound;
36 import static org.fest.reflect.core.Reflection.field;
37 import static org.fest.swing.edt.GuiActionRunner.execute;
38 import static org.junit.Assert.assertNotNull;
39
40 public class RenameDialogFixture extends IdeaDialogFixture<RenameDialog> {
41
42   public RenameDialogFixture(@NotNull Robot robot, @NotNull JDialog target, @NotNull RenameDialog dialogWrapper) {
43     super(robot, target, dialogWrapper);
44   }
45
46   /**
47    * Starts 'rename' refactoring for the given data.
48    * <p/>
49    * <b>Note:</b> proper way would be to write dedicated 'project view fixture' and emulate user actions like 'expand nodes until
50    * we find a target one' but that IJ component (project view) is rather complex and it's much easier to start the refactoring
51    * programmatically.
52    *
53    * @param element  target PSI element for which 'rename' refactoring should begin
54    * @param handler  rename refactoring handler to use
55    * @param robot    robot to use
56    * @return         a fixture for the 'rename dialog' which occurs when we start 'rename' refactoring for the given data
57    */
58   @NotNull
59   public static RenameDialogFixture startFor(@NotNull final PsiElement element,
60                                              @NotNull final RenameHandler handler,
61                                              @NotNull Robot robot)
62   {
63     // We use SwingUtilities instead of FEST here because RenameDialog is modal and GuiActionRunner doesn't return until
64     //noinspection SSBasedInspection
65     SwingUtilities.invokeLater(
66       () -> handler.invoke(element.getProject(), new PsiElement[] { element }, SimpleDataContext.getProjectContext(element.getProject())));
67     final Ref<RenameDialog> ref = new Ref<RenameDialog>();
68     JDialog dialog = waitUntilFound(robot, new GenericTypeMatcher<JDialog>(JDialog.class) {
69       @Override
70       protected boolean isMatching(@NotNull JDialog dialog) {
71         if (!RefactoringBundle.message("rename.title").equals(dialog.getTitle()) || !dialog.isShowing()) {
72           return false;
73         }
74         RenameDialog renameDialog = getDialogWrapperFrom(dialog, RenameDialog.class);
75         if (renameDialog == null) {
76           return false;
77         }
78         ref.set(renameDialog);
79         return true;
80       }
81     });
82     return new RenameDialogFixture(robot, dialog, ref.get());
83   }
84
85   @NotNull
86   public String getNewName() {
87     //noinspection ConstantConditions
88     return execute(new GuiQuery<String>() {
89       @Override
90       protected String executeInEDT() throws Throwable {
91         String text = robot().finder().findByType(target(), EditorTextField.class).getText();
92         return text == null ? "" : text;
93       }
94     });
95   }
96
97   public void setNewName(@NotNull final String newName) {
98     execute(new GuiTask() {
99       @Override
100       protected void executeInEDT() throws Throwable {
101         robot().finder().findByType(target(), EditorTextField.class).setText(newName);
102       }
103     });
104   }
105
106   /**
107    * Allows to check if a warning exists at the target 'rename dialog'
108    *
109    * @param warningText  {@code null} as a wildcard to match any non-empty warning text;
110    *                     non-null text which is evaluated to be a part of the target dialog's warning text
111    * @return             {@code true} if the target 'rename dialog' has a warning and given text matches it according to the
112    *                     rules described above; {@code false} otherwise
113    */
114   public boolean warningExists(@Nullable final String warningText) {
115     //noinspection ConstantConditions
116     return execute(new GuiQuery<Boolean>() {
117       @Override
118       protected Boolean executeInEDT() throws Throwable {
119         JComponent errorTextPane = field("myErrorText").ofType(JComponent.class).in(getDialogWrapper()).get();
120         assertNotNull(errorTextPane);
121         if (!errorTextPane.isVisible()) {
122           return false;
123         }
124         JLabel errorLabel = field("myLabel").ofType(JLabel.class).in(errorTextPane).get();
125         assertNotNull(errorLabel);
126         String text = errorLabel.getText();
127         if (!StringUtil.isNotEmpty(text)) {
128           return false;
129         }
130         return warningText == null || text.contains(warningText);
131       }
132     });
133   }
134 }