Author: britter
Date: Tue Oct 15 19:09:31 2013
New Revision: 1532491

URL: http://svn.apache.org/r1532491
Log:
LANG-922 - Add isOneTrue(booleans...) to BooleanUtils to preserve old behavior 
of BooleanUtils.xor(booleans...). Added isOneTrue for primitives and wrappers, 
isOneFalse still missing.

Modified:
    
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/BooleanUtils.java
    
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java

Modified: 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/BooleanUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/BooleanUtils.java?rev=1532491&r1=1532490&r2=1532491&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/BooleanUtils.java
 (original)
+++ 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/BooleanUtils.java
 Tue Oct 15 19:09:31 2013
@@ -141,6 +141,82 @@ public class BooleanUtils {
         return !isFalse(bool);
     }
 
+    /**
+     * <p>Checks if exactly one of the given booleans is true.</p>
+     *
+     * <pre>
+     *   BooleanUtils.isOneTrue(true, true)   = false
+     *   BooleanUtils.isOneTrue(false, false) = false
+     *   BooleanUtils.isOneTrue(true, false)  = true
+     *   BooleanUtils.isOneTrue(true, true)   = false
+     *   BooleanUtils.isOneTrue(false, false) = false
+     *   BooleanUtils.isOneTrue(true, false)  = true
+     * </pre>
+     *
+     * @param array  an array of {@code boolean}s
+     * @return {@code true} if the array containes the value true only once.
+     * @throws IllegalArgumentException if {@code array} is {@code null}
+     * @throws IllegalArgumentException if {@code array} is empty.
+     * @since 3.2
+     */
+    public static boolean isOneTrue(final boolean... array) {
+        // Validates input
+        if (array == null) {
+            throw new IllegalArgumentException("The Array must not be null");
+        }
+        if (array.length == 0) {
+            throw new IllegalArgumentException("Array is empty");
+        }
+
+        // Loops through array, comparing each item
+        int trueCount = 0;
+        for (final boolean element : array) {
+            // If item is true, and trueCount is < 1, increments count
+            // Else, isOneTrue fails
+            if (element) {
+                if (trueCount < 1) {
+                    trueCount++;
+                } else {
+                    return false;
+                }
+            }
+        }
+
+        // Returns true if there was exactly 1 true item
+        return trueCount == 1;
+    }
+
+    /**
+     * <p>Checks if exactly one of the given Booleans is true.</p>
+     *
+     * <pre>
+     *   BooleanUtils.isOneTrue(new Boolean[] { Boolean.TRUE, Boolean.TRUE })  
 = Boolean.FALSE
+     *   BooleanUtils.isOneTrue(new Boolean[] { Boolean.FALSE, Boolean.FALSE 
}) = Boolean.FALSE
+     *   BooleanUtils.isOneTrue(new Boolean[] { Boolean.TRUE, Boolean.FALSE }) 
 = Boolean.TRUE
+     * </pre>
+     *
+     * @param array  an array of {@code Boolean}s
+     * @return {@code true} if the array containes a Boolean with value true 
only once.
+     * @throws IllegalArgumentException if {@code array} is {@code null}
+     * @throws IllegalArgumentException if {@code array} is empty.
+     * @throws IllegalArgumentException if {@code array} contains a {@code 
null}
+     * @since 3.2
+     */
+    public static Boolean isOneTrue(final Boolean... array) {
+        if (array == null) {
+            throw new IllegalArgumentException("The Array must not be null");
+        }
+        if (array.length == 0) {
+            throw new IllegalArgumentException("Array is empty");
+        }
+        try {
+            final boolean[] primitive = ArrayUtils.toPrimitive(array);
+            return isOneTrue(primitive) ? Boolean.TRUE : Boolean.FALSE;
+        } catch (final NullPointerException ex) {
+            throw new IllegalArgumentException("The array must not contain any 
null elements");
+        }
+    }
+
     //-----------------------------------------------------------------------
     /**
      * <p>Converts a Boolean to a boolean handling {@code null}

Modified: 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java?rev=1532491&r1=1532490&r2=1532491&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java
 (original)
+++ 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/BooleanUtilsTest.java
 Tue Oct 15 19:09:31 2013
@@ -53,6 +53,189 @@ public class BooleanUtilsTest {
         assertSame(Boolean.FALSE, BooleanUtils.negate(Boolean.TRUE));
     }
 
+    //  test isOneTrue
+    //  -----------------------------------------------------------------------
+    @Test(expected = IllegalArgumentException.class)
+    public void testIsOneTrue_primitive_nullInput() {
+        BooleanUtils.isOneTrue((boolean[]) null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testIsOneTrue_primitive_emptyInput() {
+        BooleanUtils.isOneTrue(new boolean[] {});
+    }
+
+    @Test
+    public void testIsOneTrue_primitive_validInput_2items() {
+        assertFalse(
+                "true, true",
+                BooleanUtils.isOneTrue(new boolean[] { true, true }));
+
+        assertFalse(
+                "false, false",
+                BooleanUtils.isOneTrue(new boolean[] { false, false }));
+
+        assertTrue(
+                "true, false",
+                BooleanUtils.isOneTrue(new boolean[] { true, false }));
+
+        assertTrue(
+                "false, true",
+                BooleanUtils.isOneTrue(new boolean[] { false, true }));
+    }
+
+    @Test
+    public void testIsOneTrue_primitive_validInput_3items() {
+        assertFalse(
+                "false, false, false",
+                BooleanUtils.isOneTrue(new boolean[] { false, false, false }));
+
+        assertTrue(
+                "false, false, true",
+                BooleanUtils.isOneTrue(new boolean[] { false, false, true }));
+
+        assertTrue(
+                "false, true, false",
+                BooleanUtils.isOneTrue(new boolean[] { false, true, false }));
+
+        assertFalse(
+                "false, true, true",
+                BooleanUtils.isOneTrue(new boolean[] { false, true, true }));
+
+        assertTrue(
+                "true, false, false",
+                BooleanUtils.isOneTrue(new boolean[] { true, false, false }));
+
+        assertFalse(
+                "true, false, true",
+                BooleanUtils.isOneTrue(new boolean[] { true, false, true }));
+
+        assertFalse(
+                "true, true, false",
+                BooleanUtils.isOneTrue(new boolean[] { true, true, false }));
+
+        assertFalse(
+                "true, true, true",
+                BooleanUtils.isOneTrue(new boolean[] { true, true, true }));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testIsOneTrue_object_nullInput() {
+        BooleanUtils.isOneTrue((Boolean[]) null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testIsOneTrue_object_emptyInput() {
+        BooleanUtils.isOneTrue(new Boolean[] {});
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testIsOneTrue_object_nullElementInput() {
+        BooleanUtils.isOneTrue(new Boolean[] {null});
+    }
+
+    @Test
+    public void testIsOneTrue_object_validInput_2items() {
+        assertFalse(
+                "false, false",
+                BooleanUtils
+                        .isOneTrue(new Boolean[] { Boolean.FALSE, 
Boolean.FALSE })
+                        .booleanValue());
+
+        assertTrue(
+                "false, true",
+                BooleanUtils
+                        .isOneTrue(new Boolean[] { Boolean.FALSE, Boolean.TRUE 
})
+                        .booleanValue());
+
+        assertTrue(
+                "true, false",
+                BooleanUtils
+                        .isOneTrue(new Boolean[] { Boolean.TRUE, Boolean.FALSE 
})
+                        .booleanValue());
+
+        assertFalse(
+                "true, true",
+                BooleanUtils
+                        .isOneTrue(new Boolean[] { Boolean.TRUE, Boolean.TRUE 
})
+                        .booleanValue());
+    }
+
+    @Test
+    public void testIsOneTrue_object_validInput_3items() {
+        assertFalse(
+                "false, false, false",
+                BooleanUtils.isOneTrue(
+                        new Boolean[] {
+                                Boolean.FALSE,
+                                Boolean.FALSE,
+                                Boolean.FALSE })
+                        .booleanValue());
+
+        assertTrue(
+                "false, false, true",
+                BooleanUtils
+                        .isOneTrue(
+                                new Boolean[] {
+                                        Boolean.FALSE,
+                                        Boolean.FALSE,
+                                        Boolean.TRUE })
+                        .booleanValue());
+
+        assertTrue(
+                "false, true, false",
+                BooleanUtils
+                        .isOneTrue(
+                                new Boolean[] {
+                                        Boolean.FALSE,
+                                        Boolean.TRUE,
+                                        Boolean.FALSE })
+                        .booleanValue());
+
+        assertTrue(
+                "true, false, false",
+                BooleanUtils
+                        .isOneTrue(
+                                new Boolean[] {
+                                        Boolean.TRUE,
+                                        Boolean.FALSE,
+                                        Boolean.FALSE })
+                        .booleanValue());
+
+        assertFalse(
+                "true, false, true",
+                BooleanUtils.isOneTrue(
+                        new Boolean[] {
+                                Boolean.TRUE,
+                                Boolean.FALSE,
+                                Boolean.TRUE })
+                        .booleanValue());
+
+        assertFalse(
+                "true, true, false",
+                BooleanUtils.isOneTrue(
+                        new Boolean[] {
+                                Boolean.TRUE,
+                                Boolean.TRUE,
+                                Boolean.FALSE })
+                        .booleanValue());
+
+        assertFalse(
+                "false, true, true",
+                BooleanUtils.isOneTrue(
+                        new Boolean[] {
+                                Boolean.FALSE,
+                                Boolean.TRUE,
+                                Boolean.TRUE })
+                        .booleanValue());
+
+        assertFalse(
+                "true, true, true",
+                BooleanUtils
+                        .isOneTrue(new Boolean[] { Boolean.TRUE, Boolean.TRUE, 
Boolean.TRUE })
+                        .booleanValue());
+    }
+
     //-----------------------------------------------------------------------
     @Test
     public void test_isTrue_Boolean() {


Reply via email to