git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277431 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -49,6 +49,15 @@ file.</p> <p>The <code><or></code> condition has the same | |||||
| shortcut semantics as the Java || operator, as soon as one of the | shortcut semantics as the Java || operator, as soon as one of the | ||||
| nested conditions is true, no other condition will be evaluated.</p> | nested conditions is true, no other condition will be evaluated.</p> | ||||
| <h4>xor</h4> | |||||
| <p>The <code><xor></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><and></code> | |||||
| and <code><or></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> | <h4>available</h4> | ||||
| <p>This condition is identical to the <a | <p>This condition is identical to the <a | ||||
| href="available.html">Available</a> task, all attributes and nested | href="available.html">Available</a> task, all attributes and nested | ||||
| @@ -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> | |||||
| @@ -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; | |||||
| } | |||||
| } | |||||
| @@ -41,4 +41,4 @@ ispingable=org.apache.tools.ant.taskdefs.optional.condition.IsPingable | |||||
| mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | ||||
| scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | ||||
| scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | ||||
| xor=org.apache.tools.ant.taskdefs.condition.Xor | |||||
| @@ -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"); | |||||
| } | |||||
| } | |||||