/*
* Copyright 2016 Nabarun Mondal
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.noga.njexl.lang.scripting;
import java.io.Reader;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import junit.framework.TestCase;
public class JexlScriptEngineTest extends TestCase {
private static final List<String> NAMES = Arrays.asList("JEXL", "Jexl", "jexl", "JEXL2", "Jexl2", "jexl2");
private static final List<String> EXTENSIONS = Arrays.asList("jexl", "jexl2");
private static final List<String> MIMES = Arrays.asList("application/x-jexl", "application/x-jexl2");
public void testScriptEngineFactory() throws Exception {
JexlScriptEngineFactory factory = new JexlScriptEngineFactory();
assertEquals("JEXL Engine", factory.getParameter(ScriptEngine.ENGINE));
assertEquals("2.0", factory.getParameter(ScriptEngine.ENGINE_VERSION));
assertEquals("JEXL", factory.getParameter(ScriptEngine.LANGUAGE));
assertEquals("2.0", factory.getParameter(ScriptEngine.LANGUAGE_VERSION));
assertNull(factory.getParameter("THREADING"));
assertEquals(NAMES, factory.getParameter(ScriptEngine.NAME));
assertEquals(EXTENSIONS, factory.getExtensions());
assertEquals(MIMES, factory.getMimeTypes());
assertEquals("42;", factory.getProgram(new String[]{"42"}));
assertEquals("str.substring(3,4)", factory.getMethodCallSyntax("str", "substring", new String[]{"3", "4"}));
}
public void testScriptingGetBy() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
assertNotNull("Manager should not be null", manager);
for (String name : NAMES) {
ScriptEngine engine = manager.getEngineByName(name);
assertNotNull("Engine should not be null (name)", engine);
}
for (String extension : EXTENSIONS) {
ScriptEngine engine = manager.getEngineByExtension(extension);
assertNotNull("Engine should not be null (extension)", engine);
}
for (String mime : MIMES) {
ScriptEngine engine = manager.getEngineByMimeType(mime);
assertNotNull("Engine should not be null (mime)", engine);
}
}
public void testScripting() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
assertNotNull("Manager should not be null", manager);
ScriptEngine engine = manager.getEngineByName("jexl2");
final Integer initialValue = Integer.valueOf(123);
assertEquals(initialValue,engine.eval("123"));
assertEquals(initialValue,engine.eval("0;123"));// multiple statements
long time1 = System.currentTimeMillis();
Long time2 = (Long) engine.eval(
"sys=context.class.forName(\"java.lang.System\");"
+"now=sys.currentTimeMillis();"
);
assertTrue("Must take some time to process this",time1 <= time2.longValue());
engine.put("value", initialValue);
assertEquals(initialValue,engine.get("value"));
final Integer newValue = Integer.valueOf(124);
assertEquals(newValue,engine.eval("old=value;value=value+1"));
assertEquals(initialValue,engine.get("old"));
assertEquals(newValue,engine.get("value"));
assertEquals(engine.getContext(),engine.get(JexlScriptEngine.CONTEXT_KEY));
// Check behaviour of JEXL object
assertEquals(engine.getContext().getReader(),engine.eval("JEXL.in"));
assertEquals(engine.getContext().getWriter(),engine.eval("JEXL.out"));
assertEquals(engine.getContext().getErrorWriter(),engine.eval("JEXL.err"));
assertEquals(System.class,engine.eval("JEXL.System"));
}
public void testNulls() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
assertNotNull("Manager should not be null", manager);
ScriptEngine engine = manager.getEngineByName("jexl2");
assertNotNull("Engine should not be null (name)", engine);
try {
engine.eval((String)null);
fail("Should have caused NPE");
} catch (NullPointerException e) {
// NOOP
}
try {
engine.eval((Reader)null);
fail("Should have caused NPE");
} catch (NullPointerException e) {
// NOOP
}
}
public void testScopes() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
assertNotNull("Manager should not be null", manager);
ScriptEngine engine = manager.getEngineByName("JEXL");
assertNotNull("Engine should not be null (JEXL)", engine);
manager.put("global",Integer.valueOf(1));
engine.put("local", Integer.valueOf(10));
manager.put("both",Integer.valueOf(7));
engine.put("both", Integer.valueOf(7));
engine.eval("local=local+1");
engine.eval("global=global+1");
engine.eval("both=both+1"); // should update engine value only
engine.eval("newvar=42;");
assertEquals(Integer.valueOf(2),manager.get("global"));
assertEquals(Integer.valueOf(11),engine.get("local"));
assertEquals(Integer.valueOf(7),manager.get("both"));
assertEquals(Integer.valueOf(8),engine.get("both"));
assertEquals(Integer.valueOf(42),engine.get("newvar"));
assertNull(manager.get("newvar"));
}
public void testDottedNames() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
assertNotNull("Manager should not be null", manager);
ScriptEngine engine = manager.getEngineByName("JEXL");
assertNotNull("Engine should not be null (JEXL)", engine);
engine.eval("this.is.a.test=null");
assertNull(engine.get("this.is.a.test"));
assertEquals(Boolean.TRUE, engine.eval("empty(this.is.a.test)"));
final Object mymap = engine.eval("testmap={ 'key1' : 'value1', 'key2' : 'value2' }");
assertTrue(mymap instanceof Map<?, ?>);
assertEquals(2,((Map<?, ?>)mymap).size());
}
}