You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2019/04/02 07:30:32 UTC

[incubator-netbeans-html4j] 01/02: Execute the test on all JavaScript engines

This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans-html4j.git

commit 57b861667e3de8567edab38a58ec65ad385e99bf
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Tue Apr 2 08:28:28 2019 +0200

    Execute the test on all JavaScript engines
---
 .../html/boot/script/Jsr223JavaScriptTest.java     | 112 ++++++++++-----------
 .../net/java/html/boot/script/ScriptsTest.java     |  47 +++++++--
 .../java/net/java/html/boot/script/SingleCase.java |   6 +-
 3 files changed, 98 insertions(+), 67 deletions(-)

diff --git a/boot-script/src/test/java/net/java/html/boot/script/Jsr223JavaScriptTest.java b/boot-script/src/test/java/net/java/html/boot/script/Jsr223JavaScriptTest.java
index bfa5f21..d21cbbd 100644
--- a/boot-script/src/test/java/net/java/html/boot/script/Jsr223JavaScriptTest.java
+++ b/boot-script/src/test/java/net/java/html/boot/script/Jsr223JavaScriptTest.java
@@ -22,14 +22,16 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
 import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
 import net.java.html.boot.BrowserBuilder;
 import org.netbeans.html.boot.spi.Fn;
 import org.netbeans.html.json.tck.KOTest;
-import org.testng.Assert;
 import static org.testng.Assert.assertEquals;
 import org.testng.annotations.Factory;
 
