jdk/test/java/util/ResourceBundle/RBTestFmwk.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/ResourceBundle/RBTestFmwk.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ *
+ *
+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
+ *
+ * Portions copyright (c) 2007 Sun Microsystems, Inc.
+ * All Rights Reserved.
+ *
+ * The original version of this source code and documentation
+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
+ * subsidiary of IBM. These materials are provided under terms
+ * of a License Agreement between Taligent and Sun. This technology
+ * is protected by multiple US and International patents.
+ *
+ * This notice and attribution to Taligent may not be removed.
+ * Taligent is a registered trademark of Taligent, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL purposes and without
+ * fee is hereby granted provided that this copyright notice
+ * appears in all copies. Please refer to the file "copyright.html"
+ * for further important copyright and licensing information.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+import java.lang.reflect.*;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Vector;
+import java.io.*;
+import java.text.*;
+
+/**
+ * RBTestFmwk is a base class for tests that can be run conveniently from
+ * the command line as well as under the Java test harness.
+ * <p>
+ * Sub-classes implement a set of methods named Test<something>. Each
+ * of these methods performs some test. Test methods should indicate
+ * errors by calling either err or errln.  This will increment the
+ * errorCount field and may optionally print a message to the log.
+ * Debugging information may also be added to the log via the log
+ * and logln methods.  These methods will add their arguments to the
+ * log only if the test is being run in verbose mode.
+ */
+public class RBTestFmwk {
+    //------------------------------------------------------------------------
+    // Everything below here is boilerplate code that makes it possible
+    // to add a new test by simply adding a function to an existing class
+    //------------------------------------------------------------------------
+
+    protected RBTestFmwk() {
+        // Create a hashtable containing all the test methods.
+        testMethods = new Hashtable();
+        Method[] methods = getClass().getDeclaredMethods();
+        for( int i=0; i<methods.length; i++ ) {
+            if( methods[i].getName().startsWith("Test")
+                    || methods[i].getName().startsWith("test") ) {
+                testMethods.put( methods[i].getName(), methods[i] );
+            }
+        }
+    }
+
+    protected void run(String[] args) throws Exception
+    {
+        System.out.println(getClass().getName() + " {");
+        indentLevel++;
+
+        // Set up the log and reference streams.  We use PrintWriters in order to
+        // take advantage of character conversion.  The JavaEsc converter will
+        // convert Unicode outside the ASCII range to Java's \\uxxxx notation.
+        log = new PrintWriter(System.out,true);
+
+        // Parse the test arguments.  They can be either the flag
+        // "-verbose" or names of test methods. Create a list of
+        // tests to be run.
+        Vector testsToRun = new Vector( args.length );
+        for( int i=0; i<args.length; i++ ) {
+            if( args[i].equals("-verbose") ) {
+                verbose = true;
+            }
+            else if( args[i].equals("-prompt") ) {
+                prompt = true;
+            } else if (args[i].equals("-nothrow")) {
+                nothrow = true;
+            } else {
+                Object m = testMethods.get( args[i] );
+                if( m != null ) {
+                    testsToRun.addElement( m );
+                }
+                else {
+                    usage();
+                    return;
+                }
+            }
+        }
+
+        // If no test method names were given explicitly, run them all.
+        if( testsToRun.size() == 0 ) {
+            Enumeration methodNames = testMethods.elements();
+            while( methodNames.hasMoreElements() ) {
+                testsToRun.addElement( methodNames.nextElement() );
+            }
+        }
+
+        // Run the list of tests given in the test arguments
+        for( int i=0; i<testsToRun.size(); i++ ) {
+            int oldCount = errorCount;
+
+            Method testMethod = (Method)testsToRun.elementAt(i);
+            writeTestName(testMethod.getName());
+
+            try {
+                testMethod.invoke(this, new Object[0]);
+            }
+            catch( IllegalAccessException e ) {
+                errln("Can't acces test method " + testMethod.getName());
+            }
+            catch( InvocationTargetException e ) {
+                errorCount++;
+                log.println("\nUncaught throwable thrown in test method "
+                            + testMethod.getName());
+                e.getTargetException().printStackTrace(this.log);
+                if (!nothrow) {
+                    throw new RuntimeException("Exiting...");
+                }
+            }
+            writeTestResult(errorCount - oldCount);
+        }
+        indentLevel--;
+        writeTestResult(errorCount);
+        if (prompt) {
+            System.out.println("Hit RETURN to exit...");
+            try {
+                System.in.read();
+            }
+            catch (IOException e) {
+                System.out.println("Exception: " + e.toString() + e.getMessage());
+            }
+        }
+        if (nothrow) {
+            System.exit(errorCount);
+        }
+    }
+
+    /**
+     * Adds given string to the log if we are in verbose mode.
+     */
+    protected void log( String message ) {
+        if( verbose ) {
+            indent(indentLevel + 1);
+            log.print( message );
+            log.flush();
+        }
+    }
+
+    protected void logln( String message ) {
+        log(message + System.getProperty("line.separator"));
+    }
+
+    /**
+     * Report an error
+     */
+    protected void err( String message ) {
+        errorCount++;
+        indent(indentLevel + 1);
+        log.print( message );
+        log.flush();
+
+        if (!nothrow) {
+            throw new RuntimeException(message);
+        }
+    }
+
+    protected void errln( String message ) {
+        err(message + System.getProperty("line.separator"));
+    }
+
+
+    protected void writeTestName(String testName) {
+        indent(indentLevel);
+        log.print(testName);
+        log.flush();
+        needLineFeed = true;
+    }
+
+    protected void writeTestResult(int count) {
+        if (!needLineFeed) {
+            indent(indentLevel);
+            log.print("}");
+        }
+        needLineFeed = false;
+
+        if (count != 0)
+            log.println(" FAILED");
+        else
+            log.println(" Passed");
+    }
+
+    private final void indent(int distance) {
+        if (needLineFeed) {
+            log.println(" {");
+            needLineFeed = false;
+        }
+        log.print(spaces.substring(0, distance * 2));
+    }
+
+    /**
+     * Print a usage message for this test class.
+     */
+    void usage() {
+        System.out.println(getClass().getName() +
+                            ": [-verbose] [-nothrow] [-prompt] [test names]");
+
+        System.out.println("test names:");
+        Enumeration methodNames = testMethods.keys();
+        while( methodNames.hasMoreElements() ) {
+            System.out.println("\t" + methodNames.nextElement() );
+        }
+    }
+
+    private boolean     prompt = false;
+    private boolean     nothrow = false;
+    protected boolean   verbose = false;
+
+    private PrintWriter log;
+    private int         indentLevel = 0;
+    private boolean     needLineFeed = false;
+    private int         errorCount = 0;
+
+    private Hashtable testMethods;
+    private final String spaces = "                                          ";
+}