groovy.util.JavadocAssertionTestSuite.groovy Maven / Gradle / Ivy
/*
* Copyright 2003-2013 the original author or authors.
*
* 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 groovy.util
import junit.framework.TestSuite
import junit.framework.Test
import junit.textui.TestRunner
/**
* JavadocAssertionTestSuite
will dynamically create test cases from Groovy assertions placed within
* Javadoc comments. Assertions should be placed within an html tag with a class="groovyTestCase"
* attribute assignment. Example:
* <pre class="groovyTestCase"> assert "example".size() == 7 </pre>
*
* Source files will be read from the directory specified by the javadocAssertion.src.dir
* system property, including all files matching javadocAssertion.src.pattern
and
* excluding files matching the javadocAssertion.src.excludesPattern
.
*
* By default all .java
and .groovy
source files from ./src
will
* be scanned for assertions.
*
* You can also run this class as an application from the command line (assumes Groovy, JUnit and Ant
* are on the classpath). As an example:
*
*
* java groovy.util.JavadocAssertionTestSuite src/main
*
*
* Note: this class requires the Ant module at runtime.
*
* @author Merlyn Albery-Speyer
*/
class JavadocAssertionTestSuite extends TestSuite {
/** The System Property to set as base directory for collection of Classes.
* The pattern will be used as an Ant fileset include basedir.
* Key is "javadocAssertion.src.dir".
* Defaults to the ./src
directory
*/
public static final String SYSPROP_SRC_DIR = "javadocAssertion.src.dir";
/** The System Property to set as the filename pattern for collection of Classes.
* The pattern will be used as Regular Expression pattern applied with the find
* operator against each candidate file.path.
* Key is "javadocAssertion.src.pattern".
* Defaults to including all .java
and .groovy
files.
*/
public static final String SYSPROP_SRC_PATTERN = "javadocAssertion.src.pattern";
/** The System Property to set as a filename excludes pattern for collection of Classes.
* When non-empty, the pattern will be used as Regular Expression pattern applied with the
* find operator against each candidate file.path.
* Key is "javadocAssertion.src.excludesPattern".
* Default value is "".
*/
public static final String SYSPROP_SRC_EXCLUDES_PATTERN = "javadocAssertion.src.excludesPattern";
private static JavadocAssertionTestBuilder testBuilder = new JavadocAssertionTestBuilder()
private static IFileNameFinder finder = Class.forName('groovy.util.FileNameFinder',true,this.classLoader).newInstance()
static Test suite() {
String basedir = System.getProperty(SYSPROP_SRC_DIR, "./src/")
return suite(basedir)
}
static Test suite(String basedir) {
String includePattern = System.getProperty(SYSPROP_SRC_PATTERN, "**/*.java,**/*.groovy")
return suite(basedir, includePattern)
}
static Test suite(String basedir, String includePattern) {
String excludePattern = System.getProperty(SYSPROP_SRC_EXCLUDES_PATTERN, "")
return suite(basedir, includePattern, excludePattern)
}
static Test suite(String basedir, String includePattern, String excludePattern) {
assert new File(basedir).exists()
TestSuite suite = new JavadocAssertionTestSuite()
Collection filenames = finder.getFileNames([dir:basedir, includes:includePattern, excludes:excludePattern])
filenames.each { filename ->
String code = new File(filename).text
Class test = testBuilder.buildTest(filename, code)
if (test != null) {
suite.addTestSuite(test)
}
}
return suite
}
static void main(String[] args) {
switch(args.length) {
case 3:
TestRunner.run(suite(args[0], args[1], args[2]))
break
case 2:
TestRunner.run(suite(args[0], args[1]))
break
case 1:
TestRunner.run(suite(args[0]))
break
default:
TestRunner.run(suite())
}
}
}