| /* |
| * $Id$ |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.commons.ognl.test; |
| |
| import junit.framework.TestCase; |
| import org.apache.commons.ognl.ASTChain; |
| import org.apache.commons.ognl.ASTConst; |
| import org.apache.commons.ognl.ASTProperty; |
| import org.apache.commons.ognl.Ognl; |
| import org.apache.commons.ognl.OgnlContext; |
| import org.apache.commons.ognl.OgnlRuntime; |
| import org.apache.commons.ognl.SimpleNode; |
| import org.apache.commons.ognl.test.objects.BaseGeneric; |
| import org.apache.commons.ognl.test.objects.GameGeneric; |
| import org.apache.commons.ognl.test.objects.GameGenericObject; |
| import org.apache.commons.ognl.test.objects.GenericRoot; |
| import org.apache.commons.ognl.test.objects.Root; |
| |
| import java.util.List; |
| import java.util.Map; |
| |
| import static org.apache.commons.ognl.test.OgnlTestCase.isEqual; |
| |
| /** |
| * Tests functionality of {@link org.apache.commons.ognl.ASTProperty}. |
| */ |
| public class ASTPropertyTest |
| extends TestCase |
| { |
| |
| public void test_Get_Indexed_Property_Type() |
| throws Exception |
| { |
| ASTProperty p = new ASTProperty( 0 ); |
| p.setIndexedAccess( false ); |
| ASTConst pRef = new ASTConst( 0 ); |
| pRef.setValue( "nested" ); |
| pRef.jjtSetParent( p ); |
| p.jjtAddChild( pRef, 0 ); |
| |
| Map root = new Root().getMap(); |
| |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| context.setCurrentNode( pRef ); |
| |
| assertEquals( root.getClass(), context.getCurrentType() ); |
| assertNull(context.getPreviousType()); |
| assertEquals( root, context.getCurrentObject() ); |
| assertNull(context.getCurrentAccessor()); |
| assertNull(context.getPreviousAccessor()); |
| |
| int type = p.getIndexedPropertyType( context, root ); |
| |
| assertEquals( OgnlRuntime.INDEXED_PROPERTY_NONE, type ); |
| assertEquals( root.getClass(), context.getCurrentType() ); |
| assertNull(context.getPreviousType()); |
| assertNull(context.getCurrentAccessor()); |
| assertNull(context.getPreviousAccessor()); |
| } |
| |
| public void test_Get_Value_Body() |
| throws Exception |
| { |
| ASTProperty p = new ASTProperty( 0 ); |
| p.setIndexedAccess( false ); |
| ASTConst pRef = new ASTConst( 0 ); |
| pRef.setValue( "nested" ); |
| pRef.jjtSetParent( p ); |
| p.jjtAddChild( pRef, 0 ); |
| |
| Map root = new Root().getMap(); |
| |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| context.setCurrentNode( pRef ); |
| |
| assertEquals( root.getClass(), context.getCurrentType() ); |
| assertNull(context.getPreviousType()); |
| assertEquals( root, context.getCurrentObject() ); |
| assertNull(context.getCurrentAccessor()); |
| assertNull(context.getPreviousAccessor()); |
| |
| Object value = p.getValue( context, root ); |
| |
| assertEquals( root.get( "nested" ), value ); |
| assertEquals( root.getClass(), context.getCurrentType() ); |
| assertNull(context.getPreviousType()); |
| assertNull(context.getCurrentAccessor()); |
| assertNull(context.getPreviousAccessor()); |
| } |
| |
| public void test_Get_Source() |
| throws Throwable |
| { |
| ASTProperty p = new ASTProperty( 0 ); |
| p.setIndexedAccess( false ); |
| ASTConst pRef = new ASTConst( 0 ); |
| pRef.setValue( "nested" ); |
| pRef.jjtSetParent( p ); |
| p.jjtAddChild( pRef, 0 ); |
| |
| Map root = new Root().getMap(); |
| |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| context.setCurrentNode( pRef ); |
| |
| assertEquals( ".get(\"nested\")", p.toGetSourceString( context, root ) ); |
| assertEquals( Object.class, context.getCurrentType() ); |
| assertEquals( Map.class, context.getCurrentAccessor() ); |
| assertEquals( root.getClass(), context.getPreviousType() ); |
| assertNull(context.getPreviousAccessor()); |
| |
| assertEquals( root.get( "nested" ), context.getCurrentObject() ); |
| |
| assert Map.class.isAssignableFrom( context.getCurrentAccessor() ); |
| |
| assertEquals( root.getClass(), context.getPreviousType() ); |
| assertNull(context.getPreviousAccessor()); |
| } |
| |
| public void test_Set_Source() |
| throws Throwable |
| { |
| ASTProperty p = new ASTProperty( 0 ); |
| p.setIndexedAccess( false ); |
| ASTConst pRef = new ASTConst( 0 ); |
| pRef.setValue( "nested" ); |
| pRef.jjtSetParent( p ); |
| p.jjtAddChild( pRef, 0 ); |
| |
| Map root = new Root().getMap(); |
| |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| context.setCurrentNode( pRef ); |
| |
| assertEquals( ".put(\"nested\", $3)", p.toSetSourceString( context, root ) ); |
| assertEquals( Object.class, context.getCurrentType() ); |
| assertEquals( root.get( "nested" ), context.getCurrentObject() ); |
| |
| assert Map.class.isAssignableFrom( context.getCurrentAccessor() ); |
| |
| assertEquals( root.getClass(), context.getPreviousType() ); |
| assertNull(context.getPreviousAccessor()); |
| } |
| |
| public void test_Indexed_Object_Type() |
| throws Throwable |
| { |
| // ASTChain chain = new ASTChain(0); |
| |
| ASTProperty listp = new ASTProperty( 0 ); |
| listp.setIndexedAccess( false ); |
| // listp.jjtSetParent(chain); |
| |
| ASTConst listc = new ASTConst( 0 ); |
| listc.setValue( "list" ); |
| listc.jjtSetParent( listp ); |
| listp.jjtAddChild( listc, 0 ); |
| |
| // chain.jjtAddChild(listp, 0); |
| |
| ASTProperty p = new ASTProperty( 0 ); |
| p.setIndexedAccess( true ); |
| |
| ASTProperty pindex = new ASTProperty( 0 ); |
| |
| ASTConst pRef = new ASTConst( 0 ); |
| pRef.setValue( "genericIndex" ); |
| pRef.jjtSetParent( pindex ); |
| pindex.jjtAddChild( pRef, 0 ); |
| |
| p.jjtAddChild( pindex, 0 ); |
| // chain.jjtAddChild(p, 1); |
| |
| Root root = new Root(); |
| |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| context.setCurrentNode( listp ); |
| |
| assertEquals( ".getList()", listp.toGetSourceString( context, root ) ); |
| assertEquals( List.class, context.getCurrentType() ); |
| assertEquals( Root.class, context.getCurrentAccessor() ); |
| assertNull(context.getPreviousAccessor()); |
| assertEquals( root.getClass(), context.getPreviousType() ); |
| assertEquals( root.getList(), context.getCurrentObject() ); |
| |
| // re test with chain |
| |
| context = (OgnlContext) Ognl.createDefaultContext( null ); |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| |
| ASTChain chain = new ASTChain( 0 ); |
| listp.jjtSetParent( chain ); |
| chain.jjtAddChild( listp, 0 ); |
| |
| context.setCurrentNode( chain ); |
| |
| assertEquals( ".getList()", chain.toGetSourceString( context, root ) ); |
| assertEquals( List.class, context.getCurrentType() ); |
| assertEquals( Root.class, context.getCurrentAccessor() ); |
| assertNull(context.getPreviousAccessor()); |
| assertEquals( Root.class, context.getPreviousType() ); |
| assertEquals( root.getList(), context.getCurrentObject() ); |
| |
| // test with only getIndex |
| |
| assertEquals( ".get(org.apache.commons.ognl.OgnlOps#getIntValue(((org.apache.commons.ognl.test.objects.Root)$2)..getGenericIndex().toString()))", |
| p.toGetSourceString( context, root.getList() ) ); |
| assertEquals( root.getArray(), context.getCurrentObject() ); |
| assertEquals( Object.class, context.getCurrentType() ); |
| } |
| |
| public void test_Complicated_List() |
| throws Exception |
| { |
| Root root = new Root(); |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| |
| SimpleNode node = |
| (SimpleNode) Ognl.compileExpression( context, |
| root, |
| "{ new org.apache.commons.ognl.test.objects.MenuItem('Home', 'Main', " |
| + "{ new org.apache.commons.ognl.test.objects.MenuItem('Help', 'Help'), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('Contact', 'Contact') }), " // end |
| // first |
| // item |
| + "new org.apache.commons.ognl.test.objects.MenuItem('UserList', getMessages().getMessage('menu.members')), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('account/BetSlipList', getMessages().getMessage('menu.account'), " |
| + "{ new org.apache.commons.ognl.test.objects.MenuItem('account/BetSlipList', 'My Bets'), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('account/TransactionList', 'My Transactions') }), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('About', 'About'), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('admin/Admin', getMessages().getMessage('menu.admin'), " |
| + "{ new org.apache.commons.ognl.test.objects.MenuItem('admin/AddEvent', 'Add event'), " |
| + "new org.apache.commons.ognl.test.objects.MenuItem('admin/AddResult', 'Add result') })}" ); |
| |
| assertTrue( List.class.isAssignableFrom( node.getAccessor().get( context, root ).getClass() ) ); |
| } |
| |
| public void test_Set_Chain_Indexed_Property() |
| throws Exception |
| { |
| Root root = new Root(); |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| |
| SimpleNode node = (SimpleNode) Ognl.parseExpression( "tab.searchCriteriaSelections[index1][index2]" ); |
| node.setValue( context, root, Boolean.FALSE ); |
| } |
| |
| public void test_Set_Generic_Property() |
| throws Exception |
| { |
| GenericRoot root = new GenericRoot(); |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| |
| SimpleNode node = (SimpleNode) Ognl.parseExpression( "cracker.param" ); |
| node.setValue( context, root, "0" ); |
| |
| assertEquals( new Integer( 0 ), root.getCracker().getParam() ); |
| |
| node.setValue( context, root, "10" ); |
| |
| assertEquals( new Integer( 10 ), root.getCracker().getParam() ); |
| } |
| |
| public void test_Get_Generic_Property() |
| throws Exception |
| { |
| GenericRoot root = new GenericRoot(); |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| |
| SimpleNode node = (SimpleNode) Ognl.parseExpression( "cracker.param" ); |
| node.setValue( context, root, "0" ); |
| |
| assertEquals( new Integer( 0 ), node.getValue( context, root ) ); |
| |
| node.setValue( context, root, "10" ); |
| |
| assertEquals( new Integer( 10 ), node.getValue( context, root ) ); |
| } |
| |
| public void test_Set_Get_Multiple_Generic_Types_Property() |
| throws Exception |
| { |
| BaseGeneric<GameGenericObject, Long> root = new GameGeneric(); |
| OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); |
| |
| context.setRoot( root ); |
| context.setCurrentObject( root ); |
| |
| SimpleNode node = (SimpleNode) Ognl.parseExpression( "ids" ); |
| node.setValue( context, root, new String[] { "0", "20", "43" } ); |
| |
| isEqual( new Long[] { new Long( 0 ), new Long( 20 ), new Long( 43 ) }, root.getIds() ); |
| isEqual( node.getValue( context, root ), root.getIds() ); |
| } |
| } |