You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2011/11/02 17:32:40 UTC

svn commit: r1196677 [2/2] - in /commons/proper/jexl/trunk/src: main/java/org/apache/commons/jexl2/ main/java/org/apache/commons/jexl2/introspection/ main/java/org/apache/commons/jexl2/parser/ main/java/org/apache/commons/jexl2/scripting/ test/java/org...

Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/UnifiedJEXLTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/UnifiedJEXLTest.java?rev=1196677&r1=1196676&r2=1196677&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/UnifiedJEXLTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/UnifiedJEXLTest.java Wed Nov  2 16:32:39 2011
@@ -15,6 +15,9 @@
  * limitations under the License.
  */
 package org.apache.commons.jexl2;
+
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -22,11 +25,13 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 /**
  * Test cases for the UnifiedEL.
  */
 public class UnifiedJEXLTest extends JexlTestCase {
     private static final JexlEngine ENGINE = createEngine(false);
+
     static {
         ENGINE.setSilent(false);
         ENGINE.setCache(128);
@@ -34,13 +39,13 @@ public class UnifiedJEXLTest extends Jex
     private static final UnifiedJEXL EL = new UnifiedJEXL(ENGINE);
     private static final Log LOG = LogFactory.getLog(UnifiedJEXL.class);
     private JexlContext context = null;
-    private Map<String,Object> vars =null;
+    private Map<String, Object> vars = null;
 
     @Override
     public void setUp() throws Exception {
         // ensure jul logging is only error
         java.util.logging.Logger.getLogger(JexlEngine.class.getName()).setLevel(java.util.logging.Level.SEVERE);
-        vars = new HashMap<String,Object>();
+        vars = new HashMap<String, Object>();
         context = new MapContext(vars);
     }
 
@@ -49,18 +54,38 @@ public class UnifiedJEXLTest extends Jex
         debuggerCheck(ENGINE);
         super.tearDown();
     }
+    
+    /** Extract the source from a toString-ed expression. */
+    private String getSource(String tostring) {
+        int len = tostring.length();
+        int sc = tostring.lastIndexOf(" /*= ");
+        if (sc >= 0)  {
+            sc += " /*= ".length();
+        }
+        int ec = tostring.lastIndexOf(" */");
+        if (sc >= 0 && ec >= 0 && ec > sc && ec < len) {
+            return tostring.substring(sc, ec);
+        } else {
+            return tostring;
+        }
+
+    }
 
     public static class Froboz {
         int value;
+
         public Froboz(int v) {
             value = v;
         }
+
         public void setValue(int v) {
             value = v;
         }
+
         public int getValue() {
             return value;
         }
+
         public int plus10() {
             int i = value;
             value += 10;
@@ -89,9 +114,10 @@ public class UnifiedJEXLTest extends Jex
         o = check.evaluate(context);
         assertEquals("Result is not 10", new Integer(10), o);
     }
-    
+
     public void testComposite() throws Exception {
-        UnifiedJEXL.Expression expr = EL.parse("Dear ${p} ${name};");
+        String source = "Dear ${p} ${name};";
+        UnifiedJEXL.Expression expr = EL.parse(source);
         vars.put("p", "Mr");
         vars.put("name", "Doe");
         assertTrue("expression should be immediate", expr.isImmediate());
@@ -101,18 +127,20 @@ public class UnifiedJEXLTest extends Jex
         vars.put("name", "Jones");
         o = expr.evaluate(context);
         assertEquals("Dear Ms Jones;", o);
+        assertEquals(source, getSource(expr.toString()));
     }
 
     public void testPrepareEvaluate() throws Exception {
+        final String source = "Dear #{p} ${name};";
         UnifiedJEXL.Expression expr = EL.parse("Dear #{p} ${name};");
         assertTrue("expression should be deferred", expr.isDeferred());
-        
+
         Set<List<String>> evars = expr.getVariables();
         assertEquals(1, evars.size());
         assertTrue(evars.contains(Arrays.asList("name")));
         vars.put("name", "Doe");
-        UnifiedJEXL.Expression  phase1 = expr.prepare(context);
-        String as = phase1.toString();
+        UnifiedJEXL.Expression phase1 = expr.prepare(context);
+        String as = phase1.asString();
         assertEquals("Dear ${p} Doe;", as);
         Set<List<String>> evars1 = phase1.getVariables();
         assertEquals(1, evars1.size());
@@ -121,45 +149,65 @@ public class UnifiedJEXLTest extends Jex
         vars.put("name", "Should not be used in 2nd phase");
         Object o = phase1.evaluate(context);
         assertEquals("Dear Mr Doe;", o);
+        
+        String p1 = getSource(phase1.toString());
+        assertEquals(source, getSource(phase1.toString()));
+        assertEquals(source, getSource(expr.toString()));
     }
-    
+
     public void testNested() throws Exception {
-        UnifiedJEXL.Expression expr = EL.parse("#{${hi}+'.world'}");
-        vars.put("hi", "hello");
-        vars.put("hello.world", "Hello World!");
+        final String source = "#{${hi}+'.world'}";
+        UnifiedJEXL.Expression expr = EL.parse(source);
+
+        Set<List<String>> evars = expr.getVariables();
+        assertEquals(1, evars.size());
+        assertTrue(evars.contains(Arrays.asList("hi")));
+
+        vars.put("hi", "greeting");
+        vars.put("greeting.world", "Hello World!");
+        assertTrue("expression should be deferred", expr.isDeferred());
         Object o = expr.evaluate(context);
-        assertTrue("source should not same expression", expr.getSource() != expr.prepare(context));
-        assertTrue("expression should be immediate", expr.isImmediate());
         assertEquals("Hello World!", o);
+        
+        assertEquals(source, getSource(expr.toString()));
     }
 
     public void testImmediate() throws Exception {
         JexlContext none = null;
-        UnifiedJEXL.Expression expr = EL.parse("${'Hello ' + 'World!'}");
+        final String source = "${'Hello ' + 'World!'}";
+        UnifiedJEXL.Expression expr = EL.parse(source);
         UnifiedJEXL.Expression prepared = expr.prepare(none);
-        assertEquals("prepare should return same expression","Hello World!",prepared.toString());
+        assertEquals("prepare should return same expression", "Hello World!", prepared.asString());
         Object o = expr.evaluate(none);
         assertTrue("expression should be immediate", expr.isImmediate());
         assertEquals("Hello World!", o);
+        
+        assertEquals(source, getSource(expr.toString()));
     }
 
     public void testConstant() throws Exception {
         JexlContext none = null;
-        UnifiedJEXL.Expression expr = EL.parse("Hello World!");
+        final String source = "Hello World!";
+        UnifiedJEXL.Expression expr = EL.parse(source);
         assertTrue("prepare should return same expression", expr.prepare(none) == expr);
         Object o = expr.evaluate(none);
         assertTrue("expression should be immediate", expr.isImmediate());
         assertEquals("Hello World!", o);
+        
+        assertEquals(source, getSource(expr.toString()));
     }
 
     public void testDeferred() throws Exception {
         JexlContext none = null;
-        UnifiedJEXL.Expression expr = EL.parse("#{'world'}");
+        final String source = "#{'world'}";
+        UnifiedJEXL.Expression expr = EL.parse(source);
+        assertTrue("expression should be deferred", expr.isDeferred());
         String as = expr.prepare(none).asString();
         assertEquals("prepare should return immediate version", "${'world'}", as);
         Object o = expr.evaluate(none);
-        assertTrue("expression should be immediate", expr.isImmediate());
         assertEquals("world", o);
+        
+        assertEquals(source, getSource(expr.toString()));
     }
 
     public void testEscape() throws Exception {
@@ -195,48 +243,45 @@ public class UnifiedJEXLTest extends Jex
             JexlContext none = null;
             expr.evaluate(none);
             fail("should be malformed");
-        }
-        catch(UnifiedJEXL.Exception xjexl) {
+        } catch (UnifiedJEXL.Exception xjexl) {
             // expected
             String xmsg = xjexl.getMessage();
             LOG.warn(xmsg);
         }
     }
-    
+
     public void testMalformedNested() throws Exception {
         try {
             UnifiedJEXL.Expression expr = EL.parse("#{${hi} world}");
             JexlContext none = null;
             expr.evaluate(none);
             fail("should be malformed");
-        }
-        catch(UnifiedJEXL.Exception xjexl) {
+        } catch (UnifiedJEXL.Exception xjexl) {
             // expected
             String xmsg = xjexl.getMessage();
             LOG.warn(xmsg);
         }
     }
-    
+
     public void testBadContextNested() throws Exception {
         try {
             UnifiedJEXL.Expression expr = EL.parse("#{${hi}+'.world'}");
             JexlContext none = null;
             expr.evaluate(none);
             fail("should be malformed");
-        }
-        catch(UnifiedJEXL.Exception xjexl) {
+        } catch (UnifiedJEXL.Exception xjexl) {
             // expected
             String xmsg = xjexl.getMessage();
             LOG.warn(xmsg);
         }
     }
-    
+
     public void testCharAtBug() throws Exception {
         vars.put("foo", "abcdef");
         UnifiedJEXL.Expression expr = EL.parse("${foo.substring(2,4)/*comment*/}");
         Object o = expr.evaluate(context);
         assertEquals("cd", o);
-        
+
         vars.put("bar", "foo");
         try {
             ENGINE.setSilent(true);
@@ -244,11 +289,108 @@ public class UnifiedJEXLTest extends Jex
             expr = expr.prepare(context);
             o = expr.evaluate(context);
             assertEquals(null, o);
-        }
-        finally {
+        } finally {
             ENGINE.setSilent(false);
         }
 
     }
 
+    public void testTemplate0() throws Exception {
+        String source = "   $$ if(x) {\nx is ${x}\n   $$ } else {\n${'no x'}\n$$ }\n";
+        StringWriter strw;
+        String output;
+
+        UnifiedJEXL.Template t = EL.createTemplate(source);
+
+        vars.put("x", 42);
+        strw = new StringWriter();
+        t.evaluate(context, strw);
+        output = strw.toString();
+        assertEquals("x is 42\n", output);
+
+        strw = new StringWriter();
+        vars.put("x", "");
+        t.evaluate(context, strw);
+        output = strw.toString();
+        assertEquals("no x\n", output);
+        
+        String dstr = t.toString();
+        assertNotNull(dstr);
+    }
+
+    public void testTemplate1() throws Exception {
+        String source = "$$ if(x) {\nx is ${x}\n$$ } else {\n${'no x'}\n$$ }\n";
+        StringWriter strw;
+        String output;
+
+        UnifiedJEXL.Template t = EL.createTemplate("$$", new StringReader(source), "x");
+        String dstr = t.asString();
+        assertNotNull(dstr);
+
+        strw = new StringWriter();
+        t.evaluate(context, strw, 42);
+        output = strw.toString();
+        assertEquals("x is 42\n", output);
+
+        strw = new StringWriter();
+        t.evaluate(context, strw, "");
+        output = strw.toString();
+        assertEquals("no x\n", output);
+    }
+    
+    public void testPrepareTemplate() throws Exception {
+        String source =
+                 "$$ for(var x : list) {\n"
+               + "${l10n}=#{x}\n"
+               + "$$ }\n";
+        int[] args = { 42 };
+        UnifiedJEXL.Template tl10n = EL.createTemplate(source, "list");
+        String dstr = tl10n.asString();
+        assertNotNull(dstr);
+        context.set("l10n", "valeur");
+        UnifiedJEXL.Template tpFR = tl10n.prepare(context);
+        context.set("l10n", "value");
+        UnifiedJEXL.Template tpEN = tl10n.prepare(context);
+        context.set("l10n", null);
+        
+        StringWriter strw;
+        strw = new StringWriter();
+        tpFR.evaluate(context, strw, args);
+        String outFR = strw.toString();
+        assertEquals("valeur=42\n", outFR);
+        
+        context.set("l10n", null);
+        strw = new StringWriter();
+        tpEN.evaluate(context, strw, args);
+        String outEN = strw.toString();
+        assertEquals("value=42\n", outEN);
+    }
+
+    public void test42() throws Exception {
+        String test42 =
+                  "$$ for(var x : list) {\n"
+                + "$$   if (x == 42) {\n"
+                + "Life, the universe, and everything\n"
+                + "$$   } else if (x > 42) {\n"
+                + "The value ${x} is over fourty-two\n"
+                + "$$   } else {\n"
+                + "The value ${x} is under fourty-two\n"
+                + "$$   }\n"
+                + "$$ }\n";
+        UnifiedJEXL.Template t = EL.createTemplate("$$", new StringReader(test42), "list");
+        StringWriter strw = new StringWriter();
+        int[] list = {1, 3, 5, 42, 169};
+        t.evaluate(context, strw, list);
+        String output = strw.toString();
+        String out42 =
+                  "The value 1 is under fourty-two\n"
+                + "The value 3 is under fourty-two\n"
+                + "The value 5 is under fourty-two\n"
+                + "Life, the universe, and everything\n"
+                + "The value 169 is over fourty-two\n";
+        assertEquals(out42, output);
+        
+        String dstr = t.asString();
+        assertNotNull(dstr);
+    }
 }

Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/parser/ParserTest.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/parser/ParserTest.java?rev=1196677&r1=1196676&r2=1196677&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/parser/ParserTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/parser/ParserTest.java Wed Nov  2 16:32:39 2011
@@ -49,21 +49,4 @@ public class ParserTest extends TestCase
         assertNotNull("parsed node is null", sn);
     }
 
-    public void testReadLines() throws Exception {
-        String input = "foo bar\n\rquux\n\r\npizza";
-        StringBuilder output = new StringBuilder(32);
-        int read = StringParser.readLines(output, input, 0, null);
-        assertEquals(input.length(), read);
-        String outstr = output.toString();
-        assertEquals("foo bar quux pizza ", outstr);
-    }
-
-    public void testReadLines$$() throws Exception {
-        String input = "$$foo bar\n\r$$quux\n\r\n$$pizza";
-        StringBuilder output = new StringBuilder(32);
-        int read = StringParser.readLines(output, input, 0, "$$");
-        assertEquals(input.length(), read);
-        String outstr = output.toString();
-        assertEquals("foo bar quux pizza ", outstr);
-    }
 }