@@ -38,57 +40,74 @@ import org.testng.annotations.Factory;
  * @author Jaroslav Tulach
  */
 public class Jsr223JavaScriptTest {
-    private static Class<?> browserClass;
-    private static Fn.Presenter browserPresenter;
-    
     public Jsr223JavaScriptTest() {
     }
 
     @Factory public static Object[] compatibilityTests() throws Exception {
-        ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
-        Object left = engine.eval(
-            "(function() {\n" +
-            "  var names = Object.getOwnPropertyNames(this);\n" +
-            "  for (var i = 0; i < names.length; i++) {\n" +
-            "    var n = names[i];\n" +
-            "    if (n === 'Object') continue;\n" +
-            "    if (n === 'Number') continue;\n" +
-            "    if (n === 'Boolean') continue;\n" +
-            "    if (n === 'Array') continue;\n" +
-            "    delete this[n];\n" +
-            "  }\n" +
-            "  return Object.getOwnPropertyNames(this).toString();\n" +
-            "})()\n" +
-            ""
-        );
-        assertEquals(left.toString().toLowerCase().indexOf("java"), -1, "No Java symbols " + left);
-        
+        List<Object> res = new ArrayList<>();
+        final ScriptEngineManager manager = new ScriptEngineManager();
+        for (ScriptEngineFactory f : manager.getEngineFactories()) {
+            if (!isJavaScriptEngineFactory(f)) {
+                continue;
+            }
+            collectTestsForEngine(f.getScriptEngine(), res);
+        }
+        return res.toArray();
+    }
+
+    static boolean isJavaScriptEngineFactory(ScriptEngineFactory f) {
+        if (f.getNames().contains("nashorn")) {
+            return true;
+        }
+        return f.getMimeTypes().contains("text/javascript");
+    }
+
+    private static void collectTestsForEngine(ScriptEngine engine, List<Object> res) throws Exception {
+        Fn.Presenter browserPresenter[] = { null };
+        CountDownLatch cdl = new CountDownLatch(1);
         Fn.Presenter presenter = createPresenter(engine);
         final BrowserBuilder bb = BrowserBuilder.newBrowser(presenter).
             loadPage("empty.html").
-            loadFinished(Jsr223JavaScriptTest::initialized);
+            loadFinished(() -> {
+                browserPresenter[0] = Fn.activePresenter();
+                cdl.countDown();
+            });
 
-        Executors.newSingleThreadExecutor().submit(new Runnable() {
-            @Override
-            public void run() {
-                bb.showAndWait();
-            }
-        });
+        Executors.newSingleThreadExecutor().submit(bb::showAndWait);
+        cdl.await();
 
-        List<Object> res = new ArrayList<>();
-        Class<? extends Annotation> test = 
-            loadClass().getClassLoader().loadClass(KOTest.class.getName()).
-            asSubclass(Annotation.class);
+        assertNoGlobalSymbolsLeft(engine);
+        final String prefix = "[" + engine.getFactory().getEngineName() + "] ";
 
-        Class[] arr = (Class[]) loadClass().getDeclaredMethod("tests").invoke(null);
+        Class<? extends Annotation> test = KOTest.class;
+        Class[] arr = Jsr223JavaScriptTst.tests();
         for (Class c : arr) {
             for (Method m : c.getMethods()) {
                 if (m.getAnnotation(test) != null) {
-                    res.add(new SingleCase(browserPresenter, m));
+                    res.add(new SingleCase(prefix, browserPresenter[0], m));
                 }
             }
         }
-        return res.toArray();
+
+    }
+
+    private static void assertNoGlobalSymbolsLeft(ScriptEngine engine) throws ScriptException {
+        Object left = engine.eval(
+                "(function() {\n" +
+                        "  var names = Object.getOwnPropertyNames(this);\n" +
+                        "  for (var i = 0; i < names.length; i++) {\n" +
+                        "    var n = names[i];\n" +
+                        "    if (n === 'Object') continue;\n" +
+                        "    if (n === 'Number') continue;\n" +
+                        "    if (n === 'Boolean') continue;\n" +
+                        "    if (n === 'Array') continue;\n" +
+                        "    delete this[n];\n" +
+                        "  }\n" +
+                        "  return Object.getOwnPropertyNames(this).toString();\n" +
+                        "})()\n" +
+                        ""
+        );
+        assertEquals(left.toString().toLowerCase().indexOf("java"), -1, "No Java symbols " + left);
     }
 
     private static Fn.Presenter createPresenter(ScriptEngine engine) {
@@ -101,25 +120,4 @@ public class Jsr223JavaScriptTest {
         // END: Jsr223JavaScriptTest#createPresenter
     }
 
-    static synchronized Class<?> loadClass() throws InterruptedException {
-        while (browserClass == null) {
-            Jsr223JavaScriptTest.class.wait();
-        }
-        return browserClass;
-    }
-    
-    private static synchronized void ready(Class<?> browserCls) {
-        browserClass = browserCls;
-        browserPresenter = Fn.activePresenter();
-        Jsr223JavaScriptTest.class.notifyAll();
-    }
-    
-    private static void initialized() {
-        Assert.assertSame(
-            Jsr223JavaScriptTest.class.getClassLoader(),
-            ClassLoader.getSystemClassLoader(),
-            "No special classloaders"
-        );
-        Jsr223JavaScriptTest.ready(Jsr223JavaScriptTst.class);
-    }
 }
diff --git a/boot-script/src/test/java/net/java/html/boot/script/ScriptsTest.java b/boot-script/src/test/java/net/java/html/boot/script/ScriptsTest.java
index 9760f65..9b4775a 100644
--- a/boot-script/src/test/java/net/java/html/boot/script/ScriptsTest.java
+++ b/boot-script/src/test/java/net/java/html/boot/script/ScriptsTest.java
@@ -19,17 +19,33 @@
 package net.java.html.boot.script;
 
 import java.io.Closeable;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
 import net.java.html.boot.BrowserBuilder;
 import net.java.html.js.JavaScriptBody;
 import org.netbeans.html.boot.spi.Fn;
 import static org.testng.Assert.*;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 public class ScriptsTest {
+    @DataProvider(name = "engines")
+    public static Object[][] primeNumbers() {
+        List<Object[]> res = new ArrayList<>();
+        final ScriptEngineManager manager = new ScriptEngineManager();
+        for (ScriptEngineFactory f : manager.getEngineFactories()) {
+            if (!Jsr223JavaScriptTest.isJavaScriptEngineFactory(f)) {
+                continue;
+            }
+            res.add(new Object[] { f.getScriptEngine() });
+        }
+        return res.toArray(new Object[0][]);
+    }
 
     public ScriptsTest() {
     }
@@ -92,9 +108,14 @@ public class ScriptsTest {
         assertSanitized(Scripts.newPresenter().sanitize(true));
     }
 
-    @Test
-    public void noSanitization() throws Exception {
-        assertNotSanitized(Scripts.newPresenter().sanitize(false));
+    @Test(dataProvider = "engines")
+    public void noSanitization(ScriptEngine eng) throws Exception {
+        boolean relaxed = "Graal.js".equals(eng.getFactory().getEngineName());
+
+        assertNotSanitized(
+            Scripts.newPresenter().engine(eng).sanitize(false),
+            relaxed
+        );
     }
 
     private void assertSanitized(Scripts newPresenter) throws Exception {
@@ -112,18 +133,28 @@ public class ScriptsTest {
         }
     }
 
-    private void assertNotSanitized(Scripts builder) throws Exception {
+    private void assertNotSanitized(Scripts builder, boolean relaxed) throws Exception {
         Fn.Presenter p = builder.build();
         try (Closeable c = Fn.activate(p)) {
             Object Java = p.defineFn("return typeof Java;").invoke(null);
             Object Packages = p.defineFn("return typeof Packages;").invoke(null);
             Object alert = p.defineFn("return typeof alert;").invoke(null);
-            assertEquals(Java, "object", "Java symbol found");
-            assertEquals(Packages, "object", "Packages symbol found");
+            assertObjectRelaxed(relaxed, Java, "Java symbol found");
+            assertObjectRelaxed(relaxed, Packages, "Packages symbol found");
             assertEquals(alert, "function", "alert is defined symbol");
         }
     }
 
+    private static void assertObjectRelaxed(boolean relaxed, Object real, String msg) {
+        if ("object".equals(real)) {
+            return;
+        }
+        if (relaxed && "undefined".equals(real)) {
+            return;
+        }
+        assertNull(real, msg);
+    }
+
     private static void awaitPresenter(Fn.Presenter p) {
         Executor e = (Executor) p;
         CountDownLatch cdl = new CountDownLatch(1);
diff --git a/boot-script/src/test/java/net/java/html/boot/script/SingleCase.java b/boot-script/src/test/java/net/java/html/boot/script/SingleCase.java
index 717b3a9..872673e 100644
--- a/boot-script/src/test/java/net/java/html/boot/script/SingleCase.java
+++ b/boot-script/src/test/java/net/java/html/boot/script/SingleCase.java
@@ -40,15 +40,17 @@ public final class SingleCase implements ITest, IHookable, Runnable {
     private final Method m;
     private Object result;
     private Object inst;
+    private final String prefix;
 
-    SingleCase(Fn.Presenter p, Method m) {
+    SingleCase(String prefix, Fn.Presenter p, Method m) {
+        this.prefix = prefix;
         this.p = p;
         this.m = m;
     }
 
     @Override
     public String getTestName() {
-        return m.getName();
+        return prefix + m.getName();
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists