/** * 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.*; import static org.junit.Assert.assertThat; import javax.script.Bindings; 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.hamcrest.Matchers; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; /** * JSR-223 Scripting API tests */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public final class ScriptEngineScopeTest { private ScriptEngineManager manager; private ScriptEngine engine; @Before public void setUp() { manager = new ScriptEngineManager(); engine = manager.getEngineByName("es6draft"); assertThat(engine, notNullValue()); } @Test public void implicitDefaultBindingsAndEval() throws ScriptException { engine.put("nullValue", null); engine.put("intValue", 1); engine.put("doubleValue", 1.5); engine.put("booleanValue", true); engine.put("stringValue", "Cepheus"); Object nullValue = engine.eval("nullValue"); Object intValue = engine.eval("intValue"); Object doubleValue = engine.eval("doubleValue"); Object stringValue = engine.eval("stringValue"); Object booleanValue = engine.eval("booleanValue"); assertThat(nullValue, nullValue()); assertThat(intValue, instanceOfWith(Number.class, is(numberCloseTo(1)))); assertThat(doubleValue, instanceOfWith(Number.class, is(numberCloseTo(1.5)))); assertThat(stringValue, instanceOfWith(String.class, is("Cepheus"))); assertThat(booleanValue, instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void explicitDefaultBindingsAndEval() throws ScriptException { Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); assertThat(bindings, notNullValue()); assertThat(bindings.entrySet(), is(empty())); bindings.put("nullValue", null); bindings.put("intValue", 1); bindings.put("doubleValue", 1.5); bindings.put("booleanValue", true); bindings.put("stringValue", "Cepheus"); Object nullValue = engine.eval("nullValue", bindings); Object intValue = engine.eval("intValue", bindings); Object doubleValue = engine.eval("doubleValue", bindings); Object stringValue = engine.eval("stringValue", bindings); Object booleanValue = engine.eval("booleanValue", bindings); assertThat(nullValue, nullValue()); assertThat(intValue, instanceOfWith(Number.class, is(numberCloseTo(1)))); assertThat(doubleValue, instanceOfWith(Number.class, is(numberCloseTo(1.5)))); assertThat(stringValue, instanceOfWith(String.class, is("Cepheus"))); assertThat(booleanValue, instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void createBindingsAndEval() throws ScriptException { Bindings bindings = engine.createBindings(); assertThat(bindings, notNullValue()); assertThat(bindings.entrySet(), is(empty())); bindings.put("nullValue", null); bindings.put("intValue", 1); bindings.put("doubleValue", 1.5); bindings.put("booleanValue", true); bindings.put("stringValue", "Cepheus"); Object nullValue = engine.eval("nullValue", bindings); Object intValue = engine.eval("intValue", bindings); Object doubleValue = engine.eval("doubleValue", bindings); Object stringValue = engine.eval("stringValue", bindings); Object booleanValue = engine.eval("booleanValue", bindings); assertThat(nullValue, nullValue()); assertThat(intValue, instanceOfWith(Number.class, is(numberCloseTo(1)))); assertThat(doubleValue, instanceOfWith(Number.class, is(numberCloseTo(1.5)))); assertThat(stringValue, instanceOfWith(String.class, is("Cepheus"))); assertThat(booleanValue, instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void simpleBindingsAndEval() throws ScriptException { Bindings bindings = new SimpleBindings(); assertThat(bindings, notNullValue()); assertThat(bindings.entrySet(), is(empty())); bindings.put("nullValue", null); bindings.put("intValue", 1); bindings.put("doubleValue", 1.5); bindings.put("booleanValue", true); bindings.put("stringValue", "Cepheus"); Object nullValue = engine.eval("nullValue", bindings); Object intValue = engine.eval("intValue", bindings); Object doubleValue = engine.eval("doubleValue", bindings); Object stringValue = engine.eval("stringValue", bindings); Object booleanValue = engine.eval("booleanValue", bindings); assertThat(nullValue, nullValue()); assertThat(intValue, instanceOfWith(Number.class, is(numberCloseTo(1)))); assertThat(doubleValue, instanceOfWith(Number.class, is(numberCloseTo(1.5)))); assertThat(stringValue, instanceOfWith(String.class, is("Cepheus"))); assertThat(booleanValue, instanceOfWith(Boolean.class, sameInstance(Boolean.TRUE))); } @Test public void implicitDefaultBindingsRetrieval() throws ScriptException { engine.eval("var a = 0; b = 1"); assertThat(engine.get("a"), instanceOfWith(Number.class, is(numberCloseTo(0)))); assertThat(engine.get("b"), instanceOfWith(Number.class, is(numberCloseTo(1)))); } @Test public void explicitDefaultBindingsRetrieval() throws ScriptException { Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); engine.eval("var a = 0; b = 1", bindings); assertThat(bindings.get("a"), instanceOfWith(Number.class, is(numberCloseTo(0)))); assertThat(bindings.get("b"), instanceOfWith(Number.class, is(numberCloseTo(1)))); } @Test public void createBindingsRetrieval() throws ScriptException { Bindings bindings = engine.createBindings(); engine.eval("var a = 0; b = 1", bindings); assertThat(bindings.get("a"), instanceOfWith(Number.class, is(numberCloseTo(0)))); assertThat(bindings.get("b"), instanceOfWith(Number.class, is(numberCloseTo(1)))); } @Test public void simpleBindingsRetrieval() throws ScriptException { Bindings bindings = new SimpleBindings(); engine.eval("var a = 0; b = 3", bindings); assertThat(bindings.get("a"), instanceOfWith(Number.class, is(numberCloseTo(0)))); assertThat(bindings.get("b"), nullValue()); } @Test public void accessToBuiltins() { Object engineObject = engine.get("Object"); Object bindingsObject = engine.getBindings(ScriptContext.ENGINE_SCOPE).get("Object"); assertThat(engineObject, notNullValue()); assertThat(engineObject, sameInstance(bindingsObject)); } @Test public void accessToBuiltinsNonSharedContext() throws ScriptException { Object defaultObject = engine.eval("Object"); Object contextObject = engine.eval("Object", new SimpleScriptContext()); assertThat(defaultObject, notNullValue()); assertThat(contextObject, notNullValue()); assertThat(defaultObject, Matchers.not(sameInstance(contextObject))); } @Test public void accessToBuiltinsNonSharedBindings() throws ScriptException { Object defaultObject = engine.eval("Object"); Object bindingsObject = engine.eval("Object", engine.createBindings()); assertThat(defaultObject, notNullValue()); assertThat(bindingsObject, notNullValue()); assertThat(defaultObject, Matchers.not(sameInstance(bindingsObject))); } @Test public void accessToBuiltinsNonSharedSimpleBindings() throws ScriptException { Object defaultObject = engine.eval("Object"); Object bindingsObject = engine.eval("Object", new SimpleBindings()); assertThat(defaultObject, notNullValue()); assertThat(bindingsObject, notNullValue()); assertThat(defaultObject, Matchers.not(sameInstance(bindingsObject))); } @Test public void isolatedContextsEvalDefault() throws ScriptException { ScriptContext context = new SimpleScriptContext(); engine.eval("var value = 'Sirius'"); assertThat(engine.eval("value"), instanceOfWith(String.class, is("Sirius"))); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); } @Test public void isolatedContextsEvalContext() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); engine.eval("var value = 'Vega'", context); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Vega"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleScriptContext()), instanceOfWith(String.class, is("undefined"))); } @Test public void isolatedContextsEvalContextWithDefaults() throws ScriptException { ScriptContext context = new SimpleScriptContext(); engine.eval("var value = 'Arcturus'", context); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Arcturus"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleScriptContext()), instanceOfWith(String.class, is("undefined"))); } @Test public void globalScopeAccess() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Aldebaran"); assertThat(engine.eval("globalVar"), instanceOfWith(String.class, is("Aldebaran"))); } @Test public void globalScopeAccessNewEmptyContext() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Gacrux"); assertThat(engine.eval("typeof globalVar", new SimpleScriptContext()), instanceOfWith(String.class, is("undefined"))); } @Test public void globalScopeAccessNewContextWithGlobal() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Achernar"); ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE); assertThat(engine.eval("globalVar", context), instanceOfWith(String.class, is("Achernar"))); } @Test public void globalScopeAccessNewContextWithGlobalSimpleBindings() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Sigma Sagittarii"); ScriptContext context = new SimpleScriptContext(); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); context.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE); assertThat(engine.eval("globalVar", context), instanceOfWith(String.class, is("Sigma Sagittarii"))); } @Test public void globalScopeAccessWithOverride() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Bellatrix"); engine.getBindings(ScriptContext.ENGINE_SCOPE).put("globalVar", "Eta Centauri"); assertThat(engine.eval("globalVar"), instanceOfWith(String.class, is("Eta Centauri"))); engine.getBindings(ScriptContext.ENGINE_SCOPE).remove("globalVar"); assertThat(engine.eval("globalVar"), instanceOfWith(String.class, is("Bellatrix"))); } @Test public void globalScopeAccessWithOverrideNewContext() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Canopus"); ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE); context.getBindings(ScriptContext.ENGINE_SCOPE).put("globalVar", "Acrux"); assertThat(engine.eval("globalVar", context), instanceOfWith(String.class, is("Acrux"))); engine.getBindings(ScriptContext.ENGINE_SCOPE).remove("globalVar"); assertThat(engine.eval("globalVar"), instanceOfWith(String.class, is("Canopus"))); } @Test public void globalScopeAccessWithOverrideNewContextSimpleBindings() throws ScriptException { Bindings globalScope = engine.getBindings(ScriptContext.GLOBAL_SCOPE); globalScope.put("globalVar", "Becrux"); ScriptContext context = new SimpleScriptContext(); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); context.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE); context.getBindings(ScriptContext.ENGINE_SCOPE).put("globalVar", "Antares"); assertThat(engine.eval("globalVar", context), instanceOfWith(String.class, is("Antares"))); engine.getBindings(ScriptContext.ENGINE_SCOPE).remove("globalVar"); assertThat(engine.eval("globalVar"), instanceOfWith(String.class, is("Becrux"))); } @Test public void isolatedBindings() throws ScriptException { Bindings binding = engine.createBindings(); engine.eval("var value = 'Betelgeuse'", binding); assertThat(engine.eval("value", binding), instanceOfWith(String.class, is("Betelgeuse"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", engine.createBindings()), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleBindings()), instanceOfWith(String.class, is("undefined"))); } @Test public void isolatedBindingsAndSimpleBindings() throws ScriptException { Bindings binding = new SimpleBindings(); engine.eval("var value = 'Alnitak'", binding); assertThat(engine.eval("value", binding), instanceOfWith(String.class, is("Alnitak"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", engine.createBindings()), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleBindings()), instanceOfWith(String.class, is("undefined"))); } @Test public void isolatedBindingsWithContext() throws ScriptException { ScriptContext context = new SimpleScriptContext(); Bindings binding = engine.createBindings(); context.setBindings(binding, ScriptContext.ENGINE_SCOPE); engine.eval("var value = 'Alnilam'", context); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Alnilam"))); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); context.setBindings(binding, ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Alnilam"))); } @Test public void isolatedBindingsWithContextAndSimpleBindings() throws ScriptException { ScriptContext context = new SimpleScriptContext(); Bindings binding = new SimpleBindings(); context.setBindings(binding, ScriptContext.ENGINE_SCOPE); engine.eval("var value = 'Zeta Scorpii'", context); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Zeta Scorpii"))); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); context.setBindings(binding, ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Zeta Scorpii"))); } @Test public void isolatedContextsNoVarEvalDefault() throws ScriptException { ScriptContext context = new SimpleScriptContext(); engine.eval("value = 'Rigel'"); assertThat(engine.eval("value"), instanceOfWith(String.class, is("Rigel"))); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); assertThat(engine.getContext().getAttribute("value"), instanceOfWith(String.class, is("Rigel"))); assertThat(context.getAttribute("value"), nullValue()); } @Test public void isolatedContextsNoVarEvalContext() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); engine.eval("value = 'Deneb'", context); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Deneb"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleScriptContext()), instanceOfWith(String.class, is("undefined"))); assertThat(engine.getContext().getAttribute("value"), nullValue()); assertThat(context.getAttribute("value"), instanceOfWith(String.class, is("Deneb"))); } @Test public void isolatedContextsNoVarEvalContextWithDefaults() throws ScriptException { ScriptContext context = new SimpleScriptContext(); engine.eval("value = 'Polaris'", context); assertThat(engine.eval("typeof value", context), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value"), instanceOfWith(String.class, is("undefined"))); assertThat(engine.eval("typeof value", new SimpleScriptContext()), instanceOfWith(String.class, is("undefined"))); assertThat(engine.getContext().getAttribute("value"), nullValue()); assertThat(context.getAttribute("value"), nullValue()); } @Test public void bindingValueWithThis() throws ScriptException { engine.put("value", "Gienah"); assertThat(engine.eval("this.value"), instanceOfWith(String.class, is("Gienah"))); } @Test public void bindingValueWithThisExplicitContext() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Markab", ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Markab"))); } @Test public void bindingValueWithThisExplicitContextSimpleBindings() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setAttribute("value", "Markeb", ScriptContext.ENGINE_SCOPE); assertThat(engine.eval("this.value", context), nullValue()); } @Test public void bindingValueWithThisExplicitBinding() throws ScriptException { Bindings binding = engine.createBindings(); binding.put("value", "Alderamin"); assertThat(engine.eval("this.value", binding), instanceOfWith(String.class, is("Alderamin"))); } @Test public void bindingValueWithThisExplicitSimpleBinding() throws ScriptException { Bindings binding = new SimpleBindings(); binding.put("value", "Sabik"); assertThat(engine.eval("this.value", binding), nullValue()); } @Test public void scopeInteractionDefaultContextGlobalAssignment() throws ScriptException { ScriptContext context = engine.getContext(); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionDefaultContextPropertyAssignment() throws ScriptException { ScriptContext context = engine.getContext(); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("this.value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionDefaultContextVarAssignment() throws ScriptException { ScriptContext context = engine.getContext(); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("var value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextGlobalAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextPropertyAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("this.value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextVarAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("var value = 'Aludra'", context); assertThat(engine.eval("this.value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextSimpleBindingsGlobalAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("value = 'Aludra'", context); assertThat(engine.eval("this.value", context), nullValue()); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextSimpleBindingsPropertyAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("this.value = 'Aludra'", context); assertThat(engine.eval("this.value", context), nullValue()); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Phecda"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Phecda"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } @Test public void scopeInteractionNewContextSimpleBindingsVarAssignment() throws ScriptException { ScriptContext context = new SimpleScriptContext(); context.setBindings(engine.getBindings(ScriptContext.GLOBAL_SCOPE), ScriptContext.GLOBAL_SCOPE); context.setBindings(new SimpleBindings(), ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Phecda", ScriptContext.ENGINE_SCOPE); context.setAttribute("value", "Scheat", ScriptContext.GLOBAL_SCOPE); engine.eval("var value = 'Aludra'", context); assertThat(engine.eval("this.value", context), nullValue()); assertThat(engine.eval("value", context), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.ENGINE_SCOPE), instanceOfWith(String.class, is("Aludra"))); assertThat(context.getAttribute("value", ScriptContext.GLOBAL_SCOPE), instanceOfWith(String.class, is("Scheat"))); } }