summaryrefslogtreecommitdiff
path: root/contrib/testng
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-17 18:46:20 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-17 21:55:03 +0800
commit6220c78031c8459be46d408242deb3865d4719a8 (patch)
treea1fd81cf8df5e20f8af48e6b4d37c69badc4bde0 /contrib/testng
parent16e67cb248ba96fc3722561bcadbba27a2779a03 (diff)
downloadmill-6220c78031c8459be46d408242deb3865d4719a8.tar.gz
mill-6220c78031c8459be46d408242deb3865d4719a8.tar.bz2
mill-6220c78031c8459be46d408242deb3865d4719a8.zip
tidy up root folder
Diffstat (limited to 'contrib/testng')
-rw-r--r--contrib/testng/src/mill/testng/ResultEvent.java45
-rw-r--r--contrib/testng/src/mill/testng/TestNGFramework.java25
-rw-r--r--contrib/testng/src/mill/testng/TestNGInstance.java67
-rw-r--r--contrib/testng/src/mill/testng/TestNGRunner.java76
4 files changed, 213 insertions, 0 deletions
diff --git a/contrib/testng/src/mill/testng/ResultEvent.java b/contrib/testng/src/mill/testng/ResultEvent.java
new file mode 100644
index 00000000..6e2a50d6
--- /dev/null
+++ b/contrib/testng/src/mill/testng/ResultEvent.java
@@ -0,0 +1,45 @@
+
+package mill.testng;
+
+import sbt.testing.*;
+import org.testng.ITestResult;
+
+public class ResultEvent {
+ static Event failure(ITestResult result){ return event(Status.Failure, result); }
+ static Event skipped(ITestResult result){ return event(Status.Skipped, result); }
+ static Event success(ITestResult result){ return event(Status.Success, result); }
+
+ static Event event(Status result, ITestResult testNGResult) {
+ return new Event() {
+ public String fullyQualifiedName() {
+ return testNGResult.getTestClass().getName();
+ }
+
+ public Fingerprint fingerprint() {
+ return TestNGFingerprint.instance;
+ }
+
+ public Selector selector() {
+ return new SuiteSelector();
+ }
+
+ public Status status() {
+ return result;
+ }
+
+ public OptionalThrowable throwable() {
+ if (result != Status.Success){
+ return new OptionalThrowable(testNGResult.getThrowable());
+ }else {
+ return new OptionalThrowable();
+ }
+ }
+
+ @Override
+ public long duration() {
+ return testNGResult.getEndMillis() - testNGResult.getStartMillis();
+ }
+ };
+ }
+ static String classNameOf(ITestResult result){ return result.getTestClass().getName(); }
+} \ No newline at end of file
diff --git a/contrib/testng/src/mill/testng/TestNGFramework.java b/contrib/testng/src/mill/testng/TestNGFramework.java
new file mode 100644
index 00000000..6e993fcc
--- /dev/null
+++ b/contrib/testng/src/mill/testng/TestNGFramework.java
@@ -0,0 +1,25 @@
+package mill.testng;
+
+
+
+import sbt.testing.*;
+
+
+public class TestNGFramework implements Framework {
+ public String name(){ return "TestNG"; }
+
+ public Fingerprint[] fingerprints() {
+ return new Fingerprint[]{TestNGFingerprint.instance};
+ }
+
+ @Override
+ public Runner runner(String[] args, String[] remoteArgs, ClassLoader classLoader) {
+ return new TestNGRunner(args, remoteArgs, classLoader);
+ }
+}
+
+class TestNGFingerprint implements AnnotatedFingerprint{
+ final public static TestNGFingerprint instance = new TestNGFingerprint();
+ public String annotationName(){return "org.testng.annotations.Test";}
+ public boolean isModule(){return false;}
+}
diff --git a/contrib/testng/src/mill/testng/TestNGInstance.java b/contrib/testng/src/mill/testng/TestNGInstance.java
new file mode 100644
index 00000000..4cf274d3
--- /dev/null
+++ b/contrib/testng/src/mill/testng/TestNGInstance.java
@@ -0,0 +1,67 @@
+package mill.testng;
+
+
+import org.testng.*;
+import sbt.testing.EventHandler;
+import sbt.testing.Logger;
+
+import com.beust.jcommander.JCommander;
+
+import java.net.URLClassLoader;
+import java.util.Arrays;
+
+class TestNGListener implements ITestListener{
+ EventHandler basket;
+ String lastName = "";
+ public TestNGListener(EventHandler basket){
+ this.basket = basket;
+ }
+ public void onTestStart(ITestResult iTestResult) {
+ String newName = iTestResult.getTestClass().getName() + " " + iTestResult.getName() + " ";
+ if(!newName.equals(lastName)){
+ if (!lastName.equals("")){
+ System.out.println();
+ }
+ lastName = newName;
+ System.out.print(lastName);
+ }
+ }
+
+ public void onTestSuccess(ITestResult iTestResult) {
+ System.out.print('+');
+ basket.handle(ResultEvent.success(iTestResult));
+ }
+
+ public void onTestFailure(ITestResult iTestResult) {
+ System.out.print('X');
+ basket.handle(ResultEvent.failure(iTestResult));
+ }
+
+ public void onTestSkipped(ITestResult iTestResult) {
+ System.out.print('-');
+ basket.handle(ResultEvent.skipped(iTestResult));
+ }
+
+ public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) {
+ basket.handle(ResultEvent.failure(iTestResult));
+ }
+
+ public void onStart(ITestContext iTestContext) {}
+
+ public void onFinish(ITestContext iTestContext) {}
+}
+
+public class TestNGInstance extends TestNG{
+ public TestNGInstance(Logger[] loggers,
+ ClassLoader testClassLoader,
+ CommandLineArgs args,
+ EventHandler eventHandler) {
+ addClassLoader(testClassLoader);
+
+ this.addListener(new TestNGListener(eventHandler));
+
+ configure(args);
+ }
+}
+
+
diff --git a/contrib/testng/src/mill/testng/TestNGRunner.java b/contrib/testng/src/mill/testng/TestNGRunner.java
new file mode 100644
index 00000000..0ad05f76
--- /dev/null
+++ b/contrib/testng/src/mill/testng/TestNGRunner.java
@@ -0,0 +1,76 @@
+package mill.testng;
+
+import com.beust.jcommander.JCommander;
+import org.testng.CommandLineArgs;
+import sbt.testing.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+class TestNGTask implements Task {
+
+ TaskDef taskDef;
+ TestNGRunner runner;
+ CommandLineArgs cliArgs;
+ public TestNGTask(TaskDef taskDef,
+ TestNGRunner runner,
+ CommandLineArgs cliArgs){
+ this.taskDef = taskDef;
+ this.runner = runner;
+ this.cliArgs = cliArgs;
+ }
+
+ @Override
+ public String[] tags() {
+ return new String[0];
+ }
+
+ @Override
+ public Task[] execute(EventHandler eventHandler, Logger[] loggers) {
+ new TestNGInstance(
+ loggers,
+ runner.testClassLoader,
+ cliArgs,
+ eventHandler
+ ).run();
+ return new Task[0];
+ }
+
+ @Override
+ public TaskDef taskDef() {
+ return taskDef;
+ }
+}
+
+public class TestNGRunner implements Runner {
+ ClassLoader testClassLoader;
+ String[] args;
+ String[] remoteArgs;
+ public TestNGRunner(String[] args, String[] remoteArgs, ClassLoader testClassLoader) {
+ this.testClassLoader = testClassLoader;
+ this.args = args;
+ this.remoteArgs = remoteArgs;
+ }
+
+ public Task[] tasks(TaskDef[] taskDefs) {
+ CommandLineArgs cliArgs = new CommandLineArgs();
+ new JCommander(cliArgs, args); // args is an output parameter of the constructor!
+ if(cliArgs.testClass == null){
+ String[] names = new String[taskDefs.length];
+ for(int i = 0; i < taskDefs.length; i += 1){
+ names[i] = taskDefs[i].fullyQualifiedName();
+ }
+ cliArgs.testClass = String.join(",", names);
+ }
+ if (taskDefs.length == 0) return new Task[]{};
+ else return new Task[]{new TestNGTask(taskDefs[0], this, cliArgs)};
+ }
+
+ public String done() { return null; }
+
+ public String[] remoteArgs() { return remoteArgs; }
+
+ public String[] args() { return args; }
+}