/**
* 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 com.github.anba.es6draft.util.matchers.IsNumberCloseTo.numberCloseTo;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.io.StringReader;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
import javax.script.SimpleScriptContext;
import org.junit.Before;
import org.junit.Test;
/**
* JSR-223 Scripting API tests
*/
public final class CompilableTest {
private ScriptEngineManager manager;
private ScriptEngine engine;
private Compilable compilable;
@Before
public void setUp() {
manager = new ScriptEngineManager();
engine = manager.getEngineByName("es6draft");
assertThat(engine, notNullValue());
assertThat(engine, instanceOf(Compilable.class));
compilable = (Compilable) engine;
}
@Test
public void getEngine() throws ScriptException {
CompiledScript script = compilable.compile("numberVal - 1");
assertThat(script, notNullValue());
assertThat(script.getEngine(), sameInstance(engine));
}
@Test
public void compileString() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
assertThat(script, notNullValue());
engine.put("numberVal", 10);
assertThat(script.eval(), instanceOfWith(Number.class, is(numberCloseTo(20))));
}
@Test
public void compileReader() throws ScriptException {
CompiledScript script = compilable.compile(new StringReader("numberVal * 4"));
assertThat(script, notNullValue());
engine.put("numberVal", 10);
assertThat(script.eval(), instanceOfWith(Number.class, is(numberCloseTo(40))));
}
@Test
public void compileStringWithBindings() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
Bindings bindings = engine.createBindings();
bindings.put("numberVal", 5);
assertThat(script.eval(bindings), instanceOfWith(Number.class, is(numberCloseTo(10))));
}
@Test
public void compileStringWithSimpleBindings() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
Bindings bindings = new SimpleBindings();
bindings.put("numberVal", 6);
assertThat(script.eval(bindings), instanceOfWith(Number.class, is(numberCloseTo(12))));
}
@Test
public void compileStringWithContext() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
ScriptContext context = new SimpleScriptContext();
context.setAttribute("numberVal", 7, ScriptContext.ENGINE_SCOPE);
assertThat(script.eval(context), instanceOfWith(Number.class, is(numberCloseTo(14))));
}
@Test
public void compileStringWithContextAndBindings() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
ScriptContext context = new SimpleScriptContext();
Bindings bindings = engine.createBindings();
bindings.put("numberVal", 8);
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
assertThat(script.eval(context), instanceOfWith(Number.class, is(numberCloseTo(16))));
}
@Test
public void compileStringWithContextAndSimpleBindings() throws ScriptException {
CompiledScript script = compilable.compile("numberVal * 2");
ScriptContext context = new SimpleScriptContext();
Bindings bindings = new SimpleBindings();
bindings.put("numberVal", 9);
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
assertThat(script.eval(context), instanceOfWith(Number.class, is(numberCloseTo(18))));
}
}