package bsh; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import java.net.URL; import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertEquals; @RunWith(FilteredTestRunner.class) public class PreparsedScriptTest { private ClassLoader _classLoader = new ClassLoader() { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { System.out.println("find class " + name); // Thread.dumpStack(); return super.findClass(name); } @Override protected URL findResource(String name) { System.out.println("find resource " + name); return super.findResource(name); } }; @Test public void x() throws Exception { final PreparsedScript preparsedScript = new PreparsedScript("", _classLoader); preparsedScript.invoke(Collections.<String, Object>emptyMap()); } @Test public void y() throws Exception { final PreparsedScript f = new PreparsedScript("return x;", _classLoader); assertEquals("hurz", f.invoke(Collections.singletonMap("x", "hurz"))); assertEquals("foo", f.invoke(Collections.singletonMap("x", "foo"))); } @Test public void z() throws Exception { final PreparsedScript f = new PreparsedScript( "import javax.crypto.*;" + "import javax.crypto.interfaces.*;" + "import javax.crypto.spec.*;" + "if (foo != void) print (\"check\");" + "class Echo {\n" + "\n" + " Object echo() {\n" + " return param;\n" + " }\n" + "\n" + "}\n" + "\n" + "return new Echo().echo();", _classLoader ); assertEquals("bla", f.invoke(Collections.singletonMap("param", "bla"))); System.out.println("second call"); assertEquals("blubb", f.invoke(Collections.singletonMap("param", "blubb"))); } @Test public void multi_threaded() throws Exception { final AtomicInteger counter = new AtomicInteger(); final String script = "return v;"; final PreparsedScript f = new PreparsedScript(script, _classLoader); Assert.assertEquals("x", f.invoke(Collections.singletonMap("v", "x"))); final Runnable runnable = new Runnable() { public void run() { final int value = counter.incrementAndGet(); try { Assert.assertEquals(value, f.invoke(Collections.singletonMap("v", value))); } catch (final EvalError evalError) { throw new RuntimeException(evalError); } } }; final long time = TestUtil.measureConcurrentTime(runnable, 30, 30, 1000); System.out.println(TimeUnit.NANOSECONDS.toMillis(time)); } @Test public void param_with_name_result() throws Exception { final AtomicInteger result = new AtomicInteger(); final PreparsedScript f = new PreparsedScript( "result.set(result.get() + 42);", _classLoader); f.invoke(Collections.singletonMap("result", result)); Assert.assertEquals(42, result.get()); f.invoke(Collections.singletonMap("result", result)); Assert.assertEquals(84, result.get()); } }