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