blob: 4a5b6fab3a43ab9ccc954819b6b31ded50d8d6b1 [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.modules.junit.ui.wizards;
import java.awt.Component;
import org.netbeans.modules.junit.api.JUnitUtils;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.SourceGroupModifier;
import org.netbeans.api.templates.TemplateRegistration;
import org.netbeans.modules.java.testrunner.GuiUtils;
import org.netbeans.modules.junit.api.JUnitSettings;
import org.netbeans.modules.junit.api.JUnitTestUtil;
import org.netbeans.modules.junit.plugin.JUnitPlugin;
import org.netbeans.modules.gsf.testrunner.plugin.CommonPlugin.CreateTestParam;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.loaders.TemplateWizard;
import org.openide.util.NbBundle;
/**
*/
@TemplateRegistration(folder = "UnitTests", position = 300, scriptEngine = "freemarker",
displayName = "org.netbeans.modules.junit.ui.Bundle#Templates/UnitTests/SimpleJUnitTest.java",
iconBase = "org/netbeans/modules/junit/ui/resources/JUnitLogo.png",
description = "/org/netbeans/modules/junit/ui/resources/SimpleJUnitTest.html", category = "junit")
public class SimpleTestCaseWizardIterator implements TemplateWizard.InstantiatingIterator<WizardDescriptor> {
private transient int index;
private transient WizardDescriptor.Panel[] panels;
private transient WizardDescriptor wizard;
/** */
private Project lastSelectedProject = null;
/** panel for choosing name and target location of the test class */
private WizardDescriptor.Panel<WizardDescriptor> classChooserPanel;
public SimpleTestCaseWizardIterator() {
}
@Override
public String name() {
return ""; // NOI18N
}
@Override
public boolean hasNext() {
return index < panels.length - 1;
}
@Override
public boolean hasPrevious() {
return index > 0;
}
@Override
public void nextPanel() {
if (!hasNext()) {
throw new NoSuchElementException();
}
index++;
}
@Override
public void previousPanel() {
if (!hasPrevious()) {
throw new NoSuchElementException();
}
index--;
}
@Override
public WizardDescriptor.Panel current() {
return panels[index];
}
@Override public final void addChangeListener(ChangeListener l) { }
@Override public final void removeChangeListener(ChangeListener l) { }
@Override
public void initialize(WizardDescriptor wizard) {
this.wizard = wizard;
index = 0;
panels = createPanels(wizard);
FileObject targetFolder = Templates.getTargetFolder(wizard);
// DataFolder targetFolder = null;
// try {
// targetFolder = wizard.getTargetFolder();
// } catch (IOException ex) {
// Exceptions.printStackTrace(ex);
// }
loadSettings(wizard);
// Make sure list of steps is accurate.
String[] beforeSteps = null;
Object prop = wizard.getProperty(WizardDescriptor.PROP_CONTENT_DATA); // NOI18N
if (prop != null && prop instanceof String[]) {
beforeSteps = (String[]) prop;
}
String[] steps = createSteps(beforeSteps, panels);
for (int i = 0; i < panels.length; i++) {
Component c = panels[i].getComponent();
if (steps[i] == null) {
// Default step name to component name of panel.
// Mainly useful for getting the name of the target
// chooser to appear in the list of steps.
steps[i] = c.getName();
}
if (c instanceof JComponent) { // assume Swing components
JComponent jc = (JComponent) c;
// Step #.
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
// Step name (actually the whole list for reference).
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps);
}
}
// String [] panelNames = new String [] {
// NbBundle.getMessage(EmptyTestCaseWizardIterator.class,"LBL_panel_chooseFileType"),
// NbBundle.getMessage(EmptyTestCaseWizardIterator.class,"LBL_panel_ChooseClass")};
//
// ((javax.swing.JComponent)getClassChooserPanel().getComponent()).putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, panelNames);
// ((javax.swing.JComponent)getClassChooserPanel().getComponent()).putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, new Integer(0));
if(targetFolder == null) {
// No test folders yet? Let's try one more time.
targetFolder = Templates.getTargetFolder(wizard);
// try {
// targetFolder = wizard.getTargetFolder();
// } catch (IOException ex1) {
// Exceptions.printStackTrace(ex1);
// }
}
WizardDescriptor.Panel<WizardDescriptor> chooserPanel = getClassChooserPanel();
if(chooserPanel instanceof SimpleTestStepLocation) {
if(targetFolder != null) {// No test folders yet. IOExceptions already loggged.
((SimpleTestStepLocation) chooserPanel).selectLocation(targetFolder);
}
}
}
@Override
public void uninitialize(WizardDescriptor wizard) {
if ((classChooserPanel != null)
&& !(classChooserPanel instanceof StepProblemMessage)) {
assert classChooserPanel instanceof SimpleTestStepLocation;
((SimpleTestStepLocation) classChooserPanel).cleanUp();
}
classChooserPanel = null;
this.wizard = null;
}
@Override
public Set<DataObject> instantiate() throws IOException {
saveSettings(wizard);
/* collect and build necessary data: */
FileObject classToTest = (FileObject)
wizard.getProperty(SimpleTestCaseWizard.PROP_CLASS_TO_TEST);
FileObject testRootFolder = (FileObject)
wizard.getProperty(SimpleTestCaseWizard.PROP_TEST_ROOT_FOLDER);
Map<CreateTestParam, Object> params
= JUnitTestUtil.getSettingsMap(false);
/* create test class(es) for the selected source class: */
JUnitPlugin plugin = JUnitTestUtil.getPluginForProject(
Templates.getProject(wizard));
if (!JUnitTestUtil.createTestActionCalled(
plugin,
new FileObject[] {classToTest})) {
return null;
}
/*
* The JUnitPlugin instance must be initialized _before_ field
* JUnitPluginTrampoline.DEFAULT gets accessed.
* See issue #74744.
*/
final FileObject[] testFileObjects
= JUnitTestUtil.createTests(
plugin,
new FileObject[] {classToTest},
testRootFolder,
params);
//XXX: What if the selected class is not testable?
// It should not be skipped!
if (testFileObjects == null) {
throw new IOException();
}
final Set<DataObject> dataObjects
= new HashSet<DataObject>((int) (testFileObjects.length * 1.5f));
for (FileObject testFile : testFileObjects) {
try {
dataObjects.add(DataObject.find(testFile));
} catch (DataObjectNotFoundException ex) {
//XXX - does nothing special - just continues
}
}
if (dataObjects.isEmpty()) {
throw new IOException();
}
return dataObjects;
}
private WizardDescriptor.Panel[] createPanels(final WizardDescriptor wizardDescriptor) {
return new WizardDescriptor.Panel[]{getClassChooserPanel()};
}
private String[] createSteps(String[] before, WizardDescriptor.Panel[] panels) {
assert panels != null;
// hack to use the steps set before this panel processed
int diff = 0;
if (before == null) {
before = new String[0];
} else if (before.length > 0) {
diff = ("...".equals(before[before.length - 1])) ? 1 : 0; // NOI18N
}
String[] res = new String[(before.length - diff) + panels.length];
for (int i = 0; i < res.length; i++) {
if (i < (before.length - diff)) {
res[i] = before[i];
} else {
res[i] = panels[i - before.length + diff].getComponent().getName();
}
}
return res;
}
/**
* Returns a panel for choosing name and target location of the test
* class. If the panel already exists, returns the existing panel,
* otherwise creates a new panel.
*
* @return existing panel or a newly created panel if it did not exist
*/
private WizardDescriptor.Panel<WizardDescriptor> getClassChooserPanel() {
final Project project = Templates.getProject(wizard);
if (classChooserPanel == null || project != lastSelectedProject) {
SourceGroupModifier.createSourceGroup(project, JavaProjectConstants.SOURCES_TYPE_JAVA, JavaProjectConstants.SOURCES_HINT_TEST);
final JUnitUtils utils = new JUnitUtils(project);
if (utils.getSourcesToTestsMap(true).isEmpty()) {
classChooserPanel = new StepProblemMessage(
project,
NbBundle.getMessage(EmptyTestCaseWizardIterator.class,
"MSG_NoTestSourceGroup")); //NOI18N
} else {
if (classChooserPanel == null) {
classChooserPanel = new SimpleTestStepLocation();
}
((SimpleTestStepLocation) classChooserPanel).setUp(utils);
}
}
lastSelectedProject = project;
return classChooserPanel;
}
private void loadSettings(WizardDescriptor wizard) {
JUnitSettings settings = JUnitSettings.getDefault();
wizard.putProperty(GuiUtils.CHK_PUBLIC, settings.isMembersPublic());
wizard.putProperty(GuiUtils.CHK_PROTECTED, settings.isMembersProtected());
wizard.putProperty(GuiUtils.CHK_PACKAGE, settings.isMembersPackage());
wizard.putProperty(GuiUtils.CHK_SETUP, settings.isGenerateSetUp());
wizard.putProperty(GuiUtils.CHK_TEARDOWN, settings.isGenerateTearDown());
wizard.putProperty(GuiUtils.CHK_BEFORE_CLASS, settings.isGenerateClassSetUp());
wizard.putProperty(GuiUtils.CHK_AFTER_CLASS, settings.isGenerateClassTearDown());
wizard.putProperty(GuiUtils.CHK_METHOD_BODIES, settings.isBodyContent());
wizard.putProperty(GuiUtils.CHK_JAVADOC, settings.isJavaDoc());
wizard.putProperty(GuiUtils.CHK_HINTS, settings.isBodyComments());
wizard.putProperty("NewFileWizard_Title", NbBundle.getMessage(SimpleTestStepLocation.class, "LBL_simpleTestWizard_stepName"));
}
private void saveSettings(WizardDescriptor wizard) {
JUnitSettings settings = JUnitSettings.getDefault();
settings.setMembersPublic(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_PUBLIC)));
settings.setMembersProtected(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_PROTECTED)));
settings.setMembersPackage(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_PACKAGE)));
settings.setGenerateSetUp(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_SETUP)));
settings.setGenerateTearDown(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_TEARDOWN)));
settings.setGenerateClassSetUp(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_BEFORE_CLASS)));
settings.setGenerateClassTearDown(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_AFTER_CLASS)));
settings.setBodyContent(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_METHOD_BODIES)));
settings.setJavaDoc(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_JAVADOC)));
settings.setBodyComments(Boolean.TRUE.equals(wizard.getProperty(GuiUtils.CHK_HINTS)));
}
}