|
|
@ -11,37 +11,48 @@ import space.kklochko.simple_jbdd.tests.commands.decorators.BlockDecorator;
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.annotation.Annotation;
|
|
|
|
import java.lang.annotation.Annotation;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.TreeMap;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class TestCommandFactory {
|
|
|
|
public class TestCommandFactory {
|
|
|
|
public AbstractTestCommand create(Test input) {
|
|
|
|
public AbstractTestCommand create(Test input) {
|
|
|
|
Class<?> aClass = input.getClass();
|
|
|
|
Class<?> aClass = input.getClass();
|
|
|
|
Map<String, Method> test_methods = this.getTestMethods(aClass);
|
|
|
|
Map<String, ArrayList<Method>> test_methods = this.getTestMethods(aClass);
|
|
|
|
|
|
|
|
|
|
|
|
AbstractTestCommand<Test> aTestCommand = createTest(aClass, input);
|
|
|
|
AbstractTestCommand<Test> aTestCommand = createTest(aClass, input);
|
|
|
|
|
|
|
|
|
|
|
|
if(test_methods.containsKey("Then")) {
|
|
|
|
if(test_methods.containsKey("Then")) {
|
|
|
|
Method then = test_methods.get("Then");
|
|
|
|
ArrayList<Method> thens = getMethodsInReverseOrder(test_methods, "Then");
|
|
|
|
String label = then.getAnnotation(Then.class).value();
|
|
|
|
for(Method then : thens) {
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, then, "Then");
|
|
|
|
String label = then.getAnnotation(Then.class).value();
|
|
|
|
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, then, "Then");
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(test_methods.containsKey("When")) {
|
|
|
|
if(test_methods.containsKey("When")) {
|
|
|
|
Method when = test_methods.get("When");
|
|
|
|
ArrayList<Method> whens = getMethodsInReverseOrder(test_methods, "When");
|
|
|
|
String label = when.getAnnotation(When.class).value();
|
|
|
|
for(Method when : whens) {
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, when, "When");
|
|
|
|
String label = when.getAnnotation(When.class).value();
|
|
|
|
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, when, "When");
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(test_methods.containsKey("Given")) {
|
|
|
|
if(test_methods.containsKey("Given")) {
|
|
|
|
Method when = test_methods.get("Given");
|
|
|
|
ArrayList<Method> givens = getMethodsInReverseOrder(test_methods, "Given");
|
|
|
|
String label = when.getAnnotation(Given.class).value();
|
|
|
|
for(Method given : givens) {
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, when, "Given");
|
|
|
|
String label = given.getAnnotation(Given.class).value();
|
|
|
|
|
|
|
|
aTestCommand = new BlockDecorator<Test>(label, aTestCommand, given, "Given");
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return aTestCommand;
|
|
|
|
return aTestCommand;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private ArrayList<Method> getMethodsInReverseOrder(Map<String, ArrayList<Method>> test_methods, String key) {
|
|
|
|
|
|
|
|
ArrayList<Method> methods = test_methods.get(key);
|
|
|
|
|
|
|
|
Collections.reverse(methods);
|
|
|
|
|
|
|
|
return methods;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected AbstractTestCommand<Test> createTest(Class<?> aClass, Test input) {
|
|
|
|
protected AbstractTestCommand<Test> createTest(Class<?> aClass, Test input) {
|
|
|
|
Title aTitle = aClass.getAnnotation(Title.class);
|
|
|
|
Title aTitle = aClass.getAnnotation(Title.class);
|
|
|
|
String title = aClass.getName();
|
|
|
|
String title = aClass.getName();
|
|
|
@ -52,8 +63,8 @@ public class TestCommandFactory {
|
|
|
|
return new SimpleTestCommand<Test>(title, input);
|
|
|
|
return new SimpleTestCommand<Test>(title, input);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected <T extends Test> Map<String, Method> getTestMethods(Class<?> aClass) {
|
|
|
|
protected <T extends Test> Map<String, ArrayList<Method>> getTestMethods(Class<?> aClass) {
|
|
|
|
Map<String, Method> test_methods = new TreeMap<String, Method>();
|
|
|
|
Map<String, ArrayList<Method>> test_methods = new TreeMap<>();
|
|
|
|
|
|
|
|
|
|
|
|
for(Method method : aClass.getDeclaredMethods()) {
|
|
|
|
for(Method method : aClass.getDeclaredMethods()) {
|
|
|
|
Annotation[] annotations = method.getAnnotations();
|
|
|
|
Annotation[] annotations = method.getAnnotations();
|
|
|
@ -62,15 +73,21 @@ public class TestCommandFactory {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if(method.isAnnotationPresent(Given.class))
|
|
|
|
if(method.isAnnotationPresent(Given.class))
|
|
|
|
test_methods.put("Given", method);
|
|
|
|
addMethodTo(test_methods, "Given", method);
|
|
|
|
|
|
|
|
|
|
|
|
if(method.isAnnotationPresent(When.class))
|
|
|
|
if(method.isAnnotationPresent(When.class))
|
|
|
|
test_methods.put("When", method);
|
|
|
|
addMethodTo(test_methods, "When", method);
|
|
|
|
|
|
|
|
|
|
|
|
if(method.isAnnotationPresent(Then.class))
|
|
|
|
if(method.isAnnotationPresent(Then.class))
|
|
|
|
test_methods.put("Then", method);
|
|
|
|
addMethodTo(test_methods, "Then", method);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return test_methods;
|
|
|
|
return test_methods;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void addMethodTo(Map<String, ArrayList<Method>> test_methods, String key, Method method) {
|
|
|
|
|
|
|
|
ArrayList<Method> methods = test_methods.getOrDefault(key, new ArrayList<>());
|
|
|
|
|
|
|
|
methods.add(method);
|
|
|
|
|
|
|
|
test_methods.put(key, methods);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|