/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.scripting; import static com.github.anba.es6draft.util.matchers.IsInstanceOfWith.instanceOfWith; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import java.util.concurrent.Callable; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.junit.Before; import org.junit.Test; /** * JSR-223 Scripting API tests */ public final class InvocableTest { private ScriptEngineManager manager; private ScriptEngine engine; private Invocable invocable; @Before public void setUp() { manager = new ScriptEngineManager(); engine = manager.getEngineByName("es6draft"); assertThat(engine, notNullValue()); assertThat(engine, instanceOf(Invocable.class)); invocable = (Invocable) engine; } @Test public void invokeFunction() throws NoSuchMethodException, ScriptException { engine.eval("function test1() { return 'Centaurus' }"); engine.eval("function test2(v) { return v + ' Major' }"); Object result1 = invocable.invokeFunction("test1"); assertThat(result1, instanceOfWith(String.class, is("Centaurus"))); Object result2 = invocable.invokeFunction("test1", "..."); assertThat(result2, instanceOfWith(String.class, is("Centaurus"))); Object result3 = invocable.invokeFunction("test2"); assertThat(result3, instanceOfWith(String.class, is("undefined Major"))); Object result4 = invocable.invokeFunction("test2", "Canis"); assertThat(result4, instanceOfWith(String.class, is("Canis Major"))); } @Test(expected = NullPointerException.class) public void invokeFunctionNullName() throws NoSuchMethodException, ScriptException { invocable.invokeFunction(null); } @Test(expected = NoSuchMethodException.class) public void invokeNonExistentFunction() throws NoSuchMethodException, ScriptException { invocable.invokeFunction("doesNotExist"); } @Test(expected = NoSuchMethodException.class) public void invokeNonFunction() throws NoSuchMethodException, ScriptException { invocable.invokeFunction("NaN"); } @Test public void invokeMethod() throws NoSuchMethodException, ScriptException { Object obj = engine .eval("({ test1() { return 'Cygnus' }, test2(v) { return v + ' Minor' } })"); Object result1 = invocable.invokeMethod(obj, "test1"); assertThat(result1, instanceOfWith(String.class, is("Cygnus"))); Object result2 = invocable.invokeMethod(obj, "test1"); assertThat(result2, instanceOfWith(String.class, is("Cygnus"))); Object result3 = invocable.invokeMethod(obj, "test2"); assertThat(result3, instanceOfWith(String.class, is("undefined Minor"))); Object result4 = invocable.invokeMethod(obj, "test2", "Canis"); assertThat(result4, instanceOfWith(String.class, is("Canis Minor"))); } @Test(expected = IllegalArgumentException.class) public void invokeMethodNullObject() throws NoSuchMethodException, ScriptException { invocable.invokeMethod(null, ""); } @Test(expected = NullPointerException.class) public void invokeMethodNullName() throws NoSuchMethodException, ScriptException { Object obj = engine.eval("({})"); invocable.invokeMethod(obj, null); } @Test(expected = NoSuchMethodException.class) public void invokeNonExistentMethod() throws NoSuchMethodException, ScriptException { Object obj = engine.eval("({})"); invocable.invokeMethod(obj, "doesNotExist"); } @Test(expected = NoSuchMethodException.class) public void invokeNonMethod() throws NoSuchMethodException, ScriptException { Object obj = engine.eval("({notFunction: 0})"); invocable.invokeMethod(obj, "notFunction"); } @Test public void getInterfaceCallable() throws ScriptException, Exception { engine.eval("function call() { return 'vvv' }"); Callable<?> callable = invocable.getInterface(Callable.class); Object result1 = callable.call(); assertThat(result1, instanceOfWith(String.class, is("vvv"))); } @Test public void getInterfaceObjectCallable() throws ScriptException, Exception { Object fn = engine.eval("function fn() { return 'Sagittarius' } fn"); Callable<?> callable = invocable.getInterface(fn, Callable.class); Object result1 = callable.call(); assertThat(result1, instanceOfWith(String.class, is("Sagittarius"))); } @Test(expected = ScriptException.class) public void getInterfaceThrowsError() throws ScriptException, Exception { Object fn = engine.eval("function fn() { throw new Error } fn"); Callable<?> callable = invocable.getInterface(fn, Callable.class); callable.call(); } @Test(expected = ScriptException.class) public void getInterfaceThrowsPrimitive() throws ScriptException, Exception { Object fn = engine.eval("function fn() { throw 123 } fn"); Callable<?> callable = invocable.getInterface(fn, Callable.class); callable.call(); } }