blob: d0dde37964f39192fbecb1b8bc26498588e38e5e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.netbeans.test.ide;
import java.awt.Component;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import junit.framework.Test;
import org.netbeans.jellytools.Bundle;
import org.netbeans.jellytools.EditorOperator;
import org.netbeans.jellytools.FavoritesOperator;
import org.netbeans.jellytools.FilesTabOperator;
import org.netbeans.jellytools.HelpOperator;
import org.netbeans.jellytools.JellyTestCase;
import org.netbeans.jellytools.MainWindowOperator;
import org.netbeans.jellytools.NbDialogOperator;
import org.netbeans.jellytools.NewJavaFileNameLocationStepOperator;
import org.netbeans.jellytools.NewFileWizardOperator;
import org.netbeans.jellytools.NewJavaFileWizardOperator;
import org.netbeans.jellytools.NewJavaProjectNameLocationStepOperator;
import org.netbeans.jellytools.NewProjectWizardOperator;
import org.netbeans.jellytools.OptionsOperator;
import org.netbeans.jellytools.OutputOperator;
import org.netbeans.jellytools.OutputTabOperator;
import org.netbeans.jellytools.PluginsOperator;
import org.netbeans.jellytools.ProjectsTabOperator;
import org.netbeans.jellytools.RuntimeTabOperator;
import org.netbeans.jellytools.TopComponentOperator;
import org.netbeans.jellytools.actions.Action;
import org.netbeans.jellytools.actions.ActionNoBlock;
import org.netbeans.jellytools.actions.AttachWindowAction;
import org.netbeans.jellytools.actions.CompileJavaAction;
import org.netbeans.jellytools.actions.CopyAction;
import org.netbeans.jellytools.actions.CutAction;
import org.netbeans.jellytools.actions.DeleteAction;
import org.netbeans.jellytools.actions.NewFileAction;
import org.netbeans.jellytools.actions.PasteAction;
import org.netbeans.jellytools.actions.ViewAction;
import org.netbeans.jellytools.modules.debugger.actions.ContinueAction;
import org.netbeans.jellytools.modules.debugger.actions.DebugJavaFileAction;
import org.netbeans.jellytools.modules.debugger.actions.FinishDebuggerAction;
import org.netbeans.jellytools.modules.debugger.actions.NewBreakpointAction;
import org.netbeans.jellytools.modules.debugger.actions.ToggleBreakpointAction;
import org.netbeans.jellytools.nodes.JavaNode;
import org.netbeans.jellytools.nodes.Node;
import org.netbeans.jellytools.nodes.SourcePackagesNode;
import org.netbeans.jemmy.ComponentChooser;
import org.netbeans.jemmy.EventTool;
import org.netbeans.jemmy.JemmyException;
import org.netbeans.jemmy.JemmyProperties;
import org.netbeans.jemmy.QueueTool;
import org.netbeans.jemmy.TestOut;
import org.netbeans.jemmy.TimeoutExpiredException;
import org.netbeans.jemmy.Waitable;
import org.netbeans.jemmy.Waiter;
import org.netbeans.jemmy.operators.JButtonOperator;
import org.netbeans.jemmy.operators.JCheckBoxOperator;
import org.netbeans.jemmy.operators.JDialogOperator;
import org.netbeans.jemmy.operators.JLabelOperator;
import org.netbeans.jemmy.operators.JRadioButtonOperator;
import org.netbeans.jemmy.operators.JTextFieldOperator;
import org.netbeans.jemmy.operators.JTreeOperator;
import org.netbeans.jemmy.operators.WindowOperator;
import org.netbeans.jemmy.util.PNGEncoder;
import org.netbeans.junit.Log;
import org.netbeans.junit.NbModuleSuite;
import org.openide.windows.Mode;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
/**
* Overall validation suite for IDE.
*
* @author Jiri Skrivanek
*/
public class IDEValidation extends JellyTestCase {
/** Need to be defined because of JUnit */
public IDEValidation(String name) {
super(name);
}
public static Test suite() throws IOException {
NbModuleSuite.Configuration conf = NbModuleSuite.createConfiguration(
IDECommitValidationTest.class
).clusters(".*").enableModules(".*").honorAutoloadEager(true)
.failOnException(Level.WARNING)
.failOnMessage(Level.SEVERE);
CountingSecurityManager.initWrites();
//conf = conf.addTest("testReflectionUsage"); // too easy to break:
conf = conf.addTest("testWriteAccess");
//conf = conf.addTest("testInitGC");
conf = conf.addTest("testMainMenu");
conf = conf.addTest("testHelp");
conf = conf.addTest("testOptions");
conf = conf.addTest("testNewProject");
conf = conf.addTest("testShortcuts"); // sample project must exist before testShortcuts
conf = conf.addTest("testNewFile");
conf = conf.addTest("testProjectsView");
conf = conf.addTest("testFilesView");
conf = conf.addTest("testEditor");
conf = conf.addTest("testBuildAndRun");
conf = conf.addTest("testDebugging");
conf = conf.addTest("testPlugins"); //needs net connectivity
conf = conf.addTest("testJUnit"); //needs JUnit installed in testPlugins
conf = conf.addTest("testXML");
conf = conf.addTest("testDb");
conf = conf.addTest("testWindowSystem");
//conf = conf.addTest("testGCDocuments");
//conf = conf.addTest("testGCProjects");
return NbModuleSuite.create(conf);
}
/** Setup called before every test case. */
@Override
public void setUp() {
System.out.println("######## " + getName() + " #######");
// Close help window if any - it should not stay open between test cases.
// Otherwise it can break next tests.
closeHelpWindow();
}
/** Tear down called after every test case. */
@Override
public void tearDown() {
}
// name of sample project
private static final String SAMPLE_PROJECT_NAME = "SampleProject"; // NOI18N
// name of first sample package
private static final String SAMPLE1_PACKAGE_NAME = "sample1"; //NOI18N
// name of sample class
private static final String SAMPLE1_CLASS_NAME = "SampleClass1"; // NOI18N
// name of sample file
private static final String SAMPLE1_FILE_NAME = SAMPLE1_CLASS_NAME + ".java"; // NOI18N
// name of sample class 2
private static final String SAMPLE2_CLASS_NAME = "SampleClass2"; // NOI18N
// name of sample file 2
private static final String SAMPLE2_FILE_NAME = SAMPLE2_CLASS_NAME + ".java"; // NOI18N
public void testWriteAccess() throws Exception {
String msg = "No writes during startup.\n"
+ "Writing any files to disk during start is inefficient and usualy unnecessary.\n"
+ "Consider using declarative registration in your layer.xml file, or delaying\n"
+ "the initialization of the whole subsystem till it is really used.\n"
+ "In case it is necessary to perform the write, you can modify the\n"
+ "'allowed-file-write.txt' file in ide.kit module. More details at\n"
+ "http://wiki.netbeans.org/FitnessViaWhiteAndBlackList";
CountingSecurityManager.assertCounts(msg, 0);
// disable further collecting of
CountingSecurityManager.initialize("non-existent", CountingSecurityManager.Mode.CHECK_READ, null);
}
/** Test creation of java project.
* - open New Project wizard from main menu (File|New Project)
* - select Java Application project from Standard category
* - in the next panel type project name and project location in
* - finish the wizard
* - wait until project appears in projects view
* - wait classpath scanning finished
*/
public void testNewProject() {
NewProjectWizardOperator.invoke().cancel();
NewProjectWizardOperator npwo = NewProjectWizardOperator.invoke();
// "Standard"
String standardLabel = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.wizards.Bundle", "Templates/Project/Standard");
npwo.selectCategory(standardLabel);
// "Java Application"
String javaApplicationLabel = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.wizards.Bundle", "template_app");
npwo.selectProject(javaApplicationLabel);
npwo.next();
NewJavaProjectNameLocationStepOperator npnlso = new NewJavaProjectNameLocationStepOperator();
npnlso.txtProjectName().setText(SAMPLE_PROJECT_NAME);
npnlso.txtProjectLocation().setText(System.getProperty("netbeans.user")); // NOI18N
npnlso.btFinish().pushNoBlock();
npnlso.getTimeouts().setTimeout("ComponentOperator.WaitStateTimeout", 120000);
npnlso.waitClosed();
// wait project appear in projects view
new ProjectsTabOperator().getProjectRootNode(SAMPLE_PROJECT_NAME);
//disable the compile on save:
ProjectsTabOperator.invoke().getProjectRootNode(SAMPLE_PROJECT_NAME).properties();
// "Project Properties"
String projectPropertiesTitle = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.customizer.Bundle", "LBL_Customizer_Title");
NbDialogOperator propertiesDialogOper = new NbDialogOperator(projectPropertiesTitle);
// select "Compile" category
String buildCategoryTitle = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.customizer.Bundle", "LBL_Config_BuildCategory");
String compileCategoryTitle = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.customizer.Bundle", "LBL_Config_Build");
new Node(new Node(new JTreeOperator(propertiesDialogOper), buildCategoryTitle), compileCategoryTitle).select();
// actually disable the quick run:
String compileOnSaveLabel = Bundle.getStringTrimmed("org.netbeans.modules.java.j2seproject.ui.customizer.Bundle", "CustomizerCompile.CompileOnSave");
JCheckBox cb = JCheckBoxOperator.waitJCheckBox((Container) propertiesDialogOper.getSource(), compileOnSaveLabel, true, true);
if (cb.isSelected()) {
cb.doClick();
}
// confirm properties dialog
propertiesDialogOper.ok();
// wait classpath scanning finished
WatchProjects.waitScanFinished();
}
/** Test new file wizard.
* - open New File wizard from main menu (File|New File)
* - select sample project as target
* - select Java Classes|Java Package file type
* - in the next panel type package name in
* - finish the wizard
* - open New File wizard from context menu on created package node (New|File)
* - select Java Classes|Java Main Class file type
* - in the next panel type class name in
* - finish the wizard
* - check class is open in editor and close all opened documents
*/
public void testNewFile() {
// create a new package
// "Java Classes"
String javaClassesLabel = Bundle.getString("org.netbeans.modules.java.project.Bundle", "Templates/Classes");
NewJavaFileWizardOperator.create(SAMPLE_PROJECT_NAME, javaClassesLabel, "Java Package", null, SAMPLE1_PACKAGE_NAME);
// wait package node is created
Node sample1Node = new Node(new SourcePackagesNode(SAMPLE_PROJECT_NAME), SAMPLE1_PACKAGE_NAME);
// create a new classes
NewFileWizardOperator.invoke(sample1Node, javaClassesLabel, "Java Main Class");
NewJavaFileNameLocationStepOperator nameStepOper = new NewJavaFileNameLocationStepOperator();
nameStepOper.setObjectName(SAMPLE1_CLASS_NAME);
nameStepOper.finish();
// check class is opened in Editor
new EditorOperator(SAMPLE1_FILE_NAME);
NewFileWizardOperator.invoke(sample1Node, javaClassesLabel, "Java Main Class");
nameStepOper = new NewJavaFileNameLocationStepOperator();
nameStepOper.setObjectName(SAMPLE2_CLASS_NAME);
nameStepOper.finish();
// check class is opened in Editor and then close all documents
new EditorOperator(SAMPLE2_FILE_NAME).closeAllDocuments();
}
/** Test Projects view
* - expand source hierarchy and find sample class (SampleClass1.java)
* - copy sample class and paste it to the same package
* - confirm refactoring dialog
* - verify creation of NewClass.java node
* - cut NewClass.java
* - paste it to another package
* - confirm refactoring dialog
* - delete NewClass.java node
*/
public void testProjectsView() {
ProjectsTabOperator.invoke();
// needed for slower machines
JemmyProperties.setCurrentTimeout("JTreeOperator.WaitNextNodeTimeout", 30000); // NOI18N
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME);
Node sampleClass1Node = new Node(sample1Node, SAMPLE1_FILE_NAME);
// test pop-up menu actions
// "Copy"
CopyAction copyAction = new CopyAction();
copyAction.perform(sampleClass1Node);
// "Paste"
PasteAction pasteAction = new PasteAction();
// "Refactor"
String refactorItem = Bundle.getStringTrimmed("org.netbeans.modules.refactoring.spi.impl.Bundle", "LBL_Action");
// "Copy..."
String copyItem = Bundle.getStringTrimmed("org.netbeans.modules.refactoring.spi.impl.Bundle", "LBL_CopyAction");
new ActionNoBlock(null, pasteAction.getPopupPath() + "|" + refactorItem + " " + copyItem).perform(sample1Node);
String copyClassTitle = Bundle.getString("org.netbeans.modules.refactoring.java.ui.Bundle", "LBL_CopyClass");
NbDialogOperator copyClassDialog = new NbDialogOperator(copyClassTitle);
// "Refactor"
String refactorLabel = Bundle.getStringTrimmed("org.netbeans.modules.refactoring.spi.impl.Bundle", "CTL_Finish");
new JButtonOperator(copyClassDialog, refactorLabel).push();
// refactoring is done asynchronously => need to wait until dialog dismisses
copyClassDialog.waitClosed();
Node newClassNode = new Node(sample1Node, "SampleClass11"); // NOI18N
// "Cut"
CutAction cutAction = new CutAction();
cutAction.perform(newClassNode);
// package created by default when the sample project was created
Node sampleProjectPackage = new Node(sourcePackagesNode, SAMPLE_PROJECT_NAME.toLowerCase());
// "Move..."
String moveItem = Bundle.getStringTrimmed("org.netbeans.modules.refactoring.spi.impl.Bundle", "LBL_MoveAction");
new ActionNoBlock(null, pasteAction.getPopupPath() + "|" + refactorItem + " " + moveItem).perform(sampleProjectPackage);
new EventTool().waitNoEvent(1000);
// confirm refactoring
// "Move Class"
String moveClassTitle = Bundle.getString("org.netbeans.modules.refactoring.java.ui.Bundle", "LBL_MoveClass");
NbDialogOperator moveClassDialog = new NbDialogOperator(moveClassTitle);
new JButtonOperator(moveClassDialog, refactorLabel).push();
// refactoring is done asynchronously => need to wait until dialog dismisses
try {
moveClassDialog.waitClosed();
} catch (TimeoutExpiredException e) {
// try it once more
moveClassDialog = new NbDialogOperator(moveClassTitle);
new JButtonOperator(moveClassDialog, refactorLabel).push();
}
// "Delete"
newClassNode = new Node(sampleProjectPackage, "SampleClass11"); // NOI18N
new EventTool().waitNoEvent(2000);
new DeleteAction().perform(newClassNode);
DeleteAction.confirmDeletion();
}
/** Test Files view
* - expand files hierarchy and find sample class (SampleClass1.java)
* and select main method node.
*/
public void testFilesView() {
FilesTabOperator filesTabOper = FilesTabOperator.invoke();
// needed for slower machines
JemmyProperties.setCurrentTimeout("JTreeOperator.WaitNextNodeTimeout", 30000); // NOI18N
Node sourcePackagesNode = new Node(filesTabOper.getProjectNode(SAMPLE_PROJECT_NAME), "src"); // NOI18N
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME); // NOI18N
Node sampleClass1Node = new Node(sample1Node, SAMPLE1_FILE_NAME);
// It is possible to test also pop-up menu actions as in testProjectsView, but
// it is redundant IMO
}
/** Test of DB module.
* It only tests whether the Databases node is present in Runtime view,
* Add Driver action is enabled on Drivers node and Connect action is available
* on default JDBC-ODBC Bridge node.
* - find Databases|Drivers node in Runtime tab
* - open and close Add Driver dialog from context menu on Drivers node
* - open and close Connect Using dialog on JDBC-ODBC Bridge node
*/
public void testDb() {
// "Databases"
String databasesLabel = Bundle.getString("org.netbeans.modules.db.explorer.node.Bundle", "RootNode_DISPLAYNAME");
Node databasesNode = new Node(RuntimeTabOperator.invoke().getRootNode(), databasesLabel);
// "Please wait..."
String waitNodeLabel = Bundle.getString("org.openide.nodes.Bundle", "LBL_WAIT");
// wait until the wait node dismiss and after that start waiting for Drivers node
// (see issue http://www.netbeans.org/issues/show_bug.cgi?id=43910 - Creation of
// children under Databases node is not properly synchronized)
try {
databasesNode.waitChildNotPresent(waitNodeLabel);
} catch (JemmyException e) {
// Ignore and try to continue. Sometimes it happens "Please, wait" node
// is still available (maybe some threading issue).
log("Timeout expired: " + e.getMessage());
}
// "Drivers"
String driversLabel = Bundle.getString("org.netbeans.modules.db.explorer.node.Bundle", "DriverListNode_DISPLAYNAME");
Node driversNode = new Node(RuntimeTabOperator.invoke().getRootNode(), databasesLabel + "|" + driversLabel);
// "Add Driver ..."
String addDriverItem = Bundle.getString("org.netbeans.modules.db.explorer.action.Bundle", "AddNewDriver");
// open a dialog to add a new JDBC driver
new ActionNoBlock(null, addDriverItem).perform(driversNode);
String addDriverTitle = Bundle.getString("org.netbeans.modules.db.explorer.dlg.Bundle", "AddDriverDialogTitle");
new NbDialogOperator(addDriverTitle).cancel();
// wait until the wait node dismiss and after that start waiting for JDBC_ODBC Bridge node
// (see issue http://www.netbeans.org/issues/show_bug.cgi?id=43910 - Creation of
// children under Databases node is not properly synchronized)
try {
driversNode.waitChildNotPresent(waitNodeLabel);
} catch (JemmyException e) {
// Ignore and try to continue. Sometimes it happens "Please, wait" node
// is still available (maybe some threading issue).
log("Timeout expired: " + e.getMessage());
}
// node Java DB (Embedded) should be present always
Node javaDBNode = new Node(driversNode, "Java DB (Embedded"); // NOI18N
// open a dialog to create a new connection
new ActionNoBlock(null, "Connect Using...").perform(javaDBNode);
// "New Connection Wizard"
String connectionDialogTitle = Bundle.getString("org.netbeans.modules.db.explorer.dlg.Bundle", "PredefinedWizard.WizardTitle");
new NbDialogOperator(connectionDialogTitle).cancel();
}
/** Test Help
* - open Help window from main menu (Help|Help Contents)
*/
public void testHelp() {
// increasing time because opening of help window can last longer on slower machines
JemmyProperties.setCurrentTimeout("JMenuOperator.PushMenuTimeout", 60000);
// open "Help|Contents"
HelpOperator helpOper = HelpOperator.invoke();
// check help window opened
// title is "Help - All"
helpOper.close();
}
/** Test Main Menu
* - open and close New Project wizard (main menu item File|New Project...)
* - open and close Javadoc Index Search top component (main menu item Tools|Javadoc Index Search)
*/
public void testMainMenu() {
// open and close New Project wizard
NewProjectWizardOperator.invoke().close();
//workaround for issue 166989
if (System.getProperty("os.name").equals("Mac OS X")) {
try {
new NbDialogOperator("Warning").close();
} catch (TimeoutExpiredException e) {
}
}
}
/** Test global shortcuts.
* - open and close new file wizard (CTRL+N)
* - open and close Javadoc Index Search top component (Shift+F1)
* - open and close new breakpoint dialog (Ctrl+Shift+F8)
*/
public void testShortcuts() {
// test global shortcuts
// open new wizard (Ctrl+N)
Node node = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
// push Escape key to ensure there is no thing blocking shortcut execution
MainWindowOperator.getDefault().pushKey(KeyEvent.VK_ESCAPE);
NewFileAction newFileAction = new NewFileAction();
try {
newFileAction.performShortcut(node);
new NewFileWizardOperator().close();
// On some linux it may happen autorepeat is activated and it
// opens dialog multiple times. So, we need to close all modal dialogs.
// See issue http://www.netbeans.org/issues/show_bug.cgi?id=56672.
closeAllModal();
} catch (TimeoutExpiredException e) {
// need to be realiable test => repeat action once more to be sure it is problem in IDE
// this time use events instead of Robot
node.select();
MainWindowOperator.getDefault().pushKey(
newFileAction.getKeyStrokes()[0].getKeyCode(),
newFileAction.getKeyStrokes()[0].getModifiers());
new NewFileWizardOperator().close();
}
// open Javadoc Index Search (Shift+F1)
// "Javadoc Index Search"
String javadocTitle = Bundle.getString("org.netbeans.modules.javadoc.search.Bundle",
"CTL_SEARCH_WindowTitle");
Action searchAction = new Action(null, null, KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.SHIFT_MASK));
try {
searchAction.perform(MainWindowOperator.getDefault());
new TopComponentOperator(javadocTitle).close();
} catch (TimeoutExpiredException e) {
// need to be realiable test => repeat action once more to be sure it is problem in IDE
// this time use events instead of Robot
MainWindowOperator.getDefault().pushKey(KeyEvent.VK_F1, KeyEvent.SHIFT_MASK);
new TopComponentOperator(javadocTitle).close();
}
// open new breakpoint dialog (Ctrl+Shift+F8)
String newBreakpointTitle = Bundle.getString("org.netbeans.modules.debugger.ui.actions.Bundle", "CTL_Breakpoint_Title");
NewBreakpointAction newBreakpointAction = new NewBreakpointAction();
try {
newBreakpointAction.performShortcut(MainWindowOperator.getDefault());
new NbDialogOperator(newBreakpointTitle).close();
// On some linux it may happen autorepeat is activated and it
// opens dialog multiple times. So, we need to close all modal dialogs.
// See issue http://www.netbeans.org/issues/show_bug.cgi?id=56672.
closeAllModal();
} catch (TimeoutExpiredException e) {
// need to be realiable test => repeat action once more to be sure it is problem in IDE
// this time use events instead of Robot
MainWindowOperator.getDefault().pushKey(
newBreakpointAction.getKeyStrokes()[0].getKeyCode(),
newBreakpointAction.getKeyStrokes()[0].getModifiers());
new NbDialogOperator(newBreakpointTitle).close();
}
}
/** Test Source Editor
* - opens sample class in Editor (context menu Open on the node)
* - type abbreviation 'sout' into main method and then 'Hello'
* - verify it is written 'System.out.println("Hello");'
* - select the text and call copy from editor's context menu
* - insert dummy text at next line , select it and paste the text in the clipboard
* - select second 'Hello' and delete it by context menu
* - insert 'Good bye' instead
* - select fourth line, cut it and paste it at line 3
*/
public void testEditor() {
// open sample file in Editor
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME);
JavaNode sampleClass1Node = new JavaNode(sample1Node, SAMPLE1_FILE_NAME);
sampleClass1Node.open();
// find open file in editor
EditorOperator eo = new EditorOperator(SAMPLE1_FILE_NAME);
eo.setCaretPosition("public static void main", true);
int insertLine = eo.getLineNumber() + 2;
eo.insert("\n", insertLine, 1); // NOI18N
// Need to disable verification because shortcut "sout" is replaced
// by "System.out.println("");" and "sout" is not found in Editor
eo.setCaretPositionToLine(insertLine);
eo.txtEditorPane().setVerification(false);
eo.txtEditorPane().typeText("sout"); // NOI18N
eo.txtEditorPane().typeKey('\t');
eo.txtEditorPane().setVerification(true);
eo.insert("Hello"); // NOI18N
//eo.insert("System.out.println(\"Hello\");\n", insertLine+1, 1); // NOI18N
final String textToCopy = "System.out.println(\"Hello\");"; // NOI18N
eo.select(textToCopy);
int oldDispatchingModel = JemmyProperties.getCurrentDispatchingModel();
// "Copy"
CopyAction copyAction = new CopyAction();
try {
copyAction.perform(eo);
} catch (TimeoutExpiredException e) {
// if not succed try it second time in Robot mode
JemmyProperties.setCurrentDispatchingModel(JemmyProperties.ROBOT_MODEL_MASK);
copyAction.perform(eo);
} finally {
// set previous dispatching model
JemmyProperties.setCurrentDispatchingModel(oldDispatchingModel);
}
// wait until clipboard contains text to copy
try {
new Waiter(new Waitable() {
@Override
public Object actionProduced(Object obj) {
try {
String text = Toolkit.getDefaultToolkit().getSystemClipboard().
getContents(null).getTransferData(DataFlavor.stringFlavor).toString();
return textToCopy.equals(text) ? Boolean.TRUE : null;
} catch (UnsupportedFlavorException e) {
// The following exception can be thrown when clipboard is empty.
// java.awt.datatransfer.UnsupportedFlavorException: Unicode String
// at org.openide.util.datatransfer.ExTransferable$Empty.getTransferData(ExTransferable.java:461)
// Ignore this exception.
return null;
} catch (IOException ioe) {
throw new JemmyException("Failed getting clipboard content.", ioe);
}
}
@Override
public String getDescription() {
return ("Clipboard contains " + textToCopy); // NOI18N
}
}).waitAction(null);
} catch (Exception ie) {
throw new JemmyException("Interrupted.", ie);
}
eo.insert("int xxxx;\n", insertLine + 1, 1); // NOI18N
eo.select("int xxxx;"); // NOI18N
PasteAction pasteAction = new PasteAction();
try {
pasteAction.perform(eo);
} catch (TimeoutExpiredException e) {
// if not succed try it second time in Robot mode
JemmyProperties.setCurrentDispatchingModel(JemmyProperties.ROBOT_MODEL_MASK);
pasteAction.perform(eo);
} finally {
// set previous dispatching model
JemmyProperties.setCurrentDispatchingModel(oldDispatchingModel);
}
eo.select("Hello", 1); // NOI18N
// "Delete"
DeleteAction deleteAction = new DeleteAction();
deleteAction.performMenu(eo);
// wait Hello is deleted
eo.txtEditorPane().waitText("System.out.println(\"\");"); // NOI18N
eo.insert("Good bye"); // NOI18N
// test cut action
eo.select(3);
// "Cut"
CutAction cutAction = new CutAction();
try {
cutAction.perform(eo);
} catch (TimeoutExpiredException e) {
// if not succed try it second time in Robot mode
JemmyProperties.setCurrentDispatchingModel(JemmyProperties.ROBOT_MODEL_MASK);
cutAction.perform(eo);
} finally {
// set previous dispatching model
JemmyProperties.setCurrentDispatchingModel(oldDispatchingModel);
}
// need to wait a little until editor content is refreshed after cut action
new EventTool().waitNoEvent(500);
// select from column 1 to 2 at line 3
eo.select(2, 1, 2);
try {
pasteAction.perform(eo);
} catch (TimeoutExpiredException e) {
// if not succed try it second time in Robot mode
JemmyProperties.setCurrentDispatchingModel(JemmyProperties.ROBOT_MODEL_MASK);
pasteAction.perform(eo);
} finally {
// set previous dispatching model
JemmyProperties.setCurrentDispatchingModel(oldDispatchingModel);
}
}
/** Test build and run.
* - select sample class node and call "Build|Compile "SampleClass1.java"" main menu item
* - wait until compilation finishes (track status bar)
* - select sample class node and call "Run|Run File|Run "SampleClass1.java"" main menu item
* - wait until run finishes
* - from context menu set sample project as main project
* - call "Build|Build Main Project" main menu item
* - wait until build finishes
* - call "Run|Run Main Project" main menu item
* - wait until run finishes
*/
public void testBuildAndRun() {
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME);
JavaNode sampleClass1Node = new JavaNode(sample1Node, SAMPLE1_FILE_NAME);
// increase timeout to 60 seconds
MainWindowOperator.getDefault().getTimeouts().setTimeout("Waiter.WaitingTime", 60000);
// start to track Main Window status bar
MainWindowOperator.StatusTextTracer stt = MainWindowOperator.getDefault().getStatusTextTracer();
stt.start();
// call Build|Compile main menu item
new CompileJavaAction().perform(sampleClass1Node);
// "SampleProject (compile-single)"
String compileSingleTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "compile-single"}); // NOI18N
// "Finished building SampleProject (compile-single)"
String finishedCompileSingleLabel = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new String[]{compileSingleTarget});
// wait message "Finished building SampleProject (compile-single)"
stt.waitText(finishedCompileSingleLabel);
// "Run"
// TODO bundle property name should be changed back to Menu/RunProject after updating bundle
String runItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.Bundle", "Menu/BuildProject");
// "Run File"
String runFileItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.actions.Bundle",
"LBL_RunSingleAction_Name",
new Object[]{new Integer(1), SAMPLE1_FILE_NAME});
// call "Run|Run File|Run "SampleClass1.java""
new Action(runItem + "|" + runFileItem, null).perform(sampleClass1Node);
// "SampleProject (run-single)"
String runSingleTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "run-single"}); // NOI18N
// "Finished building SampleProject (run-single)"
String finishedRunSingleLabel = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new String[]{runSingleTarget});
// wait message "Finished building SampleProject (run-single)"
stt.waitText(finishedRunSingleLabel); // NOI18N
// check Hello and Good bye was printed out to the output window
OutputTabOperator outputOper = new OutputTabOperator("run-single"); //NOI18N
outputOper.waitText("Hello"); //NOI18N
outputOper.waitText("Good bye"); //NOI18N
// "Run"
String buildItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.Bundle", "Menu/BuildProject");
// "Build Main Project"
String buildMainProjectItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.actions.Bundle", "LBL_BuildMainProjectAction_Name");
// call "Run|Build Main Project" main menu item
new Action(buildItem + "|" + buildMainProjectItem, null).perform();
// "SampleProject (jar)"
String jarTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "jar"}); // NOI18N
// "Finished building SampleProject (jar)"
String finishedJarLabel = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new String[]{jarTarget});
// wait message "Finished building SampleProject (jar)"
stt.waitText(finishedJarLabel);
// Run Main Project
String runMainProjectItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.actions.Bundle", "LBL_RunMainProjectAction_Name");
// call "Run|Run Main Project" main menu item
new Action(runItem + "|" + runMainProjectItem, null).perform();
// "SampleProject (run)"
String runTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "run"}); // NOI18N
// "Finished building SampleProject (run)"
String finishedRunLabel = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new String[]{runTarget});
// wait message "Finished building SampleProject (run)"
stt.waitText(finishedRunLabel);
stt.stop();
}
/** Test JUnit support
* - add methods to sample class
* - from context menu on sample class node call "Tools|Create JUnit Tests" item
* - confirm Create Tests dialog
* - select "JUnit 3.x" in "Select JUnit Version" dialog
* - click "Select" button to confirm dialog
* - find generated test under "Test Packages"
* - check whether test was open in editor and if includes test of public,
* protected, default but not private methods
* - close the test
* - select sample class
* - call "Navigate|Go to Test" main menu item
* - check test class is opened in editor
* - run single test from main menu "Run|Run File|Test SampleClass2.java"
* - check status bar that test was executed
* - run test project from main menu "Run|Test SampleProject"
* - check status bar that test was executed
* - from context menu on sample package call "Tools|Create JUnit Tests" item
* - confirm Create Tests dialog
* - find generated suite under "Test Packages"
* - open the suite class and check if contains generated test class
* - close all documents in editor
*/
public void testJUnit() throws InterruptedException {
// open sample file in Editor
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME);
JavaNode sampleClass2Node = new JavaNode(sample1Node, SAMPLE2_FILE_NAME);
sampleClass2Node.open();
// find open sample file in editor
EditorOperator eo = new EditorOperator(SAMPLE2_FILE_NAME);
eo.setCaretPosition("public static void main", true);
int insertLine = eo.getLineNumber() + 3;
// add methods declarations to sample file
String publicMethod = "\n public void publicMethod() {\n }\n"; // NOI18N
eo.insert(publicMethod, insertLine, 1);
String privateMethod = "\n private void privateMethod() {\n }\n"; //NOI18N
eo.insert(privateMethod, insertLine + 3, 1);
String protectedMethod = "\n protected void protectedMethod() {\n }\n"; //NOI18N
eo.insert(protectedMethod, insertLine + 3, 1);
String defaultMethod = "\n void defaultMethod() {\n }\n"; //NOI18N
eo.insert(defaultMethod, insertLine + 3, 1);
eo.save();
// need to wait until new methods are parsed
WatchProjects.waitScanFinished();
// "Tools"
String toolsItem = Bundle.getStringTrimmed("org.netbeans.core.ui.resources.Bundle", "Menu/Tools"); // NOI18N
ActionNoBlock createTestsAction = new ActionNoBlock(null, toolsItem + "|Create/Update Tests");
createTestsAction.perform(sampleClass2Node);
// "Create Tests"
String createTestsTitle = Bundle.getString("org.netbeans.modules.junit.Bundle", "JUnitCfgOfCreate.Title");
new NbDialogOperator(createTestsTitle).ok();
// "Select JUnit Version"
String selectJUnitVersionTitle = Bundle.getString("org.netbeans.modules.junit.Bundle", "LBL_title_select_generator");
NbDialogOperator selectVersionOper = new NbDialogOperator(selectJUnitVersionTitle);
// "JUnit 3.x"
String version3Label = Bundle.getStringTrimmed("org.netbeans.modules.junit.Bundle", "LBL_JUnit3_generator");
new JRadioButtonOperator(selectVersionOper, version3Label).push();
// "Select"
String selectLabel = Bundle.getStringTrimmed("org.netbeans.modules.junit.Bundle", "LBL_Select");
new JButtonOperator(selectVersionOper, selectLabel).pushNoBlock();
// wait until test node is created
// "Test Packages"
String testPackagesLabel = Bundle.getString("org.netbeans.modules.java.j2seproject.Bundle", "NAME_test.src.dir");
Node testPackagesNode = new Node(new ProjectsTabOperator().getProjectRootNode(SAMPLE_PROJECT_NAME), testPackagesLabel);
// Test Packages|sample1|SampleClass1Test.java
new JavaNode(testPackagesNode, SAMPLE1_PACKAGE_NAME + "|" + SAMPLE2_CLASS_NAME + "Test.java"); // NOI18N
// check default, protected and public method tests created and private is not created
EditorOperator eoTest = new EditorOperator(SAMPLE2_CLASS_NAME + "Test.java"); // NOI18N
// wait code is generated
eoTest.txtEditorPane().waitText("testDefaultMethod"); // NOI18N
eoTest.txtEditorPane().waitText("testProtectedMethod"); // NOI18N
eoTest.txtEditorPane().waitText("testPublicMethod"); // NOI18N
assertFalse("Created test should not include test of private method.", eoTest.contains("testPrivateMethod")); // NOI18N
eoTest.close();
// go to test
// "Navigate"
String navigateItem = Bundle.getStringTrimmed("org.netbeans.core.ui.resources.Bundle", "Menu/GoTo"); // NOI18N
// "Go to Test"
String goToTestItem = Bundle.getString("org.netbeans.modules.junit.Bundle", "LBL_Action_GoToTest"); // NOI18N
// go to test ("Navigate|Go to Test") - main menu action
Action gotoTestAction = new Action(navigateItem + "|" + goToTestItem, null);
gotoTestAction.perform(sampleClass2Node);
// wait until test is opened in editor
new EditorOperator(SAMPLE2_CLASS_NAME + "Test.java"); // NOI18N
// run generated test
// "Run"
// TODO bundle property name should be changed back to Menu/RunProject after updating bundle
String runItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.Bundle", "Menu/BuildProject");
// "Test File"
String testFileItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.actions.Bundle",
"LBL_TestSingleAction_Name",
new Object[]{new Integer(1), SAMPLE2_FILE_NAME});
// "Test Project"
String testProjectItem = Bundle.getStringTrimmed("org.netbeans.modules.project.ui.actions.Bundle",
"LBL_TestProjectAction_Name",
new Object[]{new Integer(1), SAMPLE_PROJECT_NAME});
// increase timeout to 60 seconds
MainWindowOperator.getDefault().getTimeouts().setTimeout("Waiter.WaitingTime", 60000); // NOI18N
// start to track Main Window status bar
MainWindowOperator.StatusTextTracer stt = MainWindowOperator.getDefault().getStatusTextTracer();
stt.start();
// call "Run|Test "SampleClass2.java""
new Action(runItem + "|" + testFileItem, null).perform(sampleClass2Node);
// check status line
// "SampleProject (test-single)"
String testSingleTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "test-single"}); // NOI18N
String testTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "test"}); // NOI18N
// "Build of SampleProject (test-single) failed."
String failedMessage = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_target_failed_status",
new Object[]{testSingleTarget});
// wait message "Build of SampleProject (test-single) failed."
stt.waitText(failedMessage);
// call "Run|Test "SampleProject""
new Action(runItem + "|" + testProjectItem, null).perform(sampleClass2Node);
// "Finished building SampleProject (test)"
String finishedMessage = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new Object[]{testTarget});
// wait message "Finished building SampleProject (test)"
stt.waitText(finishedMessage);
stt.stop();
// test JUnit on folder
createTestsAction.perform(sample1Node);
new NbDialogOperator(createTestsTitle).ok();
// wait until test node is created
// Test Packages|sample1|Sample1Suite.java
JavaNode suiteNode = new JavaNode(testPackagesNode, SAMPLE1_PACKAGE_NAME + "|Suite.java"); // NOI18N
suiteNode.open();
// check suite is open in editor and it conteins generated test class
assertTrue("Created suite should include test of public method.",
new EditorOperator("Suite").contains(SAMPLE2_CLASS_NAME + "Test")); // NOI18N
EditorOperator.closeDiscardAll();
}
/** Test Debugging
* - find sample class in editor
* - select text 'System.out.println("Hello");' and push Shift+F8 to toggle breakpoint
* - select text 'System.out.println("Good bye");' and call 'Toggle Breakpoint" context menu item
* - run debugger from main menu ("Run "SampleClass1.java" in Debugger")
* - wait until first breakpoint is reached and call Continue from main menu
* - wait until second breakpoint is reached and check 'Hello' is printed to output
* - finish debugger by main menu action (Finish Debugger Session)
* - delete sample class
*/
public void testDebugging() throws Throwable {
// Status bar tracer
MainWindowOperator.StatusTextTracer stt = MainWindowOperator.getDefault().getStatusTextTracer();
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
JavaNode sampleClass1Node = new JavaNode(sourcePackagesNode, SAMPLE1_PACKAGE_NAME + "|" + SAMPLE1_FILE_NAME);
// flag to stop debugger in finally
boolean debuggerStarted = false;
try {
// find sample file in Editor
EditorOperator eo = new EditorOperator(SAMPLE1_FILE_NAME);
eo.setCaretPosition("public static void main", true);
final int insertLine = eo.getLineNumber() + 2;
// if file not contains brpText from previous test cases, insert it
String brpText = "System.out.println(\"Hello\");"; // NOI18N
if (!eo.contains(brpText)) {
eo.insert(brpText + "\n", insertLine, 1);
}
eo.select(brpText);
ToggleBreakpointAction toggleBreakpointAction = new ToggleBreakpointAction();
try {
// toggle breakpoint via Shift+F8
toggleBreakpointAction.performShortcut(eo);
waitBreakpoint(eo, insertLine);
} catch (TimeoutExpiredException e) {
// need to be realiable test => repeat action once more to be sure it is problem in IDE
// this time use events instead of Robot
MainWindowOperator.getDefault().pushKey(
toggleBreakpointAction.getKeyStrokes()[0].getKeyCode(),
toggleBreakpointAction.getKeyStrokes()[0].getModifiers());
waitBreakpoint(eo, insertLine);
}
// if file not contains second brpText from previous test cases, insert it
brpText = "System.out.println(\"Good bye\");"; // NOI18N
if (!eo.contains(brpText)) {
eo.insert(brpText + "\n", insertLine + 1, 1);
}
eo.select(brpText);
// toggle breakpoint via pop-up menu
// clickForPopup(0, 0) used in the past sometimes caused that menu
// was opened outside editor area because editor roll up after
// text was selected
toggleBreakpointAction.perform(eo.txtEditorPane());
// wait second breakpoint established
waitBreakpoint(eo, insertLine + 1);
// start to track Main Window status bar
stt.start();
debuggerStarted = true;
// start debugging
new DebugJavaFileAction().performMenu(sampleClass1Node);
// check the first breakpoint reached
// wait status text "Thread main stopped at SampleClass1.java:"
// increase timeout to 60 seconds
MainWindowOperator.getDefault().getTimeouts().setTimeout("Waiter.WaitingTime", 60000);
stt.waitText("Thread main stopped at SampleClass1.java:" + insertLine);
// continue debugging
new ContinueAction().perform();
// check the second breakpoint reached
stt.waitText("Thread main stopped at SampleClass1.java:" + (insertLine + 1));
// check "Hello" was printed out in Output
OutputTabOperator oto = new OutputTabOperator("debug-single"); // NOI18N
// wait until text Hello is not written in to the Output
oto.waitText("Hello"); // NOI18N
} catch (Throwable th) {
try {
// capture screen before cleanup in finally clause is completed
PNGEncoder.captureScreen(getWorkDir().getAbsolutePath() + File.separator + "screenBeforeCleanup.png");
} catch (Exception e1) {
// ignore it
}
th.printStackTrace(getLog());
throw th;
} finally {
if (debuggerStarted) {
// finish debugging
new FinishDebuggerAction().perform();
// check status line
// "SampleProject (debug-single)"
String outputTarget = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"TITLE_output_target",
new Object[]{SAMPLE_PROJECT_NAME, null, "debug-single"}); // NOI18N
// "Finished building SampleProject (debug-single)"
String finishedMessage = Bundle.getString(
"org.apache.tools.ant.module.run.Bundle",
"FMT_finished_target_status",
new Object[]{outputTarget});
stt.waitText(finishedMessage);
}
stt.stop();
// delete sample class
sampleClass1Node.delete();
String confirmTitle = Bundle.getString("org.netbeans.modules.refactoring.java.ui.Bundle", "LBL_SafeDel_Delete"); // NOI18N
String confirmButton = UIManager.getDefaults().get("OptionPane.okButtonText").toString(); // NOI18N
// "Confirm Object Deletion"
new JButtonOperator(new NbDialogOperator(confirmTitle), confirmButton).push();
}
}
/** Test Options
* - open Options window from main menu Tools|Options
* - select Editor category
* - select Fonts & Colors category
* - select Keymap category
* - select General category
* - pick Manual Proxy Setting
* - set Proxy Host to emea-proxy.uk.oracle.com
* - set Proxy Port to 80
* - click OK to confirm and close Options window
*/
public void testOptions() {
OptionsOperator optionsOper = OptionsOperator.invoke();
optionsOper.selectEditor();
optionsOper.selectFontAndColors();
optionsOper.selectKeymap();
optionsOper.selectGeneral();
// "Manual Proxy Setting"
String hTTPProxyLabel = Bundle.getStringTrimmed(
"org.netbeans.core.ui.options.general.Bundle", "CTL_Use_HTTP_Proxy");
new JRadioButtonOperator(optionsOper, hTTPProxyLabel).push();
// "HTTP Proxy:"
String proxyHostLabel = Bundle.getStringTrimmed(
"org.netbeans.core.ui.options.general.Bundle", "CTL_Proxy_Host");
JLabelOperator jloHost = new JLabelOperator(optionsOper, proxyHostLabel);
new JTextFieldOperator((JTextField) jloHost.getLabelFor()).setText("emea-proxy.uk.oracle.com"); // NOI18N
// "Port:"
String proxyPortLabel = Bundle.getStringTrimmed(
"org.netbeans.core.ui.options.general.Bundle", "CTL_Proxy_Port");
JLabelOperator jloPort = new JLabelOperator(optionsOper, proxyPortLabel);
new JTextFieldOperator((JTextField) jloPort.getLabelFor()).setText("80"); // NOI18N
optionsOper.ok();
}
/** Test XML
* - open "Tools|DTDs and XML Schemas"
* - select "NetBeans Catalog|-//DTD XMLCatalog//EN"
* - call "View" on it
* - check it is opened in editor and close it
* - close "DTDs and XML Schemas" dialog
* - create XML file
* - call "Check XML" on xml node
* - find and close output tab
* - call "Validate XML" on xml node
* - find and close output tab
* - call "Generate DTD" on xml node
* - set name and confirm the dialog
* - wait until dtd is opened in editor and close it
* - call "Check DTD" on dtd node
* - find and close output tab
* - call "Generate DOM Tree Scanner" on dtd node
* - set name and confirm the dialog
* - wait until scanner is opened in editor and close it
*/
public void testXML() {
// check XML Entity Catalogs
// "Tools"
String toolsItem = Bundle.getStringTrimmed("org.netbeans.core.ui.resources.Bundle", "Menu/Tools"); // NOI18N
// "DTDs and XML Schemas"
String dtdsItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.catalog.Bundle", "LBL_CatalogAction_Name");
new Action(toolsItem + "|" + dtdsItem, null).perform();
// "DTDs and XML Schemas"
String dtdsTitle = Bundle.getString("org.netbeans.modules.xml.catalog.Bundle", "LBL_CatalogPanel_Title");
NbDialogOperator dtdsOper = new NbDialogOperator(dtdsTitle);
String publicID = "-//DTD XMLCatalog//EN";
Node catalogNode = new Node(new JTreeOperator(dtdsOper),
"NetBeans Catalog|"
+ publicID);
// view and close it
new ViewAction().perform(catalogNode);
new EditorOperator(publicID).close();
dtdsOper.close();
// create an XML file
// create xml package
// select Source Packages to not create xml folder in Test Packages
new SourcePackagesNode(SAMPLE_PROJECT_NAME).select();
// "Java Classes"
String javaClassesLabel = Bundle.getString("org.netbeans.modules.java.project.Bundle", "Templates/Classes");
NewJavaFileWizardOperator.create(SAMPLE_PROJECT_NAME, javaClassesLabel, "Java Package", null, "xml"); // NOI18N
Node xmlNode = new Node(new SourcePackagesNode(SAMPLE_PROJECT_NAME), "xml"); //NOI18N
// "XML"
String xmlCategory = Bundle.getString("org.netbeans.api.xml.resources.Bundle", "Templates/XML");
// "XML Document"
String xmlDocument = Bundle.getString("org.netbeans.modules.xml.resources.Bundle", "Templates/XML/XMLDocument.xml");
NewFileWizardOperator.invoke(xmlNode, xmlCategory, xmlDocument);
NewJavaFileNameLocationStepOperator nameStepOper = new NewJavaFileNameLocationStepOperator();
nameStepOper.setObjectName("XMLDocument"); // NOI18N
nameStepOper.next();
nameStepOper.finish();
// wait node is present
Node xmlDocumentNode = new Node(xmlNode, "XMLDocument.xml"); // NOI18N
// wait xml document is open in editor
new EditorOperator("XMLDocument.xml").close(); // NOI18N
// "Check XML"
String checkXMLItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.tools.actions.Bundle", "NAME_Check_XML");
// invoke context action to check xml
new Action(null, checkXMLItem).perform(xmlDocumentNode);
// "XML check"
String xmlCheckTitle = Bundle.getString("org.netbeans.modules.xml.actions.Bundle", "TITLE_XML_check_window");
// find and close an output with the result of xml check
new OutputTabOperator(xmlCheckTitle).close();
// "Validate XML"
String validateItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.tools.actions.Bundle", "NAME_Validate_XML");
// invoke context action to validate xml
new Action(null, validateItem).perform(xmlDocumentNode);
// find and close an output with the result of xml validation
new OutputTabOperator(xmlCheckTitle).close();
// "Generate DTD..."
String generateDTDItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.tools.generator.Bundle", "PROP_GenerateDTD");
new ActionNoBlock(null, generateDTDItem).perform(xmlDocumentNode);
// "Select File Name"
String selectTitle = Bundle.getString("org.netbeans.modules.xml.tools.generator.Bundle", "PROP_fileNameTitle");
NbDialogOperator selectDialog = new NbDialogOperator(selectTitle);
// name has to be set because of issue http://www.netbeans.org/issues/show_bug.cgi?id=46049
new JTextFieldOperator(selectDialog).setText("DTD");
String oKLabel = Bundle.getString("org.netbeans.core.windows.services.Bundle", "OK_OPTION_CAPTION");
new JButtonOperator(selectDialog, oKLabel).push();
// wait DTD is open in editor
new EditorOperator("DTD.dtd").close(); // NOI18N
Node dtdNode = new Node(xmlNode, "DTD.dtd"); // NOI18N
// "Check DTD"
String checkDTDItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.tools.actions.Bundle", "NAME_Validate_DTD");
new Action(null, checkDTDItem).perform(dtdNode);
// find and close an output with the result of dtd check
new OutputTabOperator(xmlCheckTitle).close();
// "Generate DOM Tree Scanner"
String generateScannerItem = Bundle.getStringTrimmed("org.netbeans.modules.xml.tools.generator.Bundle", "PROP_GenerateDOMScanner");
new ActionNoBlock(null, generateScannerItem).perform(dtdNode);
selectDialog = new NbDialogOperator(selectTitle);
new JButtonOperator(selectDialog, oKLabel).push();
// wait Scanner is open in editor
new EditorOperator("DTDScanner.java").close(); // NOI18N
new Node(xmlNode, "DTDScanner.java"); // NOI18N
}
/** Test Window System
* - open Favorites top component from main menu Window|Favorites
* - attach Favorites as last tab to output mode
* - attach Favorites to top of Projects tab
* - attach Favorites to right of output mode
* - attach Favorites as last tab to explorer mode (next to Projects)
* - close Favorites
* - open sample1|SampleClass2.java file
* - maximize opened editor by menu item "Maximize Window" on its tab
* - restore editor by menu item "Restore Window" on its tab
* - close all open editors
*/
public void testWindowSystem() {
final ProjectsTabOperator projectsOper = ProjectsTabOperator.invoke();
final FavoritesOperator favoritesOper = FavoritesOperator.invoke();
// test attaching
favoritesOper.attachTo(new OutputOperator(), AttachWindowAction.AS_LAST_TAB);
favoritesOper.attachTo(projectsOper, AttachWindowAction.TOP);
favoritesOper.attachTo(new OutputOperator(), AttachWindowAction.RIGHT);
favoritesOper.attachTo(projectsOper, AttachWindowAction.AS_LAST_TAB);
// wait until TopComponent is in new location and is showing
final TopComponent projectsTc = (TopComponent) projectsOper.getSource();
final TopComponent favoritesTc = (TopComponent) favoritesOper.getSource();
try {
new Waiter(new Waitable() {
@Override
public Object actionProduced(Object tc) {
// run in dispatch thread
Mode mode1 = (Mode) projectsOper.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("findMode") { // NOI18N
@Override
public Object launch() {
return WindowManager.getDefault().findMode(projectsTc);
}
});
Mode mode2 = (Mode) favoritesOper.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("findMode") { // NOI18N
@Override
public Object launch() {
return WindowManager.getDefault().findMode(favoritesTc);
}
});
return (mode1 == mode2 && favoritesTc.isShowing()) ? Boolean.TRUE : null;
}
@Override
public String getDescription() {
return ("Favorites TopComponent is next to Projects TopComponent."); // NOI18N
}
}).waitAction(null);
} catch (InterruptedException e) {
throw new JemmyException("Interrupted.", e); // NOI18N
}
favoritesOper.close();
// test maximize/restore
// open sample file in Editor
SourcePackagesNode sourcePackagesNode = new SourcePackagesNode(SAMPLE_PROJECT_NAME);
Node sample1Node = new Node(sourcePackagesNode, SAMPLE1_PACKAGE_NAME);
JavaNode sampleClass2Node = new JavaNode(sample1Node, SAMPLE2_FILE_NAME);
sampleClass2Node.open();
// find open file in editor
EditorOperator eo = new EditorOperator(SAMPLE2_FILE_NAME);
eo.maximize();
eo.restore();
EditorOperator.closeDiscardAll();
}
/** Test Plugins
* - open Plugins window from main menu Tools|Plugins
* - wait until tabbed pane is enabled and the Installed tab is enabled
* - click "Reload Catalog" button
* - wait until "Available Plugins" tab is enabled
* - switch to "Available Plugins" tab
* - type "JUnit" into Search field
* - wait until table contains "JUnit" module in the first row
* - select that row
* - click check box for the module
* - click Install button
* - in "NetBeans IDE Installer" dialog click Next
* - click "I accept..." radio button
* - click Install button
* - wait until the module is turned on (message in main window status bar)
* - click Finish button to dismiss the dialog
* - switch to Installed tab
* - select "netbeans.org Source Browser" plugin
* - click Deactivate button
* - wait for "NetBeans IDE Installer" dialog
* - click Cancel
* - Cancel deactivation because it requires restart (it can be fixed in future releases)
* - close Plugins dialog
*/
public void testPlugins() {
final String PLUGIN_LABEL = "JUnit"; //NOI18N
PluginsOperator pluginsOper = null;
try {
pluginsOper = PluginsOperator.invoke();
pluginsOper.reloadCatalog();
// Install
pluginsOper.selectAvailablePlugins();
pluginsOper.search(PLUGIN_LABEL);
pluginsOper.install(PLUGIN_LABEL);
// Deactivate
pluginsOper.selectInstalled();
try {
pluginsOper.cbShowDetails().setSelected(true);
} catch (JemmyException e) {
log("Show Details check box not found - details already shown.");
}
pluginsOper.selectPlugin(PLUGIN_LABEL);
pluginsOper.deactivate();
pluginsOper.installer().cancel();
/* Because it needs restart to deactivate module (probably can be changed in
* future releases), we skip this part.
*
// check Status line
// "Turning off modules...done."
String turningOffLabel = Bundle.getString("org.netbeans.core.startup.Bundle", "MSG_finish_disable_modules");
// increase timeout to 120 seconds
MainWindowOperator.getDefault().getTimeouts().setTimeout("Waiter.WaitingTime", 120000);
MainWindowOperator.getDefault().waitStatusText(turningOffLabel);
// click Finish button
String finishLabel = Bundle.getStringTrimmed("org.netbeans.modules.autoupdate.ui.wizards.Bundle", "InstallUnitWizardModel_Buttons_Finish");
new JButtonOperator(installerOper, finishLabel).push();
// Activate module
pluginsOper.selectInstalled();
pluginsOper.selectPlugin(PLUGIN_LABEL);
pluginsOper.activate();
// "Activate"
String activateInDialogLabel = Bundle.getStringTrimmed("org.netbeans.modules.autoupdate.ui.wizards.Bundle", "UninstallUnitWizardModel_Buttons_TurnOn");
new JButtonOperator(pluginsOper.installer(), activateInDialogLabel).pushNoBlock();
// check Status line
// "Turning on modules...done."
String turningOnLabel = Bundle.getString("org.netbeans.core.startup.Bundle", "MSG_finish_enable_modules");
// increase timeout to 120 seconds
MainWindowOperator.getDefault().getTimeouts().setTimeout("Waiter.WaitingTime", 120000);
MainWindowOperator.getDefault().waitStatusText(turningOnLabel);
// click Finish button
pluginsOper.installer().finish();
*/
pluginsOper.close();
} catch (JemmyException e) {
// close possible error dialog
// "Error"
String errorTitle = Bundle.getString("org.netbeans.modules.autoupdate.ui.Bundle", "CTL_Error");
if (JDialogOperator.findJDialog(errorTitle, true, true) != null) {
new NbDialogOperator(errorTitle).close();
}
// close Plugins dialog
if (pluginsOper != null) {
pluginsOper.close();
}
throw e;
}
}
public void testInitGC() throws Exception {
WatchProjects.initialize();
Log.enableInstances(Logger.getLogger("TIMER"), "TextDocument", Level.FINEST);
}
public void testGCDocuments() throws Exception {
WatchProjects.assertTextDocuments();
}
public void testGCProjects() throws Exception {
WatchProjects.assertProjects();
}
public void testReflectionUsage() throws Exception {
CountingSecurityManager.assertReflection(0, "allowed-reflection.txt");
}
/** Closes help window if any. It should not stay open between test cases.
* Otherwise it can break next tests.
*/
private static void closeHelpWindow() {
Window helpWindow = WindowOperator.findWindow(new ComponentChooser() {
@Override
public boolean checkComponent(Component comp) {
WindowOperator winOper = new WindowOperator((Window) comp);
winOper.setOutput(TestOut.getNullOutput());
return null != winOper.findSubComponent(new ComponentChooser() {
@Override
public boolean checkComponent(Component comp) {
return comp.getClass().getName().startsWith("javax.help.JHelp"); //NOI18N
}
@Override
public String getDescription() {
return ("any javax.help"); //NOI18N
}
});
}
@Override
public String getDescription() {
return "containing any javax.help.JHelp component"; //NOI18N
}
});
if (helpWindow != null) {
new WindowOperator(helpWindow).close();
}
}
/**
* Waits for breakpoint at specified line in editor.
*
* @param line line with breakpoint
* @param eo EditorOperator instance
*/
private static void waitBreakpoint(EditorOperator eo, final int line) throws Exception {
new Waiter(new Waitable() {
@Override
public Object actionProduced(Object editorOper) {
Object[] annotations = ((EditorOperator) editorOper).getAnnotations(line);
for (int i = 0; i < annotations.length; i++) {
if ("Breakpoint".equals(EditorOperator.getAnnotationType(annotations[i]))) { // NOI18N
return Boolean.TRUE;
}
}
return null;
}
@Override
public String getDescription() {
return ("Wait breakpoint established on line " + line); // NOI18N
}
}).waitAction(eo);
}
}