/* * WizardControllerTest.java 7 juin 07 * * Copyright (c) 2007 Emmanuel PUYBARET / eTeks <info@eteks.com>. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.eteks.sweethome3d.junit; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.net.URL; import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import junit.framework.TestCase; import abbot.finder.ComponentSearchException; import abbot.tester.JComponentTester; import com.eteks.sweethome3d.io.DefaultUserPreferences; import com.eteks.sweethome3d.model.UserPreferences; import com.eteks.sweethome3d.swing.SwingViewFactory; import com.eteks.sweethome3d.swing.WizardPane; import com.eteks.sweethome3d.viewcontroller.View; import com.eteks.sweethome3d.viewcontroller.ViewFactory; import com.eteks.sweethome3d.viewcontroller.WizardController; /** * Tests {@link com.eteks.sweethome3d.viewcontroller.WizardController wizard controller}. * @author Emmanuel Puybaret */ public class WizardControllerTest extends TestCase { public void testWizardController() throws NoSuchFieldException, IllegalAccessException, ComponentSearchException { // 1. Create a wizard controller test waiting for finish call final boolean [] finished = {false}; WizardController controller = new ControllerTest(new DefaultUserPreferences(), new SwingViewFactory()) { @Override public void finish() { finished [0] = true; } }; WizardPane view = (WizardPane)controller.getView(); // Retrieve view back and next buttons final JButton backOptionButton = (JButton)TestUtilities.getField(view, "backOptionButton"); final JButton nextFinishOptionButton = (JButton)TestUtilities.getField(view, "nextFinishOptionButton"); String nextFinishOptionButtonText = nextFinishOptionButton.getText(); // Check view displays first step view assertEquals("First step view class isn't correct", ControllerTest.FirstStepView.class, ((BorderLayout)((JPanel)view.getMessage()).getLayout()).getLayoutComponent(BorderLayout.CENTER).getClass()); // Check back button is disabled and next button is enabled assertFalse("Back button isn't disabled", backOptionButton.isEnabled()); assertTrue("Next button isn't enabled", nextFinishOptionButton.isEnabled()); // 2. Click on nextFinishButton JComponentTester tester = new JComponentTester(); tester.invokeAndWait(new Runnable() { public void run() { nextFinishOptionButton.doClick(); } }); // Check view displays second step view assertEquals("Second step view class isn't correct", ControllerTest.SecondStepView.class, ((BorderLayout)((JPanel)view.getMessage()).getLayout()).getLayoutComponent(BorderLayout.CENTER).getClass()); // Check back button is enabled and next button is disabled assertTrue("Back button isn't enabled", backOptionButton.isEnabled()); assertFalse("Next button isn't disabled", nextFinishOptionButton.isEnabled()); // Check next button text changed assertFalse("Next button text didn't changed", nextFinishOptionButton.getText().equals(nextFinishOptionButtonText)); // 3. Click on backButton tester.invokeAndWait(new Runnable() { public void run() { backOptionButton.doClick(); } }); // Check view displays first step view assertEquals("First step view class isn't correct", ControllerTest.FirstStepView.class, ((BorderLayout)((JPanel)view.getMessage()).getLayout()).getLayoutComponent(BorderLayout.CENTER).getClass()); // Check back button is disabled and next button is enabled assertFalse("Back button isn't disabled", backOptionButton.isEnabled()); assertTrue("Next button isn't enabled", nextFinishOptionButton.isEnabled()); // Check next button text changed back to its first value assertEquals("Next button text didn't changed", nextFinishOptionButtonText, nextFinishOptionButton.getText()); // 4. Click on nextFinishButton tester.invokeAndWait(new Runnable() { public void run() { nextFinishOptionButton.doClick(); } }); // Check view displays second step view assertEquals("Second step view class isn't correct", ControllerTest.SecondStepView.class, ((BorderLayout)((JPanel)view.getMessage()).getLayout()).getLayoutComponent(BorderLayout.CENTER).getClass()); // Check the check box in second step view isn't selected final JCheckBox yesCheckBox = (JCheckBox)TestUtilities.findComponent(view, JCheckBox.class); assertFalse("Check box is selected", yesCheckBox.isSelected()); // Select the check box in second step view tester.invokeAndWait(new Runnable() { public void run() { yesCheckBox.doClick(); } }); // Check the check box is selected and next button is enabled assertTrue("Check box isn't selected", yesCheckBox.isSelected()); assertTrue("Next button isn't enabled", nextFinishOptionButton.isEnabled()); // 5. Click on nextFinishButton tester.invokeAndWait(new Runnable() { public void run() { nextFinishOptionButton.doClick(); } }); // Check finish was called assertTrue("Finish wasn't called", finished [0]); } public static void main(String [] args) { // Display the wizard controlled by ControllerTest new ControllerTest(new DefaultUserPreferences(), new SwingViewFactory()).displayView(null); } /** * A simple <code>WizardController</code> implementation that displays two steps. */ private static class ControllerTest extends WizardController { private static URL stepIcon = WizardController.class.getResource("resources/backgroundImageWizard.png"); public ControllerTest(UserPreferences preferences, ViewFactory viewFactory) { super(preferences, viewFactory); // Choose step to display setStepState(new FirstStep()); } @Override public void finish() { JOptionPane.showMessageDialog(null, "Wizard finished"); } // First step of wizard private class FirstStep extends WizardControllerStepState { @Override public void enter() { setNextStepEnabled(true); } @Override public View getView() { return new FirstStepView(); } @Override public URL getIcon() { return stepIcon; } @Override public boolean isFirstStep() { return true; } @Override public void goToNextStep() { setStepState(new SecondStep()); } } // First step view is a simple label private static class FirstStepView extends JLabel implements View { public FirstStepView() { super("First step"); } } // Second step of wizard private class SecondStep extends WizardControllerStepState { @Override public View getView() { return new SecondStepView(this); } @Override public URL getIcon() { return stepIcon; } @Override public boolean isLastStep() { return true; } @Override public void goBackToPreviousStep() { setStepState(new FirstStep()); } public void setFinishEnabled(boolean enabled) { // Activate next step when check box is selected setNextStepEnabled(enabled); } } // Second step view is a panel displaying a check box that enables next step private static class SecondStepView extends JPanel implements View { public SecondStepView(final SecondStep secondStepController) { add(new JLabel("Finish ?")); add(new JCheckBox(new AbstractAction("Yes") { public void actionPerformed(ActionEvent ev) { // Activate next step when check box is selected secondStepController.setFinishEnabled( ((AbstractButton)ev.getSource()).isSelected()); } })); } } } }