/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed 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 xmlcursor.xpath.common;

import org.junit.Before;
import org.junit.Ignore;
import xmlcursor.common.BasicCursorTestCase;

import java.util.HashMap;

@Ignore("abstract class")
public abstract class BaseXPathTest extends BasicCursorTestCase {
    protected final HashMap<String,String[]> testMap = new HashMap<String,String[]>();

    @Before
    public void setUp() throws Exception {
        String[] add = new String[]{"//price[position()=0+1]"};
        String[] sub = new String[]{"//price[position()=4-2]"};
        String[] mult = new String[]{"//price[position()=2*1]"};
        String[] div = new String[]{
            "//price[ position()= last() div 2 ]",
            "//price[ position()= 4 div 2 ]",
            "//price[ position()=10 div 0 ]",
            "//price[position()=round(22 div 7)-1]"
        };

        String[] mod = new String[]{
            "//price[ position() mod 2 = 0 ]",
            "//price[position() = 5 mod 3]"
        };

        String[] eq = new String[]{"//bar[price=5.00]"};

        String[] eq_ns = new String[]{"//bar[price=3]"};

        String[] neq = new String[]{"//bar[price!=3]"};

        String[] lt = new String[]{"//bar[price < 2 ]"};
        String[] lteq = new String[]{"//bar[price <=2 ]"};

        String[] gt = new String[]{"//bar[price > 2 ]"};

        String[] gteq = new String[]{"//bar[price >= 2 ]"};

        String[] or = new String[]{"//price[text()>3 or @at=\"val1\"]"};

        String[] and = new String[]{"//price[text()>2 and @at=\"val1\"]"};

        testMap.put("testAddition", add);
        testMap.put("testSubtraction", sub);
        testMap.put("testMultiplication", mult);
        testMap.put("testDiv", div);
        testMap.put("testMod", mod);
        testMap.put("testEqual", eq);
        testMap.put("testEqualityNodeset", eq_ns);
        testMap.put("testNotEqual", neq);
        testMap.put("testLessThan", lt);
        testMap.put("testLessOrEqual", lteq);
        testMap.put("testGreaterThan", gt);
        testMap.put("testGreaterOrEqual", gteq);
        testMap.put("testOr", or);
        testMap.put("testAnd", and);

        testMap.put("testFunctionId", new String[]{
            "id(\"bobdylan\")",
            "id(\"foobar\")",
            "id(\"*\")/child::cd[position()=3]"});

        testMap.put("testFunctionLast", new String[]{
            "/catalog/cd[last()]"});

        testMap.put("testFunctionNamespaceURI", new String[]{
            "//*[namespace-uri(.)=\"uri.org\"]"});

        testMap.put("testFunctionNumber", new String[]{
            "/foo/bar[number(price)+1=4]"});

        testMap.put("testFunctionRound", new String[]{
            "//bar//*[round(text())=3]"});

        testMap.put("testFunctionSum", new String[]{
            "//bar[position()=sum(price)-4]"});

        testMap.put("testFunctionBoolean", new String[]{
            "/foo[boolean(.//@at)]"});

        testMap.put("testFunctionFalse", new String[]{
            "//foo[boolean(price)=false()]"});

        testMap.put("testFunctionLang", new String[]{
            "//price[xf:lang(\"en\")=true()]",
            "//foo[xf:lang(\"en\")=true()]"});

        testMap.put("testFunctionTrue", new String[]{
            "//*[xf:boolean(@at)=true()]"});
    }

    public abstract String getQuery(String testName, int testCase);
}
