001    package org.apache.tapestry.enhance;
002    
003    import ognl.Node;
004    import ognl.Ognl;
005    import ognl.OgnlContext;
006    import org.apache.tapestry.TestBase;
007    import org.apache.tapestry.services.impl.HiveMindExpressionCompiler;
008    import org.testng.annotations.Test;
009    
010    /**
011     * Tests functionality of {@link org.apache.tapestry.services.impl.HiveMindExpressionCompiler}.
012     */
013    @Test
014    public class TestHiveMindExpressionCompiler extends TestBase {
015    
016        ClassFactoryImpl _classFactory = new ClassFactoryImpl();
017        HiveMindExpressionCompiler _compiler = new HiveMindExpressionCompiler(_classFactory);
018    
019        public void test_Duplicate_Class_Compiler()
020        throws Exception
021        {
022            OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
023            BasicObject root = new BasicObject();
024            String expr = "name";
025            Node expression = (Node) Ognl.parseExpression(expr);
026    
027            _compiler.compileExpression(context, expression, root);
028            assert expression.getAccessor() != null;
029            assertEquals(expression.getAccessor().get(context, root), root.getName());
030    
031            Node expression2 = (Node) Ognl.parseExpression(expr);
032            
033            _compiler.compileExpression(context, expression2, root);
034            assert expression2.getAccessor() != null;
035            assertEquals(expression2.getAccessor().get(context, root), root.getName());
036    
037            assertNotSame(expression2.getAccessor().getClass().getName(), expression.getAccessor().getClass().getName());
038        }
039    
040        public void test_Divide_By_Zero()
041        throws Exception
042        {
043            OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
044            String expr = "true ? 1 : 1/0";
045    
046            Node expression = (Node) Ognl.parseExpression(expr);
047            _compiler.compileExpression(context, expression, expr);
048            
049            assertEquals(expression.getAccessor().get(context, null), Integer.valueOf(1));
050        }
051    
052        public void test_ClassFab_Generation_Count_With_Uncompilable_Expression()
053                throws Exception
054        {
055            OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
056            BasicObject root = new BasicObject();
057    
058            String exprStr = "user != null && user.name != null ? user.name : name";
059            Node expression = (Node) Ognl.parseExpression(exprStr);
060    
061            int prevCount = _classFactory._classCounter;
062    
063            _compiler.compileExpression(context, expression, root);
064            assert expression.getAccessor() == null;
065    
066            assertEquals(_classFactory._classCounter, prevCount);
067    
068            root.setUser(new User());
069    
070            _compiler.compileExpression(context, expression, root);
071            assert expression.getAccessor() != null;
072    
073            assertEquals(_classFactory._classCounter, prevCount + 1);
074        }
075    
076        public void test_ClassFab_Generation_Count_With_Uncompilable_Expression2()
077                throws Exception
078        {
079            OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
080            BasicObject root = new BasicObject();
081    
082            String exprStr = "user ? user.name : name";
083            Node expression = (Node) Ognl.parseExpression(exprStr);
084    
085            int prevCount = _classFactory._classCounter;
086    
087            _compiler.compileExpression(context, expression, root);
088            assert expression.getAccessor() == null;
089    
090            assertEquals(_classFactory._classCounter, prevCount);
091    
092            root.setUser(new User());
093    
094            _compiler.compileExpression(context, expression, root);
095            assert expression.getAccessor() != null;
096    
097            assertEquals(_classFactory._classCounter, prevCount + 1);
098        }
099    }