blob: 1b8e5c893279eca0e1a7628ffa32a800fbecb477 [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.api.options;
import java.awt.Frame;
import java.awt.Dialog;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.SwingUtilities;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.RandomlyFails;
import org.netbeans.modules.options.advanced.Advanced;
import org.netbeans.modules.options.advanced.AdvancedPanel;
import org.netbeans.modules.options.advanced.AdvancedPanelController;
import org.netbeans.spi.options.OptionsCategory;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.util.Lookup;
import org.openide.util.lookup.Lookups;
/**
*
* @author Radek Matous
*/
public class OptionsDisplayerOpenTest extends NbTestCase {
public static Test suite() {
return GraphicsEnvironment.isHeadless() ? new TestSuite() : new TestSuite(OptionsDisplayerOpenTest.class);
}
private static TestDisplayer displayer = new TestDisplayer();
private static final int REPEATER = 10;
private Collection<? extends RegisteredCategory> all;
Logger log;
static {
String[] layers = new String[] {"org/netbeans/api/options/mf-layer.xml"};//NOI18N
Object[] instances = new Object[] {displayer};
IDEInitializer.setup(layers,instances);
}
public OptionsDisplayerOpenTest(String testName) {
super(testName);
}
private Lookup lookup;
@Override
protected void setUp() throws Exception {
log = Logger.getLogger("[Test - " + getName() + "]");
lookup = Lookups.forPath("OptionsDialog"); // NOI18N
Lookup.Result<RegisteredCategory> result = lookup.lookup(new Lookup.Template<RegisteredCategory>(RegisteredCategory.class));
all = result.allInstances();
assertTrue(all.size() > 0);
}
/**
* Test of getDefault method, of class org.netbeans.api.options.OptionsDisplayer.
*/
public void testGetDefault() {
assertNotNull(OptionsDisplayer.getDefault());
}
@RandomlyFails // NB-Core-Build #2372
public void testSimulatesAllNecessaryCallAndCheckThreading() throws Exception {
RegisteredCategory rcTemp = null;
for (RegisteredCategory rc : all) {
rcTemp = rc;
break;
}
final RegisteredCategory registeredCategory = rcTemp;
assertNotNull(registeredCategory);
//cals getComponent,update, getLookup
open("Registered", true);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
//calls isValid
registeredCategory.setInvalid();
//calls getHelpCtx
registeredCategory.helpChanged();
}
});
} finally {
//calls cancel
close(false);
try {
open("Registered", true);
} finally {
//calls applyChanges
close();
}
registeredCategory.assertThreadingForAllCallsWereTested();
}
}
public void testOpenFromWorkerThread() {
openOpen(null);
openOpen("Registered");
openOpen("Unknown");
openCloseOpen(null);
openCloseOpen("Registered");
openCloseOpen("Unknown");
}
public void testOpenFromAWT() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
testOpenFromWorkerThread();
}
});
}
public void testOpenFromMixedThreads() throws Exception {
testOpenFromWorkerThread();
testOpenFromAWT();
testOpenFromWorkerThread();
testOpenFromAWT();
}
/** Tests method setCurrentSubcategory is called in implementing OptionsPanelController
* when OptionsDisplayer.open(categoryId, subcategoryId) is called.
*/
public void testSetCurrentSubcategoryCalled() {
open("Registered/SubcategoryID", true);
assertEquals("Subcategory not set.", "SubcategoryID", RegisteredCategory.subcategoryID);
close();
open("Registered", true);
// check RegisteredCategory.create().setCurrentSubcategory not called
assertEquals("Subcategory should not be set.", "SubcategoryID", RegisteredCategory.subcategoryID);
close();
}
/**
* Tests selection of subcategories in Advanced (aka Miscellaneous) category.
*/
public void testAdvancedSubcategorySelection() throws Exception {
open(OptionsDisplayer.ADVANCED, true);
assertEquals("First subcategory should be selected by default.", Subcategory1.DISPLAY_NAME, getSelectedSubcategory(Advanced.class));
close();
open(OptionsDisplayer.ADVANCED+"/Subcategory2", true);
assertEquals("Wrong subcategory selected.", Subcategory2.DISPLAY_NAME, getSelectedSubcategory(Advanced.class));
close();
open(OptionsDisplayer.ADVANCED+"/UnknownID", true);
assertEquals("Wrong subcategory selected.", Subcategory2.DISPLAY_NAME, getSelectedSubcategory(Advanced.class));
close();
open(OptionsDisplayer.ADVANCED+"/Subcategory1", true);
assertEquals("Wrong subcategory selected.", Subcategory1.DISPLAY_NAME, getSelectedSubcategory(Advanced.class));
close();
}
/**
* Tests selection of subcategories in user-created category.
*/
@RandomlyFails // NB-Core-Build #3813
public void testSubcategorySelection() throws Exception {
open("MyAdvancedCategory", true);
assertEquals("Subcategory2 should be first and selected by default.", Subcategory2.DISPLAY_NAME, getSelectedSubcategory(MyAdvancedCategory.class));
close();
open("MyAdvancedCategory/Subcategory1", true);
assertEquals("Wrong subcategory selected.", Subcategory1.DISPLAY_NAME, getSelectedSubcategory(MyAdvancedCategory.class));
close();
open("MyAdvancedCategory/UnknownID", true);
assertEquals("Wrong subcategory selected.", Subcategory1.DISPLAY_NAME, getSelectedSubcategory(MyAdvancedCategory.class));
close();
open("MyAdvancedCategory/Subcategory2", true);
assertEquals("Wrong subcategory selected.", Subcategory2.DISPLAY_NAME, getSelectedSubcategory(MyAdvancedCategory.class));
close();
open("MyAdvancedCategory/Subcategory2/Subcategory22", true);
assertEquals("setCurrentSubcategory not called in Subcategory2 controller.", "Subcategory22", Subcategory2.getSubpath());
close();
}
/** Returns display name of subcategory selected in AdvancedPanel. */
private String getSelectedSubcategory(Class<? extends OptionsCategory> categoryClass) throws Exception {
OptionsCategory category = lookup.lookup(categoryClass);
Method getAdvancedPanelMethod = AdvancedPanelController.class.getDeclaredMethod("getAdvancedPanel", (Class[])null);
getAdvancedPanelMethod.setAccessible(true);
AdvancedPanel advancedPanel = (AdvancedPanel)getAdvancedPanelMethod.invoke(category.create(), (Object[])null);
Method getSelectedDisplayNameMethod = AdvancedPanel.class.getDeclaredMethod("getSelectedDisplayName", (Class[])null);
getSelectedDisplayNameMethod.setAccessible(true);
return (String) getSelectedDisplayNameMethod.invoke(advancedPanel, (Object[])null);
}
public void openOpen(String categoryId) {
for (int i = 0; i < REPEATER; i++) {
if (categoryId == null) {
open(true);
open(false);
close();
//don't call: OptionsDisplayer.getDefault().open(null) but OptionsDisplayer.getDefault().open()
open(null, false);
close();
} else {
if ("Registered".equals(categoryId)) {
open(categoryId, true);
open(categoryId, false);
close();
} else {
open(categoryId, false);
open(categoryId, false);
close();
}
}
}
}
public void openCloseOpen(String categoryId) {
for (int i = 0; i < REPEATER; i++) {
if (categoryId == null) {
open(true);
close();
open(true);
close();
} else {
if ("Registered".equals(categoryId)) {
open(categoryId, true);
close();
open(categoryId, true);
close();
} else {
open(categoryId, false);
close();
open(categoryId, false);
close();
}
}
}
}
public void testModality() throws Exception {
OptionsDisplayer.getDefault().open(false) ;
modality(displayer.descriptor, false);
close();
TestDisplayer td = new TestDisplayer();
td.createDialog(new DialogDescriptor(displayer, null, true, null));
OptionsDisplayer.getDefault().open(true) ;
modality(td.descriptor, true);
close();
}
public void modality(DialogDescriptor desc, boolean expectedResult) {
if (desc != null) {
assertEquals(expectedResult, desc.isModal());
}
}
public void open(boolean expectedResult) {
modality(displayer.descriptor);
boolean latestResult = OptionsDisplayer.getDefault().open() ;
assertEquals(expectedResult, latestResult);
}
public void open(String path, boolean expectedResult) {
modality(displayer.descriptor);
boolean latestResult = OptionsDisplayer.getDefault().open(path);
assertEquals(expectedResult, latestResult);
}
public void modality(DialogDescriptor desc) {
if (desc != null) {
assertFalse(desc.isModal());
}
}
public void close() {
close(true);
}
public void close(boolean okButtonForClose) {
displayer.okButtonForClose = okButtonForClose;
modality(displayer.descriptor);
displayer.close();
}
@Override
protected Level logLevel() {
return Level.FINE;
}
public static class TestDisplayer extends DialogDisplayer implements Runnable {
DialogDescriptor descriptor;
private JDialog dialog;
boolean okButtonForClose = true;
public Object notify(NotifyDescriptor descriptor) {
throw new UnsupportedOperationException("Not supported yet.");
}
public Dialog createDialog(DialogDescriptor descriptor) {
this.descriptor = descriptor;
return dialog = new TestDialog(descriptor);
}
public void close() {
try {
if (okButtonForClose || SwingUtilities.isEventDispatchThread()) {
run();
} else {
SwingUtilities.invokeAndWait(this);
}
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
}
public void run() {
if (descriptor != null) {
Object[] oo = descriptor.getClosingOptions();
for (int i = 0; i < oo.length; i++) {
if (okButtonForClose && oo[i] instanceof JButton && ((JButton)oo[i]).getActionCommand().equals("OK")) {
descriptor.getButtonListener().actionPerformed(new ActionEvent(oo[i], 0, ((JButton)oo[i]).getActionCommand()));
return;
} else if (!okButtonForClose && !(oo[i] instanceof JButton)) {
descriptor.getButtonListener().actionPerformed(new ActionEvent(DialogDescriptor.CANCEL_OPTION, 0, ""));
return;
}
}
}
}
}
private static class TestDialog extends JDialog {
TestDialog(DialogDescriptor descriptor) {
super((Frame)null, descriptor.getTitle(), descriptor.isModal());
}
@Override
public void setVisible(boolean b) {
if (isModal()) {
super.setVisible(b);
}
}
}
}