You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2003/06/28 20:16:03 UTC

cvs commit: jakarta-commons/lang/src/java/org/apache/commons/lang BooleanUtils.java

scolebourne    2003/06/28 11:16:03

  Modified:    lang/src/test/org/apache/commons/lang BooleanUtilsTest.java
               lang/src/java/org/apache/commons/lang BooleanUtils.java
  Log:
  Add XOR methods
  bug 21068, from Matthew Hawthorne
  
  Revision  Changes    Path
  1.4       +186 -1    jakarta-commons/lang/src/test/org/apache/commons/lang/BooleanUtilsTest.java
  
  Index: BooleanUtilsTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/BooleanUtilsTest.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BooleanUtilsTest.java	23 Mar 2003 21:47:30 -0000	1.3
  +++ BooleanUtilsTest.java	28 Jun 2003 18:16:03 -0000	1.4
  @@ -62,6 +62,7 @@
    * Unit tests {@link org.apache.commons.lang.BooleanUtils}.
    *
    * @author Stephen Colebourne
  + * @author Matthew Hawthorne
    * @version $Id$
    */
   public class BooleanUtilsTest extends TestCase {
  @@ -337,4 +338,188 @@
           assertEquals("N", BooleanUtils.toString(false, "Y", "N"));
       }
       
  +    //  testXor
  +    //  -----------------------------------------------------------------------
  +    public void testXor_primitive_nullInput() {
  +        final boolean[] b = null;
  +        try {
  +            BooleanUtils.xor(b);
  +            fail("Exception was not thrown for null input.");
  +        } catch (IllegalArgumentException ex) {}
  +    }
  +
  +    public void testXor_primitive_emptyInput() {
  +        try {
  +            BooleanUtils.xor(new boolean[] {});
  +            fail("Exception was not thrown for empty input.");
  +        } catch (IllegalArgumentException ex) {}
  +    }
  +
  +    public void testXor_primitive_validInput_2items() {
  +        assertTrue(
  +            "True result for (true, true)",
  +            ! BooleanUtils.xor(new boolean[] { true, true }));
  +
  +        assertTrue(
  +            "True result for (false, false)",
  +            ! BooleanUtils.xor(new boolean[] { false, false }));
  +
  +        assertTrue(
  +            "False result for (true, false)",
  +            BooleanUtils.xor(new boolean[] { true, false }));
  +
  +        assertTrue(
  +            "False result for (false, true)",
  +            BooleanUtils.xor(new boolean[] { false, true }));
  +    }
  +
  +    public void testXor_primitive_validInput_3items() {
  +        assertTrue(
  +            "False result for (false, false, true)",
  +            BooleanUtils.xor(new boolean[] { false, false, true }));
  +
  +        assertTrue(
  +            "False result for (false, true, false)",
  +            BooleanUtils.xor(new boolean[] { false, true, false }));
  +
  +        assertTrue(
  +            "False result for (true, false, false)",
  +            BooleanUtils.xor(new boolean[] { true, false, false }));
  +
  +        assertTrue(
  +            "True result for (true, true, true)",
  +            ! BooleanUtils.xor(new boolean[] { true, true, true }));
  +
  +        assertTrue(
  +            "True result for (false, false)",
  +            ! BooleanUtils.xor(new boolean[] { false, false, false }));
  +
  +        assertTrue(
  +            "True result for (true, true, false)",
  +            ! BooleanUtils.xor(new boolean[] { true, true, false }));
  +
  +        assertTrue(
  +            "True result for (true, false, true)",
  +            ! BooleanUtils.xor(new boolean[] { true, false, true }));
  +
  +        assertTrue(
  +            "False result for (false, true, true)",
  +            ! BooleanUtils.xor(new boolean[] { false, true, true }));
  +    }
  +
  +    public void testXor_object_nullInput() {
  +        final Boolean[] b = null;
  +        try {
  +            BooleanUtils.xor(b);
  +            fail("Exception was not thrown for null input.");
  +        } catch (IllegalArgumentException ex) {}
  +    }
  +
  +    public void testXor_object_emptyInput() {
  +        try {
  +            BooleanUtils.xor(new Boolean[] {});
  +            fail("Exception was not thrown for empty input.");
  +        } catch (IllegalArgumentException ex) {}
  +    }
  +
  +    public void testXor_object_validInput_2items() {
  +        assertTrue(
  +            "True result for (true, true)",
  +            ! BooleanUtils
  +                .xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "True result for (false, false)",
  +            ! BooleanUtils
  +                .xor(new Boolean[] { Boolean.FALSE, Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "False result for (true, false)",
  +            BooleanUtils
  +                .xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "False result for (false, true)",
  +            BooleanUtils
  +                .xor(new Boolean[] { Boolean.FALSE, Boolean.TRUE })
  +                .booleanValue());
  +    }
  +
  +    public void testXor_object_validInput_3items() {
  +        assertTrue(
  +            "False result for (false, false, true)",
  +            BooleanUtils
  +                .xor(
  +                    new Boolean[] {
  +                        Boolean.FALSE,
  +                        Boolean.FALSE,
  +                        Boolean.TRUE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "False result for (false, true, false)",
  +            BooleanUtils
  +                .xor(
  +                    new Boolean[] {
  +                        Boolean.FALSE,
  +                        Boolean.TRUE,
  +                        Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "False result for (true, false, false)",
  +            BooleanUtils
  +                .xor(
  +                    new Boolean[] {
  +                        Boolean.TRUE,
  +                        Boolean.FALSE,
  +                        Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "True result for (true, true, true)",
  +            ! BooleanUtils
  +                .xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE, Boolean.TRUE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "True result for (false, false)",
  +            ! BooleanUtils.xor(
  +                    new Boolean[] {
  +                        Boolean.FALSE,
  +                        Boolean.FALSE,
  +                        Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "True result for (true, true, false)",
  +            ! BooleanUtils.xor(
  +                    new Boolean[] {
  +                        Boolean.TRUE,
  +                        Boolean.TRUE,
  +                        Boolean.FALSE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "True result for (true, false, true)",
  +            ! BooleanUtils.xor(
  +                    new Boolean[] {
  +                        Boolean.TRUE,
  +                        Boolean.FALSE,
  +                        Boolean.TRUE })
  +                .booleanValue());
  +
  +        assertTrue(
  +            "False result for (false, true, true)",
  +            ! BooleanUtils.xor(
  +                    new Boolean[] {
  +                        Boolean.FALSE,
  +                        Boolean.TRUE,
  +                        Boolean.TRUE })
  +                .booleanValue());
  +    }
  +
   }
  
  
  
  1.6       +51 -9     jakarta-commons/lang/src/java/org/apache/commons/lang/BooleanUtils.java
  
  Index: BooleanUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/BooleanUtils.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- BooleanUtils.java	24 Jun 2003 21:14:50 -0000	1.5
  +++ BooleanUtils.java	28 Jun 2003 18:16:03 -0000	1.6
  @@ -60,6 +60,7 @@
    * boolean and Boolean objects.</p>
    *
    * @author Stephen Colebourne
  + * @author Matthew Hawthorne
    * @since 2.0
    * @version $Id$
    */
  @@ -77,7 +78,6 @@
   
       // Boolean utilities
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Negates the specified boolean.</p>
        * 
  @@ -95,7 +95,6 @@
       
       // boolean Boolean methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Boolean factory that avoids creating new Boolean objecs all the time.</p>
        * 
  @@ -137,7 +136,6 @@
       
       // Integer to Boolean methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Convert an int to a boolean using the convention that zero is false.</p>
        * 
  @@ -271,7 +269,6 @@
       
       // Boolean to Integer methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Convert a boolean to an int using the convention that zero is false.</p>
        * 
  @@ -365,7 +362,6 @@
       
       // String to Boolean methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Converts a String to a Boolean.</p>
        * 
  @@ -425,7 +421,6 @@
   
       // String to boolean methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Converts a String to a boolean.</p>
        * 
  @@ -476,7 +471,6 @@
   
       // Boolean to String methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Converts a Boolean to a String returning 'true', 'false', or <code>null</code>.</p>
        * 
  @@ -525,7 +519,6 @@
       
       // boolean to String methods
       //--------------------------------------------------------------------------
  -    
       /**
        * <p>Converts a boolean to a String returning 'true' or 'false'.</p>
        * 
  @@ -568,4 +561,53 @@
           return (bool ? trueString : falseString);
       }
       
  +    // xor methods
  +    //  --------------------------------------------------------------------------
  +    /**
  +     * Performs an xor on a set of booleans.
  +     * 
  +     * @param array  an array of <code>boolean<code>s
  +     * @return <code>true</code> if the xor is successful.
  +     * @throws NullArgumentException if <code>array</code> is <code>null</code>
  +     * @throws IllegalArgumentException if <code>array</code> is empty.
  +     */
  +    public static boolean xor(boolean[] array) {
  +        // Validates input
  +        if (array == null) {
  +            throw new NullArgumentException("Array");
  +        } else if (array.length == 0) {
  +            throw new IllegalArgumentException("Array is empty");
  +        }
  +
  +        // Loops through array, comparing each item
  +        int trueCount = 0;
  +        for (int i = 0; i < array.length; i++) {
  +            // If item is true, and trueCount is < 1, increments count
  +            // Else, xor fails
  +            if (array[i]) {
  +                if (trueCount < 1) {
  +                    trueCount++;
  +                } else {
  +                    return false;
  +                }
  +            }
  +        }
  +
  +        // Returns true if there was exactly 1 true item
  +        return trueCount == 1;
  +    }
  +
  +    /**
  +     * Performs an xor on an array of Booleans.
  +     * 
  +     * @param array  an array of <code>Boolean<code>s
  +     * @return <code>true</code> if the xor is successful.
  +     * @throws NullPointerException if <code>array</code> contains a <code>null</code>
  +     * @throws NullArgumentException if <code>array</code> is <code>null</code>
  +     * @throws IllegalArgumentException if <code>array</code> is empty.
  +     */
  +    public static Boolean xor(Boolean[] array) {
  +        return new Boolean(xor(ArrayUtils.toPrimitive(array)));
  +    }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org