rwaldhoff    2003/01/09 16:21:09

  Modified:    collections/src/test/org/apache/commons/collections/comparators
                        TestAll.java
  Added:       collections/src/java/org/apache/commons/collections/comparators
                        BooleanComparator.java
               collections/src/test/org/apache/commons/collections/comparators
                        TestBooleanComparator.java
  Log:
  add BooleanComparator and tests
  
  Revision  Changes    Path
  1.1                  
jakarta-commons/collections/src/java/org/apache/commons/collections/comparators/BooleanComparator.java
  
  Index: BooleanComparator.java
  ===================================================================
  /* 
   * $Header: 
/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 [EMAIL PROTECTED]
   *
   * 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
   * <http://www.apache.org/>.
   */
  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 <code>BooleanComparator</code>
       * that sorts <code>false</code> values before 
       * <code>true</code> values.
       * 
       * Equivalent to {@link BooleanComparator(boolean) BooleanComparator(false)}.
       */
      public BooleanComparator() {
          this(false);
      }
  
      /**
       * Creates a <code>BooleanComparator</code>
       * that sorts <code><i>trueFirst</i></code> values before 
       * <code>!<i>trueFirst</i></code> values.
       * 
       * @param trueFirst when <code>true</code>, sort 
       *        <code>true</code> {@link Boolean}s before
       *        <code>false</code> {@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)<i>o1</i>,(Boolean)<i>o2</i>)}.
       * 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-<code>null</code> {@link Boolean}s
       * according to the value of {@link #sortsTrueFirst}.
       * 
       * @throws NullPointerException when either argument <code>null</code>
       */
      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 <code>true</code> iff <i>that</i> Object is 
       * is a {@link Comparator} whose ordering is known to be 
       * equivalent to mine.
       * <p>
       * This implementation returns <code>true</code>
       * iff <code><i>that</i></code> 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 <code>true</code> iff
       * I sort <code>true</code> values before 
       * <code>false</code> values.  In other words,
       * returns <code>true</code> 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 
       * <code>true</code> values before <code>false</code> values.
       * <p />
       * 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 
       * <code>false</code> values before <code>true</code> values.
       * <p />
       * 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 
       * <code><i>trueFirst</i></code> values before 
       * <code>!<i>trueFirst</i></code> values.
       * <p />
       * 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;
      }
      
      /** <code>true</code> iff <code>true</code> values sort before 
<code>false</code> 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);
  }
  
  
  
  1.2       +4 -6      
jakarta-commons/collections/src/test/org/apache/commons/collections/comparators/TestAll.java
  
  Index: TestAll.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/comparators/TestAll.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestAll.java      12 Oct 2002 22:35:10 -0000      1.1
  +++ TestAll.java      10 Jan 2003 00:21:08 -0000      1.2
  @@ -1,13 +1,10 @@
   /*
    * $Header$
  - * $Revision$
  - * $Date$
  - *
    * ====================================================================
    *
    * 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 @@
   /**
    * Entry point for all Comparator Collections tests.
    * @author Stephen Colebourne
  - * @version $Id$
  + * @version $Revision$ $Date$
    */
   public class TestAll extends TestCase {
       public TestAll(String testName) {
  @@ -76,6 +73,7 @@
   
       public static Test suite() {
           TestSuite suite = new TestSuite();
  +        suite.addTest(TestBooleanComparator.suite());
           suite.addTest(TestComparableComparator.suite());
           suite.addTest(TestComparatorChain.suite());
           suite.addTest(TestNullComparator.suite());
  
  
  
  1.1                  
jakarta-commons/collections/src/test/org/apache/commons/collections/comparators/TestBooleanComparator.java
  
  Index: TestBooleanComparator.java
  ===================================================================
  /* 
   * $Header: 
/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 [EMAIL PROTECTED]
   *
   * 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
   * <http://www.apache.org/>.
   */
  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
          }
      }
  
  }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to