001 /* 002 * $Id: ASTPropertyTest.java 1103095 2011-05-14 13:18:29Z simonetripodi $ 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 */ 020 package org.apache.commons.ognl.test; 021 022 import junit.framework.TestCase; 023 import org.apache.commons.ognl.ASTChain; 024 import org.apache.commons.ognl.ASTConst; 025 import org.apache.commons.ognl.ASTProperty; 026 import org.apache.commons.ognl.Ognl; 027 import org.apache.commons.ognl.OgnlContext; 028 import org.apache.commons.ognl.OgnlRuntime; 029 import org.apache.commons.ognl.SimpleNode; 030 import org.apache.commons.ognl.test.objects.BaseGeneric; 031 import org.apache.commons.ognl.test.objects.GameGeneric; 032 import org.apache.commons.ognl.test.objects.GameGenericObject; 033 import org.apache.commons.ognl.test.objects.GenericRoot; 034 import org.apache.commons.ognl.test.objects.Root; 035 036 import java.util.List; 037 import java.util.Map; 038 039 import static org.apache.commons.ognl.test.OgnlTestCase.isEqual; 040 041 /** 042 * Tests functionality of {@link org.apache.commons.ognl.ASTProperty}. 043 */ 044 public class ASTPropertyTest 045 extends TestCase 046 { 047 048 public void test_Get_Indexed_Property_Type() 049 throws Exception 050 { 051 ASTProperty p = new ASTProperty( 0 ); 052 p.setIndexedAccess( false ); 053 ASTConst pRef = new ASTConst( 0 ); 054 pRef.setValue( "nested" ); 055 pRef.jjtSetParent( p ); 056 p.jjtAddChild( pRef, 0 ); 057 058 Map root = new Root().getMap(); 059 060 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 061 context.setRoot( root ); 062 context.setCurrentObject( root ); 063 context.setCurrentNode( pRef ); 064 065 assertEquals( root.getClass(), context.getCurrentType() ); 066 assertEquals( null, context.getPreviousType() ); 067 assertEquals( root, context.getCurrentObject() ); 068 assertEquals( null, context.getCurrentAccessor() ); 069 assertEquals( null, context.getPreviousAccessor() ); 070 071 int type = p.getIndexedPropertyType( context, root ); 072 073 assertEquals( OgnlRuntime.INDEXED_PROPERTY_NONE, type ); 074 assertEquals( root.getClass(), context.getCurrentType() ); 075 assertEquals( null, context.getPreviousType() ); 076 assertEquals( null, context.getCurrentAccessor() ); 077 assertEquals( null, context.getPreviousAccessor() ); 078 } 079 080 public void test_Get_Value_Body() 081 throws Exception 082 { 083 ASTProperty p = new ASTProperty( 0 ); 084 p.setIndexedAccess( false ); 085 ASTConst pRef = new ASTConst( 0 ); 086 pRef.setValue( "nested" ); 087 pRef.jjtSetParent( p ); 088 p.jjtAddChild( pRef, 0 ); 089 090 Map root = new Root().getMap(); 091 092 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 093 context.setRoot( root ); 094 context.setCurrentObject( root ); 095 context.setCurrentNode( pRef ); 096 097 assertEquals( root.getClass(), context.getCurrentType() ); 098 assertEquals( null, context.getPreviousType() ); 099 assertEquals( root, context.getCurrentObject() ); 100 assertEquals( null, context.getCurrentAccessor() ); 101 assertEquals( null, context.getPreviousAccessor() ); 102 103 Object value = p.getValue( context, root ); 104 105 assertEquals( root.get( "nested" ), value ); 106 assertEquals( root.getClass(), context.getCurrentType() ); 107 assertEquals( null, context.getPreviousType() ); 108 assertEquals( null, context.getCurrentAccessor() ); 109 assertEquals( null, context.getPreviousAccessor() ); 110 } 111 112 public void test_Get_Source() 113 throws Throwable 114 { 115 ASTProperty p = new ASTProperty( 0 ); 116 p.setIndexedAccess( false ); 117 ASTConst pRef = new ASTConst( 0 ); 118 pRef.setValue( "nested" ); 119 pRef.jjtSetParent( p ); 120 p.jjtAddChild( pRef, 0 ); 121 122 Map root = new Root().getMap(); 123 124 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 125 context.setRoot( root ); 126 context.setCurrentObject( root ); 127 context.setCurrentNode( pRef ); 128 129 assertEquals( ".get(\"nested\")", p.toGetSourceString( context, root ) ); 130 assertEquals( Object.class, context.getCurrentType() ); 131 assertEquals( Map.class, context.getCurrentAccessor() ); 132 assertEquals( root.getClass(), context.getPreviousType() ); 133 assertEquals( null, context.getPreviousAccessor() ); 134 135 assertEquals( root.get( "nested" ), context.getCurrentObject() ); 136 137 assert Map.class.isAssignableFrom( context.getCurrentAccessor() ); 138 139 assertEquals( root.getClass(), context.getPreviousType() ); 140 assertEquals( null, context.getPreviousAccessor() ); 141 } 142 143 public void test_Set_Source() 144 throws Throwable 145 { 146 ASTProperty p = new ASTProperty( 0 ); 147 p.setIndexedAccess( false ); 148 ASTConst pRef = new ASTConst( 0 ); 149 pRef.setValue( "nested" ); 150 pRef.jjtSetParent( p ); 151 p.jjtAddChild( pRef, 0 ); 152 153 Map root = new Root().getMap(); 154 155 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 156 context.setRoot( root ); 157 context.setCurrentObject( root ); 158 context.setCurrentNode( pRef ); 159 160 assertEquals( ".put(\"nested\", $3)", p.toSetSourceString( context, root ) ); 161 assertEquals( Object.class, context.getCurrentType() ); 162 assertEquals( root.get( "nested" ), context.getCurrentObject() ); 163 164 assert Map.class.isAssignableFrom( context.getCurrentAccessor() ); 165 166 assertEquals( root.getClass(), context.getPreviousType() ); 167 assertEquals( null, context.getPreviousAccessor() ); 168 } 169 170 public void test_Indexed_Object_Type() 171 throws Throwable 172 { 173 // ASTChain chain = new ASTChain(0); 174 175 ASTProperty listp = new ASTProperty( 0 ); 176 listp.setIndexedAccess( false ); 177 // listp.jjtSetParent(chain); 178 179 ASTConst listc = new ASTConst( 0 ); 180 listc.setValue( "list" ); 181 listc.jjtSetParent( listp ); 182 listp.jjtAddChild( listc, 0 ); 183 184 // chain.jjtAddChild(listp, 0); 185 186 ASTProperty p = new ASTProperty( 0 ); 187 p.setIndexedAccess( true ); 188 189 ASTProperty pindex = new ASTProperty( 0 ); 190 191 ASTConst pRef = new ASTConst( 0 ); 192 pRef.setValue( "genericIndex" ); 193 pRef.jjtSetParent( pindex ); 194 pindex.jjtAddChild( pRef, 0 ); 195 196 p.jjtAddChild( pindex, 0 ); 197 // chain.jjtAddChild(p, 1); 198 199 Root root = new Root(); 200 201 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 202 context.setRoot( root ); 203 context.setCurrentObject( root ); 204 context.setCurrentNode( listp ); 205 206 assertEquals( ".getList()", listp.toGetSourceString( context, root ) ); 207 assertEquals( List.class, context.getCurrentType() ); 208 assertEquals( Root.class, context.getCurrentAccessor() ); 209 assertEquals( null, context.getPreviousAccessor() ); 210 assertEquals( root.getClass(), context.getPreviousType() ); 211 assertEquals( root.getList(), context.getCurrentObject() ); 212 213 // re test with chain 214 215 context = (OgnlContext) Ognl.createDefaultContext( null ); 216 context.setRoot( root ); 217 context.setCurrentObject( root ); 218 219 ASTChain chain = new ASTChain( 0 ); 220 listp.jjtSetParent( chain ); 221 chain.jjtAddChild( listp, 0 ); 222 223 context.setCurrentNode( chain ); 224 225 assertEquals( ".getList()", chain.toGetSourceString( context, root ) ); 226 assertEquals( List.class, context.getCurrentType() ); 227 assertEquals( Root.class, context.getCurrentAccessor() ); 228 assertEquals( null, context.getPreviousAccessor() ); 229 assertEquals( Root.class, context.getPreviousType() ); 230 assertEquals( root.getList(), context.getCurrentObject() ); 231 232 // test with only getIndex 233 234 assertEquals( ".get(org.apache.commons.ognl.OgnlOps#getIntValue(((org.apache.commons.ognl.test.objects.Root)$2)..getGenericIndex().toString()))", 235 p.toGetSourceString( context, root.getList() ) ); 236 assertEquals( root.getArray(), context.getCurrentObject() ); 237 assertEquals( Object.class, context.getCurrentType() ); 238 } 239 240 public void test_Complicated_List() 241 throws Exception 242 { 243 Root root = new Root(); 244 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 245 246 SimpleNode node = 247 (SimpleNode) Ognl.compileExpression( context, 248 root, 249 "{ new org.apache.commons.ognl.test.objects.MenuItem('Home', 'Main', " 250 + "{ new org.apache.commons.ognl.test.objects.MenuItem('Help', 'Help'), " 251 + "new org.apache.commons.ognl.test.objects.MenuItem('Contact', 'Contact') }), " // end 252 // first 253 // item 254 + "new org.apache.commons.ognl.test.objects.MenuItem('UserList', getMessages().getMessage('menu.members')), " 255 + "new org.apache.commons.ognl.test.objects.MenuItem('account/BetSlipList', getMessages().getMessage('menu.account'), " 256 + "{ new org.apache.commons.ognl.test.objects.MenuItem('account/BetSlipList', 'My Bets'), " 257 + "new org.apache.commons.ognl.test.objects.MenuItem('account/TransactionList', 'My Transactions') }), " 258 + "new org.apache.commons.ognl.test.objects.MenuItem('About', 'About'), " 259 + "new org.apache.commons.ognl.test.objects.MenuItem('admin/Admin', getMessages().getMessage('menu.admin'), " 260 + "{ new org.apache.commons.ognl.test.objects.MenuItem('admin/AddEvent', 'Add event'), " 261 + "new org.apache.commons.ognl.test.objects.MenuItem('admin/AddResult', 'Add result') })}" ); 262 263 assertTrue( List.class.isAssignableFrom( node.getAccessor().get( context, root ).getClass() ) ); 264 } 265 266 public void test_Set_Chain_Indexed_Property() 267 throws Exception 268 { 269 Root root = new Root(); 270 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 271 272 context.setRoot( root ); 273 context.setCurrentObject( root ); 274 275 SimpleNode node = (SimpleNode) Ognl.parseExpression( "tab.searchCriteriaSelections[index1][index2]" ); 276 node.setValue( context, root, Boolean.FALSE ); 277 } 278 279 public void test_Set_Generic_Property() 280 throws Exception 281 { 282 GenericRoot root = new GenericRoot(); 283 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 284 285 context.setRoot( root ); 286 context.setCurrentObject( root ); 287 288 SimpleNode node = (SimpleNode) Ognl.parseExpression( "cracker.param" ); 289 node.setValue( context, root, "0" ); 290 291 assertEquals( new Integer( 0 ), root.getCracker().getParam() ); 292 293 node.setValue( context, root, "10" ); 294 295 assertEquals( new Integer( 10 ), root.getCracker().getParam() ); 296 } 297 298 public void test_Get_Generic_Property() 299 throws Exception 300 { 301 GenericRoot root = new GenericRoot(); 302 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 303 304 context.setRoot( root ); 305 context.setCurrentObject( root ); 306 307 SimpleNode node = (SimpleNode) Ognl.parseExpression( "cracker.param" ); 308 node.setValue( context, root, "0" ); 309 310 assertEquals( new Integer( 0 ), node.getValue( context, root ) ); 311 312 node.setValue( context, root, "10" ); 313 314 assertEquals( new Integer( 10 ), node.getValue( context, root ) ); 315 } 316 317 public void test_Set_Get_Multiple_Generic_Types_Property() 318 throws Exception 319 { 320 BaseGeneric<GameGenericObject, Long> root = new GameGeneric(); 321 OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null ); 322 323 context.setRoot( root ); 324 context.setCurrentObject( root ); 325 326 SimpleNode node = (SimpleNode) Ognl.parseExpression( "ids" ); 327 node.setValue( context, root, new String[] { "0", "20", "43" } ); 328 329 isEqual( new Long[] { new Long( 0 ), new Long( 20 ), new Long( 43 ) }, root.getIds() ); 330 isEqual( node.getValue( context, root ), root.getIds() ); 331 } 332 }