[ https://issues.apache.org/jira/browse/LANG-1627?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gary D. Gregory resolved LANG-1627. ----------------------------------- Fix Version/s: 3.13.0 Resolution: Fixed > 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 > Priority: Major > Fix For: 3.13.0 > > Time Spent: 1h 40m > Remaining Estimate: 0h > > 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.20.10#820010)