diff --git a/src/java/org/apache/commons/collections/comparators/BooleanComparator.java b/src/java/org/apache/commons/collections/comparators/BooleanComparator.java new file mode 100644 index 000000000..cd3b784d3 --- /dev/null +++ b/src/java/org/apache/commons/collections/comparators/BooleanComparator.java @@ -0,0 +1,216 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/comparators/BooleanComparator.java,v 1.1 2003/01/10 00:21:08 rwaldhoff Exp $ + * ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.commons.collections.comparators; + +import java.io.Serializable; +import java.util.Comparator; + +/** + * A {@link Comparator} for {@link Boolean}s. + * + * @see #getTrueFirstComparator + * @see #getFalseFirstComparator + * @see #getBooleanComparator + * + * @since Commons Collections 2.2 + * + * @version $Revision: 1.1 $ $Date: 2003/01/10 00:21:08 $ + * + * @author Rodney Waldhoff + */ +public final class BooleanComparator implements Comparator, Serializable { + + /** + * Creates a BooleanComparator + * that sorts false values before + * true values. + * + * Equivalent to {@link BooleanComparator(boolean) BooleanComparator(false)}. + */ + public BooleanComparator() { + this(false); + } + + /** + * Creates a BooleanComparator + * that sorts trueFirst values before + * !trueFirst values. + * + * @param trueFirst when true, sort + * true {@link Boolean}s before + * false {@link Boolean}s. + */ + public BooleanComparator(boolean trueFirst) { + this.trueFirst = trueFirst; + } + + /** + * Compares two arbitrary Objects. When both arguments + * are {@link Boolean}, this method is equivalent to + * {@link #compare(Boolean,Boolean) compare((Boolean)o1,(Boolean)o2)}. + * When either argument is not a {@link Boolean}, this methods throws + * a {@link ClassCastException}. + * + * @throws ClassCastException when either argument is not + * a {@link Boolean} + */ + public int compare(Object o1, Object o2) { + return compare((Boolean)o1,(Boolean)o2); + } + + /** + * Compares two non-null {@link Boolean}s + * according to the value of {@link #sortsTrueFirst}. + * + * @throws NullPointerException when either argument null + */ + public int compare(Boolean b1, Boolean b2) { + boolean v1 = b1.booleanValue(); + boolean v2 = b2.booleanValue(); + + return (v1 ^ v2) ? ( (v1 ^ trueFirst) ? 1 : -1 ) : 0; + } + + /** + * Implement a hash code for this comparator that is consistent with + * {@link #equals equals}. + * + * @return a hash code for this comparator. + */ + public int hashCode() { + int hash = "BooleanComparator".hashCode(); + return trueFirst ? -1 * hash : hash; + } + + /** + * Returns true iff that Object is + * is a {@link Comparator} whose ordering is known to be + * equivalent to mine. + *

+ * This implementation returns true + * iff that is a {@link BooleanComparator} + * whose {@link #sortsTrueFirst} value is equal to mine. + */ + public boolean equals(Object that) { + return (this == that) || + ((that instanceof BooleanComparator) && + (this.trueFirst == ((BooleanComparator)that).trueFirst)); + } + + /** + * Returns true iff + * I sort true values before + * false values. In other words, + * returns true iff + * {@link #compare(Boolean,Boolean) compare(Boolean.TRUE,Boolean.FALSE)} + * returns a positive value. + */ + public boolean sortsTrueFirst() { + return trueFirst; + } + + /** + * Returns a BooleanComparator instance that sorts + * true values before false values. + *

+ * Clients are encouraged to use the value returned from + * this method instead of constructing a new instance + * to reduce allocation and garbage collection overhead when + * multiple BooleanComparators may be used in the same + * virtual machine. + */ + public static BooleanComparator getTrueFirstComparator() { + return TRUE_FIRST; + } + + /** + * Returns a BooleanComparator instance that sorts + * false values before true values. + *

+ * Clients are encouraged to use the value returned from + * this method instead of constructing a new instance + * to reduce allocation and garbage collection overhead when + * multiple BooleanComparators may be used in the same + * virtual machine. + */ + public static BooleanComparator getFalseFirstComparator() { + return FALSE_FIRST; + } + + /** + * Returns a BooleanComparator instance that sorts + * trueFirst values before + * !trueFirst values. + *

+ * Clients are encouraged to use the value returned from + * this method instead of constructing a new instance + * to reduce allocation and garbage collection overhead when + * multiple BooleanComparators may be used in the same + * virtual machine. + */ + public static BooleanComparator getBooleanComparator(boolean trueFirst) { + return trueFirst ? TRUE_FIRST : FALSE_FIRST; + } + + /** true iff true values sort before false values. */ + private boolean trueFirst = false; + + /** My static "true first" reference. */ + private static final BooleanComparator TRUE_FIRST = new BooleanComparator(true); + + /** My static "false first" reference. */ + private static final BooleanComparator FALSE_FIRST = new BooleanComparator(false); +} diff --git a/src/test/org/apache/commons/collections/comparators/TestAll.java b/src/test/org/apache/commons/collections/comparators/TestAll.java index 770c2df6e..eb7a9f357 100644 --- a/src/test/org/apache/commons/collections/comparators/TestAll.java +++ b/src/test/org/apache/commons/collections/comparators/TestAll.java @@ -1,13 +1,10 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/comparators/TestAll.java,v 1.1 2002/10/12 22:35:10 scolebourne Exp $ - * $Revision: 1.1 $ - * $Date: 2002/10/12 22:35:10 $ - * + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/comparators/TestAll.java,v 1.2 2003/01/10 00:21:08 rwaldhoff Exp $ * ==================================================================== * * The Apache Software License, Version 1.1 * - * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -67,7 +64,7 @@ import junit.framework.TestSuite; /** * Entry point for all Comparator Collections tests. * @author Stephen Colebourne - * @version $Id: TestAll.java,v 1.1 2002/10/12 22:35:10 scolebourne Exp $ + * @version $Revision: 1.2 $ $Date: 2003/01/10 00:21:08 $ */ public class TestAll extends TestCase { public TestAll(String testName) { @@ -76,6 +73,7 @@ public class TestAll extends TestCase { public static Test suite() { TestSuite suite = new TestSuite(); + suite.addTest(TestBooleanComparator.suite()); suite.addTest(TestComparableComparator.suite()); suite.addTest(TestComparatorChain.suite()); suite.addTest(TestNullComparator.suite()); diff --git a/src/test/org/apache/commons/collections/comparators/TestBooleanComparator.java b/src/test/org/apache/commons/collections/comparators/TestBooleanComparator.java new file mode 100644 index 000000000..b3d33d029 --- /dev/null +++ b/src/test/org/apache/commons/collections/comparators/TestBooleanComparator.java @@ -0,0 +1,273 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/comparators/TestBooleanComparator.java,v 1.1 2003/01/10 00:21:08 rwaldhoff Exp $ + * ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.commons.collections.comparators; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * Tests for {@link BooleanComparator}. + * + * @since Commons Collections 2.2 + * + * @version $Revision: 1.1 $ $Date: 2003/01/10 00:21:08 $ + * + * @author Rodney Waldhoff + */ +public class TestBooleanComparator extends TestComparator { + + // conventional + // ------------------------------------------------------------------------ + + public TestBooleanComparator(String testName) { + super(testName); + } + + public static Test suite() { + return new TestSuite(TestBooleanComparator.class); + } + + // collections testing framework + // ------------------------------------------------------------------------ + + public Comparator makeComparator() { + return new BooleanComparator(); + } + + public List getComparableObjectsOrdered() { + List list = new ArrayList(); + list.add(new Boolean(false)); + list.add(Boolean.FALSE); + list.add(new Boolean(false)); + list.add(Boolean.TRUE); + list.add(new Boolean(true)); + list.add(Boolean.TRUE); + return list; + } + + // tests + // ------------------------------------------------------------------------ + + public void testConstructors() { + allTests(false,new BooleanComparator()); + allTests(false,new BooleanComparator(false)); + allTests(true,new BooleanComparator(true)); + } + + public void testStaticFactoryMethods() { + allTests(false,BooleanComparator.getFalseFirstComparator()); + allTests(false,BooleanComparator.getBooleanComparator(false)); + allTests(true,BooleanComparator.getTrueFirstComparator()); + allTests(true,BooleanComparator.getBooleanComparator(true)); + } + + public void testEqualsCompatibleInstance() { + assertEquals(new BooleanComparator(),new BooleanComparator(false)); + assertEquals(new BooleanComparator(false),new BooleanComparator(false)); + assertEquals(new BooleanComparator(false),BooleanComparator.getFalseFirstComparator()); + assertSame(BooleanComparator.getFalseFirstComparator(),BooleanComparator.getBooleanComparator(false)); + + assertEquals(new BooleanComparator(true),new BooleanComparator(true)); + assertEquals(new BooleanComparator(true),BooleanComparator.getTrueFirstComparator()); + assertSame(BooleanComparator.getTrueFirstComparator(),BooleanComparator.getBooleanComparator(true)); + + assertTrue(!(new BooleanComparator().equals(new BooleanComparator(true)))); + assertTrue(!(new BooleanComparator(true).equals(new BooleanComparator(false)))); + } + + public void testComparatorCompatibility() { + // XXX FIX ME XXX + // need to a serialized form to cvs + // XXX FIX ME XXX + } + + // utilities + // ------------------------------------------------------------------------ + + protected void allTests(boolean trueFirst, BooleanComparator comp) { + orderIndependentTests(comp); + if(trueFirst) { + trueFirstTests(comp); + } else { + falseFirstTests(comp); + } + } + + protected void trueFirstTests(BooleanComparator comp) { + assertNotNull(comp); + assertEquals(0,comp.compare(Boolean.TRUE,Boolean.TRUE)); + assertEquals(0,comp.compare(Boolean.FALSE,Boolean.FALSE)); + assertTrue(comp.compare(Boolean.FALSE,Boolean.TRUE) > 0); + assertTrue(comp.compare(Boolean.TRUE,Boolean.FALSE) < 0); + + assertEquals(0,comp.compare((Object)(Boolean.TRUE),(Object)(Boolean.TRUE))); + assertEquals(0,comp.compare((Object)(Boolean.FALSE),(Object)(Boolean.FALSE))); + assertTrue(comp.compare((Object)(Boolean.FALSE),(Object)(Boolean.TRUE)) > 0); + assertTrue(comp.compare((Object)(Boolean.TRUE),(Object)(Boolean.FALSE)) < 0); + } + + protected void falseFirstTests(BooleanComparator comp) { + assertNotNull(comp); + assertEquals(0,comp.compare(Boolean.TRUE,Boolean.TRUE)); + assertEquals(0,comp.compare(Boolean.FALSE,Boolean.FALSE)); + assertTrue(comp.compare(Boolean.FALSE,Boolean.TRUE) < 0); + assertTrue(comp.compare(Boolean.TRUE,Boolean.FALSE) > 0); + + assertEquals(0,comp.compare((Object)(Boolean.TRUE),(Object)(Boolean.TRUE))); + assertEquals(0,comp.compare((Object)(Boolean.FALSE),(Object)(Boolean.FALSE))); + assertTrue(comp.compare((Object)(Boolean.FALSE),(Object)(Boolean.TRUE)) < 0); + assertTrue(comp.compare((Object)(Boolean.TRUE),(Object)(Boolean.FALSE)) > 0); + } + + protected void orderIndependentTests(BooleanComparator comp) { + nullArgumentTests(comp); + nonBooleanArgumentTests(comp); + nullAndNonBooleanArgumentsTests(comp); + } + + protected void nullArgumentTests(BooleanComparator comp) { + assertNotNull(comp); + try { + comp.compare(null,null); + fail("Expected NullPointerException"); + } catch(NullPointerException e) { + // expected + } + try { + comp.compare(Boolean.TRUE,null); + fail("Expected NullPointerException"); + } catch(NullPointerException e) { + // expected + } + try { + comp.compare(Boolean.FALSE,null); + fail("Expected NullPointerException"); + } catch(NullPointerException e) { + // expected + } + try { + comp.compare(null,Boolean.TRUE); + fail("Expected NullPointerException"); + } catch(NullPointerException e) { + // expected + } + try { + comp.compare(null,Boolean.FALSE); + fail("Expected NullPointerException"); + } catch(NullPointerException e) { + // expected + } + } + + protected void nonBooleanArgumentTests(BooleanComparator comp) { + assertNotNull(comp); + try { + comp.compare("string","string"); + fail("Expected ClassCastException"); + } catch(ClassCastException e) { + // expected + } + try { + comp.compare(Boolean.TRUE,"string"); + fail("Expected ClassCastException"); + } catch(ClassCastException e) { + // expected + } + try { + comp.compare("string",Boolean.TRUE); + fail("Expected ClassCastException"); + } catch(ClassCastException e) { + // expected + } + try { + comp.compare("string",new Integer(3)); + fail("Expected ClassCastException"); + } catch(ClassCastException e) { + // expected + } + try { + comp.compare(new Integer(3),"string"); + fail("Expected ClassCastException"); + } catch(ClassCastException e) { + // expected + } + } + + protected void nullAndNonBooleanArgumentsTests(BooleanComparator comp) { + assertNotNull(comp); + try { + comp.compare(null,"string"); + fail("Expected ClassCast or NullPointer Exception"); + } catch(ClassCastException e) { + // expected + } catch(NullPointerException e) { + // expected + } + try { + comp.compare("string",null); + fail("Expected ClassCast or NullPointer Exception"); + } catch(ClassCastException e) { + // expected + } catch(NullPointerException e) { + // expected + } + } + +}