Xor. Not strictly necessary, but the logical equivalent is a dog to type.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277431 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Steve Loughran 2005-01-22 22:01:15 +00:00
parent f3a1a77fc5
commit f119bd971b
5 changed files with 218 additions and 1 deletions

View File

@ -49,6 +49,15 @@ <h4>or</h4> <p>
shortcut semantics as the Java || operator, as soon as one of the
nested conditions is true, no other condition will be evaluated.</p>
<h4>xor</h4>
<p>The <code>&lt;xor&gt;</code> element performs an exclusive
or on all nested elements, similar to the <code>^</code> operator
in Java. It only evaluates to true if an odd number of nested conditions
are true. There is no shortcutting of evaluation, unlike the <code>&lt;and&gt;</code>
and <code>&lt;or&gt;</code> tests.
It doesn't have any attributes and accepts all nested
elements of the condition task as nested elements as well.</p>
<h4>available</h4>
<p>This condition is identical to the <a
href="available.html">Available</a> task, all attributes and nested

View File

@ -0,0 +1,95 @@
<project default="all">
<!--
Xor semantics
in out
== ===
00 0
01 1
10 1
00 0
-->
<target name="testEmpty" >
<fail message="empty test">
<condition>
<xor/>
</condition>
</fail>
</target>
<target name="test1" >
<fail message="testTrue">
<condition>
<not>
<xor>
<istrue value="true" />
</xor>
</not>
</condition>
</fail>
</target>
<target name="test0" >
<fail message="testFalse">
<condition>
<xor>
<istrue value="" />
</xor>
</condition>
</fail>
</target>
<target name="test10" >
<fail message="test10">
<condition>
<not>
<xor>
<istrue value="true" />
<istrue value="" />
</xor>
</not>
</condition>
</fail>
</target>
<target name="test01" >
<fail message="test01">
<condition>
<not>
<xor>
<istrue value="" />
<istrue value="true" />
</xor>
</not>
</condition>
</fail>
</target>
<target name="test00" >
<fail message="test10">
<condition>
<xor>
<istrue value="" />
<istrue value="" />
</xor>
</condition>
</fail>
</target>
<target name="test11" >
<fail message="test11">
<condition>
<xor>
<istrue value="" />
<istrue value="" />
</xor>
</condition>
</fail>
</target>
</project>

View File

@ -0,0 +1,46 @@
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import org.apache.tools.ant.BuildException;
import java.util.Enumeration;
/**
* <tt>Xor</tt> task to exclusive or operations.
* This does not shortcut stuff
*/
public class Xor extends ConditionBase implements Condition {
/**
* @return true if all the contained conditions evaluates to true
* @throws org.apache.tools.ant.BuildException
* if an error occurs
*/
public boolean eval() throws BuildException {
Enumeration e = getConditions();
//initial state is false.
boolean state=false;
while (e.hasMoreElements()) {
Condition c = (Condition) e.nextElement();
//every condition is xored against the previous one
state ^= c.eval();
}
return state;
}
}

View File

@ -41,4 +41,4 @@ ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable
mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository
scriptselector=org.apache.tools.ant.types.optional.ScriptSelector
scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition
xor=org.apache.tools.ant.taskdefs.condition.Xor

View File

@ -0,0 +1,67 @@
/*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import org.apache.tools.ant.BuildFileTest;
/**
* Test that Xor follows the conventional boolean logic semantics
* (a ^ b) === (a||b)&!(a&&b)
*/
public class XorTest extends BuildFileTest {
public XorTest(String name) {
super(name);
}
/**
* The JUnit setup method
*/
public void setUp() {
configureProject("src/etc/testcases/taskdefs/conditions/xor.xml");
}
public void testEmpty() {
executeTarget("testEmpty");
}
public void test0() {
executeTarget("test0");
}
public void test1() {
executeTarget("test1");
}
public void test00() {
executeTarget("test00");
}
public void test10() {
executeTarget("test10");
}
public void test01() {
executeTarget("test01");
}
public void test11() {
executeTarget("test11");
}
}