Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
189ba44c1d | ||
|
|
bcdd11c5a3 | ||
|
|
19f638e091 | ||
|
|
38f4cf3464 | ||
|
|
a0880372f8 | ||
|
|
db0c3da413 | ||
|
|
75e30ddae9 | ||
|
|
9056c8d047 | ||
|
|
a1b85e3771 | ||
|
|
0683be643f | ||
|
|
e67bdc4bb0 | ||
|
|
9a14ea6486 | ||
|
|
1549f85a49 | ||
|
|
efb644e6a9 | ||
|
|
6a3d7f4f42 | ||
|
|
6feb7f87dc | ||
|
|
47af8b4522 | ||
|
|
db8fe1fc47 | ||
|
|
e803452389 | ||
|
|
08c85459a7 | ||
|
|
9edbca09cf | ||
|
|
b3a010f6e9 | ||
|
|
b1332c838b |
+24
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: gradle
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: test
|
||||||
|
image: gradle:8.3.0-jdk17-graal
|
||||||
|
commands:
|
||||||
|
- gradle assemble
|
||||||
|
- gradle check
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: maven
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: test
|
||||||
|
image: maven:3.9.4-eclipse-temurin-17-alpine
|
||||||
|
commands:
|
||||||
|
- mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
|
||||||
|
- mvn test -B
|
||||||
|
|
||||||
@@ -18,6 +18,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation 'com.google.guava:guava:32.1.2-jre'
|
||||||
// mandatory dependencies for using Spock
|
// mandatory dependencies for using Spock
|
||||||
implementation platform('org.apache.groovy:groovy-bom:4.0.15')
|
implementation platform('org.apache.groovy:groovy-bom:4.0.15')
|
||||||
implementation 'org.apache.groovy:groovy'
|
implementation 'org.apache.groovy:groovy'
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<groovy.version>4.0.15</groovy.version>
|
<groovy.version>4.0.15</groovy.version>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@@ -77,6 +79,11 @@
|
|||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>32.1.2-jre</version>
|
||||||
|
</dependency>
|
||||||
<!-- Mandatory dependencies for using Spock -->
|
<!-- Mandatory dependencies for using Spock -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spockframework</groupId>
|
<groupId>org.spockframework</groupId>
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package space.kklochko.simple_jbdd.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
public @interface Title {
|
||||||
|
String value() default "Title";
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package space.kklochko.simple_jbdd.test_examples;
|
|
||||||
|
|
||||||
public class Sum {
|
|
||||||
static int sum(int a, int b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package space.kklochko.simple_jbdd.test_examples.samples;
|
||||||
|
|
||||||
|
public class Sum {
|
||||||
|
public static int sum(int a, int b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
package space.kklochko.simple_jbdd.test_examples.tests;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Then;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Title;
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
|
||||||
|
|
||||||
|
@Title("A Simple Failed GivenWhenTest for Sum")
|
||||||
|
public class SimpleFailedThenTest extends Test {
|
||||||
|
@Then
|
||||||
|
public void check() {
|
||||||
|
assert 30 == 10 + 20 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
package space.kklochko.simple_jbdd.test_examples.tests;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Given;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Then;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Title;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.When;
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.samples.Sum;
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
|
||||||
|
@Title("A Simple GivenWhenTest for Sum")
|
||||||
|
public class SimpleGivenWhenThenTest extends Test {
|
||||||
|
private Sum sum;
|
||||||
|
private int a;
|
||||||
|
private int b;
|
||||||
|
|
||||||
|
@Given
|
||||||
|
void setup() {
|
||||||
|
sum = new Sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
@When
|
||||||
|
void trigger() {
|
||||||
|
a = 10;
|
||||||
|
b = 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Then
|
||||||
|
void check() {
|
||||||
|
assert 30 == sum.sum(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package space.kklochko.simple_jbdd.test_examples.tests;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Then;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Title;
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
|
||||||
|
@Title("Simple test")
|
||||||
|
public class SimpleThenTest extends Test {
|
||||||
|
@Then("The sum of 10 and 20 is 30.")
|
||||||
|
public void check() {
|
||||||
|
assert 30 == 10 + 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package space.kklochko.simple_jbdd.test_examples.tests;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Then;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Title;
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
|
||||||
|
public class SimpleThenTestWithoutTitle extends Test {
|
||||||
|
@Then("The sum of 10 and 20 is 30.")
|
||||||
|
public void check() {
|
||||||
|
assert 30 == 10 + 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests;
|
||||||
|
|
||||||
|
public abstract class Test {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.commands;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
public abstract class AbstractTestCommand<T extends Test> {
|
||||||
|
protected String type;
|
||||||
|
protected String label;
|
||||||
|
|
||||||
|
public AbstractTestCommand(String label) {
|
||||||
|
setLabel(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean test();
|
||||||
|
|
||||||
|
public Map<String, String> getLabels() {
|
||||||
|
Map<String, String> labels = new TreeMap<String, String>();
|
||||||
|
labels.put(getType(), this.getLabel());
|
||||||
|
return labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void setObject(T object);
|
||||||
|
|
||||||
|
public abstract T getObject();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.commands;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
|
||||||
|
public class SimpleTestCommand<T extends Test> extends AbstractTestCommand<T> {
|
||||||
|
protected T object;
|
||||||
|
|
||||||
|
public SimpleTestCommand(String label, T object) {
|
||||||
|
super(label);
|
||||||
|
setObject(object);
|
||||||
|
setType("Title");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setObject(T object) {
|
||||||
|
this.object = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getObject() {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.commands.decorators;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public abstract class AbstractDecorator<T extends Test> extends AbstractTestCommand<T> {
|
||||||
|
protected AbstractTestCommand<T> command;
|
||||||
|
|
||||||
|
protected Method method;
|
||||||
|
|
||||||
|
public AbstractDecorator(String label, AbstractTestCommand<T> command) {
|
||||||
|
super(label);
|
||||||
|
setCommand(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean test();
|
||||||
|
|
||||||
|
public Map<String, String> getLabels() {
|
||||||
|
Map<String, String> labels = getCommand().getLabels();
|
||||||
|
labels.put(getType(), this.getLabel());
|
||||||
|
return labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean runMethod();
|
||||||
|
|
||||||
|
public void setMethod(Method method) {
|
||||||
|
this.method = method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method getMethod() {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setObject(T object) {
|
||||||
|
command.setObject(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T getObject() {
|
||||||
|
return command.getObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractTestCommand<T> getCommand() {
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCommand(AbstractTestCommand<T> command) {
|
||||||
|
this.command = command;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.commands.decorators;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public class BlockDecorator<T extends Test> extends AbstractDecorator<T> {
|
||||||
|
public BlockDecorator(String label, AbstractTestCommand<T> command, Method method, String type) {
|
||||||
|
super(label, command);
|
||||||
|
setType(type);
|
||||||
|
setMethod(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean test() {
|
||||||
|
boolean result = runMethod();
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return getCommand().test();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean runMethod() {
|
||||||
|
try {
|
||||||
|
method.setAccessible(true);
|
||||||
|
method.invoke(getCommand().getObject());
|
||||||
|
return true;
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
Throwable exception = e.getCause();
|
||||||
|
|
||||||
|
if(exception instanceof AssertionError)
|
||||||
|
throw (AssertionError) exception;
|
||||||
|
|
||||||
|
System.err.println(e.getMessage());
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
System.err.println("Check access modifiers.");
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
import space.kklochko.simple_jbdd.tests.runners.AbstractTestRunner;
|
||||||
|
|
||||||
|
public abstract class AbstractTestRunnerFactory {
|
||||||
|
public abstract AbstractTestRunner create(AbstractTestCommand<Test> command);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
import space.kklochko.simple_jbdd.tests.runners.AbstractTestRunner;
|
||||||
|
import space.kklochko.simple_jbdd.tests.runners.SimpleTestRunner;
|
||||||
|
|
||||||
|
public class SimpleTestRunnerFactory extends AbstractTestRunnerFactory {
|
||||||
|
public AbstractTestRunner create(AbstractTestCommand<Test> command) {
|
||||||
|
return new SimpleTestRunner(command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Given;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Then;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.Title;
|
||||||
|
import space.kklochko.simple_jbdd.annotations.When;
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.SimpleTestCommand;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
public class TestCommandFactory {
|
||||||
|
public AbstractTestCommand create(Test input) {
|
||||||
|
Class<?> aClass = input.getClass();
|
||||||
|
Map<String, Method> test_methods = this.getTestMethods(aClass);
|
||||||
|
|
||||||
|
AbstractTestCommand<Test> aTestCommand = createTest(aClass, input);
|
||||||
|
|
||||||
|
if(test_methods.containsKey("Then")) {
|
||||||
|
Method then = test_methods.get("Then");
|
||||||
|
String label = then.getAnnotation(Then.class).value();
|
||||||
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, then, "Then");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(test_methods.containsKey("When")) {
|
||||||
|
Method when = test_methods.get("When");
|
||||||
|
String label = when.getAnnotation(When.class).value();
|
||||||
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, when, "When");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(test_methods.containsKey("Given")) {
|
||||||
|
Method when = test_methods.get("Given");
|
||||||
|
String label = when.getAnnotation(Given.class).value();
|
||||||
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, when, "Given");
|
||||||
|
}
|
||||||
|
|
||||||
|
return aTestCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AbstractTestCommand<Test> createTest(Class<?> aClass, Test input) {
|
||||||
|
Title aTitle = aClass.getAnnotation(Title.class);
|
||||||
|
String title = aClass.getName();
|
||||||
|
|
||||||
|
if(aTitle != null)
|
||||||
|
title = aTitle.value();
|
||||||
|
|
||||||
|
return new SimpleTestCommand<Test>(title, input);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected <T extends Test> Map<String, Method> getTestMethods(Class<?> aClass) {
|
||||||
|
Map<String, Method> test_methods = new TreeMap<String, Method>();
|
||||||
|
|
||||||
|
for(Method method : aClass.getDeclaredMethods()) {
|
||||||
|
Annotation[] annotations = method.getAnnotations();
|
||||||
|
|
||||||
|
if (annotations.length == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(method.isAnnotationPresent(Given.class))
|
||||||
|
test_methods.put("Given", method);
|
||||||
|
|
||||||
|
if(method.isAnnotationPresent(When.class))
|
||||||
|
test_methods.put("When", method);
|
||||||
|
|
||||||
|
if(method.isAnnotationPresent(Then.class))
|
||||||
|
test_methods.put("Then", method);
|
||||||
|
}
|
||||||
|
|
||||||
|
return test_methods;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class TestCommandQueueFactory {
|
||||||
|
private ArrayList<Test> tests;
|
||||||
|
private TestCommandFactory factory;
|
||||||
|
|
||||||
|
public TestCommandQueueFactory(ArrayList<Test> tests, TestCommandFactory factory) {
|
||||||
|
setTests(tests);
|
||||||
|
setFactory(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<AbstractTestCommand<Test>> create() {
|
||||||
|
ArrayList<AbstractTestCommand<Test>> commands = new ArrayList<AbstractTestCommand<Test>>();
|
||||||
|
|
||||||
|
for(Test test : getTests()) {
|
||||||
|
AbstractTestCommand<Test> command = getFactory().create(test);
|
||||||
|
commands.add(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Test> getTests() {
|
||||||
|
return tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTests(ArrayList<Test> tests) {
|
||||||
|
this.tests = tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestCommandFactory getFactory() {
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFactory(TestCommandFactory factory) {
|
||||||
|
this.factory = factory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories.meta;
|
||||||
|
|
||||||
|
import java.util.AbstractMap;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public abstract class AbstractTestCommandMetaDataFactory {
|
||||||
|
abstract public ArrayList<AbstractMap.SimpleEntry<String, String>> create();
|
||||||
|
}
|
||||||
|
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories.meta;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.decorators.AbstractDecorator;
|
||||||
|
|
||||||
|
import java.util.AbstractMap;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class TestCommandMetaDataFactory extends AbstractTestCommandMetaDataFactory {
|
||||||
|
private AbstractTestCommand command;
|
||||||
|
|
||||||
|
public TestCommandMetaDataFactory(AbstractTestCommand command) {
|
||||||
|
this.command = command;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<AbstractMap.SimpleEntry<String, String>> create() {
|
||||||
|
ArrayList<AbstractMap.SimpleEntry<String, String>> blocks = new ArrayList<>();
|
||||||
|
AbstractTestCommand currentCommand = command;
|
||||||
|
Class<?> aClass = command.getClass();
|
||||||
|
|
||||||
|
while(AbstractDecorator.class.isAssignableFrom(aClass)) {
|
||||||
|
AbstractDecorator block = (AbstractDecorator) currentCommand;
|
||||||
|
blocks.add(new AbstractMap.SimpleEntry<>(block.getType(), block.getLabel()));
|
||||||
|
|
||||||
|
currentCommand = block.getCommand();
|
||||||
|
aClass = currentCommand.getClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
blocks.add(0, (new AbstractMap.SimpleEntry<>(currentCommand.getType(), currentCommand.getLabel())));
|
||||||
|
|
||||||
|
return blocks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public abstract class AbstractNameClassLoader {
|
||||||
|
public abstract Set<Class<?>> load();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ClassLoader<T> {
|
||||||
|
|
||||||
|
AbstractNameClassLoader nameLoader;
|
||||||
|
|
||||||
|
public ClassLoader(AbstractNameClassLoader nameLoader) {
|
||||||
|
this.nameLoader = nameLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<T> load() {
|
||||||
|
Set<Class<?>> names = nameLoader.load();
|
||||||
|
ArrayList<T> classes = new ArrayList<>();
|
||||||
|
|
||||||
|
for(Class<?> name : names) {
|
||||||
|
SingleClassLoader loader = new SingleClassLoader(name.getName());
|
||||||
|
classes.add((T) loader.load());
|
||||||
|
}
|
||||||
|
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders;
|
||||||
|
|
||||||
|
import com.google.common.reflect.ClassPath;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class NameClassLoader extends AbstractNameClassLoader {
|
||||||
|
public Set<Class<?>> load() {
|
||||||
|
try {
|
||||||
|
return ClassPath.from(java.lang.ClassLoader.getSystemClassLoader())
|
||||||
|
.getAllClasses()
|
||||||
|
.stream()
|
||||||
|
// exclude the Test class, which indicate a Test class
|
||||||
|
.filter(aClass -> !aClass.getName().endsWith(".Test"))
|
||||||
|
.filter(aClass -> aClass.getName().endsWith("Test"))
|
||||||
|
// include classes which extends the Test class
|
||||||
|
.filter(aClass -> space.kklochko.simple_jbdd.tests.Test.class.isAssignableFrom(aClass.load()))
|
||||||
|
.filter(aClass -> aClass.getName().startsWith("space"))
|
||||||
|
.map(aClass -> aClass.load())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
} catch (IOException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders;
|
||||||
|
|
||||||
|
public class SingleClassLoader {
|
||||||
|
String className;
|
||||||
|
|
||||||
|
public SingleClassLoader(String className) {
|
||||||
|
setClassName(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?> load() {
|
||||||
|
try {
|
||||||
|
return Class.forName(getClassName());
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClassName() {
|
||||||
|
return className;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassName(String className) {
|
||||||
|
this.className = className;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.runners;
|
||||||
|
|
||||||
|
public abstract class AbstractTestRunner {
|
||||||
|
public abstract boolean run();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.runners;
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test;
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||||
|
|
||||||
|
public class SimpleTestRunner extends AbstractTestRunner {
|
||||||
|
private AbstractTestCommand<Test> command;
|
||||||
|
|
||||||
|
public SimpleTestRunner(AbstractTestCommand<Test> command) {
|
||||||
|
setCommand(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean run() {
|
||||||
|
try {
|
||||||
|
return getCommand().test();
|
||||||
|
}catch (AssertionError e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractTestCommand<Test> getCommand() {
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCommand(AbstractTestCommand<Test> command) {
|
||||||
|
this.command = command;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
package space.kklochko.simple_jbdd.test_examples
|
package space.kklochko.simple_jbdd.test_examples.samples
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.samples.Sum
|
||||||
import spock.lang.Specification
|
import spock.lang.Specification
|
||||||
|
|
||||||
class SumSpec extends Specification {
|
class SumSpec extends Specification {
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTestWithoutTitle
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The factory must generate a queue of the test commands, so
|
||||||
|
those tests check if factory generate them right.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for TestCommandQueueFactory")
|
||||||
|
class IntegratedTestCommandQueueFactorySpec extends Specification {
|
||||||
|
def "Factory generate the queue and its size is 2."() {
|
||||||
|
given: "I have a list of tests"
|
||||||
|
def tests = [new SimpleThenTest(), new SimpleThenTestWithoutTitle()]
|
||||||
|
|
||||||
|
and: "I have a test factory"
|
||||||
|
def testFactory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandQueueFactory(tests, testFactory)
|
||||||
|
|
||||||
|
when: "Factory build the queue"
|
||||||
|
def queue = factory.create()
|
||||||
|
|
||||||
|
then: "the size is 2"
|
||||||
|
2 == queue.size()
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Factory generate the queue and the commands and test order is the same."() {
|
||||||
|
given: "I have a list of tests with first methods [check, setup]"
|
||||||
|
def tests = [new SimpleThenTest(), new SimpleGivenWhenThenTest()]
|
||||||
|
|
||||||
|
and: "I have a test factory"
|
||||||
|
def testFactory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandQueueFactory(tests, testFactory)
|
||||||
|
|
||||||
|
when: "Factory build the queue"
|
||||||
|
def queue = factory.create()
|
||||||
|
|
||||||
|
then: "the order is the same"
|
||||||
|
queue[0].method.getName() == "check"
|
||||||
|
queue[1].method.getName() == "setup"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+96
@@ -0,0 +1,96 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTestWithoutTitle
|
||||||
|
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
|
||||||
|
import spock.lang.Narrative;
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The factory must generate a test command, so
|
||||||
|
those tests check if factory generate them right.
|
||||||
|
""")
|
||||||
|
@Title("Unit tests for TestCommandFactory")
|
||||||
|
class TestCommandFactorySpec extends Specification {
|
||||||
|
def "If the map of methods have one test block."() {
|
||||||
|
given: "I have a TestCommandFactory object"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandFactory();
|
||||||
|
|
||||||
|
and: "I also have a SimpleThenTest object"
|
||||||
|
def simpleThenTest = new SimpleThenTest()
|
||||||
|
|
||||||
|
when: "If a test have only one block"
|
||||||
|
def map = factory.getTestMethods(simpleThenTest.getClass())
|
||||||
|
|
||||||
|
then: "the map size is 1 method"
|
||||||
|
1 == map.size()
|
||||||
|
}
|
||||||
|
|
||||||
|
def "createTest() sets the title to a class name if no Title annotation."() {
|
||||||
|
given: "I have a test factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a test class without Title"
|
||||||
|
def testClass = new SimpleThenTestWithoutTitle()
|
||||||
|
|
||||||
|
when: "I build a test"
|
||||||
|
def test = factory.create(testClass)
|
||||||
|
|
||||||
|
then: "The test have title as the test class"
|
||||||
|
testClass.class.getName() == test.getLabels()['Title']
|
||||||
|
}
|
||||||
|
|
||||||
|
def "createTest() sets the title to a value of the Title annotation."() {
|
||||||
|
given: "I have a test factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a test class with Title"
|
||||||
|
def testClass = new SimpleThenTest()
|
||||||
|
|
||||||
|
and: "and the title of the annotation"
|
||||||
|
def titleClass = space.kklochko.simple_jbdd.annotations.Title.class
|
||||||
|
def title = testClass.getClass().getAnnotation(titleClass).value()
|
||||||
|
|
||||||
|
when: "I build a test"
|
||||||
|
def test = factory.create(testClass)
|
||||||
|
|
||||||
|
then: "The test have title as the test class"
|
||||||
|
title == test.getLabels()['Title']
|
||||||
|
}
|
||||||
|
|
||||||
|
def "createTest() build a Test with only Then."() {
|
||||||
|
given: "I have a test factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a test class with Title"
|
||||||
|
def testClass = new SimpleThenTest()
|
||||||
|
|
||||||
|
when: "I build a test"
|
||||||
|
def test = factory.create(testClass)
|
||||||
|
|
||||||
|
then: "The test have title and then method"
|
||||||
|
['Title', 'Then'].toSet() == test.getLabels().keySet()
|
||||||
|
}
|
||||||
|
|
||||||
|
def "createTest() build a Test with Given-When-Then."() {
|
||||||
|
given: "I have a test factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandFactory()
|
||||||
|
|
||||||
|
and: "I have a test class with Title and Given-When-Then"
|
||||||
|
def testClass = new SimpleGivenWhenThenTest()
|
||||||
|
|
||||||
|
when: "I build a test"
|
||||||
|
def test = factory.create(testClass)
|
||||||
|
|
||||||
|
then: "The test have title and then method"
|
||||||
|
['Title', 'Given', 'When', 'Then'].toSet() == test.getLabels().keySet()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTestWithoutTitle
|
||||||
|
import space.kklochko.simple_jbdd.tests.Test
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The factory must generate a queue of the test commands, so
|
||||||
|
those tests check if factory generate them right.
|
||||||
|
""")
|
||||||
|
@Title("Unit tests for TestCommandQueueFactory")
|
||||||
|
class TestCommandQueueFactorySpec extends Specification {
|
||||||
|
def "Factory generate the queue and its size is 2."() {
|
||||||
|
given: "I have a list of tests"
|
||||||
|
def tests = [Mock(SimpleThenTest), Mock(SimpleThenTestWithoutTitle)]
|
||||||
|
|
||||||
|
and: "I have a test factory"
|
||||||
|
def testFactory = Stub(TestCommandFactory)
|
||||||
|
testFactory.create() >>> [Mock(BlockDecorator<Test>)]*2
|
||||||
|
|
||||||
|
and: "I have the factory"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandQueueFactory(tests, testFactory)
|
||||||
|
|
||||||
|
when: "Factory build the queue"
|
||||||
|
def queue = factory.create()
|
||||||
|
|
||||||
|
then: "the size is 2"
|
||||||
|
2 == queue.size()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories.meta
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleFailedThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTestWithoutTitle
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator
|
||||||
|
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
|
||||||
|
import space.kklochko.simple_jbdd.tests.runners.SimpleTestRunner
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The factory must generate a test command metadata, so
|
||||||
|
those tests check if the factory generate it right.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for TestCommandMetaDataFactory")
|
||||||
|
class IntegratedTestCommandMetaDataFactorySpec extends Specification {
|
||||||
|
def "Metadata have the map of methods have one test block."() {
|
||||||
|
given: "I have a command factory"
|
||||||
|
def commandFactory = new TestCommandFactory();
|
||||||
|
|
||||||
|
and: "I have a command of a test"
|
||||||
|
def command = commandFactory.create(testObject)
|
||||||
|
|
||||||
|
and: "I have a TestCommandMetaDataFactory object"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandMetaDataFactory(command)
|
||||||
|
|
||||||
|
when: "Parse the command to get metadata"
|
||||||
|
def metadata = factory.create()
|
||||||
|
|
||||||
|
then: "the metadata have only two labels for Title and Then"
|
||||||
|
expectedCount == metadata.size()
|
||||||
|
|
||||||
|
where: "Possible variants of tests"
|
||||||
|
testObject || expectedCount
|
||||||
|
new SimpleThenTest() || 2
|
||||||
|
new SimpleGivenWhenThenTest() || 4
|
||||||
|
new SimpleThenTestWithoutTitle() || 2
|
||||||
|
new SimpleFailedThenTest() || 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.factories.meta
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator
|
||||||
|
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
|
||||||
|
import spock.lang.Narrative;
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The factory must generate a test command metadata, so
|
||||||
|
those tests check if the factory generate it right.
|
||||||
|
""")
|
||||||
|
@Title("Unit tests for TestCommandMetaDataFactory")
|
||||||
|
class TestCommandMetaDataFactorySpec extends Specification {
|
||||||
|
def "If the map of methods have one test block."() {
|
||||||
|
given: "I have a simple test with only Then block and its command."
|
||||||
|
def test = Mock(AbstractTestCommand) {
|
||||||
|
getType() >> "Title"
|
||||||
|
getLabel() >> "A simple test"
|
||||||
|
}
|
||||||
|
|
||||||
|
def command = GroovyMock(BlockDecorator) {
|
||||||
|
getType() >> "Then"
|
||||||
|
getLabel() >> "Then block"
|
||||||
|
getCommand() >> test
|
||||||
|
}
|
||||||
|
|
||||||
|
and: "I have a TestCommandMetaDataFactory object"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandMetaDataFactory(command)
|
||||||
|
|
||||||
|
when: "Parse the command to get metadata"
|
||||||
|
def metadata = factory.create()
|
||||||
|
|
||||||
|
then: "The metadata have only two labels for Title and Then"
|
||||||
|
2 == metadata.size()
|
||||||
|
|
||||||
|
and: "The format and the order must be the same"
|
||||||
|
metadata == [
|
||||||
|
new AbstractMap.SimpleEntry<>("Title", "A simple test"),
|
||||||
|
new AbstractMap.SimpleEntry<>("Then", "Then block")
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
def "If the map of methods have GivenWhenThen blocks."() {
|
||||||
|
given: "I have a simple test with only Then block and its command."
|
||||||
|
def test = Mock(AbstractTestCommand) {
|
||||||
|
getType() >> "Title"
|
||||||
|
getLabel() >> "A simple test"
|
||||||
|
}
|
||||||
|
|
||||||
|
and: "Bootstrapping the test command"
|
||||||
|
def then = GroovyMock(BlockDecorator) {
|
||||||
|
getType() >> "Then"
|
||||||
|
getLabel() >> "Then block"
|
||||||
|
getCommand() >> test
|
||||||
|
}
|
||||||
|
|
||||||
|
def when = GroovyMock(BlockDecorator) {
|
||||||
|
getType() >> "When"
|
||||||
|
getLabel() >> "When block"
|
||||||
|
getCommand() >> then
|
||||||
|
}
|
||||||
|
|
||||||
|
def command = GroovyMock(BlockDecorator) {
|
||||||
|
getType() >> "Given"
|
||||||
|
getLabel() >> "Given block"
|
||||||
|
getCommand() >> when
|
||||||
|
}
|
||||||
|
|
||||||
|
and: "I have a TestCommandMetaDataFactory object"
|
||||||
|
@Subject
|
||||||
|
def factory = new TestCommandMetaDataFactory(command)
|
||||||
|
|
||||||
|
when: "Parse the command to get metadata"
|
||||||
|
def metadata = factory.create()
|
||||||
|
|
||||||
|
then: "The metadata have only two labels for Title and Then"
|
||||||
|
4 == metadata.size()
|
||||||
|
|
||||||
|
and: "The format and the order must be the same"
|
||||||
|
metadata == [
|
||||||
|
new AbstractMap.SimpleEntry<>("Title", "A simple test"),
|
||||||
|
new AbstractMap.SimpleEntry<>("Given", "Given block"),
|
||||||
|
new AbstractMap.SimpleEntry<>("When", "When block"),
|
||||||
|
new AbstractMap.SimpleEntry<>("Then", "Then block")
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders
|
||||||
|
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The loader must return a test classes or null, so
|
||||||
|
those tests check if responses are right.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for ClassLoader.")
|
||||||
|
class IntegratedClassLoader extends Specification {
|
||||||
|
def "The classes have been loaded."() {
|
||||||
|
given: "I have a name class loader"
|
||||||
|
def nameLoader = new NameClassLoader()
|
||||||
|
|
||||||
|
and: "I have a loader for classes"
|
||||||
|
@Subject
|
||||||
|
def loader = new ClassLoader(nameLoader)
|
||||||
|
|
||||||
|
when: "The classes were loaded"
|
||||||
|
def classes = loader.load()
|
||||||
|
|
||||||
|
then: "Checking that the test result is expected"
|
||||||
|
3 == classes.size()
|
||||||
|
}
|
||||||
|
|
||||||
|
def "The classes must be represent the Test interface."() {
|
||||||
|
given: "I have a name class loader"
|
||||||
|
def nameLoader = new NameClassLoader()
|
||||||
|
|
||||||
|
and: "I have a loader for classes"
|
||||||
|
@Subject
|
||||||
|
def loader = new ClassLoader(nameLoader)
|
||||||
|
|
||||||
|
when: "The classes were loaded"
|
||||||
|
def classes = loader.load()
|
||||||
|
|
||||||
|
then: "Checking that the test result is expected"
|
||||||
|
classes.every({ space.kklochko.simple_jbdd.tests.Test.class.isAssignableFrom(it) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders
|
||||||
|
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The loader must return a test class names or null, so
|
||||||
|
those tests check if responses are right.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for NameClassLoader.")
|
||||||
|
class IntegratedNameClassLoader extends Specification {
|
||||||
|
def "The class names have been loaded."() {
|
||||||
|
given: "I have a class loader"
|
||||||
|
@Subject
|
||||||
|
def loader = new NameClassLoader()
|
||||||
|
|
||||||
|
when: "The class names were loaded"
|
||||||
|
def classNames = loader.load()
|
||||||
|
|
||||||
|
then: "Checking that the test result is expected"
|
||||||
|
3 == classNames.size()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.loaders
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The loader must return a class or null, so
|
||||||
|
those tests check if responses are right.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for ClassLoader.")
|
||||||
|
class IntegratedSingleClassLoader extends Specification {
|
||||||
|
def "The class has been loaded."() {
|
||||||
|
given: "I have a class loader"
|
||||||
|
@Subject
|
||||||
|
def loader = new SingleClassLoader(className)
|
||||||
|
|
||||||
|
when: "The class was loaded"
|
||||||
|
def aClass = loader.load()
|
||||||
|
|
||||||
|
then: "Checking that the test result is expected"
|
||||||
|
aClass == expectedClass
|
||||||
|
|
||||||
|
where: "Possible variants of tests"
|
||||||
|
className || expectedClass
|
||||||
|
"fourHundredFour" || null
|
||||||
|
"space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest" || SimpleThenTest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.runners
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleFailedThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleGivenWhenThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest
|
||||||
|
import space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTestWithoutTitle
|
||||||
|
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The runner must return a result of test, so
|
||||||
|
those tests check if passed and failed test generate the right result.
|
||||||
|
""")
|
||||||
|
@Title("Integrated tests for SimpleTestRunner with TestCommandFactory and test examples")
|
||||||
|
class IntegratedSimpleTestRunnerSpec extends Specification {
|
||||||
|
def "The real test has been run."() {
|
||||||
|
given: "I have a factory"
|
||||||
|
def factory = new TestCommandFactory();
|
||||||
|
|
||||||
|
and: "I have a testCommand created from a test object"
|
||||||
|
def test = factory.create(testObject)
|
||||||
|
|
||||||
|
and: "I have a test runner"
|
||||||
|
@Subject
|
||||||
|
def runner = new SimpleTestRunner(test)
|
||||||
|
|
||||||
|
when: "The testCommand has been run"
|
||||||
|
def result = runner.run()
|
||||||
|
|
||||||
|
then: "Checking that the test result is expected"
|
||||||
|
result == expectedResult
|
||||||
|
|
||||||
|
where: "Possible variants of tests"
|
||||||
|
testObject || expectedResult
|
||||||
|
new SimpleThenTest() || true
|
||||||
|
new SimpleGivenWhenThenTest() || true
|
||||||
|
new SimpleThenTestWithoutTitle() || true
|
||||||
|
new SimpleFailedThenTest() || false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package space.kklochko.simple_jbdd.tests.runners
|
||||||
|
|
||||||
|
import space.kklochko.simple_jbdd.tests.commands.SimpleTestCommand
|
||||||
|
import space.kklochko.simple_jbdd.tests.factories.TestCommandFactory
|
||||||
|
import spock.lang.Narrative
|
||||||
|
import spock.lang.Specification
|
||||||
|
import spock.lang.Subject
|
||||||
|
import spock.lang.Title
|
||||||
|
|
||||||
|
@Narrative("""The runner must return a result of test, so
|
||||||
|
those tests check if passed and failed test generate the right result.
|
||||||
|
""")
|
||||||
|
@Title("Unit tests for SimpleTestRunner")
|
||||||
|
class SimpleTestRunnerSpec extends Specification {
|
||||||
|
def "The test with then has been passed."() {
|
||||||
|
given: "I have a testCommand"
|
||||||
|
def test = Stub(SimpleTestCommand)
|
||||||
|
test.test() >>> [true]
|
||||||
|
|
||||||
|
and: "I have a test runner"
|
||||||
|
@Subject
|
||||||
|
def runner = new SimpleTestRunner(test)
|
||||||
|
|
||||||
|
when: "The testCommand has been run"
|
||||||
|
def result = runner.run()
|
||||||
|
|
||||||
|
then: "The result is true"
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
def "The test with then that has not been passed."() {
|
||||||
|
given: "I have a failed testCommand"
|
||||||
|
def test = Stub(SimpleTestCommand)
|
||||||
|
test.test() >> { assert 1 == 0 }
|
||||||
|
|
||||||
|
and: "I have a test runner"
|
||||||
|
@Subject
|
||||||
|
def runner = new SimpleTestRunner(test)
|
||||||
|
|
||||||
|
when: "The testCommand has been run"
|
||||||
|
def result = runner.run()
|
||||||
|
|
||||||
|
then: "The result is false"
|
||||||
|
!result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user