/* VisualTestlet.java -- Abstract superclass for visual tests Copyright (C) 2006 Roman Kennke (kennke@aicas.com) This file is part of Mauve. Mauve 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, or (at your option) any later version. Mauve 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 Mauve; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package gnu.testlet; import java.awt.Component; import java.awt.Frame; import java.io.IOException; import javax.swing.JComponent; import javax.swing.JFrame; /** * Provides an environment for visual tests. Visual tests must provide a * component, instructions and the expected results. The harness provides * all three to the tester and ask if the test passed or not. * * The test component is displayed inside a AWT Frame or a Swing JFrame * (depending on the type of the component). This means that the tested * Java environment needs to have some basic AWT or Swing functionality. This * should be covered by other tests (possibly by java.awt.Robot or so). */ public abstract class VisualTestlet implements Testlet { /** * Starts the test. * * @param h the test harness */ public void test(TestHarness h) { // Initialize and show test component. Component c = getTestComponent(); Frame f; if (c instanceof JComponent) { JFrame jFrame = new JFrame(); jFrame.setContentPane((JComponent) c); f = jFrame; } else { f = new Frame(); f.add(c); } f.pack(); f.setVisible(true); // Print instructions and expected results on console. System.out.println("===================================================="); System.out.print("This is a test that needs human interaction. Please "); System.out.print("read the instructions carefully and follow them. "); System.out.print("Then check if your results match the expected results. "); System.out.print("Type p if the test showed the expected results,"); System.out.println(" f otherwise."); System.out.println("===================================================="); System.out.println("INSTRUCTIONS:"); System.out.println(getInstructions()); System.out.println("===================================================="); System.out.println("EXPECTED RESULTS:"); System.out.println(getExpectedResults()); System.out.println("===================================================="); // Ask the tester whether the test passes or fails. System.out.println("(P)ASS or (F)AIL ?"); while (true) { int ch; try { ch = System.in.read(); if (ch == 'P' || ch == 'p') { h.check(true); break; } else if (ch == 'f' || ch == 'F') { h.check(false); break; } } catch (IOException ex) { h.debug(ex); h.fail("Unexpected IO problem on console"); } } } /** * Provides the instructions for the test. * * @return the instructions for the test */ public abstract String getInstructions(); /** * Describes the expected results. * * @return the expected results */ public abstract String getExpectedResults(); /** * Provides the test component. * * @return the test component */ public abstract Component getTestComponent(); }