001    /*
002     * $Id: IndexedPropertyTest.java 1104080 2011-05-17 09:22:09Z 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 org.apache.commons.ognl.test.objects.Indexed;
023    import org.apache.commons.ognl.test.objects.Root;
024    import org.junit.runner.RunWith;
025    import org.junit.runners.Parameterized;
026    import org.junit.runners.Parameterized.Parameters;
027    
028    import java.util.ArrayList;
029    import java.util.Collection;
030    
031    @RunWith(value = Parameterized.class)
032    public class IndexedPropertyTest
033        extends OgnlTestCase
034    {
035    
036        private static Indexed INDEXED = new Indexed();
037    
038        private static Root ROOT = new Root();
039    
040        private static Object[][] TESTS = {
041            // Indexed properties
042            { INDEXED, "getValues", INDEXED.getValues() }, // gets String[]
043            { INDEXED, "[\"values\"]", INDEXED.getValues() }, // String[]
044            { INDEXED.getValues(), "[0]", INDEXED.getValues()[0] }, // "foo"
045            { INDEXED, "getValues()[0]", INDEXED.getValues()[0] }, // "foo" directly from array
046            { INDEXED, "values[0]", INDEXED.getValues( 0 ) }, // "foo" + "xxx"
047            { INDEXED, "values[^]", INDEXED.getValues( 0 ) }, // "foo" + "xxx"
048            { INDEXED, "values[|]", INDEXED.getValues( 1 ) }, // "bar" + "xxx"
049            { INDEXED, "values[$]", INDEXED.getValues( 2 ) }, // "baz" + "xxx"
050            { INDEXED, "values[1]", "bar" + "xxx", "xxxx" + "xxx", "xxxx" + "xxx" }, // set through setValues(int, String)
051            { INDEXED, "values[1]", "xxxx" + "xxx" }, // getValues(int) again to check if setValues(int, String) was called
052            { INDEXED, "setValues(2, \"xxxx\")", null }, // was "baz" -> "xxxx"
053            { INDEXED, "getTitle(list.size)", "Title count 3" }, { INDEXED, "source.total", 1 },
054            { ROOT, "indexer.line[index]", "line:1" }, { INDEXED, "list[2].longValue()", (long) 3 },
055            { ROOT, "map.value.id", (long) 1 }, { INDEXED, "property['hoodak']", null, "random string", "random string" } };
056    
057        /*
058         * =================================================================== Public static methods
059         * ===================================================================
060         */
061        @Parameters
062        public static Collection<Object[]> data()
063        {
064            Collection<Object[]> data = new ArrayList<Object[]>(TESTS.length);
065            for ( int i = 0; i < TESTS.length; i++ )
066            {
067                Object[] tmp = new Object[6];
068                tmp[0] = TESTS[i][1];
069                tmp[1] = TESTS[i][0];
070                tmp[2] = TESTS[i][1];
071    
072                switch ( TESTS[i].length )
073                {
074                    case 3:
075                        tmp[3] = TESTS[i][2];
076                        break;
077    
078                    case 4:
079                        tmp[3] = TESTS[i][2];
080                        tmp[4] = TESTS[i][3];
081                        break;
082    
083                    case 5:
084                        tmp[3] = TESTS[i][2];
085                        tmp[4] = TESTS[i][3];
086                        tmp[5] = TESTS[i][4];
087                        break;
088    
089                    default:
090                        throw new RuntimeException( "don't understand TEST format with length " + TESTS[i].length );
091                }
092    
093                data.add( tmp );
094            }
095            return data;
096        }
097    
098        /*
099         * =================================================================== Constructors
100         * ===================================================================
101         */
102        public IndexedPropertyTest( String name, Object root, String expressionString, Object expectedResult,
103                                    Object setValue, Object expectedAfterSetResult )
104        {
105            super( name, root, expressionString, expectedResult, setValue, expectedAfterSetResult );
106        }
107    }