Alberto Scotto created LANG-1627:
------------------------------------
Summary: BooleanUtils.xor not behaving as expected with any odd
number of true's
Key: LANG-1627
URL: https://issues.apache.org/jira/browse/LANG-1627
Project: Commons Lang
Issue Type: Bug
Affects Versions: 3.11
Reporter: Alberto Scotto
Hi,
I was expecting a xor function that takes a variable number of arguments to
*return true if and only if exactly one among all of the arguments is true*,
regardless of the number of arguments.
This holds true given three false's:
{code:java}
@Test
public void threeFalse() {
boolean[] bools = new boolean[]{Boolean.FALSE, Boolean.FALSE, Boolean.FALSE};
assertFalse(BooleanUtils.xor(bools));
}{code}
It also holds true given 4 true's, as well as for any even number of trues.
{code:java}
@Test
public void fourTrue() {
boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE,
Boolean.TRUE, Boolean.TRUE};
assertFalse(BooleanUtils.xor(bools));
}
{code}
The above tests pass.
But with any odd number of true's that doesn't hold anymore:
{code:java}
@Test
public void threeTrue() {
boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE, Boolean.TRUE};
assertFalse(BooleanUtils.xor(bools));
}
{code}
This test fails.
That was totally unexpected to me.
But as it turns out, even
{noformat}
true ^ true ^ true{noformat}
evaluates to true. That was unexpected too to me, at a first sight.
The thing is that xor (I mean the original boolean operator) is a binary
operator, so if you want to make it n-ary, one simple solution is to apply it
in two by two: ((a ^ b) ^ c) ^ d
And that's what is done in the implementation of the method BooleanUtils#xor.
But that brings to BooleanUtils.xor(true, true, true) == true, and at the same
time BooleanUtils.xor(true, true, true, true) == false, which just doesn't
sound right to me.
Whether or not you agree with me that that is a bug of the method, please at
least update the Javadoc, because right now it is not providing the user enough
information. Look:
{code:java}
Performs an xor on a set of booleans.
BooleanUtils.xor(true, true) = false
BooleanUtils.xor(false, false) = false
BooleanUtils.xor(true, false) = true
{code}
Thanks.
Cheers
--
This message was sent by Atlassian Jira
(v8.3.4#803005)