You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by sk...@apache.org on 2008/03/26 10:58:53 UTC

svn commit: r641231 - in /commons/proper/collections/branches/collections_jdk5_branch/src: java/org/apache/commons/collections/ java/org/apache/commons/collections/functors/ test/org/apache/commons/collections/functors/ test/org/apache/commons/collecti...

Author: skestle
Date: Wed Mar 26 02:58:51 2008
New Revision: 641231

URL: http://svn.apache.org/viewvc?rev=641231&view=rev
Log:
Started incorporating Edwin's patch for COLLECTIONS-253, in preparation for COLLECTIONS-290.

Added:
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/PredicateTestBase.java
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAll.java
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAllPredicate.java
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAnyAllOnePredicate.java
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestCompositePredicate.java
Modified:
    commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/PredicateUtils.java
    commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/AllPredicate.java
    commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/FunctorUtils.java
    commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/PredicateDecorator.java
    commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/TruePredicate.java
    commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/PredicateUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/PredicateUtils.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/PredicateUtils.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/PredicateUtils.java Wed Mar 26 02:58:51 2008
@@ -16,6 +16,9 @@
  */
 package org.apache.commons.collections;
 
+import static org.apache.commons.collections.functors.AllPredicate.allPredicate;
+import static org.apache.commons.collections.functors.TruePredicate.truePredicate;
+
 import java.util.Collection;
 
 import org.apache.commons.collections.functors.AllPredicate;
@@ -103,8 +106,8 @@
      * 
      * @return the predicate
      */
