Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1399dac02 | ||
|
|
59d8fe7a4f | ||
|
|
c27d3eca13 |
@@ -0,0 +1,50 @@
|
||||
package space.kklochko.simple_jbdd.tests.loaders;
|
||||
|
||||
import space.kklochko.simple_jbdd.tests.Test;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class SingleTestLoader {
|
||||
String className;
|
||||
|
||||
public SingleTestLoader(String className) {
|
||||
setClassName(className);
|
||||
}
|
||||
|
||||
public Test load() {
|
||||
SingleClassLoader loader = new SingleClassLoader(getClassName());
|
||||
Class<?> aClass = loader.load();
|
||||
|
||||
if(aClass == null)
|
||||
return null;
|
||||
|
||||
Constructor defaultConstructor = null;
|
||||
|
||||
for(Constructor constructor : aClass.getDeclaredConstructors()) {
|
||||
if(constructor.getParameterCount() == 0) {
|
||||
defaultConstructor = constructor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
return (Test) defaultConstructor.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return className;
|
||||
}
|
||||
|
||||
public void setClassName(String className) {
|
||||
this.className = className;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,15 +20,15 @@ public class CLIReporter extends AbstractReporter {
|
||||
int passed = count(testData, true);
|
||||
int failed = count(testData, false);
|
||||
|
||||
System.out.printf("%s\n", center(" Tests "));
|
||||
System.out.printf("%s\n\n", center(" Tests "));
|
||||
printTests(testData);
|
||||
|
||||
if(failed != 0) {
|
||||
System.out.printf("\n%s\n", center(" Errors "));
|
||||
System.out.printf("%s\n\n", center(" Errors "));
|
||||
printTests(failedTestData);
|
||||
}
|
||||
|
||||
System.out.printf("\n%s\n", center(" Summary "));
|
||||
System.out.printf("%s\n", center(" Summary "));
|
||||
System.out.print(summary(passed, failed));
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -25,10 +25,10 @@ public class SimpleTestReportFormatter extends AbstractTestReportFormatter {
|
||||
|
||||
for(int i=1; i<getTestMetaData().size(); ++i) {
|
||||
AbstractMap.SimpleEntry<String, String> pair = getTestMetaData().get(i);
|
||||
result += String.format("\t%s %s\n", pair.getKey(), pair.getValue());
|
||||
result += String.format("\t%s: %s\n", pair.getKey(), pair.getValue());
|
||||
}
|
||||
|
||||
return result;
|
||||
return result + '\n';
|
||||
}
|
||||
|
||||
public String getPassedIcon() {
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
package space.kklochko.simple_jbdd.tests.runners;
|
||||
|
||||
import space.kklochko.simple_jbdd.tests.Test;
|
||||
import space.kklochko.simple_jbdd.tests.commands.AbstractTestCommand;
|
||||
import space.kklochko.simple_jbdd.tests.factories.AbstractTestRunnerFactory;
|
||||
import space.kklochko.simple_jbdd.tests.factories.TestCommandQueueFactory;
|
||||
import space.kklochko.simple_jbdd.tests.factories.meta.AbstractTestCommandMetaDataFactory;
|
||||
import space.kklochko.simple_jbdd.tests.factories.meta.TestCommandMetaDataFactory;
|
||||
import space.kklochko.simple_jbdd.tests.loaders.AbstractNameClassLoader;
|
||||
import space.kklochko.simple_jbdd.tests.loaders.SingleTestLoader;
|
||||
import space.kklochko.simple_jbdd.tests.reports.AbstractReporter;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
public class CLITestRunner extends AbstractTestRunner {
|
||||
private ArrayList<AbstractTestCommand<Test>> commands;
|
||||
private AbstractNameClassLoader classLoader;
|
||||
private AbstractTestRunnerFactory runnerFactory;
|
||||
private AbstractReporter reporter;
|
||||
|
||||
public CLITestRunner(AbstractNameClassLoader classLoader, AbstractTestRunnerFactory runnerFactory, AbstractReporter reporter) {
|
||||
setClassLoader(classLoader);
|
||||
setRunnerFactory(runnerFactory);
|
||||
setReporter(reporter);
|
||||
}
|
||||
|
||||
public boolean run() {
|
||||
commands = createCommands(load());
|
||||
ArrayList<Boolean> testStatuses = runTests(commands);
|
||||
report(createMetadata(commands, testStatuses));
|
||||
|
||||
return isFailed(testStatuses);
|
||||
}
|
||||
|
||||
public ArrayList<Test> load() {
|
||||
Set<Class<?>> classes = this.classLoader.load();
|
||||
ArrayList<Test> tests = new ArrayList();
|
||||
|
||||
for(var aClass : classes) {
|
||||
tests.add((new SingleTestLoader(aClass.getName())).load());
|
||||
}
|
||||
|
||||
return tests;
|
||||
}
|
||||
|
||||
public ArrayList<AbstractTestCommand<Test>> createCommands(ArrayList<Test> tests) {
|
||||
TestCommandQueueFactory factory = new TestCommandQueueFactory(tests);
|
||||
return factory.create();
|
||||
}
|
||||
|
||||
public ArrayList<Boolean> runTests(ArrayList<AbstractTestCommand<Test>> commands) {
|
||||
return commands.stream()
|
||||
.map(c -> runnerFactory.create(c).run())
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
}
|
||||
|
||||
public ArrayList<AbstractMap.SimpleEntry<AbstractTestCommandMetaDataFactory, Boolean>> createMetadata(ArrayList<AbstractTestCommand<Test>> commands, ArrayList<Boolean> testStatuses) {
|
||||
return IntStream.range(0, commands.size())
|
||||
.mapToObj(i -> new AbstractMap.SimpleEntry<AbstractTestCommandMetaDataFactory, Boolean>(
|
||||
new TestCommandMetaDataFactory(commands.get(i)),
|
||||
testStatuses.get(i)))
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
}
|
||||
|
||||
public void report(ArrayList<AbstractMap.SimpleEntry<AbstractTestCommandMetaDataFactory, Boolean>> metadata) {
|
||||
reporter.setMetadata(metadata);
|
||||
reporter.report();
|
||||
}
|
||||
|
||||
public boolean isFailed(ArrayList<Boolean> testStatuses) {
|
||||
return !testStatuses.stream().anyMatch(b -> b == false);
|
||||
}
|
||||
|
||||
public AbstractNameClassLoader getClassLoader() {
|
||||
return classLoader;
|
||||
}
|
||||
|
||||
public void setClassLoader(AbstractNameClassLoader classLoader) {
|
||||
this.classLoader = classLoader;
|
||||
}
|
||||
|
||||
public AbstractTestRunnerFactory getRunnerFactory() {
|
||||
return runnerFactory;
|
||||
}
|
||||
|
||||
public void setRunnerFactory(AbstractTestRunnerFactory runnerFactory) {
|
||||
this.runnerFactory = runnerFactory;
|
||||
}
|
||||
|
||||
public AbstractReporter getReporter() {
|
||||
return reporter;
|
||||
}
|
||||
|
||||
public void setReporter(AbstractReporter reporter) {
|
||||
this.reporter = reporter;
|
||||
}
|
||||
}
|
||||
|
||||
+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 SingleTestLoader.")
|
||||
class IntegratedSingleTestLoader extends Specification {
|
||||
def "The class has been loaded."() {
|
||||
given: "I have a class loader"
|
||||
@Subject
|
||||
def loader = new SingleTestLoader(className)
|
||||
|
||||
when: "The class was loaded"
|
||||
def aClass = loader.load()
|
||||
|
||||
then: "Checking that the test result is expected"
|
||||
aClass?.class == expectedClass
|
||||
|
||||
where: "Possible variants of tests"
|
||||
className || expectedClass
|
||||
"fourHundredFour" || null
|
||||
"space.kklochko.simple_jbdd.test_examples.tests.SimpleThenTest" || SimpleThenTest
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -36,8 +36,8 @@ class SimpleTestReportFormatterSpec extends Specification {
|
||||
|
||||
where: "Possible variants of tests"
|
||||
isPassed || expectedFormat
|
||||
true || "✓ A simple test\n\tThen Then block\n"
|
||||
false || "⨯ A simple test\n\tThen Then block\n"
|
||||
true || "✓ A simple test\n\tThen: Then block\n\n"
|
||||
false || "⨯ A simple test\n\tThen: Then block\n\n"
|
||||
}
|
||||
|
||||
def "If the map of methods have GivenWhenThen blocks."() {
|
||||
@@ -61,8 +61,8 @@ class SimpleTestReportFormatterSpec extends Specification {
|
||||
|
||||
where: "Possible variants of tests"
|
||||
isPassed || expectedFormat
|
||||
true || "✓ A simple test\n\tGiven Given block\n\tWhen When block\n\tThen Then block\n"
|
||||
false || "⨯ A simple test\n\tGiven Given block\n\tWhen When block\n\tThen Then block\n"
|
||||
true || "✓ A simple test\n\tGiven: Given block\n\tWhen: When block\n\tThen: Then block\n\n"
|
||||
false || "⨯ A simple test\n\tGiven: Given block\n\tWhen: When block\n\tThen: Then block\n\n"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user