/* * $Id$ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. */ package org.jdesktop.swingx.action; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; import java.beans.Statement; import java.util.Iterator; import javax.swing.Action; import javax.swing.JButton; import junit.framework.TestCase; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Unit test driver for the ActionManager * * TODO: Should test TargetableActions */ @RunWith(JUnit4.class) public class ActionManagerTest extends TestCase { private ActionManager manager; @Before public void setUpJ4() throws Exception { setUp(); } @After public void tearDownJ4() throws Exception { tearDown(); } // TODO: Add more attributes which represent actions and types. @Override protected void setUp() { // JW: changed on reorg to remove reference to Application // manager = Application.getInstance().getActionManager(); manager = ActionManager.getInstance(); // Simple commands manager.addAction(createBoundAction("simple-command", "Simple", "S")); manager.addAction(createBoundAction("simple2-command", "Simple 2", "2")); manager.addAction(createBoundAction("simple3-command", "Simple 3", "3")); // Toggle action manager.addAction(createBoundAction("toggle-command", "Toggle", "T", true)); // More toggle actions for a group manager.addAction(createBoundAction("left-command", "Left", "L", true, "position-group")); manager.addAction(createBoundAction("center-command", "Center", "C", true, "position-group")); manager.addAction(createBoundAction("right-command", "Right", "R", true, "position-group")); // Composite action CompositeAction action = ActionFactory.createCompositeAction("composite-command", "Composite", "C"); action.addAction("simple-command"); action.addAction("simple2-command"); manager.addAction(action); // Server action ServerAction saction = ActionFactory.createServerAction("namefinder-command", "NameFinder", "N"); saction.setURL("http://namefinder.sfbay/NameFinder"); saction.addParam("nfquery", "Mark Davidson"); manager.addAction(saction); // XXX This doesn't work since google doesn't allow this. saction = ActionFactory.createServerAction("server-command", "Google", "G"); saction.setURL("http://www.google.com/search"); saction.addParam("q", "Zaphod+Beeblebrox"); manager.addAction(saction); } public BoundAction createBoundAction(String id, String name, String mnemonic) { return createBoundAction(id, name, mnemonic, false); } public BoundAction createBoundAction(String id, String name, String mnemonic, boolean toggle) { return createBoundAction(id, name, mnemonic, toggle, null); } public BoundAction createBoundAction(String id, String name, String mnemonic, boolean toggle, String group) { return ActionFactory.createBoundAction(id, name, mnemonic, toggle, group); } /** * Test to see if the types of actions that are created map correctly. */ @Test public void testActionTypes() { assertTrue(manager.isBoundAction("simple-command")); assertTrue(manager.isBoundAction("simple2-command")); assertTrue(manager.isBoundAction("simple3-command")); assertTrue(manager.isBoundAction("toggle-command")); assertTrue(manager.isBoundAction("left-command")); assertTrue(manager.isBoundAction("right-command")); assertTrue(manager.isBoundAction("center-command")); assertTrue(manager.isCompositeAction("composite-command")); assertTrue(manager.isServerAction("namefinder-command")); assertTrue(manager.isServerAction("server-command")); // state types assertTrue(!manager.isStateAction("simple-command")); assertTrue(!manager.isStateAction("simple2-command")); assertTrue(!manager.isStateAction("simple3-command")); assertTrue(manager.isStateAction("toggle-command")); assertTrue(manager.isStateAction("left-command")); assertTrue(manager.isStateAction("right-command")); assertTrue(manager.isStateAction("center-command")); assertTrue(!manager.isStateAction("composite-command")); assertTrue(!manager.isStateAction("namefinder-command")); assertTrue(!manager.isStateAction("server-command")); } /** * A test which registers all the actions with a controller, * invokes the actions to see if the registration was correct. */ @Test public void testRegisterMethod() { Controller controller = new Controller(); // Register the action on the controller. Iterator<?> iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { manager.registerCallback(iter.next(), controller, "action"); } // Invoke all the actions. Action action; // dummy ItemSelectable used for forging ItemEvents. java.awt.ItemSelectable dummy = new JButton("Dummy"); iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { controller.reset(); Object id = iter.next(); action = manager.getAction(id); if (manager.isBoundAction(id)) { if (manager.isStateAction(id)) { // Use reflection to fake the ItemEvent. ItemEvent evt = new ItemEvent(dummy, 666, "test", ItemEvent.SELECTED); Statement statement = new Statement(action, "itemStateChanged", new Object[] { evt }); try { statement.execute(); } catch (Exception ex) { ex.printStackTrace(); } assertTrue(controller.isInvoked()); } else { // Simple command action. action.actionPerformed(new ActionEvent(action, 666, "test")); assertTrue("ERROR: " + manager.getBoundAction(id).toString(), controller.isInvoked()); } } } } /** * Test the composite action. Two simple commands have registered methods. * these methods should be executed in the composite action invokation. */ @Test public void testCompositeAction() { Controller controller = new Controller(); manager.registerCallback("simple-command", controller, "doNew"); manager.registerCallback("simple2-command", controller, "doSave"); Action action = manager.getAction("composite-command"); action.actionPerformed(new ActionEvent(action, 666, "test")); assertTrue("ERROR: Controller was not invoked", controller.isInvoked()); assertTrue("ERROR: Controller should have been invoked twice", controller.getNumInvoked() == 2); } /** * Test the server action. The server action should send an http post. * with the params and not throw an exception. * * TODO: It's difficult to test the server action in a firewall/non-controlled * network environment. Enable this test when working specifically with ServerActions. @Test public void testServerAction() { ServerAction action = manager.getServerAction("namefinder-command"); try { // Determine if we are behind a firewall. Set // set the web proxy if we are URL url = new URL(action.getURL()); URLConnection uc = url.openConnection(); uc.connect(); } catch (Exception ex) { // Set proxy since we are behind the firewall. System.setProperty("http.proxyHost", "scaweb1.sfbay"); System.setProperty("http.proxyPort", "8080"); } action.actionPerformed(new ActionEvent(action, 666, "test")); } */ @Test public void testEnabled() { boolean[] values = new boolean[] { true, false, true, true, false, false }; Iterator<?> iter; for (int i = 0; i < values.length; i++) { // Test for actions enabled by disabling actions. iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { manager.setEnabled(iter.next(), values[i]); } iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { assertTrue(manager.isEnabled(iter.next()) == values[i]); } } } @Test public void testSelected() { boolean[] values = new boolean[] { true, false, true, true, false, false }; Iterator<?> iter; for (int i = 0; i < values.length; i++) { // Test for actions enabled by disabling actions. iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { manager.setSelected(iter.next(), values[i]); } iter = manager.getActionIDs().iterator(); while (iter.hasNext()) { Object a = iter.next(); if (manager.isStateAction(a)) { assertTrue("Action: " + a + " selected state not " + values[i], manager.isSelected(a) == values[i]); } else { // Non StateActions will always return false. assertFalse(manager.isSelected(a)); } } } } /** * A simple controller callback for ActionManager registration test. */ public class Controller { private boolean invoked = false; private int numInvoked = 0; public void action() { invoked = true; numInvoked++; } public void doNew() { action(); } public void doSave() { action(); } public void action(boolean state) { action(); } public void reset() { invoked = false; numInvoked = 0; } public int getNumInvoked() { return numInvoked; } public boolean isInvoked() { return invoked; } } }