I've been using jelly and snooping on the mail list for a few weeks now. here's my
first patch.
I've implemented junit fixtures by adding setUp and tearDown Script type attributes to
the SuiteTag. attached is the patch file for the code and test cases. Please consider
for inclusion in Jelly.
Here's a snippet to show how it works ...
<define:script var="setUpScript">
<!-- fixture setUp script goes here -->
</define:script>
<define:script var="tearDownScript">
<!-- fixture tear-down script goes here -->
</define:script>
<!--
|| @setUp is called before each test:case.
|| @tearDown is called after each test:case.
|| @setUp and @tearDown run in the same context as the test:case.
-->
<test:suite setUp="${setUpScript}" tearDown="${tearDownScript}">
<test:case name="testcase">
<!-- test case script ..... -->
</test:case>
</test:suite>
I looked at a number of ways of getting fixtures in to the junit jelly tags. I settled
on the above as it's pretty neat and doesn't involve any new tags.
If there's a better approach that i've missed i'd be happy to discuss/code it/try it
out.
cheers
Darren McGrath
--
__________________________________________________________
Sign-up for your own FREE Personalized E-mail at Mail.com
http://www.mail.com/?sr=signup
Meet Singles
http://corp.mail.com/lavalife
Index: src/java/org/apache/commons/jelly/tags/junit/SuiteTag.java
===================================================================
RCS file:
/home/cvspublic/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/junit/SuiteTag.java,v
retrieving revision 1.2
diff -u -r1.2 SuiteTag.java
--- src/java/org/apache/commons/jelly/tags/junit/SuiteTag.java 30 Oct 2002 19:16:30
-0000 1.2
+++ src/java/org/apache/commons/jelly/tags/junit/SuiteTag.java 20 Dec 2002 11:29:05
+-0000
@@ -66,6 +66,7 @@
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
+import org.apache.commons.jelly.Script;
/**
* Represents a collection of TestCases.. This tag is analagous to
@@ -85,6 +86,12 @@
/** the name of the test suite to create */
private String name;
+ /** the fixture setup script to run before each test case */
+ private Script setUp;
+
+ /** the fixture tear down script to run after each test case */
+ private Script tearDown;
+
public SuiteTag() {
}
@@ -141,7 +148,35 @@
public void setName(String name) {
this.name = name;
}
-
+
+ /**
+ * Sets the fixture setup script to be run before each test case in this test
+suite
+ */
+ public void setSetUp(Script setUp) {
+ this.setUp = setUp;
+ }
+
+ /**
+ * Sets the fixture tear-down script to be run after each test case in this test
+suite
+ */
+ public void setTearDown(Script tearDown) {
+ this.tearDown = tearDown;
+ }
+
+ /**
+ * @return the fixture setup script to be run before each test case in this test
+suite
+ */
+ public Script getSetUp() {
+ return setUp;
+ }
+
+ /**
+ * @return the fixture tear-down script to be run after each test case in this
+test suite
+ */
+ public Script getTearDown() {
+ return tearDown;
+ }
+
// Implementation methods
//-------------------------------------------------------------------------
Index: src/java/org/apache/commons/jelly/tags/junit/CaseTag.java
===================================================================
RCS file:
/home/cvspublic/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/junit/CaseTag.java,v
retrieving revision 1.4
diff -u -r1.4 CaseTag.java
--- src/java/org/apache/commons/jelly/tags/junit/CaseTag.java 30 Oct 2002 19:16:30
-0000 1.4
+++ src/java/org/apache/commons/jelly/tags/junit/CaseTag.java 20 Dec 2002 11:29:06
+-0000
@@ -100,9 +100,15 @@
// disable inheritence of variables and tag libraries
newContext.setExportLibraries(false);
newContext.setExport(false);
-
+
+ // setup the test case fixture
+ runSetUp(newContext, output);
+
// invoke the test case
getBody().run(newContext, output);
+
+ // tear-down the test case fixture
+ runTearDown(newContext, output);
}
};
@@ -145,4 +151,29 @@
return (TestSuite) context.getVariable(
"org.apache.commons.jelly.junit.suite" );
}
+ /**
+ * Method to invoke the fixture setup script (if there is one) of the
+ * enclosing SuiteTag (if there is one)
+ */
+ protected void runSetUp(JellyContext newContext, XMLOutput output) throws
+Exception {
+ SuiteTag tag = (SuiteTag) findAncestorWithClass( SuiteTag.class );
+ if ( tag != null ) {
+ if (tag.getSetUp() != null) {
+ tag.getSetUp().run(newContext, output);
+ }
+ }
+ }
+
+ /**
+ * Method to invoke the fixture tear-down script (if there is one) of the
+ * enclosing SuiteTag (if there is one)
+ */
+ protected void runTearDown(JellyContext newContext, XMLOutput output) throws
+Exception {
+ SuiteTag tag = (SuiteTag) findAncestorWithClass( SuiteTag.class );
+ if ( tag != null ) {
+ if (tag.getTearDown() != null) {
+ tag.getTearDown().run(newContext, output);
+ }
+ }
+ }
}
Index: src/test/org/apache/commons/jelly/junit/suite.jelly
===================================================================
RCS file:
/home/cvspublic/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly,v
retrieving revision 1.11
diff -u -r1.11 suite.jelly
--- src/test/org/apache/commons/jelly/junit/suite.jelly 16 Dec 2002 10:46:42 -0000
1.11
+++ src/test/org/apache/commons/jelly/junit/suite.jelly 20 Dec 2002 11:29:07 -0000
@@ -1,5 +1,7 @@
<?xml version="1.0"?>
-<test:suite xmlns:j="jelly:core" xmlns:test="jelly:junit" xmlns:x="jelly:xml"
xmlns:log="jelly:log">
+<j:jelly xmlns:j="jelly:core" xmlns:test="jelly:junit" xmlns:x="jelly:xml"
+xmlns:log="jelly:log" xmlns:define="jelly:define">
+
+<test:suite>
<test:case name="assertTests">
@@ -113,3 +115,59 @@
-->
</test:suite>
+
+<!-- Define the fixture which consists of a setUp and tearDown scripts -->
+<define:script var="setUpScript">
+ <j:set var="foo" value="one"/>
+
+ <!-- check that tearDown removes bar from the parent context -->
+ <test:assert test='${context.getParent().findVariable("bar") == null}'/>
+ <j:set var="bar" value="uno" scope="parent"/>
+</define:script>
+
+<define:script var="tearDownScript">
+ <j:set var="bar" value="${null}" scope="parent"/>
+</define:script>
+
+<!--
+ || @setUp is called before each test:case.
+ || @tearDown is called after each test:case.
+ || @setUp and @tearDown run in the same scope as the test:case.
+-->
+<test:suite setUp="${setUpScript}" tearDown="${tearDownScript}">
+
+ <test:case name="testFixtureCase1">
+
+ <!-- make sure foo is in this context but not parent context -->
+ <test:assertEquals expected="one" actual="${foo}"/>
+ <test:assert test='${context.getParent().findVariable("foo") == null}'/>
+ <j:set var="foo" value="two"/>
+
+ <test:assert test='${context.getParent().findVariable("bar") == "uno"}'/>
+
+ <j:set var="local" value="tres"/>
+
+ </test:case>
+
+ <test:case name="testFixtureCase2">
+
+ <test:assertEquals expected="one" actual="${foo}"/>
+ <test:assert test='${context.getParent().findVariable("foo") == null}'/>
+
+ <test:assert test='${context.getParent().findVariable("bar") == "uno"}'/>
+
+ <test:assert test="${local == null}"/>
+
+ </test:case>
+
+</test:suite>
+
+<test:suite>
+
+ <test:case name="testNoFixture">
+ <test:assertEquals expected="${null}" actual="${foo}"/>
+ </test:case>
+
+</test:suite>
+
+</j:jelly>
\ No newline at end of file
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>