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 | |||||
| } | |||||
| } | |||||