diff --git a/src/main/java/com/askimed/nf/test/lang/TestContext.java b/src/main/java/com/askimed/nf/test/lang/TestContext.java index f6ced80e..bfcff51f 100644 --- a/src/main/java/com/askimed/nf/test/lang/TestContext.java +++ b/src/main/java/com/askimed/nf/test/lang/TestContext.java @@ -6,8 +6,6 @@ import com.askimed.nf.test.core.ITest; import com.askimed.nf.test.lang.extensions.Snapshot; -import com.askimed.nf.test.lang.function.Function; -import com.askimed.nf.test.lang.process.Process; import com.askimed.nf.test.lang.workflow.Workflow; import groovy.lang.Closure; @@ -16,28 +14,27 @@ public class TestContext { private ParamsMap params = new ParamsMap(); - private Workflow workflow = new Workflow(); - - private Process process = new Process(); - - private Function function = new Function(); - private Closure paramsClosure; - private Closure processClosure; - public String baseDir = "nf-test"; public String outputDir = "nf-test"; public ITest test; + private String name; + + private WorkflowMeta workflow = new WorkflowMeta(); + public TestContext(ITest test) { this.test = test; } - public void setName(String name) { - process.setName(name); + public void init(String baseDir, String outputDir) { + params.setBaseDir(baseDir); + params.setOutputDir(outputDir); + this.baseDir = baseDir; + this.outputDir = outputDir; } public ParamsMap getParams() { @@ -48,30 +45,6 @@ public void setParams(ParamsMap params) { this.params = params; } - public Workflow getWorkflow() { - return workflow; - } - - public void setWorkflow(Workflow workflow) { - this.workflow = workflow; - } - - public Process getProcess() { - return process; - } - - public void setProcess(Process process) { - this.process = process; - } - - public Function getFunction() { - return function; - } - - public void setFunction(Function function) { - this.function = function; - } - public void params(Closure closure) { this.paramsClosure = closure; } @@ -88,70 +61,28 @@ public void evaluateParamsClosure() { } - public void process(Closure closure) { - processClosure = closure; - } - - public void evaluateProcessClosure() { - if (processClosure == null) { - return; - } - processClosure.setDelegate(this); - processClosure.setResolveStrategy(Closure.DELEGATE_FIRST); - Object mapping = processClosure.call(); - if (mapping != null) { - process.setMapping(mapping.toString()); - } - - } - - public void workflow(Closure closure) { - processClosure = closure; + public WorkflowMeta getWorkflow() { + return workflow; } - public void evaluateWorkflowClosure() { - if (processClosure == null) { - return; - } - processClosure.setDelegate(this); - processClosure.setResolveStrategy(Closure.DELEGATE_FIRST); - Object mapping = processClosure.call(); - if (mapping != null) { - workflow.setMapping(mapping.toString()); - } - + public void setWorkflow(Workflow workflow) { + this.workflow = workflow; } - public void function(Closure closure) { - processClosure = closure; + public Snapshot snapshot(Object... object) { + return new Snapshot(object, test); } - public void evaluateFunctionClosure() { - if (processClosure == null) { - return; - } - processClosure.setDelegate(this); - processClosure.setResolveStrategy(Closure.DELEGATE_FIRST); - Object mapping = processClosure.call(); - if (mapping != null) { - process.setMapping(mapping.toString()); - } - + public void loadParams(String filename) throws CompilationFailedException, ClassNotFoundException, IOException { + params.load(filename); } - public Snapshot snapshot(Object ... object ) { - return new Snapshot(object, test); + public void setName(String name) { + this.name = name; } - public void init(String baseDir, String outputDir) { - params.setBaseDir(baseDir); - params.setOutputDir(outputDir); - this.baseDir = baseDir; - this.outputDir = outputDir; + public String getName() { + return name; } - public void loadParams(String filename) throws CompilationFailedException, ClassNotFoundException, IOException { - params.load(filename); - } - } diff --git a/src/main/java/com/askimed/nf/test/lang/function/FunctionContext.java b/src/main/java/com/askimed/nf/test/lang/function/FunctionContext.java new file mode 100644 index 00000000..e3a80182 --- /dev/null +++ b/src/main/java/com/askimed/nf/test/lang/function/FunctionContext.java @@ -0,0 +1,44 @@ +package com.askimed.nf.test.lang.function; + +import com.askimed.nf.test.core.ITest; +import com.askimed.nf.test.lang.TestContext; + +import groovy.lang.Closure; + +public class FunctionContext extends TestContext { + + private Function function = new Function(); + + private Closure functionClosure; + + public FunctionContext(ITest test) { + super(test); + } + + public Function getFunction() { + return function; + } + + public void setFunction(Function function) { + this.function = function; + } + + + public void function(Closure closure) { + functionClosure = closure; + } + + public void evaluateFunctionClosure() { + if (functionClosure == null) { + return; + } + functionClosure.setDelegate(this); + functionClosure.setResolveStrategy(Closure.DELEGATE_FIRST); + Object mapping = functionClosure.call(); + if (mapping != null) { + function.setMapping(mapping.toString()); + } + + } + +} diff --git a/src/main/java/com/askimed/nf/test/lang/function/FunctionTest.java b/src/main/java/com/askimed/nf/test/lang/function/FunctionTest.java index 9586118b..b8eadfa2 100644 --- a/src/main/java/com/askimed/nf/test/lang/function/FunctionTest.java +++ b/src/main/java/com/askimed/nf/test/lang/function/FunctionTest.java @@ -10,9 +10,7 @@ import com.askimed.nf.test.core.AbstractTest; import com.askimed.nf.test.lang.TestCode; -import com.askimed.nf.test.lang.TestContext; import com.askimed.nf.test.nextflow.NextflowCommand; -import com.askimed.nf.test.util.AnsiText; import com.askimed.nf.test.util.FileUtil; import groovy.lang.Closure; @@ -34,14 +32,14 @@ public class FunctionTest extends AbstractTest { private TestCode then; - private TestContext context; + private FunctionContext context; private FunctionTestSuite parent; public FunctionTest(FunctionTestSuite parent) { super(parent); this.parent = parent; - context = new TestContext(this); + context = new FunctionContext(this); context.setName(parent.getFunction()); } @@ -151,10 +149,6 @@ public void execute() throws Throwable { context.getWorkflow().exitStatus = exitCode; context.getWorkflow().success = (exitCode == 0); context.getWorkflow().failed = (exitCode != 0); - if (isDebug()) { - System.out.println(AnsiText.padding("Output Channels:", 4)); - context.getProcess().getOut().view(); - } then.execute(context); @@ -188,7 +182,7 @@ protected void writeWorkflowMock(File file) throws IOException, CompilationFaile binding.put("script", script); // Get body of when closure - binding.put("mapping", context.getProcess().getMapping()); + binding.put("mapping", context.getFunction().getMapping()); URL templateUrl = this.getClass().getResource("WorkflowMock.nf"); SimpleTemplateEngine engine = new SimpleTemplateEngine(); diff --git a/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineContext.java b/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineContext.java new file mode 100644 index 00000000..d62518a7 --- /dev/null +++ b/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineContext.java @@ -0,0 +1,12 @@ +package com.askimed.nf.test.lang.pipeline; + +import com.askimed.nf.test.core.ITest; +import com.askimed.nf.test.lang.TestContext; + +public class PipelineContext extends TestContext { + + public PipelineContext(ITest test) { + super(test); + } + +} diff --git a/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineTest.java b/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineTest.java index d675eea9..b9bf4326 100644 --- a/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineTest.java +++ b/src/main/java/com/askimed/nf/test/lang/pipeline/PipelineTest.java @@ -4,7 +4,6 @@ import com.askimed.nf.test.core.AbstractTest; import com.askimed.nf.test.lang.TestCode; -import com.askimed.nf.test.lang.TestContext; import com.askimed.nf.test.nextflow.NextflowCommand; import groovy.lang.Closure; @@ -24,12 +23,12 @@ public class PipelineTest extends AbstractTest { private PipelineTestSuite parent; - private TestContext context; + private PipelineContext context; public PipelineTest(PipelineTestSuite parent) { super(parent); this.parent = parent; - context = new TestContext(this); + context = new PipelineContext(this); context.setName(parent.getName()); } @@ -78,7 +77,6 @@ public void execute() throws Throwable { } context.evaluateParamsClosure(); - context.evaluateProcessClosure(); if (isDebug()) { System.out.println(); diff --git a/src/main/java/com/askimed/nf/test/lang/process/ProcessContext.java b/src/main/java/com/askimed/nf/test/lang/process/ProcessContext.java new file mode 100644 index 00000000..692076a5 --- /dev/null +++ b/src/main/java/com/askimed/nf/test/lang/process/ProcessContext.java @@ -0,0 +1,47 @@ +package com.askimed.nf.test.lang.process; + +import com.askimed.nf.test.core.ITest; +import com.askimed.nf.test.lang.TestContext; + +import groovy.lang.Closure; + +public class ProcessContext extends TestContext { + + private Process process = new Process(); + + private Closure processClosure; + + public ProcessContext(ITest test) { + super(test); + } + + public void setName(String name) { + process.setName(name); + } + + public Process getProcess() { + return process; + } + + public void setProcess(Process process) { + this.process = process; + } + + public void process(Closure closure) { + processClosure = closure; + } + + public void evaluateProcessClosure() { + if (processClosure == null) { + return; + } + processClosure.setDelegate(this); + processClosure.setResolveStrategy(Closure.DELEGATE_FIRST); + Object mapping = processClosure.call(); + if (mapping != null) { + process.setMapping(mapping.toString()); + } + + } + +} diff --git a/src/main/java/com/askimed/nf/test/lang/process/ProcessTest.java b/src/main/java/com/askimed/nf/test/lang/process/ProcessTest.java index e1aabb11..93353635 100644 --- a/src/main/java/com/askimed/nf/test/lang/process/ProcessTest.java +++ b/src/main/java/com/askimed/nf/test/lang/process/ProcessTest.java @@ -10,7 +10,6 @@ import com.askimed.nf.test.core.AbstractTest; import com.askimed.nf.test.lang.TestCode; -import com.askimed.nf.test.lang.TestContext; import com.askimed.nf.test.nextflow.NextflowCommand; import com.askimed.nf.test.util.AnsiText; import com.askimed.nf.test.util.FileUtil; @@ -36,13 +35,13 @@ public class ProcessTest extends AbstractTest { private ProcessTestSuite parent; - private TestContext context; + private ProcessContext context; public ProcessTest(ProcessTestSuite parent) { super(parent); this.parent = parent; this.autoSort = parent.isAutoSort(); - context = new TestContext(this); + context = new ProcessContext(this); context.setName(parent.getProcess()); } diff --git a/src/main/java/com/askimed/nf/test/lang/workflow/Workflow.java b/src/main/java/com/askimed/nf/test/lang/workflow/Workflow.java index 469f9cce..7fb9ea95 100644 --- a/src/main/java/com/askimed/nf/test/lang/workflow/Workflow.java +++ b/src/main/java/com/askimed/nf/test/lang/workflow/Workflow.java @@ -6,16 +6,10 @@ import com.askimed.nf.test.lang.process.ChannelsOutput; public class Workflow extends WorkflowMeta { - - private String mapping = ""; - private String name = "workflow"; + private String mapping = ""; private ChannelsOutput out = new ChannelsOutput(); - - public void setName(String name) { - this.name = name; - } @Transient public void setMapping(String mapping) { @@ -25,14 +19,9 @@ public void setMapping(String mapping) { public String getMapping() { return mapping; } - + public ChannelsOutput getOut() { return out; } - @Override - public String toString() { - return name; - } - } \ No newline at end of file diff --git a/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowContext.java b/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowContext.java new file mode 100644 index 00000000..2d5c09d7 --- /dev/null +++ b/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowContext.java @@ -0,0 +1,43 @@ +package com.askimed.nf.test.lang.workflow; + +import com.askimed.nf.test.core.ITest; +import com.askimed.nf.test.lang.TestContext; + +import groovy.lang.Closure; + +public class WorkflowContext extends TestContext { + + private Closure workflowClosure; + + private Workflow workflow = new Workflow(); + + public WorkflowContext(ITest test) { + super(test); + } + + public void workflow(Closure closure) { + workflowClosure = closure; + } + + public void evaluateWorkflowClosure() { + if (workflowClosure == null) { + return; + } + workflowClosure.setDelegate(this); + workflowClosure.setResolveStrategy(Closure.DELEGATE_FIRST); + Object mapping = workflowClosure.call(); + if (mapping != null) { + workflow.setMapping(mapping.toString()); + } + + } + + public Workflow getWorkflow() { + return workflow; + } + + public void setWorkflow(Workflow workflow) { + this.workflow = workflow; + } + +} diff --git a/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowTest.java b/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowTest.java index f115eeae..ea86f156 100644 --- a/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowTest.java +++ b/src/main/java/com/askimed/nf/test/lang/workflow/WorkflowTest.java @@ -39,13 +39,13 @@ public class WorkflowTest extends AbstractTest { private WorkflowTestSuite parent; - private TestContext context; + private WorkflowContext context; public WorkflowTest(WorkflowTestSuite parent) { super(parent); this.parent = parent; this.autoSort = parent.isAutoSort(); - context = new TestContext(this); + context = new WorkflowContext(this); context.setName(parent.getWorkflow()); } diff --git a/src/test/java/com/askimed/nf/test/lang/PipelineTest.java b/src/test/java/com/askimed/nf/test/lang/PipelineTest.java index c8609d5f..c7360b4c 100644 --- a/src/test/java/com/askimed/nf/test/lang/PipelineTest.java +++ b/src/test/java/com/askimed/nf/test/lang/PipelineTest.java @@ -91,6 +91,24 @@ public void testDsl2() throws Exception { } + @Test + public void testPipelineThatUsesProcessKeywordShouldFail() throws Exception { + + App app = new App(); + int exitCode = app.run(new String[] { "test", "test-data/pipeline/dsl2/trial.process-keyword.nf.test" }); + assertEquals(1, exitCode); + + } + + @Test + public void testPipelineThatUsesWorkflowKeywordShouldFail() throws Exception { + + App app = new App(); + int exitCode = app.run(new String[] { "test", "test-data/pipeline/dsl2/trial.workflow-keyword.nf.test" }); + assertEquals(1, exitCode); + + } + // Thanks: https://www.digitalocean.com/community/tutorials/how-to-validate-xml-against-xsd-in-java public static void assertXmlSchemaValidation(String xsdPath, String xmlPath) throws Exception{ SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); diff --git a/test-data/pipeline/dsl2/trial.process-keyword.nf.test b/test-data/pipeline/dsl2/trial.process-keyword.nf.test new file mode 100644 index 00000000..d71eb184 --- /dev/null +++ b/test-data/pipeline/dsl2/trial.process-keyword.nf.test @@ -0,0 +1,23 @@ +nextflow_pipeline { + + name "Test workflow" + script "test-data/pipeline/dsl2/trial.nf" + + test("Should run without failures") { + when { + params { + output = "$outputDir" + input = "a,b" + } + } + + then { + //check if test case succeeded + assert workflow.success + snapshot(process.out).match() + assert workflow.trace.tasks().size() == 2 + assert path("$outputDir/a.txt").exists() + assert path("$outputDir/b.txt").exists() + } + } +} \ No newline at end of file diff --git a/test-data/pipeline/dsl2/trial.workflow-keyword.nf.test b/test-data/pipeline/dsl2/trial.workflow-keyword.nf.test new file mode 100644 index 00000000..73e4499e --- /dev/null +++ b/test-data/pipeline/dsl2/trial.workflow-keyword.nf.test @@ -0,0 +1,23 @@ +nextflow_pipeline { + + name "Test workflow" + script "test-data/pipeline/dsl2/trial.nf" + + test("Should run without failures") { + when { + params { + output = "$outputDir" + input = "a,b" + } + } + + then { + //check if test case succeeded + assert workflow.success + snapshot(workflow.out).match() + assert workflow.trace.tasks().size() == 2 + assert path("$outputDir/a.txt").exists() + assert path("$outputDir/b.txt").exists() + } + } +} \ No newline at end of file