git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278138 13f79535-47bb-0310-9956-ffa450edef68master
@@ -0,0 +1 @@ | |||
build |
@@ -0,0 +1,93 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
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. | |||
--> | |||
<project default="compile"> | |||
<target name="setup"> | |||
<property name="build" value="build"/> | |||
<property name="build.classes" value="${build}/classes"/> | |||
<property name="build.testclasses" value="${build}/test-classes"/> | |||
<property name="build.lib" value="${build}/lib"/> | |||
<property name="jarname" value="${build.lib}/ant-antunit.jar"/> | |||
<mkdir dir="${build.classes}"/> | |||
<mkdir dir="${build.testclasses}"/> | |||
<mkdir dir="${build.lib}"/> | |||
</target> | |||
<target name="compile" depends="setup"> | |||
<javac | |||
srcdir="src/main" | |||
destdir="${build.classes}" | |||
debug="true" | |||
/> | |||
</target> | |||
<target name="antlib" depends="compile"> | |||
<copy todir="${build.classes}"> | |||
<fileset dir="src/main" includes="**/antlib.xml"/> | |||
</copy> | |||
<jar | |||
destfile="${jarname}" | |||
basedir="${build.classes}" | |||
/> | |||
</target> | |||
<target name="setup-for-tests" depends="setup"> | |||
<ant | |||
antfile="../../../build.xml" | |||
target="test-jar" | |||
inheritall="false" | |||
/> | |||
</target> | |||
<target name="compile-tests" depends="setup-for-tests, antlib"> | |||
<javac | |||
srcdir="src/testcases" | |||
destdir="${build.testclasses}" | |||
debug="true" | |||
> | |||
<classpath> | |||
<pathelement location="${jarname}"/> | |||
<pathelement location="../../../build/lib/ant-testutil.jar"/> | |||
</classpath> | |||
</javac> | |||
</target> | |||
<target name="test" depends="compile-tests"> | |||
<junit | |||
printsummary="false" | |||
haltonfailure="false" | |||
failureproperty="tests.failed" | |||
filtertrace="false" | |||
fork="true" | |||
forkmode="once" | |||
> | |||
<classpath> | |||
<pathelement location="${jarname}"/> | |||
<pathelement location="../../../build/lib/ant-testutil.jar"/> | |||
<pathelement location="${build.testclasses}"/> | |||
</classpath> | |||
<batchtest> | |||
<fileset dir="src/testcases"/> | |||
</batchtest> | |||
<formatter type="plain" usefile="false"/> | |||
</junit> | |||
<fail if="tests.failed">At least one test has failed.</fail> | |||
</target> | |||
</project> |
@@ -0,0 +1,143 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
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. | |||
--> | |||
<project name="assert-test" | |||
default="all" xmlns:au="antlib:org.apache.ant.antlib.antunit"> | |||
<target name="all"> | |||
<fail>Only run via JUnit</fail> | |||
</target> | |||
<target name="assertTruePass"> | |||
<au:assertTrue> | |||
<istrue value="true"/> | |||
</au:assertTrue> | |||
</target> | |||
<target name="assertTrueFail"> | |||
<au:assertTrue> | |||
<istrue value="false"/> | |||
</au:assertTrue> | |||
</target> | |||
<target name="assertFalsePass"> | |||
<au:assertFalse> | |||
<isfalse value="true"/> | |||
</au:assertFalse> | |||
</target> | |||
<target name="assertFalseFail"> | |||
<au:assertFalse> | |||
<isfalse value="false"/> | |||
</au:assertFalse> | |||
</target> | |||
<target name="assertEqualsPass"> | |||
<au:assertEquals expected="bar" actual="bar"/> | |||
</target> | |||
<target name="assertEqualsCasePass"> | |||
<au:assertEquals expected="bar" actual="BAR" casesensitive="false"/> | |||
</target> | |||
<target name="assertEqualsFail1"> | |||
<au:assertEquals expected="bar" actual="baz"/> | |||
</target> | |||
<target name="assertEqualsFail2"> | |||
<au:assertEquals expected="bar" actual="BAR"/> | |||
</target> | |||
<target name="assertPropertySetPass"> | |||
<property name="foo" value="bar"/> | |||
<au:assertPropertySet name="foo"/> | |||
</target> | |||
<target name="assertPropertySetFail"> | |||
<au:assertPropertySet name="foo"/> | |||
</target> | |||
<target name="assertPropertyEqualsPass"> | |||
<property name="foo" value="bar"/> | |||
<au:assertPropertyEquals name="foo" value="bar"/> | |||
</target> | |||
<target name="assertPropertyEqualsCasePass"> | |||
<property name="foo" value="bar"/> | |||
<au:assertPropertyEquals name="foo" value="BAR" casesensitive="false"/> | |||
</target> | |||
<target name="assertPropertyEqualsFail1"> | |||
<au:assertPropertyEquals name="foo" value="bar"/> | |||
</target> | |||
<target name="assertPropertyEqualsFail2"> | |||
<property name="foo" value="bar"/> | |||
<au:assertPropertyEquals name="foo" value="baz"/> | |||
</target> | |||
<target name="assertPropertyEqualsFail3"> | |||
<property name="foo" value="bar"/> | |||
<au:assertPropertyEquals name="foo" value="BAR"/> | |||
</target> | |||
<target name="assertFileExistsPass"> | |||
<au:assertFileExists file="assert.xml"/> | |||
</target> | |||
<target name="assertFileExistsFail"> | |||
<au:assertFileExists file="assert.txt"/> | |||
</target> | |||
<target name="assertFileDoesntExistPass"> | |||
<au:assertFileDoesntExist file="assert.txt"/> | |||
</target> | |||
<target name="assertFileDoesntExistFail"> | |||
<au:assertFileDoesntExist file="assert.xml"/> | |||
</target> | |||
<target name="assertDestIsUptodatePass"> | |||
<au:assertDestIsUptodate | |||
src="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||
dest="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||
</target> | |||
<target name="assertDestIsUptodateFail"> | |||
<au:assertDestIsUptodate | |||
dest="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||
src="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||
</target> | |||
<target name="assertDestIsOutofdatePass"> | |||
<au:assertDestIsOutofdate | |||
dest="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||
src="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||
</target> | |||
<target name="assertDestIsOutofdateFail"> | |||
<au:assertDestIsOutofdate | |||
src="../../main/org/apache/ant/antlib/antunit/AssertTask.java" | |||
dest="../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class"/> | |||
</target> | |||
</project> |
@@ -0,0 +1,70 @@ | |||
/* | |||
* 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.ant.antlib.antunit; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.taskdefs.condition.Condition; | |||
import org.apache.tools.ant.taskdefs.condition.ConditionBase; | |||
/** | |||
* Exits the active build, giving an additional message if the single | |||
* nested condition fails. | |||
* | |||
* <p>This one could as well be implemented as | |||
* | |||
* <pre> | |||
* <macrodef name="assertTrue"> | |||
* <attribute name="message" default="Assertion failed"/> | |||
* <element name="assertion" implicit="true"/> | |||
* <sequential> | |||
* <fail message="@{message}"> | |||
* <condition> | |||
* <assertion/> | |||
* </condition> | |||
* </fail> | |||
* </sequential> | |||
* </macrodef> | |||
* </pre> | |||
* | |||
* but wouldn't be able to throw a specialized exception that way - | |||
* and the macrodef would nest the exception in yet another | |||
* BuildException.</p> | |||
*/ | |||
public class AssertTask extends ConditionBase { | |||
private String message = AssertionFailedException.DEFAULT_MESSAGE; | |||
public void setMessage(String value) { | |||
this.message = value; | |||
} | |||
public void execute() throws BuildException { | |||
int count = countConditions(); | |||
if (count > 1) { | |||
throw new BuildException("You must not specify more tha one " | |||
+ "conditions"); | |||
} | |||
if (count < 1) { | |||
throw new BuildException("You must specify a condition"); | |||
} | |||
if (!((Condition) getConditions().nextElement()).eval()) { | |||
throw new AssertionFailedException(message); | |||
} | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
/* | |||
* 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.ant.antlib.antunit; | |||
import org.apache.tools.ant.BuildException; | |||
/** | |||
* Specialized BuildException thrown by the AssertTask task. | |||
*/ | |||
public class AssertionFailedException extends BuildException { | |||
public static final String DEFAULT_MESSAGE = "Assertion failed"; | |||
public AssertionFailedException(String message) { | |||
super(message); | |||
} | |||
} |
@@ -0,0 +1,117 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
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. | |||
--> | |||
<antlib xmlns:au="antlib:org.apache.ant.antlib.antunit"> | |||
<taskdef name="assertTrue" | |||
classname="org.apache.ant.antlib.antunit.AssertTask"/> | |||
<macrodef name="assertFalse"> | |||
<attribute name="message" default="Assertion failed"/> | |||
<element name="assertion" implicit="true"/> | |||
<sequential> | |||
<au:assertTrue message="@{message}"> | |||
<not> | |||
<assertion/> | |||
</not> | |||
</au:assertTrue> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertEquals"> | |||
<attribute name="expected"/> | |||
<attribute name="actual"/> | |||
<attribute name="casesensitive" default="true"/> | |||
<attribute name="message" | |||
default="Expected '@{expected}' but was '@{actual}'"/> | |||
<sequential> | |||
<au:assertTrue message="@{message}"> | |||
<equals arg1="@{expected}" arg2="@{actual}" | |||
casesensitive="@{casesensitive}"/> | |||
</au:assertTrue> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertPropertySet"> | |||
<attribute name="name"/> | |||
<attribute name="message" | |||
default="Expected property '@{name}'"/> | |||
<sequential> | |||
<au:assertTrue message="@{message}"> | |||
<isset property="@{name}"/> | |||
</au:assertTrue> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertPropertyEquals"> | |||
<attribute name="name"/> | |||
<attribute name="value"/> | |||
<attribute name="casesensitive" default="true"/> | |||
<attribute name="message" | |||
default="Expected property '@{name}' to have value '@{value}' but was '${@{name}}'"/> | |||
<sequential> | |||
<au:assertPropertySet message="@{message}" name="@{name}"/> | |||
<au:assertEquals message="@{message}" expected="@{value}" | |||
actual="${@{name}}" casesensitive="@{casesensitive}"/> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertFileExists"> | |||
<attribute name="file"/> | |||
<attribute name="message" | |||
default="Expected file '@{file}' to exist"/> | |||
<sequential> | |||
<au:assertTrue message="@{message}"> | |||
<available file="@{file}"/> | |||
</au:assertTrue> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertFileDoesntExist"> | |||
<attribute name="file"/> | |||
<attribute name="message" | |||
default="Didn't expect file '@{file}' to exist"/> | |||
<sequential> | |||
<au:assertFalse message="@{message}"> | |||
<available file="@{file}"/> | |||
</au:assertFalse> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertDestIsUptodate"> | |||
<attribute name="src"/> | |||
<attribute name="dest"/> | |||
<attribute name="message" | |||
default="Expected '@{dest}' to be more recent than '@{src}'"/> | |||
<sequential> | |||
<au:assertTrue message="@{message}"> | |||
<uptodate srcfile="@{src}" targetfile="@{dest}"/> | |||
</au:assertTrue> | |||
</sequential> | |||
</macrodef> | |||
<macrodef name="assertDestIsOutofdate"> | |||
<attribute name="src"/> | |||
<attribute name="dest"/> | |||
<attribute name="message" | |||
default="Expected '@{src}' to be more recent than '@{dest}'"/> | |||
<sequential> | |||
<au:assertFalse message="@{message}"> | |||
<uptodate srcfile="@{src}" targetfile="@{dest}"/> | |||
</au:assertFalse> | |||
</sequential> | |||
</macrodef> | |||
</antlib> |
@@ -0,0 +1,138 @@ | |||
/* | |||
* 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.ant.antlib.antunit; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.BuildFileTest; | |||
public class AssertTest extends BuildFileTest { | |||
public AssertTest(String name) { | |||
super(name); | |||
} | |||
public void setUp() { | |||
configureProject("src/etc/testcases/assert.xml"); | |||
} | |||
public void testTruePass() { | |||
testPass("assertTruePass"); | |||
} | |||
public void testFalsePass() { | |||
testPass("assertFalsePass"); | |||
} | |||
public void testEqualsPass() { | |||
testPass("assertEqualsPass"); | |||
} | |||
public void testEqualsCasePass() { | |||
testPass("assertEqualsCasePass"); | |||
} | |||
public void testPropertySetPass() { | |||
testPass("assertPropertySetPass"); | |||
} | |||
public void testPropertyEqualsPass() { | |||
testPass("assertPropertyEqualsPass"); | |||
} | |||
public void testPropertyEqualsCasePass() { | |||
testPass("assertPropertyEqualsCasePass"); | |||
} | |||
public void testFileExistsPass() { | |||
testPass("assertFileExistsPass"); | |||
} | |||
public void testFileDoesntExistPass() { | |||
testPass("assertFileDoesntExistPass"); | |||
} | |||
public void testDestIsUptodatePass() { | |||
testPass("assertDestIsUptodatePass"); | |||
} | |||
public void testDestIsOutofdatePass() { | |||
testPass("assertDestIsOutofdatePass"); | |||
} | |||
public void testTrueFail() { | |||
testFail("assertTrueFail"); | |||
} | |||
public void testFalseFail() { | |||
testFail("assertFalseFail"); | |||
} | |||
public void testEqualsFail1() { | |||
testFail("assertEqualsFail1", "Expected 'bar' but was 'baz'"); | |||
} | |||
public void testEqualsFail2() { | |||
testFail("assertEqualsFail2", "Expected 'bar' but was 'BAR'"); | |||
} | |||
public void testPropertySetFail() { | |||
testFail("assertPropertySetFail", "Expected property 'foo'"); | |||
} | |||
public void testPropertyEqualsFail1() { | |||
testFail("assertPropertyEqualsFail1", "Expected property 'foo' to have value 'bar' but was '${foo}'"); | |||
} | |||
public void testPropertyEqualsFail2() { | |||
testFail("assertPropertyEqualsFail2", "Expected property 'foo' to have value 'baz' but was 'bar'"); | |||
} | |||
public void testPropertyEqualsFail3() { | |||
testFail("assertPropertyEqualsFail3", "Expected property 'foo' to have value 'BAR' but was 'bar'"); | |||
} | |||
public void testFileExistsFail() { | |||
testFail("assertFileExistsFail", | |||
"Expected file 'assert.txt' to exist"); | |||
} | |||
public void testFileDoesntExistFail() { | |||
testFail("assertFileDoesntExistFail", | |||
"Didn't expect file 'assert.xml' to exist"); | |||
} | |||
public void testDestIsUptodateFail() { | |||
testFail("assertDestIsUptodateFail", | |||
"Expected '../../main/org/apache/ant/antlib/antunit/AssertTask.java' to be more recent than '../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class'"); | |||
} | |||
public void testDestIsOutofdateFail() { | |||
testFail("assertDestIsOutofdateFail", | |||
"Expected '../../main/org/apache/ant/antlib/antunit/AssertTask.java' to be more recent than '../../../build/classes/org/apache/ant/antlib/antunit/AssertTask.class'"); | |||
} | |||
private void testPass(String target) { | |||
executeTarget(target); | |||
} | |||
private void testFail(String target) { | |||
testFail(target, "Assertion failed"); | |||
} | |||
private void testFail(String target, String message) { | |||
try { | |||
executeTarget(target); | |||
fail("Expected failed assetion"); | |||
} catch (AssertionFailedException e) { | |||
assertEquals(message, e.getMessage()); | |||
} catch (BuildException e) { | |||
// depending on the number of macrodef indirections, this | |||
// can become arbitrarily deep | |||
while (true) { | |||
Throwable t = e.getCause(); | |||
assertNotNull(t); | |||
assertTrue("nested is a BuildException", | |||
t instanceof BuildException); | |||
if (t instanceof AssertionFailedException) { | |||
assertEquals(message, e.getMessage()); | |||
break; | |||
} | |||
e = (BuildException) t; | |||
} | |||
} // end of try-catch | |||
} | |||
} |