示例#1
0
  protected Bean1 createBean1() {
    Bean1 b1 = new Bean1();
    b1.setBoolean1(true);
    b1.setByte1((byte) 12);
    b1.setShort1((short) 98);
    b1.setChar1('b');
    b1.setInt1(4);
    b1.setLong1(98);
    b1.setFloat1((float) 12.4);
    b1.setDouble1(89.224);
    b1.setString1("hello");
    b1.setStringArray1(new String[] {"string1", "string2", "string3", "string4"});
    {
      List l = new ArrayList();
      l.add(new Integer(14));
      l.add("another value");
      l.add(b1.getStringArray1());
      b1.setList1(l);
    }
    {
      Map m = new HashMap();
      m.put("key1", "value1");
      m.put(new Integer(14), "value2");
      m.put(new Long(14), "value3");
      m.put("recurse", b1);
      b1.setMap1(m);
    }

    Bean1 b2 = new Bean1();
    b2.setInt2(new Integer(-224));
    b2.setString2("bean2's string");
    b1.setBean1(b2);

    Bean1 b3 = new Bean1();
    b3.setDouble1(1422.332);
    b3.setString2("bean3's string");
    b2.setBean2(b3);

    return b1;
  }
示例#2
0
  public void testELEvaluation() throws Exception {
    /* setup our test date */
    Bean1 b = this.createBean1();
    getExternalContext().getRequestMap().put("bean1a", b);

    getExternalContext().getSessionMap().put("val1c", "session-scoped1");
    getExternalContext().getRequestMap().put("val1b", "request-scoped1");
    getExternalContext().getApplicationMap().put("val1d", "app-scoped1");

    Map m = new HashMap();
    m.put("emptyArray", new Object[0]);
    m.put("nonemptyArray", new Object[] {"abc"});
    m.put("emptyList", new ArrayList());
    {
      List l = new ArrayList();
      l.add("hello");
      m.put("nonemptyList", l);
    }
    m.put("emptyMap", new HashMap());
    {
      Map m2 = new HashMap();
      m2.put("a", "a");
      m.put("nonemptyMap", m2);
    }
    m.put("emptySet", new HashSet());
    {
      Set s = new HashSet();
      s.add("hello");
      m.put("nonemptySet", s);
    }
    getExternalContext().getRequestMap().put("emptyTests", m);

    getExternalContext().getRequestMap().put("pbean1", Factory.createBean1());
    getExternalContext().getRequestMap().put("pbean2", Factory.createBean2());
    getExternalContext().getRequestMap().put("pbean3", Factory.createBean3());
    getExternalContext().getRequestMap().put("pbean4", Factory.createBean4());
    getExternalContext().getRequestMap().put("pbean5", Factory.createBean5());
    getExternalContext().getRequestMap().put("pbean6", Factory.createBean6());
    getExternalContext().getRequestMap().put("pbean7", Factory.createBean7());

    /* testing mixture of strings and expressions */
    evaluateTest("abc", "abc");
    evaluateTest("${ 3}", new Long(3));
    evaluateTestFailure("a${");
    evaluateTest("a${ 5 }", "a5");
    evaluateTest("${ 3 }b", "3b");
    evaluateTest("${ 1 }${ 2 }", "12");
    evaluateTest("abc ${ 1} ${ 2} def", "abc 1 2 def");

    /* testing values that end with or contain "$" */
    evaluateTest("$", "$");
    evaluateTest("\\$", "$");
    evaluateTest("$  ", "$  ");
    evaluateTest("test$", "test$");
    evaluateTest("$test", "$test");
    evaluateTest("test$test", "test$test");
    evaluateTest("test$$$", "test$$$");
    evaluateTest("test$$${ 34 }", "test$$34");
    evaluateTest("test$$${ 34 }$$", "test$$34$$");
    evaluateTest("test$${ 34 }", "test$34");
    evaluateTest("$${ 34 }", "$34");
    evaluateTest("$$", "$$");
    evaluateTest("test$$", "test$$");
    evaluateTest("test$$test", "test$$test");
    evaluateTest("${ 34 }$${ 34 }", "34$34");

    /* basic literals */
    evaluateTest("${1}", new Long(1));
    evaluateTest("${-12}", new Long(-12));
    evaluateTest("${true}", Boolean.TRUE);
    evaluateTest("${false}", Boolean.FALSE);
    evaluateTest("${null}", null);
    evaluateTest("${4.2}", new Double(4.2));
    evaluateTest("${-21.3}", new Double(-21.3));
    evaluateTest("${4.}", new Double(4.0));
    evaluateTest("${.21}", new Double(0.21));
    evaluateTest("${3e-1}", new Double(0.3));
    evaluateTest("${.2222222222}", new Double(0.2222222222));

    /* basic relationals between literals */
    evaluateTest("${1 < 2}", Boolean.TRUE);
    evaluateTest("${1 > 2}", Boolean.FALSE);
    evaluateTest("${1 >= 2}", Boolean.FALSE);
    evaluateTest("${1 <= 2}", Boolean.TRUE);
    evaluateTest("${1 == 2}", Boolean.FALSE);
    evaluateTest("${1 != 2}", Boolean.TRUE);
    evaluateTest("${3 >= 3}", Boolean.TRUE);
    evaluateTest("${3 <= 3}", Boolean.TRUE);
    evaluateTest("${3 == 3}", Boolean.TRUE);
    evaluateTest("${3 < 3}", Boolean.FALSE);
    evaluateTest("${3 > 3}", Boolean.FALSE);
    evaluateTest("${3 != 3}", Boolean.FALSE);

    // PENDING (visvan) check with Kinman/Jacob
    /* relationals between booleans
    evaluateTestFailure("${false < true}");
    evaluateTestFailure("${false > true}");
    evaluateTest("${true >= true}", Boolean.TRUE);
    evaluateTest("${true <= true}", Boolean.TRUE);
    evaluateTest("${true == true}", Boolean.TRUE);
    evaluateTest("${true != true}", Boolean.FALSE); */

    /* looking up objects in scopes */
    evaluateTest("${requestScope.val1b}", "request-scoped1");
    evaluateTest("${sessionScope.val1b}", null);
    evaluateTest("${applicationScope.val1b}", null);
    evaluateTest("${val1b}", "request-scoped1");

    evaluateTest("${requestScope.val1c}", null);
    evaluateTest("${sessionScope.val1c}", "session-scoped1");
    evaluateTest("${applicationScope.val1c}", null);
    evaluateTest("${val1c}", "session-scoped1");

    evaluateTest("${requestScope.val1d}", null);
    evaluateTest("${sessionScope.val1d}", null);
    evaluateTest("${applicationScope.val1d}", "app-scoped1");
    evaluateTest("${val1d}", "app-scoped1");

    /* accessing properties */
    evaluateTest("${bean1a.int1}", new Integer(b.getInt1()));
    evaluateTest("${bean1a.boolean1}", Boolean.valueOf(b.getBoolean1()));
    evaluateTest("${bean1a.string1}", b.getString1());
    evaluateTest("${bean1a.bean1.int2}", b.getBean1().getInt2());
    evaluateTest("${bean1a.bean1.bean2.string2}", b.getBean1().getBean2().getString2());
    evaluateTest("${bean1a.byte1}", new Byte(b.getByte1()));
    evaluateTest("${bean1a.char1}", new Character(b.getChar1()));
    evaluateTest("${bean1a.short1}", new Short(b.getShort1()));
    evaluateTest("${bean1a.long1}", new Long(b.getLong1()));
    evaluateTest("${bean1a.float1}", new Float(b.getFloat1()));
    evaluateTest("${bean1a.double1}", new Double(b.getDouble1()));

    /* test the entire relational comparison type promotion matrix */
    evaluateTest("${bean1a.byte1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.byte1 < bean1a.char1}", Boolean.TRUE);
    evaluateTest("${bean1a.byte1 < bean1a.short1}", Boolean.TRUE);
    evaluateTest("${bean1a.byte1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.byte1 < bean1a.long1}", Boolean.TRUE);
    evaluateTest("${bean1a.byte1 < bean1a.float1}", Boolean.TRUE);
    evaluateTest("${bean1a.byte1 < bean1a.double1}", Boolean.TRUE);

    evaluateTest("${bean1a.char1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.char1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.short1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.long1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.float1}", Boolean.FALSE);
    evaluateTest("${bean1a.char1 < bean1a.double1}", Boolean.FALSE);

    evaluateTest("${bean1a.short1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.char1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.short1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.float1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.long1}", Boolean.FALSE);
    evaluateTest("${bean1a.short1 < bean1a.double1}", Boolean.FALSE);

    evaluateTest("${bean1a.int1 < bean1a.byte1}", Boolean.TRUE);
    evaluateTest("${bean1a.int1 < bean1a.char1}", Boolean.TRUE);
    evaluateTest("${bean1a.int1 < bean1a.short1}", Boolean.TRUE);
    evaluateTest("${bean1a.int1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.int1 < bean1a.long1}", Boolean.TRUE);
    evaluateTest("${bean1a.int1 < bean1a.float1}", Boolean.TRUE);
    evaluateTest("${bean1a.int1 < bean1a.double1}", Boolean.TRUE);

    evaluateTest("${bean1a.long1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.char1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.short1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.long1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.float1}", Boolean.FALSE);
    evaluateTest("${bean1a.long1 < bean1a.double1}", Boolean.FALSE);

    evaluateTest("${bean1a.float1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.float1 < bean1a.char1}", Boolean.TRUE);
    evaluateTest("${bean1a.float1 < bean1a.short1}", Boolean.TRUE);
    evaluateTest("${bean1a.float1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.float1 < bean1a.long1}", Boolean.TRUE);
    evaluateTest("${bean1a.float1 < bean1a.float1}", Boolean.FALSE);
    evaluateTest("${bean1a.float1 < bean1a.double1}", Boolean.TRUE);

    evaluateTest("${bean1a.double1 < bean1a.byte1}", Boolean.FALSE);
    evaluateTest("${bean1a.double1 < bean1a.char1}", Boolean.TRUE);
    evaluateTest("${bean1a.double1 < bean1a.short1}", Boolean.TRUE);
    evaluateTest("${bean1a.double1 < bean1a.int1}", Boolean.FALSE);
    evaluateTest("${bean1a.double1 < bean1a.long1}", Boolean.TRUE);
    evaluateTest("${bean1a.double1 < bean1a.float1}", Boolean.FALSE);
    evaluateTest("${bean1a.double1 < bean1a.double1}", Boolean.FALSE);

    /* test other relational comparison rules */
    evaluateTest("${null == null}", Boolean.TRUE);
    evaluateTest("${noSuchAttribute == noSuchAttribute}", Boolean.TRUE);
    evaluateTest("${noSuchAttribute == null}", Boolean.TRUE);
    evaluateTest("${null == noSuchAttribute}", Boolean.TRUE);
    evaluateTest("${bean1a == null}", Boolean.FALSE);
    evaluateTest("${null == bean1a}", Boolean.FALSE);
    evaluateTest("${bean1a == bean1a}", Boolean.TRUE);
    evaluateTest("${bean1a > \"hello\"}", Boolean.FALSE);
    evaluateTestFailure("${bean1a.bean1 < 14}");
    evaluateTest("${bean1a.bean1 == \"hello\"}", Boolean.FALSE);

    /* test String comparisons */
    evaluateTest("${bean1a.string1 == \"hello\"}", Boolean.TRUE);
    evaluateTest("${bean1a.string1 != \"hello\"}", Boolean.FALSE);
    evaluateTest("${bean1a.string1 == \"goodbye\"}", Boolean.FALSE);
    evaluateTest("${bean1a.string1 != \"goodbye\"}", Boolean.TRUE);
    evaluateTest("${bean1a.string1 > \"goodbye\"}", Boolean.TRUE);
    evaluateTest("${\"hello\" == bean1a.string1}", Boolean.TRUE);
    evaluateTest("${\"goodbye\" > bean1a.string1}", Boolean.FALSE);

    /* test errors in property traversal */
    evaluateTest("${noSuchAttribute.abc}", null);
    evaluateTest("${bean1a.bean2.byte1}", null);
    evaluateTestFailure("${bean1a.noProperty}");
    evaluateTestFailure("${bean1a.noGetter}");
    evaluateTestFailure("${bean1a.errorInGetter}");
    evaluateTest("${bean1a.bean2.string2}", null);

    /* test accessing public properties from private classes */
    evaluateTest("${pbean1.value}", "got the value");
    evaluateTest("${pbean2.value}", "got the value");
    evaluateTest("${pbean3.value}", "got the value");
    evaluateTest("${pbean4.value}", "got the value");
    evaluateTest("${pbean5.value}", "got the value");
    evaluateTest("${pbean6.value}", "got the value");
    evaluateTest("${pbean7.value}", "got the value");

    /* test reserved words as identifiers */
    evaluateTestFailure("${and}");
    evaluateTestFailure("${or}");
    evaluateTestFailure("${not}");
    evaluateTestFailure("${eq}");
    evaluateTestFailure("${ne}");
    evaluateTestFailure("${lt}");
    evaluateTestFailure("${gt}");
    evaluateTestFailure("${le}");
    evaluateTestFailure("${ge}");
    evaluateTest("${true}", Boolean.TRUE);
    evaluateTest("${false}", Boolean.FALSE);
    evaluateTest("${null}", null);

    /* test reserved words as property names */
    evaluateTestFailure("${bean1a.and}");
    evaluateTestFailure("${bean1a.or}");
    evaluateTestFailure("${bean1a.not}");
    evaluateTestFailure("${bean1a.eq}");
    evaluateTestFailure("${bean1a.ne}");
    evaluateTestFailure("${bean1a.lt}");
    evaluateTestFailure("${bean1a.gt}");
    evaluateTestFailure("${bean1a.le}");
    evaluateTestFailure("${bean1a.ge}");
    evaluateTestFailure("${bean1a.instanceof}");
    evaluateTestFailure("${bean1a.page}");
    evaluateTestFailure("${bean1a.request}");
    evaluateTestFailure("${bean1a.session}");
    evaluateTestFailure("${bean1a.application}");
    evaluateTestFailure("${bean1a.true}");
    evaluateTestFailure("${bean1a.false}");
    evaluateTestFailure("${bean1a.null}");

    /* test arithmetic */
    evaluateTest("${3+5}", new Long(8));
    evaluateTest("${3-5}", new Long(-2));
    evaluateTest("${3/5}", new Double(0.6));
    evaluateTest("${3*5}", new Long(15));
    evaluateTest("${3*5.0}", new Double(15.0));
    evaluateTest("${3.0*5}", new Double(15.0));
    evaluateTest("${3.0*5.0}", new Double(15.0));
    evaluateTest("${225 % 17}", new Long(4));
    evaluateTest("${ 1 + 2 + 3 * 5 + 6}", new Long(24));
    evaluateTest("${ 1 + (2 + 3) * 5 + 6}", new Long(32));

    /* test logical operators */
    evaluateTest("${ true}", Boolean.TRUE);
    evaluateTest("${ not true}", Boolean.FALSE);
    evaluateTest("${ not false}", Boolean.TRUE);
    evaluateTest("${ not not true}", Boolean.TRUE);
    evaluateTest("${ not not false}", Boolean.FALSE);
    evaluateTest("${ true and false}", Boolean.FALSE);
    evaluateTest("${ true and true}", Boolean.TRUE);
    evaluateTest("${ false and true}", Boolean.FALSE);
    evaluateTest("${ false and false}", Boolean.FALSE);
    evaluateTest("${ true or false}", Boolean.TRUE);
    evaluateTest("${ true or true}", Boolean.TRUE);
    evaluateTest("${ false or true}", Boolean.TRUE);
    evaluateTest("${ false or false}", Boolean.FALSE);
    evaluateTest("${ false or false or false or true and false}", Boolean.FALSE);
    evaluateTest("${ false or false or false or true and false or true}", Boolean.TRUE);

    /* test indexed access operator */
    evaluateTest("${ bean1a[\"double1\"] }", new Double(b.getDouble1()));
    evaluateTest("${ bean1a[\"double1\"].class }", Double.class);
    evaluateTest("${ bean1a.stringArray1[-1]}", null);
    evaluateTest("${ bean1a.stringArray1[0]}", b.getStringArray1()[0]);
    evaluateTest("${ bean1a.stringArray1[1]}", b.getStringArray1()[1]);
    evaluateTest("${ bean1a.stringArray1[2]}", b.getStringArray1()[2]);
    evaluateTest("${ bean1a.stringArray1[3]}", b.getStringArray1()[3]);
    evaluateTest("${ bean1a.stringArray1[4]}", null);

    /* Test as list accessor */
    evaluateTest("${ bean1a.list1 [0] }", b.getList1().get(0));
    evaluateTest("${ bean1a.list1 [1] }", b.getList1().get(1));
    evaluateTest("${ bean1a.list1 [2][2] }", "string3");

    /* Test as indexed property accessor */
    evaluateTestFailure("${ bean1a.indexed1[-1]}");
    evaluateTestFailure("${ bean1a.indexed1[0]}");
    evaluateTestFailure("${ bean1a.indexed1[1]}");
    evaluateTestFailure("${ bean1a.indexed1[2]}");
    evaluateTestFailure("${ bean1a.indexed1[3]}");
    evaluateTestFailure("${ bean1a.indexed1[4]}");

    /* Test as map accessor */
    evaluateTest("${ bean1a.map1.noKey }", null);
    evaluateTest("${ bean1a.map1.key1 }", b.getMap1().get("key1"));
    evaluateTest("${ bean1a.map1 [\"key1\"] }", b.getMap1().get("key1"));
    evaluateTest("${ bean1a.map1 [14] }", "value3");
    evaluateTest("${ bean1a.map1 [2 * 7] }", "value3");
    evaluateTest("${ bean1a.map1.recurse.list1[0] }", new Integer(14));

    /* Test UIComponent as bean
    evaluateTest("${view.rendered}", Boolean.TRUE);
    evaluateTest("${view.attributes.rendered}", Boolean.TRUE);
    evaluateTest("${view.children[0].value}", "inputValue");
    evaluateTest("${view.children[0].rendered}", Boolean.TRUE);
     */

    /* test String concatenation */
    evaluateTestFailure("${ \"a\" + \"bcd\" }");
    evaluateTestFailure("${ \"a\" + (4*3) }");
    evaluateTestFailure("${ bean1a.map1 [\"key\" + (5-4)] }");

    /* test String comparisons */
    evaluateTest("${ \"30\" < \"4\" }", Boolean.TRUE);
    evaluateTest("${ 30 < \"4\" }", Boolean.FALSE);
    evaluateTest("${ 30 > \"4\" }", Boolean.TRUE);
    evaluateTest("${ \"0004\" == \"4\" }", Boolean.FALSE);

    /* test relational comparison with alternate symbols */
    evaluateTest("${ 4 eq 3}", Boolean.FALSE);
    evaluateTest("${ 4 ne 3}", Boolean.TRUE);
    evaluateTest("${ 4 eq 4}", Boolean.TRUE);
    evaluateTest("${ 4 ne 4}", Boolean.FALSE);
    evaluateTest("${ 4 lt 3}", Boolean.FALSE);
    evaluateTest("${ 4 gt 3}", Boolean.TRUE);
    evaluateTest("${ 4 le 3}", Boolean.FALSE);
    evaluateTest("${ 4 ge 3}", Boolean.TRUE);
    evaluateTest("${ 4 le 4}", Boolean.TRUE);
    evaluateTest("${ 4 ge 4}", Boolean.TRUE);

    /* test expressions on the left side of a value suffix */
    evaluateTest("${(3).class}", Long.class);
    evaluateTest("${(bean1a.map1)[\"key1\"]}", "value1");

    /* test String/boolean logical operators */
    evaluateTest("${'true' and false}", Boolean.FALSE);
    evaluateTest("${'true' or true}", Boolean.TRUE);
    evaluateTest("${false and 'true'}", Boolean.FALSE);
    evaluateTest("${false or 'true'}", Boolean.TRUE);

    /* test empty operator */
    evaluateTest("${ empty \"A\"}", Boolean.FALSE);
    evaluateTest("${ empty \"\" }", Boolean.TRUE);
    evaluateTest("${ empty null }", Boolean.TRUE);
    evaluateTest("${ empty false}", Boolean.FALSE);
    evaluateTest("${ empty 0}", Boolean.FALSE);
    evaluateTest("${ not empty 0}", Boolean.TRUE);
    evaluateTest("${ not empty empty 0}", Boolean.TRUE);
    evaluateTest("${ empty emptyTests.emptyArray }", Boolean.TRUE);
    evaluateTest("${ empty emptyTests.nonemptyArray }", Boolean.FALSE);
    evaluateTest("${ empty emptyTests.emptyList }", Boolean.TRUE);
    evaluateTest("${ empty emptyTests.nonemptyList }", Boolean.FALSE);
    evaluateTest("${ empty emptyTests.emptyMap }", Boolean.TRUE);
    evaluateTest("${ empty emptyTests.nonemptyMap }", Boolean.FALSE);
    evaluateTest("${ empty emptyTests.emptySet }", Boolean.TRUE);
    evaluateTest("${ empty emptyTests.nonemptySet }", Boolean.FALSE);

    /* test String arithmetic */
    evaluateTest("${ \"6\" / \"3\" }", new Double(2.0));
    evaluateTest("${ 3 + \"4\" }", new Long(7));
    evaluateTest("${ \"4\" + 3 }", new Long(7));
    evaluateTest("${ 3 + \"4.5\" }", new Double(7.5));
    evaluateTest("${ \"4.5\" + 3 }", new Double(7.5));
    evaluateTest("${ 3.0 + 6.0}", new Double(9.0));
    evaluateTest("${ 31121.0 * 61553.0 }", new Double(1.915590913E9));
    evaluateTest("${ 31121 * 61553 }", new Long(1915590913));
    evaluateTest("${ 65536 * 65536 * 65536 * 32759 }", new Long("9220838762064379904"));
    evaluateTest("${ 9220838762064379904.0 - 9220838762064379900.0 }", new Double(0.0));
    evaluateTest("${ 9220838762064379904 - 9220838762064379900 }", new Long(4));

    /* test relational operators involving null */
    evaluateTest("${ null == null }", Boolean.TRUE);
    evaluateTest("${ null != null }", Boolean.FALSE);
    evaluateTest("${ null > null }", Boolean.FALSE);
    evaluateTest("${ null < null }", Boolean.FALSE);
    evaluateTest("${ null >= null }", Boolean.TRUE);
    evaluateTest("${ null <= null }", Boolean.TRUE);
    evaluateTest("${ null == 3 }", Boolean.FALSE);
    evaluateTest("${ null != 3 }", Boolean.TRUE);
    evaluateTest("${ null > 3 }", Boolean.FALSE);
    evaluateTest("${ null < 3 }", Boolean.FALSE);
    evaluateTest("${ null >= 3 }", Boolean.FALSE);
    evaluateTest("${ null <= 3 }", Boolean.FALSE);
    evaluateTest("${ 3 == null }", Boolean.FALSE);
    evaluateTest("${ 3 != null }", Boolean.TRUE);
    evaluateTest("${ 3 > null }", Boolean.FALSE);
    evaluateTest("${ 3 < null }", Boolean.FALSE);
    evaluateTest("${ 3 >= null }", Boolean.FALSE);
    evaluateTest("${ 3 <= null }", Boolean.FALSE);
    evaluateTest("${ null == \"\" }", Boolean.FALSE);
    evaluateTest("${ null != \"\" }", Boolean.TRUE);
    evaluateTest("${ \"\" == null }", Boolean.FALSE);
    evaluateTest("${ \"\" != null }", Boolean.TRUE);

    /* arithmetic operators involving Strings */
    evaluateTest("${ 4 + 3 }", new Long(7));
    evaluateTest("${ 4.0 + 3 }", new Double(7.0));
    evaluateTest("${ 4 + 3.0 }", new Double(7.0));
    evaluateTest("${ 4.0 + 3.0 }", new Double(7.0));
    evaluateTest("${ \"4\" + 3 }", new Long(7));
    evaluateTest("${ \"4.0\" + 3 }", new Double(7.0));
    evaluateTest("${ \"4\" + 3.0 }", new Double(7.0));
    evaluateTest("${ \"4.0\" + 3.0 }", new Double(7.0));
    evaluateTest("${ 4 + \"3\" }", new Long(7));
    evaluateTest("${ 4.0 + \"3\" }", new Double(7.0));
    evaluateTest("${ 4 + \"3.0\" }", new Double(7.0));
    evaluateTest("${ 4.0 + \"3.0\" }", new Double(7.0));
    evaluateTest("${ \"4\" + \"3\" }", new Long(7));
    evaluateTest("${ \"4.0\" + \"3\" }", new Double(7.0));
    evaluateTest("${ \"4\" + \"3.0\" }", new Double(7.0));
    evaluateTest("${ \"4.0\" + \"3.0\" }", new Double(7.0));

    evaluateTest("${ 4 - 3 }", new Long(1));
    evaluateTest("${ 4.0 - 3 }", new Double(1.0));
    evaluateTest("${ 4 - 3.0 }", new Double(1.0));
    evaluateTest("${ 4.0 - 3.0 }", new Double(1.0));
    evaluateTest("${ \"4\" - 3 }", new Long(1));
    evaluateTest("${ \"4.0\" - 3 }", new Double(1.0));
    evaluateTest("${ \"4\" - 3.0 }", new Double(1.0));
    evaluateTest("${ \"4.0\" - 3.0 }", new Double(1.0));
    evaluateTest("${ 4 - \"3\" }", new Long(1));
    evaluateTest("${ 4.0 - \"3\" }", new Double(1.0));
    evaluateTest("${ 4 - \"3.0\" }", new Double(1.0));
    evaluateTest("${ 4.0 - \"3.0\" }", new Double(1.0));
    evaluateTest("${ \"4\" - \"3\" }", new Long(1));
    evaluateTest("${ \"4.0\" - \"3\" }", new Double(1.0));
    evaluateTest("${ \"4\" - \"3.0\" }", new Double(1.0));
    evaluateTest("${ \"4.0\" - \"3.0\" }", new Double(1.0));

    evaluateTest("${ 4 * 3 }", new Long(12));
    evaluateTest("${ 4.0 * 3 }", new Double(12.0));
    evaluateTest("${ 4 * 3.0 }", new Double(12.0));
    evaluateTest("${ 4.0 * 3.0 }", new Double(12.0));
    evaluateTest("${ \"4\" * 3 }", new Long(12));
    evaluateTest("${ \"4.0\" * 3 }", new Double(12.0));
    evaluateTest("${ \"4\" * 3.0 }", new Double(12.0));
    evaluateTest("${ \"4.0\" * 3.0 }", new Double(12.0));
    evaluateTest("${ 4 * \"3\" }", new Long(12));
    evaluateTest("${ 4.0 * \"3\" }", new Double(12.0));
    evaluateTest("${ 4 * \"3.0\" }", new Double(12.0));
    evaluateTest("${ 4.0 * \"3.0\" }", new Double(12.0));
    evaluateTest("${ \"4\" * \"3\" }", new Long(12));
    evaluateTest("${ \"4.0\" * \"3\" }", new Double(12.0));
    evaluateTest("${ \"4\" * \"3.0\" }", new Double(12.0));
    evaluateTest("${ \"4.0\" * \"3.0\" }", new Double(12.0));

    evaluateTest("${ 4 / 3 }", new Double(4.0 / 3.0));
    evaluateTest("${ 4.0 / 3 }", new Double(4.0 / 3.0));
    evaluateTest("${ 4 / 3.0 }", new Double(4.0 / 3.0));
    evaluateTest("${ 4.0 / 3.0 }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4\" / 3 }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4.0\" / 3 }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4\" / 3.0 }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4.0\" / 3.0 }", new Double(4.0 / 3.0));
    evaluateTest("${ 4 / \"3\" }", new Double(4.0 / 3.0));
    evaluateTest("${ 4.0 / \"3\" }", new Double(4.0 / 3.0));
    evaluateTest("${ 4 / \"3.0\" }", new Double(4.0 / 3.0));
    evaluateTest("${ 4.0 / \"3.0\" }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4\" / \"3\" }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4.0\" / \"3\" }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4\" / \"3.0\" }", new Double(4.0 / 3.0));
    evaluateTest("${ \"4.0\" / \"3.0\" }", new Double(4.0 / 3.0));

    evaluateTest("${ 4 % 3 }", new Long(1));
    evaluateTest("${ 4.0 % 3 }", new Double(1.0));
    evaluateTest("${ 4 % 3.0 }", new Double(1.0));
    evaluateTest("${ 4.0 % 3.0 }", new Double(1.0));
    evaluateTest("${ \"4\" % 3 }", new Long(1));
    evaluateTest("${ \"4.0\" % 3 }", new Double(1.0));
    evaluateTest("${ \"4\" % 3.0 }", new Double(1.0));
    evaluateTest("${ \"4.0\" % 3.0 }", new Double(1.0));
    evaluateTest("${ 4 % \"3\" }", new Long(1));
    evaluateTest("${ 4.0 % \"3\" }", new Double(1.0));
    evaluateTest("${ 4 % \"3.0\" }", new Double(1.0));
    evaluateTest("${ 4.0 % \"3.0\" }", new Double(1.0));
    evaluateTest("${ \"4\" % \"3\" }", new Long(1));
    evaluateTest("${ \"4.0\" % \"3\" }", new Double(1.0));
    evaluateTest("${ \"4\" % \"3.0\" }", new Double(1.0));
    evaluateTest("${ \"4.0\" % \"3.0\" }", new Double(1.0));

    evaluateTest("${ \"8\" / \"2\" }", new Double(4.0));
    evaluateTest("${ \"4e2\" + \"3\" }", new Double(403));
    evaluateTest("${ \"4\" + \"3e2\" }", new Double(304));
    evaluateTest("${ \"4e2\" + \"3e2\" }", new Double(700));

    /* unary minus operator involving Strings */
    evaluateTest("${ -3 }", new Long(-3));
    evaluateTest("${ -3.0 }", new Double(-3.0));
    evaluateTest("${ -\"3\" }", new Long(-3));
    evaluateTest("${ -\"3.0\" }", new Double(-3));
    evaluateTest("${ -\"3e2\" }", new Double(-300));
  }