diff options
6 files changed, 504 insertions, 0 deletions
@@ -1,5 +1,22 @@ 2013-04-10 Jana Fabrikova <[email protected]> + * /tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java: + adding 11 testcases based on the interactive Liveconnect JS->Java + overloaded function resolution tests, tests with JSObject were already + included + * /tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java: + the applet whose methods are invoked from JS during the tests + * /tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js: + the JavaScript code for calling the applet methods from JS + * /tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp: + java network launch protocol file for displaying applet in the html + page + * /tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html: + the html page with java applet embedded, displayed in browser during + the tests + +2013-04-10 Jana Fabrikova <[email protected]> + * /tests/reproducers/simple/JToJSFuncReturn/testcases/JToJSFuncReturnTest.java: adding 5 testcases based on the interactive Liveconnect JS->Java function return type tests diff --git a/tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html b/tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html new file mode 100644 index 0000000..60f6243 --- /dev/null +++ b/tests/reproducers/simple/JSToJFuncResol/resources/JSToJFuncResol.html @@ -0,0 +1,25 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html lang="en-US"> + <head> + <title>JavaScript to Java LiveConnect - FuncResol values from applet</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + + <script language="JavaScript" src="JSToJava_FuncResol.js"></script> + + </head> + <body> + + <h2> The JSToJFuncResol html page</h2> + + <applet code="JSToJFuncResol" width="1000" height="100" id="jstojFuncResolApplet" MAYSCRIPT> + <param name="jnlp_href" value="jstoj-funcresol.jnlp"> + </applet> + + <script type="text/javascript"> + + doFuncResolTests(); + + </script> + + </body> +</html> diff --git a/tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js b/tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js new file mode 100644 index 0000000..e0ee52c --- /dev/null +++ b/tests/reproducers/simple/JSToJFuncResol/resources/JSToJava_FuncResol.js @@ -0,0 +1,11 @@ +function doFuncResolTests(){ + + var urlArgs = document.URL.split("?"); + var testParams = urlArgs[1].split(";"); + var applet = document.getElementById('jstojFuncResolApplet'); + var func = testParams[0]; + var value = decodeURIComponent(testParams[1]); + + eval('applet.' + func + '(' + value + ')'); + applet.writeAfterTests(); +} diff --git a/tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp b/tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp new file mode 100644 index 0000000..81b029a --- /dev/null +++ b/tests/reproducers/simple/JSToJFuncResol/resources/jstoj-funcresol.jnlp @@ -0,0 +1,23 @@ + +<?xml version="1.0" encoding="UTF-8"?> +<jnlp spec="1.0+" codebase="" href="jstoj-funcresol.jnlp"> + <information> + <title>JavaScript to Java LiveConnect - FuncResol</title> + <vendor>IcedTea</vendor> + <homepage href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/> + <description>LiveConnect - tests for overloaded function resolution when calling Java functions from JS.</description> + </information> + <resources> + <!-- Application Resources --> + <j2se version="1.6+" + href="http://java.sun.com/products/autodl/j2se"/> + <jar href="JSToJFuncResol.jar" main="true" /> + + </resources> + <applet-desc + name="JS to J FuncResol" + main-class="JSToJFuncResol" + width="1000" + height="100"> + </applet-desc> +</jnlp> diff --git a/tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java b/tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java new file mode 100644 index 0000000..4f7b7f7 --- /dev/null +++ b/tests/reproducers/simple/JSToJFuncResol/srcs/JSToJFuncResol.java @@ -0,0 +1,235 @@ +import java.applet.Applet; +import netscape.javascript.JSObject; + +public class JSToJFuncResol extends Applet { + + /****** Primitive (numeric) value resolutions ******/ + + /* Javascript primitive numeric (int) value resolutions: + * - to an analogous primitive Java type (best - lowest cost) + * - to another primitive numeric Java type (long) (second lowest) + * - to Java String type (third lowest) + */ + + public void numeric( int p){ + System.out.println("numeric(int) with "+p); + } + + public void numeric(long p) { + System.out.println("numeric(long) with "+p); + } + + public void numeric(String p) { + System.out.println("numeric(String) with "+p); + } + + /* Javascript primitive numeric (int) value resolutions: + * - to a different primitive Java numeric type (double) (best - second lowest cost) + * - to Java string (third lowest cost) + */ + + public void numericToDifferentNumeric(double p) { + System.out.println("numericToDifferentNumeric(double) with "+p); + } + + public void numericToDifferentNumeric(String p) { + System.out.println("numericToDifferentNumeric(String) with "+p); + } + + /* Javascript primitive numeric (floating point) value resolutions: + * - to a primitive Java numeric type (double) (best - lowest cost) + * - to Java char + */ + + public void numericToDouble(double p) { + System.out.println("numericToDouble(double) with "+p); + } + + public void numericToDouble(char p) { + System.out.println("numericToDouble(char) with "+p); + } + + + + /****** Null resolutions ******/ + + /* Javascript null value resolutions: + * - to any nonprimitive Java type (e.g. Integer) (best) + * - to a primitive Java type (int) (not allowed) + */ + + public void nullToInteger(Integer p) { + + System.out.println("nullToInteger(Integer) with "+p); + } + + public void nullToInteger(int p) { + System.out.println("nullToInteger(int) with "+p); + } + + /****** Java inherited class resolutions ******/ + + /* Java inherited class (OverloadTestHelper2) value resolutions: + * - to the same class type (OverloadTestHelper2) (best) + * - to a superclass (OverloadTestHelper1) (second best) + * - to a subclass (OverloadTestHelper3) (not possible) + */ + + public void inheritedClass(OverloadTestHelper2 p) { + System.out.println("inheritedClass(OverloadTestHelper2) with "+p); + } + + public void inheritedClass(OverloadTestHelper1 p) { + System.out.println("inheritedClass(OverloadTestHelper1) with "+p); + } + + public void inheritedClass(OverloadTestHelper3 p) { + System.out.println("inheritedClass(OverloadTestHelper3) with "+p); + } + + /* Java inherited class (OverloadTestHelper3) value resolutions: + * - to a superclass (OverloadTestHelper2) (best - second lowest cost) + * - to a superclass of superclass (OverloadTestHelper1) (higher cost) + */ + + public void inheritedClassToParent1(OverloadTestHelper2 p) { + System.out.println("inheritedClassToParent1(OverloadTestHelper2) with "+p); + } + + public void inheritedClassToParent1(OverloadTestHelper1 p) { + System.out.println("inheritedClassToParent1(OverloadTestHelper1) with "+p); + } + + /* Java inherited class (OverloadTestHelper2) resolutions: + * - to the superclass (OverloadTestHelper1) (best - second lowest cost) + * - to Java String (third lowest cost) + */ + + public void inheritedClassToParent2(OverloadTestHelper1 p) { + System.out.println("inheritedClassToParent2(OverloadTestHelper1) with "+p); + } + + public void inheritedClassToParent2(String p) { + System.out.println("inheritedClassToParent2(String) with "+p); + } + + + /****** Java object resolutions ******/ + + /* Java object (OverloadTestHelper1) value resolutions: + * - to Java String (best - third lowest cost) + * - to a different nonprimitive Java class (JSObject) (not possible) + */ + + public void javaObjectToString(String p) { + System.out.println("javaObjectToString(String) with "+p); + } + + public void javaObjectToString(JSObject p) { + System.out.println("javaObjectToString(JSObject) with "+p); + } + + /****** String resolutions ******/ + + /* Javascript string value resolutions: + * - to a primitive numeric Java type (double) (best - second lowest cost) + * - to a nonprimitive Java class (OverloadTestHelper1 as a dummy)(not possible) + */ + + public void javascriptStringToNumeric(double p) { + System.out.println("javascriptStringToNumeric(double) with "+p); + } + + public void javascriptStringToNumeric(OverloadTestHelper1 p) { + System.out.println("javascriptStringToNumeric(OverloadTestHelper1) with "+p); + } + + /****** Javascript object resolutions ******/ + + /* Javascript object value resolutions: + * - to JSObject Java type (best - lowest cost) + * - to Java String type (fourth lowest cost) + * - to Java array of Strings (fourth lowest cost) + * - to a Java superclass (Object) (second lowest cost) + */ + + public void javascriptObject(JSObject p) { + System.out.println("javascriptObject(JSObject) with "+p); + } + + public void javascriptObject(String p) { + System.out.println("javascriptObject(String) with "+p); + } + + public void javascriptObject(String[] p) { + System.out.println("javascriptObject(String[]) with "+p); + } + + public void javascriptObject(Object p) { + System.out.println("javascriptObject(Object) with "+p); + } + + /* Javascript object (array) value resolutions: + * - to a Java array of primitive numeric Java type (int[]) (best - fourth lowest cost) + * - to a nonprimitive Java class Integer (impossible) + */ + + public void javascriptObjectToArray(int[] p) { + System.out.println("javascriptObjectToArray(int[]) with "+p); + } + + public void javascriptObjectToArray(Integer p) { + System.out.println("javascriptObjectToArray(Integer) with "+p); + } + + + /****** Not allowed resolutions *******/ + + /* Impossible resolutions all should result in + * "Error on Java side: No suitable method named ... with matching args found" + * - null to a primitive numeric Java type (int) + * - JSObject (window) to a different nonprimitive Java class (OverloadTestHelper1) + * - non-array value (numeric primitive 25) to array + */ + + public void nullToPrimitive(int p) { + System.out.println("nullToPrimitive(int) with "+p); + } + + public void javascriptObjectToUnrelatedType(OverloadTestHelper1 p) { + System.out.println("javascriptObjectToUnrelatedType(OverloadTesthelper1) with "+p); + } + + public void unsupported(Object[] p) { + System.out.println("unsupported(Object[]) with "+p); + } + + /****** Auxiliary methods and classes ******/ + + public void init() { + String initStr = "JSToJFuncResol applet initialized."; + System.out.println(initStr); + } + + public void writeAfterTests(){ + System.out.println("afterTests"); + } + + //dummy classes for passing objects as function parameters + public class OverloadTestHelper1 {}; + public class OverloadTestHelper2 extends OverloadTestHelper1 {}; + public class OverloadTestHelper3 extends OverloadTestHelper2 {}; + + public OverloadTestHelper1 getNewOverloadTestHelper1(){ + return new OverloadTestHelper1(); + } + + public OverloadTestHelper2 getNewOverloadTestHelper2(){ + return new OverloadTestHelper2(); + } + + public OverloadTestHelper3 getNewOverloadTestHelper3(){ + return new OverloadTestHelper3(); + } + +} diff --git a/tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java b/tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java new file mode 100644 index 0000000..b1fd2c5 --- /dev/null +++ b/tests/reproducers/simple/JSToJFuncResol/testcases/JSToJFuncResolTest.java @@ -0,0 +1,193 @@ +/* JSToJFuncResolTest.java +Copyright (C) 2012 Red Hat, Inc. + +This file is part of IcedTea. + +IcedTea 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, version 2. + +IcedTea 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 IcedTea; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. + */ + +import net.sourceforge.jnlp.ProcessResult; +import net.sourceforge.jnlp.ServerAccess; +import net.sourceforge.jnlp.browsertesting.BrowserTest; +import net.sourceforge.jnlp.browsertesting.Browsers; +import net.sourceforge.jnlp.closinglisteners.CountingClosingListener; +import net.sourceforge.jnlp.annotations.NeedsDisplay; +import net.sourceforge.jnlp.annotations.TestInBrowsers; +import net.sourceforge.jnlp.annotations.KnownToFail; +import org.junit.Assert; +import org.junit.Test; + +public class JSToJFuncResolTest extends BrowserTest { + + private final String initStr = "JSToJFuncResol applet initialized."; + private final String afterStr = "afterTests"; + + private class CountingClosingListenerImpl extends CountingClosingListener { + + @Override + protected boolean isAlowedToFinish(String s) { + + return (s.contains(initStr) && s.contains(afterStr)); + } + } + + private void evaluateStdoutContents(String expectedStdout, ProcessResult pr) { + // Assert that the applet was initialized. + Assert.assertTrue("JSToJFuncResol: the stdout should contain " + initStr + + ", but it didnt.", pr.stdout.contains(initStr)); + + // Assert that the values set by JavaScript are ok + Assert.assertTrue("JSToJFuncResol: the output should include: "+expectedStdout+", but it didnt.", + pr.stdout.contains(expectedStdout)); + + } + + private void jsToJavaFuncResolTest( String methodStr, String valueStr, String expectedStdout) throws Exception { + String strURL = "/JSToJFuncResol.html?" + methodStr + ";" + valueStr; + ProcessResult pr = server.executeBrowser(strURL, new CountingClosingListenerImpl(), new CountingClosingListenerImpl()); + evaluateStdoutContents(expectedStdout, pr); + } + + /****** Primitive (numeric) value resolutions ******/ + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_numeric_Test() throws Exception { + jsToJavaFuncResolTest("numeric", "1", "numeric(int) with 1"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_numericToDifferentNumeric_Test() throws Exception { + jsToJavaFuncResolTest("numericToDifferentNumeric", "1.1", "numericToDifferentNumeric(double) with 1.1"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + @KnownToFail + public void AppletJSToJFuncResol_numericToDouble_Test() throws Exception { + jsToJavaFuncResolTest("numericToDouble", "1.1", "numericToDouble(double) with 1.1"); + } + + /****** Null resolutions ******/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_nullToInteger_Test() throws Exception { + jsToJavaFuncResolTest("nullToInteger", "null", "nullToInteger(Integer) with null"); + } + + /****** Java inherited class resolutions ******/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_inheritedClass_Test() throws Exception { + jsToJavaFuncResolTest("inheritedClass", "applet.getNewOverloadTestHelper2()", "inheritedClass(OverloadTestHelper2) with JSToJFuncResol$OverloadTestHelper2@"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_inheritedClassToParent1_Test() throws Exception { + jsToJavaFuncResolTest("inheritedClassToParent1", "applet.getNewOverloadTestHelper3()", "inheritedClassToParent1(OverloadTestHelper2) with JSToJFuncResol$OverloadTestHelper3@"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_inheritedClassToParent2_Test() throws Exception { + jsToJavaFuncResolTest("inheritedClassToParent2", "applet.getNewOverloadTestHelper2()", "inheritedClassToParent2(OverloadTestHelper1) with JSToJFuncResol$OverloadTestHelper2@"); + } + + /****** Java object resolutions ******/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_javaObjectToString_Test() throws Exception { + jsToJavaFuncResolTest("javaObjectToString", "applet.getNewOverloadTestHelper1()", "javaObjectToString(String) with JSToJFuncResol$OverloadTestHelper1@"); + } + + /****** String resolutions ******/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_javascriptStringToNumeric_Test() throws Exception { + jsToJavaFuncResolTest("javascriptStringToNumeric", "\"1.1\"", "javascriptStringToNumeric(double) with 1.1"); + } + + /****** Javascript object resolutions ******/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_javascriptObject_Test() throws Exception { + jsToJavaFuncResolTest("javascriptObject", "window", "javascriptObject(JSObject) with [object Window]"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_javascriptObjectToArray_Test() throws Exception { + jsToJavaFuncResolTest("javascriptObjectToArray", "[10]", "javascriptObjectToArray(int[]) with [I@"); + } + + /****** The unsupported resolutions: *****/ + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_nullToPrimitive_Test() throws Exception { + jsToJavaFuncResolTest("nullToPrimitive", "null", "Error on Java side: No suitable method named nullToPrimitive with matching args found"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_javascriptObjectToUnrelatedType_Test() + throws Exception { + jsToJavaFuncResolTest("javascriptObjectToUnrelatedType", "window", "Error on Java side: No suitable method named javascriptObjectToUnrelatedType with matching args found"); + } + + @Test + @TestInBrowsers(testIn = { Browsers.all }) + @NeedsDisplay + public void AppletJSToJFuncResol_unsupported_Test() throws Exception { + jsToJavaFuncResolTest("unsupported", "25", "Error on Java side: No suitable method named unsupported with matching args found"); + } + +} |