@Test
  public void testMapAccess() {
    Map<String, Object> vars = new HashMap<String, Object>();

    Map<String, Object> obj2 =
        MapBuilder.<String, Object>newMapBuilder().put("prop2", "value2").map();
    Map<String, Object> obj1 =
        MapBuilder.<String, Object>newMapBuilder()
            .put("prop1", "value1")
            .put("obj2", obj2)
            .put("l", Arrays.asList("2", "1"))
            .map();
    vars.put("obj1", obj1);
    Object o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE, "testMapAccess", "js", se.compile("obj1")),
            vars);
    assertThat(o, instanceOf(Map.class));
    obj1 = (Map<String, Object>) o;
    assertThat((String) obj1.get("prop1"), equalTo("value1"));
    assertThat((String) ((Map<String, Object>) obj1.get("obj2")).get("prop2"), equalTo("value2"));

    o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE, "testMapAccess", "js", se.compile("obj1.l[0]")),
            vars);
    assertThat(((String) o), equalTo("2"));
  }
 @Test
 public void testSimpleEquation() {
   Map<String, Object> vars = new HashMap<String, Object>();
   Object o =
       se.execute(
           new CompiledScript(
               ScriptService.ScriptType.INLINE, "testSimpleEquation", "js", se.compile("1 + 2")),
           vars);
   assertThat(((Number) o).intValue(), equalTo(3));
 }
 @Test
 public void testJavaScriptObjectToMap() {
   Map<String, Object> vars = new HashMap<String, Object>();
   Object o =
       se.execute(
           se.compile(
               "var obj1 = {}; obj1.prop1 = 'value1'; obj1.obj2 = {}; obj1.obj2.prop2 = 'value2'; obj1"),
           vars);
   Map obj1 = (Map) o;
   assertThat((String) obj1.get("prop1"), equalTo("value1"));
   assertThat((String) ((Map<String, Object>) obj1.get("obj2")).get("prop2"), equalTo("value2"));
 }
  @Test
  public void testChangingVarsCrossExecution2() {
    Map<String, Object> vars = new HashMap<String, Object>();
    Object compiledScript = se.compile("value");

    ExecutableScript script = se.executable(compiledScript, vars);
    script.setNextVar("value", 1);
    Object o = script.run();
    assertThat(((Number) o).intValue(), equalTo(1));

    script.setNextVar("value", 2);
    o = script.run();
    assertThat(((Number) o).intValue(), equalTo(2));
  }
  @Test
  public void testJavaScriptObjectMapInter() {
    Map<String, Object> vars = new HashMap<String, Object>();
    Map<String, Object> ctx = new HashMap<String, Object>();
    Map<String, Object> obj1 = new HashMap<String, Object>();
    obj1.put("prop1", "value1");
    ctx.put("obj1", obj1);
    vars.put("ctx", ctx);

    se.execute(
        se.compile("ctx.obj2 = {}; ctx.obj2.prop2 = 'value2'; ctx.obj1.prop1 = 'uvalue1'"), vars);
    ctx = (Map<String, Object>) se.unwrap(vars.get("ctx"));
    assertThat(ctx.containsKey("obj1"), equalTo(true));
    assertThat((String) ((Map<String, Object>) ctx.get("obj1")).get("prop1"), equalTo("uvalue1"));
    assertThat(ctx.containsKey("obj2"), equalTo(true));
    assertThat((String) ((Map<String, Object>) ctx.get("obj2")).get("prop2"), equalTo("value2"));
  }
  @Test
  public void testJavaScriptInnerArrayCreation() {
    Map<String, Object> ctx = new HashMap<String, Object>();
    Map<String, Object> doc = new HashMap<String, Object>();
    ctx.put("doc", doc);

    Object compiled = se.compile("ctx.doc.field1 = ['value1', 'value2']");
    ExecutableScript script =
        se.executable(
            new CompiledScript(
                ScriptService.ScriptType.INLINE,
                "testJavaScriptInnerArrayCreation",
                "js",
                compiled),
            new HashMap<String, Object>());
    script.setNextVar("ctx", ctx);
    script.run();

    Map<String, Object> unwrap = (Map<String, Object>) script.unwrap(ctx);

    assertThat(((Map) unwrap.get("doc")).get("field1"), instanceOf(List.class));
  }
  @Test
  public void testMapAccess() {
    Map<String, Object> vars = new HashMap<String, Object>();

    Map<String, Object> obj2 =
        MapBuilder.<String, Object>newMapBuilder().put("prop2", "value2").map();
    Map<String, Object> obj1 =
        MapBuilder.<String, Object>newMapBuilder()
            .put("prop1", "value1")
            .put("obj2", obj2)
            .put("l", Lists.newArrayList("2", "1"))
            .map();
    vars.put("obj1", obj1);
    Object o = se.execute(se.compile("obj1"), vars);
    assertThat(o, instanceOf(Map.class));
    obj1 = (Map<String, Object>) o;
    assertThat((String) obj1.get("prop1"), equalTo("value1"));
    assertThat((String) ((Map<String, Object>) obj1.get("obj2")).get("prop2"), equalTo("value2"));

    o = se.execute(se.compile("obj1.l[0]"), vars);
    assertThat(((String) o), equalTo("2"));
  }
  @Test
  public void testChangingVarsCrossExecution1() {
    Map<String, Object> vars = new HashMap<String, Object>();
    Map<String, Object> ctx = new HashMap<String, Object>();
    vars.put("ctx", ctx);
    Object compiledScript = se.compile("ctx.value");

    ExecutableScript script =
        se.executable(
            new CompiledScript(
                ScriptService.ScriptType.INLINE,
                "testChangingVarsCrossExecution1",
                "js",
                compiledScript),
            vars);
    ctx.put("value", 1);
    Object o = script.run();
    assertThat(((Number) o).intValue(), equalTo(1));

    ctx.put("value", 2);
    o = script.run();
    assertThat(((Number) o).intValue(), equalTo(2));
  }
  @Test
  public void testAccessListInScript() {
    Map<String, Object> vars = new HashMap<String, Object>();
    Map<String, Object> obj2 =
        MapBuilder.<String, Object>newMapBuilder().put("prop2", "value2").map();
    Map<String, Object> obj1 =
        MapBuilder.<String, Object>newMapBuilder().put("prop1", "value1").put("obj2", obj2).map();
    vars.put("l", Arrays.asList("1", "2", "3", obj1));

    Object o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE,
                "testAccessInScript",
                "js",
                se.compile("l.length")),
            vars);
    assertThat(((Number) o).intValue(), equalTo(4));

    o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE, "testAccessInScript", "js", se.compile("l[0]")),
            vars);
    assertThat(((String) o), equalTo("1"));

    o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE, "testAccessInScript", "js", se.compile("l[3]")),
            vars);
    obj1 = (Map<String, Object>) o;
    assertThat((String) obj1.get("prop1"), equalTo("value1"));
    assertThat((String) ((Map<String, Object>) obj1.get("obj2")).get("prop2"), equalTo("value2"));

    o =
        se.execute(
            new CompiledScript(
                ScriptService.ScriptType.INLINE,
                "testAccessInScript",
                "js",
                se.compile("l[3].prop1")),
            vars);
    assertThat(((String) o), equalTo("value1"));
  }
 @After
 public void close() {
   se.close();
 }
 @Test
 public void testSimpleEquation() {
   Map<String, Object> vars = new HashMap<String, Object>();
   Object o = se.execute(se.compile("1 + 2"), vars);
   assertThat(((Number) o).intValue(), equalTo(3));
 }
 @AfterClass
 public void close() {
   se.close();
 }