You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by br...@apache.org on 2005/10/19 12:27:48 UTC

svn commit: r326519 - in /incubator/jdo/trunk/tck20/test: conf/ java/org/apache/jdo/tck/pc/mylib/ java/org/apache/jdo/tck/query/ java/org/apache/jdo/tck/query/jdoql/methods/ testdata/org/apache/jdo/tck/pc/mylib/

Author: brazil
Date: Wed Oct 19 03:27:35 2005
New Revision: 326519

URL: http://svn.apache.org/viewcvs?rev=326519&view=rev
Log:
JDO-159: Implement new JDO 2 query tests cases concerning new supported methods.

Added:
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/MylibReader.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedJDOHelperMethods.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMapMethods.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMathMethods.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedStringMethods.java
    incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/
    incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml
Modified:
    incubator/jdo/trunk/tck20/test/conf/alltests.conf
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/PrimitiveTypes.java
    incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java

Modified: incubator/jdo/trunk/tck20/test/conf/alltests.conf
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/conf/alltests.conf?rev=326519&r1=326518&r2=326519&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/conf/alltests.conf (original)
+++ incubator/jdo/trunk/tck20/test/conf/alltests.conf Wed Oct 19 03:27:35 2005
@@ -314,6 +314,10 @@
 org.apache.jdo.tck.query.jdoql.methods.MethodsAndObjectConstructionNotSupported \
 org.apache.jdo.tck.query.jdoql.methods.StartsWithAndEndsWith \
 org.apache.jdo.tck.query.jdoql.methods.SupportedCollectionMethods \
+org.apache.jdo.tck.query.jdoql.methods.SupportedJDOHelperMethods \
+org.apache.jdo.tck.query.jdoql.methods.SupportedMapMethods \
+org.apache.jdo.tck.query.jdoql.methods.SupportedMathMethods \
+org.apache.jdo.tck.query.jdoql.methods.SupportedStringMethods \
 org.apache.jdo.tck.query.jdoql.operators.BinaryAddition \
 org.apache.jdo.tck.query.jdoql.operators.BinarySubtraction \
 org.apache.jdo.tck.query.jdoql.operators.BitwiseComplement \

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/MylibReader.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/MylibReader.java?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/MylibReader.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/MylibReader.java Wed Oct 19 03:27:35 2005
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2005 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 org.apache.jdo.tck.pc.mylib;
+
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.springframework.beans.propertyeditors.CustomDateEditor;
+import org.springframework.beans.factory.xml.XmlBeanFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.InputStreamResource;
+
+/**
+ * Utility class to create a mylib instances from an xml
+ * representation. 
+ */
+public class MylibReader extends XmlBeanFactory {
+
+    /** The format of date values in the xml representation */
+    public static final String DATE_PATTERN = "d/MMM/yyyy";
+
+    /** The name of the root list bean. */
+    public static final String ROOT_LIST_NAME = "root";
+
+    /** Teardown classes 
+     */
+    private static final Class[] tearDownClasses = new Class[] {
+        PrimitiveTypes.class
+    };
+    
+    /** 
+     * Create a MylibReader for the specified resourceName. 
+     * @param resourceName the name of the resource
+     */
+    public MylibReader(String resourceName) {
+        // Use the class loader of the PrimitiveTypes class to find the resource
+        this(resourceName, PrimitiveTypes.class.getClassLoader());
+    }
+
+    /** 
+     * Create a MylibReader for the specified resourceName. 
+     * @param resourceName the name of the resource
+     */
+    public MylibReader(String resourceName, ClassLoader classLoader) {
+        super(new ClassPathResource(resourceName, classLoader));
+        configureFactory();
+    }
+
+    /**
+     * Create a MylibReader for the specified InputStream.
+     * @param stream the input stream
+     */
+    public MylibReader(InputStream stream) {
+        super(new InputStreamResource(stream));
+        configureFactory();
+    }
+
+    /** 
+     * Returns a list of root objects. The method expects to find a bean
+     * called "root" of type list in the xml and returns it.
+     * @return a list of root instances
+     */
+    public List getRootList() {
+        return (List)getBean(ROOT_LIST_NAME);
+    }
+    
+    /** 
+     * Configure the MylibReader, e.g. register CustomEditor classes
+     * to convert the string representation of a property into an instance
+     * of the right type.
+     */
+    private void configureFactory() {
+        SimpleDateFormat formatter = new SimpleDateFormat(DATE_PATTERN, Locale.US);
+        formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
+        CustomDateEditor dateEditor = 
+            new CustomDateEditor(formatter, true);
+        registerCustomEditor(Date.class, dateEditor);
+    }
+    
+    // Convenience methods
+
+    /** 
+     * Convenience method returning an Address instance for the specified
+     * name. The method returns <code>null</code> if there is no Address
+     * bean with the specified name. 
+     * @param name the name of the bean to return.
+     * @return the instance of the bean or <code>null</code> if there no
+     * Address bean.
+     */
+    public PrimitiveTypes getPrimitiveTypes(String name) {
+        return (PrimitiveTypes)getBean(name, PrimitiveTypes.class);
+    }
+
+    /**
+     * @return Returns the tearDownClasses.
+     */
+    public static Class[] getTearDownClasses() {
+        return tearDownClasses;
+    }
+}
+