-    public static Predicate truePredicate() {
-        return TruePredicate.INSTANCE;
+    public static <T> Predicate<T> truePredicate() {
+        return truePredicate();
     }
 
     /**
@@ -274,8 +277,8 @@
      * @throws IllegalArgumentException if the predicates array is null
      * @throws IllegalArgumentException if any predicate in the array is null
      */
-    public static Predicate allPredicate(Predicate[] predicates) {
-        return AllPredicate.getInstance(predicates);
+    public static <T> Predicate<T> allPredicate(Predicate<? super T>[] predicates) {
+        return allPredicate(predicates);
     }
 
     /**
@@ -290,8 +293,8 @@
      * @throws IllegalArgumentException if the predicates collection is null
      * @throws IllegalArgumentException if any predicate in the collection is null
      */
-    public static Predicate allPredicate(Collection predicates) {
-        return AllPredicate.getInstance(predicates);
+    public static <T> Predicate<T> allPredicate(Collection<Predicate<? super T>> predicates) {
+        return allPredicate(predicates);
     }
 
     /**

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/AllPredicate.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/AllPredicate.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/AllPredicate.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/AllPredicate.java Wed Mar 26 02:58:51 2008
@@ -16,6 +16,10 @@
  */
 package org.apache.commons.collections.functors;
 
+import static org.apache.commons.collections.functors.FunctorUtils.coerce;
+import static org.apache.commons.collections.functors.FunctorUtils.validate;
+import static org.apache.commons.collections.functors.TruePredicate.truePredicate;
+
 import java.io.Serializable;
 import java.util.Collection;
 
@@ -34,14 +38,15 @@
  *
  * @author Stephen Colebourne
  * @author Matt Benson
+ * @author Stephen Kestle
  */
-public final class AllPredicate implements Predicate, PredicateDecorator, Serializable {
+public final class AllPredicate<T> implements Predicate<T>, PredicateDecorator<T>, Serializable {
 
     /** Serial version UID */
     private static final long serialVersionUID = -3094696765038308799L;
     
     /** The array of predicates to call */
-    private final Predicate[] iPredicates;
+    private final Predicate<? super T>[] iPredicates;
     
     /**
      * Factory to create the predicate.
@@ -53,17 +58,33 @@
      * @return the <code>all</code> predicate
      * @throws IllegalArgumentException if the predicates array is null
      * @throws IllegalArgumentException if any predicate in the array is null
+     * @deprecated Use {@link #allPredicate(Predicate<? super T>...)} instead
      */
-    public static Predicate getInstance(Predicate[] predicates) {
+    public static <T> Predicate<T> getInstance(Predicate<? super T> ... predicates) {
+        return allPredicate(predicates);
+    }
+
+    /**
+     * Factory to create the predicate.
+     * <p>
+     * If the array is size zero, the predicate always returns true.
+     * If the array is size one, then that predicate is returned.
+     *
+     * @param predicates  the predicates to check, cloned, not null
+     * @return the <code>all</code> predicate
+     * @throws IllegalArgumentException if the predicates array is null
+     * @throws IllegalArgumentException if any predicate in the array is null
+     */
+    public static <T> Predicate<T> allPredicate(Predicate<? super T> ... predicates) {
         FunctorUtils.validate(predicates);
         if (predicates.length == 0) {
-            return TruePredicate.INSTANCE;
+            return truePredicate();
         }
         if (predicates.length == 1) {
-            return predicates[0];
+            return coerce(predicates[0]);
         }
-        predicates = FunctorUtils.copy(predicates);
-        return new AllPredicate(predicates);
+
+        return new AllPredicate<T>(FunctorUtils.copy(predicates));
     }
 
     /**
@@ -76,25 +97,41 @@
      * @return the <code>all</code> predicate
      * @throws IllegalArgumentException if the predicates array is null
      * @throws IllegalArgumentException if any predicate in the array is null
+     * @deprecated Use {@link #allPredicate(Collection<Predicate<? super T>>)} instead
      */
-    public static Predicate getInstance(Collection predicates) {
-        Predicate[] preds = FunctorUtils.validate(predicates);
+    public static <T> Predicate<T> getInstance(Collection<Predicate<? super T>> predicates) {
+        return allPredicate(predicates);
+    }
+
+    /**
+     * Factory to create the predicate.
+     * <p>
+     * If the collection is size zero, the predicate always returns true.
+     * If the collection is size one, then that predicate is returned.
+     *
+     * @param predicates  the predicates to check, cloned, not null
+     * @return the <code>all</code> predicate
+     * @throws IllegalArgumentException if the predicates array is null
+     * @throws IllegalArgumentException if any predicate in the array is null
+     */
+    public static <T> Predicate<T> allPredicate(Collection<Predicate<? super T>> predicates) {
+        final Predicate<? super T>[] preds = validate(predicates);
         if (preds.length == 0) {
-            return TruePredicate.INSTANCE;
+            return truePredicate();
         }
         if (preds.length == 1) {
-            return preds[0];
+            return coerce(preds[0]);
         }
-        return new AllPredicate(preds);
+        return new AllPredicate<T>(preds);
     }
 
     /**
      * Constructor that performs no validation.
      * Use <code>getInstance</code> if you want that.
-     * 
+     *
      * @param predicates  the predicates to check, not cloned, not null
      */
-    public AllPredicate(Predicate[] predicates) {
+    public AllPredicate(Predicate<? super T> ... predicates) {
         super();
         iPredicates = predicates;
     }
@@ -105,9 +142,9 @@
      * @param object  the input object
      * @return true if all decorated predicates return true
      */
-    public boolean evaluate(Object object) {
-        for (int i = 0; i < iPredicates.length; i++) {
-            if (iPredicates[i].evaluate(object) == false) {
+    public boolean evaluate(T object) {
+        for (Predicate<? super T> iPredicate : iPredicates) {
+            if (!iPredicate.evaluate(object)) {
                 return false;
             }
         }
@@ -120,7 +157,7 @@
      * @return the predicates
      * @since Commons Collections 3.1
      */
-    public Predicate[] getPredicates() {
+    public Predicate<? super T>[] getPredicates() {
         return iPredicates;
     }
 

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/FunctorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/FunctorUtils.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/FunctorUtils.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/FunctorUtils.java Wed Mar 26 02:58:51 2008
@@ -17,7 +17,6 @@
 package org.apache.commons.collections.functors;
 
 import java.util.Collection;
-import java.util.Iterator;
 
 import org.apache.commons.collections.Closure;
 import org.apache.commons.collections.Predicate;
@@ -43,15 +42,35 @@
     
     /**
      * Clone the predicates to ensure that the internal reference can't be messed with.
+     * Due to the {@link Predicate#evaluate(T)} method, Predicate<? super T> is
+     * able to be coerced to Predicate<T> without casting issues. 
      * 
      * @param predicates  the predicates to copy
      * @return the cloned predicates
      */
-    static Predicate[] copy(Predicate[] predicates) {
+    @SuppressWarnings("unchecked")
+    static <T> Predicate<? super T>[] copy(Predicate<? super T>[] predicates) {
         if (predicates == null) {
             return null;
         }
-        return (Predicate[]) predicates.clone();
+        return predicates.clone();
+    }
+    
+    /**
+     * A very simple method that coerces Predicate<? super T> to Predicate<T>.
+     * Due to the {@link Predicate#evaluate(T)} method, Predicate<? super T> is
+     * able to be coerced to Predicate<T> without casting issues. 
+     * <p>This method exists
+     * simply as centralised documentation and atomic unchecked warning
+     * suppression.
+     * 
+     * @param <T> the type of object the returned predicate should "accept"
+     * @param predicate the predicate to coerce.
+     * @return the coerced predicate.
+     */
+    @SuppressWarnings("unchecked")
+    static <T> Predicate<T> coerce(Predicate<? super T> predicate){
+        return (Predicate<T>) predicate;
     }
     
     /**
@@ -59,7 +78,7 @@
      * 
      * @param predicates  the predicates to validate
      */
-    static void validate(Predicate[] predicates) {
+    static void validate(Predicate<?>[] predicates) {
         if (predicates == null) {
             throw new IllegalArgumentException("The predicate array must not be null");
         }
@@ -76,15 +95,16 @@
      * @param predicates  the predicates to validate
      * @return predicate array
      */
-    static Predicate[] validate(Collection predicates) {
+    @SuppressWarnings("unchecked")
+    static <T> Predicate<? super T>[] validate(Collection<Predicate<? super T>> predicates) {
         if (predicates == null) {
             throw new IllegalArgumentException("The predicate collection must not be null");
         }
         // convert to array like this to guarantee iterator() ordering
-        Predicate[] preds = new Predicate[predicates.size()];
+        Predicate<? super T>[] preds = new Predicate[predicates.size()];
         int i = 0;
-        for (Iterator it = predicates.iterator(); it.hasNext();) {
-            preds[i] = (Predicate) it.next();
+        for (Predicate<? super T> predicate : predicates) {
+            preds[i] = predicate;
             if (preds[i] == null) {
                 throw new IllegalArgumentException("The predicate collection must not contain a null predicate, index " + i + " was null");
             }

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/PredicateDecorator.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/PredicateDecorator.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/PredicateDecorator.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/PredicateDecorator.java Wed Mar 26 02:58:51 2008
@@ -27,8 +27,9 @@
  * @version $Revision$ $Date$
  * 
  * @author Stephen Colebourne
+ * @author Stephen Kestle
  */
-public interface PredicateDecorator extends Predicate {
+public interface PredicateDecorator<T> extends Predicate<T> {
 
     /**
      * Gets the predicates being decorated as an array.
@@ -38,6 +39,6 @@
      * 
      * @return the predicates being decorated
      */
-    Predicate[] getPredicates();
+    Predicate<? super T>[] getPredicates();
 
 }

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/TruePredicate.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/TruePredicate.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/TruePredicate.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/java/org/apache/commons/collections/functors/TruePredicate.java Wed Mar 26 02:58:51 2008
@@ -27,23 +27,37 @@
  * @version $Revision$ $Date$
  *
  * @author Stephen Colebourne
+ * @author Stephen Kestle
  */
-public final class TruePredicate implements Predicate, Serializable {
+public final class TruePredicate<T> implements Predicate<T>, Serializable {
 
     /** Serial version UID */
     private static final long serialVersionUID = 3374767158756189740L;
     
     /** Singleton predicate instance */
-    public static final Predicate INSTANCE = new TruePredicate();
+    public static final Predicate<?> INSTANCE = new TruePredicate<Object>();
 
     /**
      * Factory returning the singleton instance.
      * 
      * @return the singleton instance
      * @since Commons Collections 3.1
+     * @deprecated
      */
-    public static Predicate getInstance() {
-        return INSTANCE;
+    @Deprecated 
+    public static <T> Predicate<T> getInstance() {
+        return truePredicate();
+    }
+
+    /**
+     * Factory returning the singleton instance.
+     * 
+     * @return the singleton instance
+     * @since Commons Collections 3.1
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> Predicate<T> truePredicate() {
+        return (Predicate<T>) INSTANCE;
     }
 
     /**
@@ -59,8 +73,7 @@
      * @param object  the input object
      * @return true always
      */
-    public boolean evaluate(Object object) {
+    public boolean evaluate(T object) {
         return true;
     }
-
 }

Added: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/PredicateTestBase.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/PredicateTestBase.java?rev=641231&view=auto
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/PredicateTestBase.java (added)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/PredicateTestBase.java Wed Mar 26 02:58:51 2008
@@ -0,0 +1,89 @@
+package org.apache.commons.collections.functors;
+
+import static org.easymock.EasyMock.verify;
+import static org.easymock.EasyMock.replay;
+import org.junit.Before;
+import org.junit.After;
+import org.apache.commons.collections.Predicate;
+import org.easymock.EasyMock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Base class for tests of predicates which delegate to other predicates when evaluating an object.  This class
+ * provides methods to create and verify mock predicates to which to delegate.
+ *
+ * @since Commons Collections 3.0
+ * @version $Revision: 468603 $ $Date: 2006-10-27 17:52:37 -0700 (Fri, 27 Oct 2006) $
+ *
+ * @author Edwin Tellman
+ */
+public abstract class PredicateTestBase<T> {
+    /**
+     * Mock predicates created by a single test case which need to be verified after the test completes.
+     */
+    private List<Predicate<? super T>> mockPredicatesToVerify;
+    
+    /**
+     * The value to pass to mocks.
+     */
+    private final T testValue;
+
+    /**
+     * Creates a new <code>PredicateTestBase</code>.
+     *
+     * @param testValue the value to pass to mock predicates.
+     */
+    protected PredicateTestBase(final T testValue) {
+        this.testValue = testValue;
+    }
+
+    /**
+     * Creates the list of predicates to verify.
+     */
+    @Before
+    public final void createVerifyList()
+    {
+        mockPredicatesToVerify = new ArrayList<Predicate<? super T>>();
+    }
+
+    /**
+     * Verifies all the mock predicates created for the test.
+     */
+    @After
+    public final void verifyPredicates()
+    {
+        for (Predicate<? super T> predicate : mockPredicatesToVerify) {
+            verify(predicate);
+        }
+    }
+
+    /**
+     * Gets the value which will be passed to the mock predicates.
+     *
+     * @return the test value.
+     */
+    protected final T getTestValue() {
+        return testValue;
+    }
+
+    /**
+     * Creates a single mock predicate.
+     *
+     * @param returnValue the return value for the mock predicate, or null if the mock is not expected to be called.
+     *
+     * @return a single mock predicate.
+     */
+    @SuppressWarnings({"unchecked"})
+    protected final Predicate<T> createMockPredicate(final Boolean returnValue) {
+        final Predicate<T> mockPredicate = EasyMock.createMock(Predicate.class);
+        if (returnValue != null) {
+            EasyMock.expect(mockPredicate.evaluate(testValue)).andReturn(returnValue);
+        }
+        replay(mockPredicate);
+        mockPredicatesToVerify.add(mockPredicate);
+
+        return mockPredicate;
+    }
+}

Added: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAll.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAll.java?rev=641231&view=auto
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAll.java (added)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAll.java Wed Mar 26 02:58:51 2008
@@ -0,0 +1,19 @@
+package org.apache.commons.collections.functors;
+
+import junit.framework.TestCase;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * Entry point for all Functors package tests.
+ *
+ * @version $Revision: 471163 $ $Date: 2006-11-04 02:56:39 -0800 (Sat, 04 Nov 2006) $
+ *
+ * @author Edwin Tellman
+ */
+@RunWith(Suite.class)
+@SuiteClasses({TestAllPredicate.class})
+public class TestAll extends TestCase {
+}

Added: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAllPredicate.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAllPredicate.java?rev=641231&view=auto
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAllPredicate.java (added)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAllPredicate.java Wed Mar 26 02:58:51 2008
@@ -0,0 +1,134 @@
+package org.apache.commons.collections.functors;
+
+import junit.framework.JUnit4TestAdapter;
+import org.apache.commons.collections.Predicate;
+
+import static org.apache.commons.collections.functors.AllPredicate.allPredicate;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Tests the org.apache.commons.collections.functors.AllPredicate class.
+ *
+ * @since Commons Collections 3.0
+ * @version $Revision: 468603 $ $Date: 2006-10-27 17:52:37 -0700 (Fri, 27 Oct 2006) $
+ *
+ * @author Edwin Tellman
+ */
+public class TestAllPredicate extends TestAnyAllOnePredicate<Integer> {
+
+    /**
+     * Creates a JUnit3 test suite.
+     *
+     * @return a JUnit3 test suite
+     */
+    public static junit.framework.Test suite() {
+        return new JUnit4TestAdapter(TestAllPredicate.class);
+    }
+    
+    /**
+     * Creates a new <code>TestAllPredicate</code>.
+     */
+    public TestAllPredicate() {
+        super(42);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected final Predicate<Integer> getPredicateInstance(final Predicate<? super Integer> ... predicates) {
+        return AllPredicate.allPredicate(predicates);
+    }
+
+    /**
+     * {@inheritDoc}
+     */    
+    @Override
+    protected final Predicate<Integer> getPredicateInstance(final Collection<Predicate<? super Integer>> predicates) {
+        return AllPredicate.allPredicate(predicates);
+    }
+
+    /**
+     * Verifies that providing an empty predicate array evaluates to true.
+     */
+    @SuppressWarnings({"unchecked"})
+    @Test
+    public void emptyArrayToGetInstance()
+    {
+        assertTrue("empty array not true", getPredicateInstance(new Predicate[] {}).evaluate(null));
+    }
+
+    /**
+     * Verifies that providing an empty predicate collection evaluates to true.
+     */
+    @Test
+    public void emptyCollectionToGetInstance()
+    {
+        final Predicate<Integer> allPredicate = getPredicateInstance(
+                Collections.<Predicate<? super Integer>>emptyList());
+        assertTrue("empty collection not true", allPredicate.evaluate(getTestValue()));
+    }
+
+    /**
+     * Tests whether a single true predicate evaluates to true.
+     */
+    @Test
+    public void oneTruePredicate()
+    {
+        // use the constructor directly, as getInstance() returns the original predicate when passed
+        // an array of size one.
+        final Predicate<Integer> predicate = createMockPredicate(true);
+        
+        assertTrue("single true predicate evaluated to false",
+                allPredicate(predicate).evaluate(getTestValue()));
+    }
+
+    /**
+     * Tests whether a single false predicate evaluates to true.
+     */
+    @Test
+    public void oneFalsePredicate()
+    {
+        // use the constructor directly, as getInstance() returns the original predicate when passed
+        // an array of size one.
+        final Predicate<Integer> predicate = createMockPredicate(false);
+        assertFalse("single false predicate evaluated to true",
+                allPredicate(predicate).evaluate(getTestValue()));
+    }
+
+    /**
+     * Tests whether multiple true predicates evaluates to true.
+     */
+    @Test
+    public void allTrue()
+    {
+        assertTrue("multiple true predicates evaluated to false",
+                getPredicateInstance(true, true).evaluate(getTestValue()));
+        assertTrue("multiple true predicates evaluated to false",
+                getPredicateInstance(true, true, true).evaluate(getTestValue()));
+    }
+
+    /**
+     * Tests whether combining some true and one false evalutes to false.  Also verifies that only the first
+     * false predicate is actually evaluated
+     */
+    @Test
+    public void trueAndFalseCombined()
+    {
+        assertFalse("false predicate evaluated to true",
+                getPredicateInstance(false, null).evaluate(getTestValue()));
+        assertFalse("false predicate evaluated to true",
+                getPredicateInstance(false, null, null).evaluate(getTestValue()));
+        assertFalse("false predicate evaluated to true",
+                getPredicateInstance(true, false, null).evaluate(getTestValue()));
+        assertFalse("false predicate evaluated to true",
+                getPredicateInstance(true, true, false).evaluate(getTestValue()));
+        assertFalse("false predicate evaluated to true",
+                getPredicateInstance(true, true, false, null).evaluate(getTestValue()));
+    }
+}

Added: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAnyAllOnePredicate.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAnyAllOnePredicate.java?rev=641231&view=auto
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAnyAllOnePredicate.java (added)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestAnyAllOnePredicate.java Wed Mar 26 02:58:51 2008
@@ -0,0 +1,66 @@
+package org.apache.commons.collections.functors;
+
+import org.apache.commons.collections.Predicate;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+import java.util.Collections;
+
+/**
+ * Base class for tests of AnyPredicate, AllPredicate, and OnePredicate.
+ *
+ * @since Commons Collections 3.0
+ * @version $Revision: 468603 $ $Date: 2006-10-27 17:52:37 -0700 (Fri, 27 Oct 2006) $
+ *
+ * @author Edwin Tellman
+ */
+public abstract class TestAnyAllOnePredicate<T> extends TestCompositePredicate<T> {
+
+    /**
+     * Creates a new <code>TestCompositePredicate</code>.
+     *
+     * @param testValue the value which the mock predicates should expect to see (may be null).
+     */
+    protected TestAnyAllOnePredicate(final T testValue) {
+        super(testValue);
+    }
+
+
+    /**
+     * Tests whether <code>getInstance</code> with a one element array returns the first element in the array.
+     */
+    @Test
+    public final void singleElementArrayToGetInstance()
+    {
+        final Predicate<T> predicate = createMockPredicate(null);
+        final Predicate<T> allPredicate = getPredicateInstance(predicate);
+        assertSame("expected argument to be returned by getInstance()", predicate, allPredicate);
+    }
+
+    /**
+     * Tests that passing a singleton collection to <code>getInstance</code> returns the single element in the
+     * collection.
+     */
+    @Test
+    public final void singletonCollectionToGetInstance()
+    {
+        final Predicate<T> predicate = createMockPredicate(null);
+        final Predicate<T> allPredicate = getPredicateInstance(
+                Collections.<Predicate<? super T>>singleton(predicate));
+        assertSame("expected singleton collection member to be returned by getInstance()",
+                predicate, allPredicate);
+    }
+
+    /**
+     * Tests creating composite predicate instances with single predicates and verifies that the composite returns
+     * the same value as the single predicate does. 
+     */
+    public final void singleValues()
+    {
+        assertTrue(getPredicateInstance(true).evaluate(null));
+        assertFalse(getPredicateInstance(false).evaluate(null));
+    }
+
+}

Added: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestCompositePredicate.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestCompositePredicate.java?rev=641231&view=auto
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestCompositePredicate.java (added)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/functors/TestCompositePredicate.java Wed Mar 26 02:58:51 2008
@@ -0,0 +1,135 @@
+package org.apache.commons.collections.functors;
+
+import org.apache.commons.collections.Predicate;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * Base class for tests of composite predicates.
+ *
+ * @since Commons Collections 3.0
+ * @version $Revision: 468603 $ $Date: 2006-10-27 17:52:37 -0700 (Fri, 27 Oct 2006) $
+ *
+ * @author Edwin Tellman
+ */
+public abstract class TestCompositePredicate<T> extends PredicateTestBase<T> {
+
+    /**
+     * Creates a new <code>TestCompositePredicate</code>.
+     *
+     * @param testValue the value which the mock predicates should expect to see (may be null).
+     */
+    protected TestCompositePredicate(final T testValue) {
+        super(testValue);
+    }
+
+    /**
+     * Creates an instance of the predicate to test.
+     *
+     * @param predicates the arguments to <code>getInstance</code>.
+     *
+     * @return a predicate to test.
+     */
+    protected abstract Predicate<T> getPredicateInstance(final Predicate<? super T> ... predicates);
+
+    /**
+     * Creates an instance of the predicate to test.
+     *
+     * @param predicates the argument to <code>getInstance</code>.
+     *
+     * @return a predicate to test.
+     */
+    protected abstract Predicate<T> getPredicateInstance(final Collection<Predicate<? super T>> predicates);
+
+    /**
+     * Creates an instance of the predicate to test.
+     *
+     * @param mockReturnValues the return values for the mock predicates, or null if that mock is not expected
+     *                         to be called
+     *
+     * @return a predicate to test.
+     */
+    protected final Predicate<T> getPredicateInstance(final Boolean ... mockReturnValues)
+    {
+        final List<Predicate<? super T>> predicates = new ArrayList<Predicate<? super T>>();
+        for (Boolean returnValue : mockReturnValues) {
+            predicates.add(createMockPredicate(returnValue));
+        }        
+        return getPredicateInstance(predicates);
+    }
+
+    /**
+     * Tests whether <code>getInstance</code> with a one element array returns the first element in the array.
+     */
+    public void singleElementArrayToGetInstance()
+    {
+        final Predicate<T> predicate = createMockPredicate(null);
+        final Predicate<T> allPredicate = getPredicateInstance(predicate);
+        Assert.assertSame("expected argument to be returned by getInstance()", predicate, allPredicate);
+    }
+
+    /**
+     * Tests that passing a singleton collection to <code>getInstance</code> returns the single element in the
+     * collection.
+     */
+    public void singletonCollectionToGetInstance()
+    {
+        final Predicate<T> predicate = createMockPredicate(null);
+        final Predicate<T> allPredicate = getPredicateInstance(
+                Collections.<Predicate<? super T>>singleton(predicate));
+        Assert.assertSame("expected argument to be returned by getInstance()", predicate, allPredicate);
+    }
+
+    /**
+     * Tests <code>getInstance</code> with a null predicate array.
+     */
+    @SuppressWarnings({"unchecked"})
+    @Test(expected = IllegalArgumentException.class)
+    public final void nullArrayToGetInstance() {
+        getPredicateInstance((Predicate<T>[]) null);
+    }
+
+    /**
+     * Tests <code>getInstance</code> with a single null element in the predicate array.
+     */
+    @SuppressWarnings({"unchecked"})
+    @Test(expected = IllegalArgumentException.class)
+    public final void nullElementInArrayToGetInstance() {
+        getPredicateInstance(new Predicate[] { null });
+    }
+
+    /**
+     * Tests <code>getInstance</code> with two null elements in the predicate array.
+     */
+    @SuppressWarnings({"unchecked"})
+    @Test(expected = IllegalArgumentException.class)
+    public final void nullElementsInArrayToGetInstance() {
+        getPredicateInstance(new Predicate[] { null, null });
+    }
+
+
+    /**
+     * Tests <code>getInstance</code> with a null predicate collection
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public final void nullCollectionToGetInstance() {
+        getPredicateInstance((Collection<Predicate<? super T>>) null);
+    }
+
+    /**
+     * Tests <code>getInstance</code> with a predicate collection that contains null elements
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public final void nullElementsInCollectionToGetInstance() {
+        final Collection<Predicate<? super T>> coll = new ArrayList<Predicate<? super T>>();
+        coll.add(null);
+        coll.add(null);
+        getPredicateInstance(coll);
+    }
+}

Modified: commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java?rev=641231&r1=641230&r2=641231&view=diff
==============================================================================
--- commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java (original)
+++ commons/proper/collections/branches/collections_jdk5_branch/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java Wed Mar 26 02:58:51 2008
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.collections.iterators;
 
+import static org.apache.commons.collections.functors.TruePredicate.truePredicate;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -125,7 +127,7 @@
         Iterator iter2 = Collections.EMPTY_LIST.iterator();
         
         FilterIterator filterIterator = new FilterIterator(iter1);
-        filterIterator.setPredicate(TruePredicate.getInstance());
+        filterIterator.setPredicate(truePredicate());
         // this iterator has elements
         assertEquals(true, filterIterator.hasNext());
         
@@ -142,7 +144,7 @@
         Iterator iter = Collections.singleton(null).iterator();
 
         FilterIterator filterIterator = new FilterIterator(iter);
-        filterIterator.setPredicate(TruePredicate.getInstance());
+        filterIterator.setPredicate(truePredicate());
         // this predicate matches
         assertEquals(true, filterIterator.hasNext());