// Tags: JDK1.1 // Uses: ../sub/InvokeHelper iface // Copyright (C) 1999, 2000, 2001, 2003, 2004 Cygnus Solutions // 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, 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. */ package gnu.testlet.wonka.lang.reflect.Method; import gnu.testlet.Testlet; import gnu.testlet.TestHarness; import gnu.testlet.wonka.lang.reflect.sub.InvokeHelper; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; public class invoke implements Testlet, iface { int save = 0; // Don't use `.class' because gcj doesn't handle it yet. static Class tclass = null; static { try { tclass = Class.forName("java.lang.Throwable"); } catch (Throwable _) { // Nothing. } } public String no_args () { return "zardoz"; } private String private_method () { return "ok"; } // Note that this is not overridden by InvokeHelper.p(). String p () { return "ppm"; } public static int takes_int (int val) { if (val < 0) throw new IllegalArgumentException (); return val + 3; } public void returns_void (Integer val1, Integer val2) { save = val1.intValue() + val2.intValue(); } public void try_invoke (TestHarness harness, Method method, Object obj, Object[] args, Object expect) { Object result = null; try { result = method.invoke (obj, args); } catch (Throwable t) { result = t; } if (tclass.isInstance(expect)) { // We're expecting an exception, so just make sure the types // match. harness.check(result.getClass(), expect.getClass()); } else harness.check(result, expect); } public Method getMethod (Class ic, String name, Class[] list) { Method m = null; try { m = ic.getMethod(name, list); } catch (Throwable _) { // Nothing. } return m; } public Method getDeclaredMethod (Class ic, String name, Class[] list) { Method m = null; try { m = ic.getDeclaredMethod(name, list); } catch (Throwable _) { // Nothing. } return m; } public void test (TestHarness harness) { // Don't use `.class' because gcj doesn't handle it yet. Class[] ic = new Class[2]; try { ic[0] = Class.forName("gnu.testlet.wonka.lang.reflect.Method.invoke"); ic[1] = Class.forName("gnu.testlet.wonka.lang.reflect.Method.iface"); } catch (Throwable _) { // Just lose. } for (int i = 0; i < ic.length; ++i) { Class[] na_list = new Class[0]; Method na_meth = getMethod (ic[i], "no_args", na_list); Class[] ti_list = new Class[1]; ti_list[0] = Integer.TYPE; Method ti_meth = getMethod (ic[i], "takes_int", ti_list); Class[] rv_list = new Class[2]; rv_list[0] = null; try { rv_list[0] = Class.forName("java.lang.Integer"); } catch (Throwable _) { // Just lose. } rv_list[1] = rv_list[0]; Method rv_meth = getMethod (ic[i], "returns_void", rv_list); harness.checkPoint ("no_args for " + ic[i]); Object[] args0 = new Object[0]; // Successful invocation. try_invoke (harness, na_meth, this, args0, "zardoz"); // Null `this' should fail. try_invoke (harness, na_meth, null, args0, new NullPointerException ()); if (! ic[i].isInterface()) { // Too few arguments. try_invoke (harness, ti_meth, this, args0, new IllegalArgumentException ()); } // Wrong class for `this'. try_invoke (harness, na_meth, new NullPointerException (), args0, new IllegalArgumentException ()); // null argument list is ok, at least according to JDK // implementation. try_invoke (harness, na_meth, this, null, "zardoz"); if (! ic[i].isInterface()) { harness.checkPoint ("takes_int for " + ic[i]); Object[] args1 = new Object[1]; args1[0] = new Integer (5); try_invoke (harness, na_meth, this, args1, new IllegalArgumentException ()); try_invoke (harness, ti_meth, this, args1, new Integer (8)); // null should work for object as this is a static method. try_invoke (harness, ti_meth, null, args1, new Integer (8)); args1[0] = "joe louis"; try_invoke (harness, ti_meth, null, args1, new IllegalArgumentException ()); args1[0] = new Short ((short) 3); try_invoke (harness, ti_meth, null, args1, new Integer (6)); args1[0] = new Long (72); try_invoke (harness, ti_meth, null, args1, new IllegalArgumentException ()); args1[0] = null; try_invoke (harness, ti_meth, null, args1, new IllegalArgumentException ()); args1[0] = new Integer (-5); try_invoke (harness, ti_meth, null, args1, new InvocationTargetException (new IllegalArgumentException ())); } harness.checkPoint ("returns_void for " + ic[i]); Object[] args2 = new Object[2]; args2[0] = new Integer (7); args2[1] = new Integer (8); try_invoke (harness, rv_meth, this, args2, null); harness.check(save, 15); harness.checkPoint("invoke private method"); Method pvm = getDeclaredMethod(ic[0], "private_method", null); try_invoke (harness, pvm, this, null, "ok"); harness.checkPoint("invoke package-private method"); Method ppvm = getDeclaredMethod(ic[0], "p", null); invoke sub = new InvokeHelper(); try_invoke (harness, ppvm, sub, null, "ppm"); } } }