Modified: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/PrimitiveTypes.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/PrimitiveTypes.java?rev=326519&r1=326518&r2=326519&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/PrimitiveTypes.java (original)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/pc/mylib/PrimitiveTypes.java Wed Oct 19 03:27:35 2005
@@ -61,6 +61,74 @@
     public String toString() { 
         return "PrimitiveTypes(" + id + ")";
     }
+    
+    public int hashCode() {
+        int hashCode = 0;
+        hashCode += id;
+        hashCode += booleanNotNull ? 
+                Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode();
+        hashCode += booleanNull != null ? booleanNull.hashCode() : 0;
+        hashCode += byteNotNull;
+        hashCode += byteNull != null ? byteNull.hashCode() : 0;
+        hashCode += shortNotNull;
+        hashCode += shortNull != null ? shortNull.hashCode() : 0;
+        hashCode += intNotNull;
+        hashCode += intNull != null ? intNull.hashCode() : 0;
+        hashCode += longNotNull;
+        hashCode += longNull != null ? longNull.hashCode() : 0;
+        hashCode += floatNotNull;
+        hashCode += floatNull != null ? floatNull.hashCode() : 0;
+        hashCode += doubleNotNull;
+        hashCode += doubleNull != null ? doubleNull.hashCode() : 0;
+        hashCode += charNotNull;
+        hashCode += charNull != null ? charNull.hashCode() : 0;
+        hashCode += dateNull != null ? dateNull.hashCode() : 0;
+        hashCode += stringNull != null ? stringNull.hashCode() : 0;
+        hashCode += bigDecimal != null ? bigDecimal.hashCode() : 0;
+        hashCode += bigInteger != null ? bigDecimal.hashCode() : 0;
+        hashCode += PrimitiveTypes != null ? PrimitiveTypes.hashCode() : 0;
+        return hashCode;
+    }
+
+    public boolean equals(Object o) {
+        PrimitiveTypes p = (PrimitiveTypes) o;
+        if (id != p.id) return false;
+        if (booleanNotNull != p.booleanNotNull) return false;
+        if (booleanNull != null) return booleanNull.equals(p.booleanNull);
+        else if (p.booleanNull != null) return false;
+        if (byteNotNull != p.byteNotNull) return false;
+        if (byteNull != null) return byteNull.equals(p.byteNull);
+        else if (p.byteNull != null) return false;
+        if (shortNotNull != p.shortNotNull) return false;
+        if (shortNull != null) return shortNull.equals(p.shortNull);
+        else if (p.shortNull != null) return false;
+        if (intNotNull != p.intNotNull) return false;
+        if (intNull != null) return intNull.equals(p.intNull);
+        else if (p.intNull != null) return false;
+        if (longNotNull != p.longNotNull) return false;
+        if (longNull != null) return longNull.equals(p.longNull);
+        else if (p.longNull != null) return false;
+        if (floatNotNull != p.floatNotNull) return false;
+        if (floatNull != null) return floatNull.equals(p.floatNull);
+        else if (p.floatNull != null) return false;
+        if (doubleNotNull != p.doubleNotNull) return false;
+        if (doubleNull != null) return doubleNull.equals(p.doubleNull);
+        else if (p.doubleNull != null) return false;
+        if (charNotNull != p.charNotNull) return false;
+        if (charNull != null) return charNull.equals(p.charNull);
+        else if (p.charNull != null) return false;
+        if (dateNull != null) return dateNull.equals(p.dateNull);
+        else if (p.dateNull != null) return false;
+        if (stringNull != null) return stringNull.equals(p.stringNull);
+        else if (p.stringNull != null) return false;
+        if (bigDecimal != null) return bigDecimal.equals(p.bigDecimal);
+        else if (p.bigDecimal != null) return false;
+        if (bigInteger != null) return bigInteger.equals(p.bigInteger);
+        else if (p.bigInteger != null) return false;
+        if (PrimitiveTypes != null) return PrimitiveTypes.equals(p.PrimitiveTypes);
+        else if (p.PrimitiveTypes != null) return false;
+        return true;
+    }
 
     public PrimitiveTypes() {
     }

Modified: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java?rev=326519&r1=326518&r2=326519&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java (original)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java Wed Oct 19 03:27:35 2005
@@ -39,6 +39,7 @@
 import org.apache.jdo.tck.pc.company.Insurance;
 import org.apache.jdo.tck.pc.company.Person;
 import org.apache.jdo.tck.pc.company.Project;
+import org.apache.jdo.tck.pc.mylib.MylibReader;
 import org.apache.jdo.tck.pc.mylib.PCPoint;
 import org.apache.jdo.tck.pc.mylib.PrimitiveTypes;
 
@@ -51,6 +52,10 @@
     public static final String COMPANY_TESTDATA = 
         "org/apache/jdo/tck/pc/company/companyForQueryTests.xml";
 
+    /** */
+    public static final String MYLIB_TESTDATA = 
+        "org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml";
+
     /** 
      * List of inserted instances (see methods insertPCPoints and
      * getFromInserted). 
@@ -136,6 +141,24 @@
         return reader;
     }
     
+    /** 
+     * Reads a graph of company model objects from the specified xml file. This 
+     * methods explictly calls makePersistent for all named instances using the
+     * specified PersistenceManager. The method returns the CompanyModelReader 
+     * instance allowing to access a compay model instance by name.
+     */
+    public MylibReader loadMylib(PersistenceManager pm, String filename) {
+        MylibReader reader = new MylibReader(filename);
+        Transaction tx = pm.currentTransaction();
+        tx.begin();
+        List rootList = (List)reader.getRootList();
+        pm.makePersistentAll(rootList);
+        if (debug) logger.debug("inserted " + rootList);
+        tx.commit();
+        tx = null;
+        return reader;
+    }
+    
     /** */
     public void cleanupCompanyModel(PersistenceManager pm) {
         Transaction tx = pm.currentTransaction();
@@ -157,7 +180,7 @@
     }
     
     /**
-     * Returns an array of company mode instances for beans names 
+     * Returns an array of company model instances for beans names 
      * in the given argument.
      * @param beanNames the bean names of company mode instances.
      * @return the array of company model instances. 
@@ -171,6 +194,21 @@
         return result;
     }
     
+    /**
+     * Returns an array of mylib instances for beans names 
+     * in the given argument.
+     * @param beanNames the bean names of mylib instances.
+     * @return the array of mylib instances. 
+     */
+    protected Object[] getMylibInstances(String[] beanNames) {
+        MylibReader reader = new MylibReader(MYLIB_TESTDATA);
+        Object[] result = new Object[beanNames.length];
+        for (int i = 0; i < beanNames.length; i++) {
+            result[i] = reader.getBean(beanNames[i]);
+        }
+        return result;
+    }
+    
     // PrimitiveTypes helper methods (creation and query)
 
     /** */
@@ -664,21 +702,25 @@
             Query query = asSingleString ?
                     queryElementHolder.getSingleStringQuery(pm) :
                         queryElementHolder.getAPIQuery(pm);
-            result = parameters != null ? 
-                    query.executeWithArray(parameters) : query.execute();
-
-            if (queryElementHolder.isUnique()) {
-                checkUniqueResult(assertion, result, expectedResult[0]);
-            } else if (queryElementHolder.hasOrdering()) {
-                List expectedResultList = 
-                    Arrays.asList(expectedResult);
-                checkQueryResultWithOrder(assertion, result, 
-                        expectedResultList);
-            } else {
-                Collection expectedResultCollection = 
-                    Arrays.asList(expectedResult);
-                checkQueryResultWithoutOrder(assertion, result, 
-                        expectedResultCollection);
+            try {
+                result = parameters != null ? 
+                        query.executeWithArray(parameters) : query.execute();
+    
+                if (queryElementHolder.isUnique()) {
+                    checkUniqueResult(assertion, result, expectedResult[0]);
+                } else if (queryElementHolder.hasOrdering()) {
+                    List expectedResultList = 
+                        Arrays.asList(expectedResult);
+                    checkQueryResultWithOrder(assertion, result, 
+                            expectedResultList);
+                } else {
+                    Collection expectedResultCollection = 
+                        Arrays.asList(expectedResult);
+                    checkQueryResultWithoutOrder(assertion, result, 
+                            expectedResultCollection);
+                }
+            } finally {
+                query.closeAll();
             }
         } finally {
             if (tx.isActive()) {

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedJDOHelperMethods.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedJDOHelperMethods.java?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedJDOHelperMethods.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedJDOHelperMethods.java Wed Oct 19 03:27:35 2005
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2005 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 org.apache.jdo.tck.query.jdoql.methods;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.jdo.JDOHelper;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Query;
+import javax.jdo.Transaction;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Person;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Supported JDOHelper methods.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.2-49.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * Supported JDOHelper methods:
+ * <ul>
+ * <li> JDOHelper.getObjectId(Object)
+ * </ul>
+ */
+public class SupportedJDOHelperMethods extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.2-49 (SupportedJDOHelperMethods) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      "JDOHelper.getObjectId(this)", 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       null,
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "JDOHelper.getObjectId(this) == oid",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  "Object oid",
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null)
+    };
+
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(SupportedJDOHelperMethods.class);
+    }
+    
+    /** */
+    public void testGetObjectById() {
+        // query 1
+        int index = 0;
+        Object[] expectedResult = getExpectedResult(true, Person.class);
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult);
+
+        // query 2
+        index = 1;
+        expectedResult = getExpectedResult(false, Person.class, "personid = 1");
+        Object[] parameters = new Object[expectedResult.length];
+        for (int i = 0; i < parameters.length; i++) {
+            parameters[i] = JDOHelper.getObjectId(expectedResult);
+        }
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                parameters, expectedResult);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                parameters, expectedResult);
+    }
+    
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        loadCompanyModel(getPM(), COMPANY_TESTDATA);
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+    }
+
+    /** */
+    private Object[] getExpectedResult(boolean oidsWanted, Class candidateClass) {
+        return getExpectedResult(oidsWanted, candidateClass, null);
+    }
+    
+    /** */
+    private Object[] getExpectedResult(boolean oidsWanted, 
+            Class candidateClass, String filter) {
+        Object[] expectedResult;
+        PersistenceManager pm = getPM();
+        Transaction transaction = pm.currentTransaction();
+        transaction.begin();
+        try {
+            Query query = filter == null ? pm.newQuery(candidateClass) :
+                pm.newQuery(candidateClass, filter);
+            try {
+                Collection result = (Collection) query.execute();
+                expectedResult = new Object[result.size()];
+                int j = 0;
+                for (Iterator i = result.iterator(); i.hasNext(); ) {
+                    Object o = i.next();
+                    if (oidsWanted) {
+                        expectedResult[j++] = JDOHelper.getObjectId(o);
+                    } else {
+                        expectedResult[j++] = o;
+                    }
+                }
+            } finally {
+                query.closeAll();
+            }
+        } finally {
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+        }
+        return expectedResult;
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMapMethods.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMapMethods.java?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMapMethods.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMapMethods.java Wed Oct 19 03:27:35 2005
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2005 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 org.apache.jdo.tck.query.jdoql.methods;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Person;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Supported Map methods.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.2-46.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * Supported Map methods:
+ * <ul>
+ * <li> get(Object)
+ * <li> containsKey(Object)
+ * <li> containsValue(Object)
+ * </ul>
+ */
+public class SupportedMapMethods extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.2-46 (SupportedMapMethods) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "phoneNumbers.get('home') == '1111'",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "phoneNumbers.containsKey('home')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "phoneNumbers.containsValue('1111')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null)
+    };
+
+    /** The expected results of valid queries. */
+    private static String[][] expectedResult = {
+        {"emp1"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1"}
+    };
+            
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(SupportedMapMethods.class);
+    }
+    
+    /** */
+    public void testGet() {
+        int index = 0;
+        executeQuery(index);
+    }
+    
+    /** */
+    public void testContainsKey() {
+        int index = 1;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testContainsValue() {
+        int index = 2;
+        executeQuery(index);
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        loadCompanyModel(getPM(), COMPANY_TESTDATA);
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+    }
+
+    /** */
+    private void executeQuery(int index) {
+        Object[] expectedResultValues = 
+            getCompanyModelInstances(expectedResult[index]);
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResultValues);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResultValues);
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMathMethods.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMathMethods.java?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMathMethods.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedMathMethods.java Wed Oct 19 03:27:35 2005
@@ -0,0 +1,307 @@
+/*
+ * Copyright 2005 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 org.apache.jdo.tck.query.jdoql.methods;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.mylib.MylibReader;
+import org.apache.jdo.tck.pc.mylib.PrimitiveTypes;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Supported Math methods.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.2-48.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * Supported Math methods:
+ * <ul>
+ * <li> Math.abs(numeric)
+ * <li> Math.sqrt(numeric)
+ * </ul>
+ */
+public class SupportedMathMethods extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.2-48 (SupportedMathMethods) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     * These queries are used to test Math.abs.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES_ABS = {
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(intNotNull) == 4",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(intNull) == 4",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(longNotNull) == 4",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(longNull) == 4",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(floatNotNull) < 4.1 &&" +
+                                "Math.abs(floatNotNull) > 3.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(floatNull) < 4.1 &&" +
+                                "Math.abs(floatNull) > 3.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(doubleNotNull) < 4.1 &&" +
+                                "Math.abs(doubleNotNull) > 3.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "Math.abs(doubleNull) < 4.1 &&" +
+                                "Math.abs(doubleNull) > 3.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null)
+    };
+
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     * These queries are used to test Math.sqrt.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES_SQRT = {
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "doubleNotNull > 0 && " +
+                                "Math.sqrt(doubleNotNull) < 2.1 && " +
+                                "Math.sqrt(doubleNotNull) > 1.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "doubleNull > 0 && " +
+                                "Math.sqrt(doubleNull) < 2.1 && " +
+                                "Math.sqrt(doubleNull) > 1.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "intNotNull > 0 && " +
+                                "Math.sqrt(intNotNull) < 2.1 && " +
+                                "Math.sqrt(intNotNull) > 1.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        PrimitiveTypes.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "intNull > 0 && " +
+                                "Math.sqrt(intNull) < 2.1 && " +
+                                "Math.sqrt(intNull) > 1.9",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+    };
+
+    /** The expected results of valid queries testing Math.abs. */
+    private static String[][] expectedResultABS = {
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"},
+        {"primitiveTypesPositive", "primitiveTypesNegative"}
+    };
+        
+    /** The expected results of valid queries testing Math.sqrt. */
+    private static String[][] expectedResultSQRT = {
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"},
+        {"primitiveTypesPositive"}
+    };
+            
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(SupportedMathMethods.class);
+    }
+    
+    /** */
+    public void testAbs() {
+        for (int i = 0; i < VALID_QUERIES_ABS.length; i++) {
+            Object[] expectedResultValues = 
+                getMylibInstances(expectedResultABS[i]);
+            executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES_ABS[i], 
+                    expectedResultValues);
+            executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES_ABS[i], 
+                    expectedResultValues);
+        }
+    }
+    
+    /** */
+    public void testSqrt() {
+        for (int i = 0; i < VALID_QUERIES_SQRT.length; i++) {
+            Object[] expectedResultValues = 
+                getMylibInstances(expectedResultSQRT[i]);
+            executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES_SQRT[i], 
+                    expectedResultValues);
+            executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES_SQRT[i], 
+                    expectedResultValues);
+        }
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        loadMylib(getPM(), MYLIB_TESTDATA);
+        addTearDownClass(MylibReader.getTearDownClasses());
+    }
+
+}

Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedStringMethods.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedStringMethods.java?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedStringMethods.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/jdoql/methods/SupportedStringMethods.java Wed Oct 19 03:27:35 2005
@@ -0,0 +1,315 @@
+/*
+ * Copyright 2005 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 org.apache.jdo.tck.query.jdoql.methods;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Department;
+import org.apache.jdo.tck.pc.company.Person;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Supported String methods.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.2-47.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * New supported String methods:
+ * <ul>
+ * <li> toLowerCase()
+ * <li> toUpperCase()
+ * <li> indexOf(String)
+ * <li> indexOf(String, int)
+ * <li> matches(String)
+ * <li> substring(int)
+ * <li> substring(int, int)
+ * <li> startsWith()
+ * <li> endsWith()
+ * </ul>
+ */
+public class SupportedStringMethods extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.2-47 (SupportedStringMethods) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.toLowerCase() == 'emp1first'",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.toUpperCase() == 'EMP1FIRST'",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Department.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "name.indexOf('e') == 1",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Department.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "name.indexOf('e', 2) == 3",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.matches('.*First')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.matches('emp.First')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.matches('(?i)EMP1FIRST')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.substring(4) == 'First'",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.substring(4,9) == 'First'",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.startsWith('emp')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null),
+        new QueryElementHolder(
+                /*UNIQUE*/      null,
+                /*RESULT*/      null, 
+                /*INTO*/        null, 
+                /*FROM*/        Person.class,
+                /*EXCLUDE*/     null,
+                /*WHERE*/       "firstname.endsWith('First')",
+                /*VARIABLES*/   null,
+                /*PARAMETERS*/  null,
+                /*IMPORTS*/     null,
+                /*GROUP BY*/    null,
+                /*ORDER BY*/    null,
+                /*FROM*/        null,
+                /*TO*/          null)
+    };
+
+    /** 
+     * The expected results of valid queries.
+     * The strings are names of bean instances loaded by spring.  
+     */
+    private static String[][] expectedResult = {
+        {"emp1"},
+        {"emp1"},
+        {"dept1"},
+        {"dept1"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"},
+        {"emp1", "emp2", "emp3", "emp4", "emp5"}
+    };
+            
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(SupportedStringMethods.class);
+    }
+    
+    /** */
+    public void testToLowerCase() {
+        int index = 0;
+        executeQuery(index);
+    }
+    
+    /** */
+    public void testToUpperCase() {
+        int index = 1;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testIndexOfString() {
+        int index = 2;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testIndexOfStringInt() {
+        int index = 3;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testMatches() {
+        int index = 4;
+        executeQuery(index);
+        executeQuery(++index);
+        executeQuery(++index);
+    }
+
+    /** */
+    public void testSubstringInt() {
+        int index = 7;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testSubstringIntInt() {
+        int index = 8;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testStartsWith() {
+        int index = 9;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testEndsWith() {
+        int index = 10;
+        executeQuery(index);
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        loadCompanyModel(getPM(), COMPANY_TESTDATA);
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+    }
+
+    /** */
+    private void executeQuery(int index) {
+        Object[] expectedResultValues = 
+            getCompanyModelInstances(expectedResult[index]);
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResultValues);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResultValues);
+    }
+}

Added: incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml?rev=326519&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml (added)
+++ incubator/jdo/trunk/tck20/test/testdata/org/apache/jdo/tck/pc/mylib/mylibForQueryTests.xml Wed Oct 19 03:27:35 2005
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
+
+<beans>
+    <description>Mylib instances for query testing</description>
+
+    <bean id="root" class="java.util.ArrayList">
+        <constructor-arg index="0">
+            <list>
+                <ref local="primitiveTypesPositive"/>
+                <ref local="primitiveTypesNegative"/>
+            </list>
+        </constructor-arg>
+    </bean>
+
+    <bean id="primitiveTypesPositive" class="org.apache.jdo.tck.pc.mylib.PrimitiveTypes">
+        <property name="id"><value>1</value></property>
+        <property name="intNotNull"><value>4</value></property>
+        <property name="intNull"><value>4</value></property>
+        <property name="longNotNull"><value>4</value></property>
+        <property name="longNull"><value>4</value></property>
+        <property name="floatNotNull"><value>4.0</value></property>
+        <property name="floatNull"><value>4.0</value></property>
+        <property name="doubleNotNull"><value>4.0</value></property>
+        <property name="doubleNull"><value>4.0</value></property>
+    </bean>
+
+    <bean id="primitiveTypesNegative" class="org.apache.jdo.tck.pc.mylib.PrimitiveTypes">
+        <property name="id"><value>2</value></property>
+        <property name="intNotNull"><value>-4</value></property>
+        <property name="intNull"><value>-4</value></property>
+        <property name="longNotNull"><value>-4</value></property>
+        <property name="longNull"><value>-4</value></property>
+        <property name="floatNotNull"><value>-4.0</value></property>
+        <property name="floatNull"><value>-4.0</value></property>
+        <property name="doubleNotNull"><value>-4.0</value></property>
+        <property name="doubleNull"><value>-4.0</value></property>
+    </bean>
+
+</beans>
+