001    /*
002     * $Id: OgnlTestCase.java 1188000 2011-10-23 23:10:24Z mcucchiara $
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.Assert;
023    import org.apache.commons.ognl.Ognl;
024    import org.apache.commons.ognl.OgnlContext;
025    import org.apache.commons.ognl.SimpleNode;
026    import org.junit.Before;
027    import org.junit.Test;
028    
029    import java.io.PrintWriter;
030    import java.io.StringWriter;
031    import java.lang.reflect.Array;
032    
033    public abstract class OgnlTestCase
034    {
035    
036        protected OgnlContext _context;
037    
038        private String _expressionString;
039    
040        private SimpleNode _expression;
041    
042        private Object _expectedResult;
043    
044        private Object _root;
045    
046        protected boolean _compileExpressions = true;
047    
048        private boolean hasSetValue;
049    
050        private Object setValue;
051    
052        private boolean hasExpectedAfterSetResult;
053    
054        private Object expectedAfterSetResult;
055    
056        /*
057         * =================================================================== Public static methods
058         * ===================================================================
059         */
060    
061        /**
062         * Returns true if object1 is equal to object2 in either the sense that they are the same object or, if both are
063         * non-null if they are equal in the <CODE>equals()</CODE> sense.
064         */
065        public static boolean isEqual(Object object1, Object object2) {
066            boolean result = false;
067    
068            if (object1 == object2) {
069                result = true;
070            } else {
071                if ((object1 != null) && object1.getClass().isArray()) {
072                    if ((object2 != null) && object2.getClass().isArray() && (object2.getClass() == object1.getClass())) {
073                        result = (Array.getLength(object1) == Array.getLength(object2));
074                        if (result) {
075                            for (int i = 0, icount = Array.getLength(object1); result && (i < icount); i++) {
076                                result = isEqual(Array.get(object1, i), Array.get(object2, i));
077                            }
078                        }
079                    }
080                } else {
081                    result = (object1 != null) && (object2 != null) && object1.equals(object2);
082                }
083            }
084            return result;
085        }
086    
087        /*
088         * =================================================================== Constructors
089         * ===================================================================
090         */
091        public OgnlTestCase(String name, Object root, String expressionString, Object expectedResult)
092        {
093            this( name, root, expressionString, expectedResult, null, false, null, false);
094        }
095    
096        public OgnlTestCase( String name, Object root, String expressionString, Object expectedResult, Object setValue,
097                             Object expectedAfterSetResult )
098        {
099            this( name, root, expressionString, expectedResult, setValue, setValue != null, expectedAfterSetResult,
100                  expectedAfterSetResult != null );
101        }
102    
103        public OgnlTestCase( String name, Object root, String expressionString, Object expectedResult, Object setValue,
104                             boolean hasSetValue, Object expectedAfterSetResult, boolean hasExpectedAfterSetResult )
105        {
106            this._root = root;
107            this._expressionString = expressionString;
108            this._expectedResult = expectedResult;
109    
110            this.hasExpectedAfterSetResult = hasExpectedAfterSetResult;
111            this.expectedAfterSetResult = expectedAfterSetResult;
112            this.hasSetValue = hasSetValue;
113            this.setValue = setValue;
114    
115        }
116    
117        /*
118         * =================================================================== Public methods
119         * ===================================================================
120         */
121        public String getExpressionDump(SimpleNode node) {
122            StringWriter writer = new StringWriter();
123    
124            node.dump(new PrintWriter(writer), "   ");
125            return writer.toString();
126        }
127    
128        public String getExpressionString() {
129            return _expressionString;
130        }
131    
132        public SimpleNode getExpression()
133                throws Exception {
134            if (_expression == null) {
135                _expression = (SimpleNode) Ognl.parseExpression(_expressionString);
136            }
137    
138            if (_compileExpressions) {
139                _expression = (SimpleNode) Ognl.compileExpression(_context, _root, _expressionString);
140            }
141    
142            return _expression;
143        }
144    
145        public Object getExpectedResult() {
146            return _expectedResult;
147        }
148    
149        public static void assertEquals(Object expected, Object actual) {
150            if (expected != null && expected.getClass().isArray() && actual != null && actual.getClass().isArray()) {
151    
152                Assert.assertEquals(Array.getLength(expected), Array.getLength(actual));
153    
154                int length = Array.getLength(expected);
155    
156                for (int i = 0; i < length; i++) {
157                    Object aexpected = Array.get(expected, i);
158                    Object aactual = Array.get(actual, i);
159    
160                    if (aexpected != null && aactual != null && Boolean.class.isAssignableFrom(aexpected.getClass())) {
161                        Assert.assertEquals(aexpected.toString(), aactual.toString());
162                    } else
163                        OgnlTestCase.assertEquals(aexpected, aactual);
164                }
165            } else if (expected != null && actual != null && Character.class.isInstance(expected)
166                    && Character.class.isInstance(actual)) {
167    
168                Assert.assertEquals(((Character) expected).charValue(), ((Character) actual).charValue());
169            } else {
170    
171                Assert.assertEquals(expected, actual);
172            }
173        }
174    
175        /*
176         * =================================================================== Overridden methods
177         * ===================================================================
178         */
179        @Test
180        public void runTest()
181                throws Exception {
182            Object testedResult = null;
183    
184            try {
185                SimpleNode expr;
186    
187                testedResult = _expectedResult;
188                expr = getExpression();
189    
190                assertEquals(_expectedResult, Ognl.getValue(expr, _context, _root));
191    
192                if (hasSetValue) {
193                    testedResult = hasExpectedAfterSetResult ? expectedAfterSetResult : setValue;
194                    Ognl.setValue(expr, _context, _root, setValue);
195    
196                    assertEquals(testedResult, Ognl.getValue(expr, _context, _root));
197                }
198    
199            } catch (Exception ex) {
200                if (RuntimeException.class.isInstance(ex) && ex.getCause() != null
201                        && Exception.class.isAssignableFrom( ex.getCause().getClass())) {
202                    ex = (Exception) ex.getCause( );
203                }
204    
205                if (testedResult instanceof Class) {
206                    Assert.assertTrue(Exception.class.isAssignableFrom((Class) testedResult));
207                } else {
208                    throw ex;
209                }
210            }
211        }
212    
213        @Before
214        public void setUp() {
215            _context = (OgnlContext) Ognl.createDefaultContext(null);
216        }
217    }