/** * 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.*; import static org.junit.Assert.assertThat; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleBindings; import org.junit.Before; import org.junit.Test; /** * JSR-223 Scripting API tests */ public final class TypeConversionTest { private ScriptEngineManager manager; private ScriptEngine engine; @Before public void setUp() { manager = new ScriptEngineManager(); engine = manager.getEngineByName("es6draft"); assertThat(engine, notNullValue()); } @Test public void testNumber() throws ScriptException { Object intValue = engine.eval("var intValue = 33; intValue"); Object doubleValue = engine.eval("var doubleValue = 33.5; doubleValue"); assertThat(intValue, instanceOf(Number.class)); assertThat(doubleValue, instanceOf(Number.class)); } @Test public void testString() throws ScriptException { Object simpleStr = engine.eval("var simpleStr = 'simple'; simpleStr"); Object concatStr = engine.eval("var concatStr = simpleStr + simpleStr; concatStr"); Object concat2Str = engine.eval("var concat2Str = concatStr + concatStr; concat2Str"); assertThat(simpleStr, instanceOf(String.class)); assertThat(concatStr, instanceOf(String.class)); assertThat(concat2Str, instanceOf(String.class)); } @Test public void testUndefined() throws ScriptException { Object undef = engine.eval("undefined"); assertThat(undef, nullValue()); Object undef2 = engine.eval("void 0"); assertThat(undef2, nullValue()); } @Test public void testNull() throws ScriptException { Object nul = engine.eval("null"); assertThat(engine.eval("typeof null"), instanceOfWith(String.class, is("object"))); assertThat(nul, nullValue()); engine.put("nullValue", null); assertThat(engine.eval("typeof nullValue"), instanceOfWith(String.class, is("object"))); assertThat(engine.eval("nullValue === null"), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); assertThat(engine.eval("nullValue"), nullValue()); } public static class JavaObject { } @Test public void testUnsupported() throws ScriptException { // Unsupported Java classes end up as `null` in default bindings Object javaObject = new JavaObject(); engine.put("javaObject", javaObject); assertThat(engine.get("javaObject"), nullValue()); assertThat(engine.eval("javaObject"), nullValue()); assertThat(engine.eval("typeof javaObject"), instanceOfWith(String.class, is("object"))); assertThat(engine.eval("javaObject == null"), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); assertThat(engine.eval("javaObject === void 0"), instanceOfWith(Boolean.class, sameInstance(Boolean.FALSE))); assertThat(engine.eval("javaObject === null"), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void testUnsupportedWithBindings() throws ScriptException { // Unsupported Java classes end up as `null` in default bindings Bindings bindings = engine.createBindings(); Object javaObject = new JavaObject(); bindings.put("javaObject", javaObject); assertThat(bindings.get("javaObject"), nullValue()); assertThat(engine.eval("javaObject", bindings), nullValue()); assertThat(engine.eval("typeof javaObject", bindings), instanceOfWith(String.class, is("object"))); assertThat(engine.eval("javaObject == null", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); assertThat(engine.eval("javaObject === void 0", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.FALSE))); assertThat(engine.eval("javaObject === null", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void testUnsupportedWithSimpleBindings() throws ScriptException { // Unsupported Java classes end up as `null` in simple bindings Bindings bindings = new SimpleBindings(); Object javaObject = new JavaObject(); bindings.put("javaObject", javaObject); assertThat(bindings.get("javaObject"), sameInstance(javaObject)); assertThat(engine.eval("javaObject", bindings), nullValue()); assertThat(engine.eval("typeof javaObject", bindings), instanceOfWith(String.class, is("object"))); assertThat(engine.eval("javaObject == null", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); assertThat(engine.eval("javaObject === void 0", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.FALSE))); assertThat(engine.eval("javaObject === null", bindings), instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } }