diff --git a/src/main/java/space/kklochko/simple_jbdd/tests/runners/CLITestRunner.java b/src/main/java/space/kklochko/simple_jbdd/tests/runners/CLITestRunner.java new file mode 100644 index 0000000..05f873d --- /dev/null +++ b/src/main/java/space/kklochko/simple_jbdd/tests/runners/CLITestRunner.java @@ -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> 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 testStatuses = runTests(commands); + report(createMetadata(commands, testStatuses)); + + return isFailed(testStatuses); + } + + public ArrayList load() { + Set> classes = this.classLoader.load(); + ArrayList tests = new ArrayList(); + + for(var aClass : classes) { + tests.add((new SingleTestLoader(aClass.getName())).load()); + } + + return tests; + } + + public ArrayList> createCommands(ArrayList tests) { + TestCommandQueueFactory factory = new TestCommandQueueFactory(tests); + return factory.create(); + } + + public ArrayList runTests(ArrayList> commands) { + return commands.stream() + .map(c -> runnerFactory.create(c).run()) + .collect(Collectors.toCollection(ArrayList::new)); + } + + public ArrayList> createMetadata(ArrayList> commands, ArrayList testStatuses) { + return IntStream.range(0, commands.size()) + .mapToObj(i -> new AbstractMap.SimpleEntry( + new TestCommandMetaDataFactory(commands.get(i)), + testStatuses.get(i))) + .collect(Collectors.toCollection(ArrayList::new)); + } + + public void report(ArrayList> metadata) { + reporter.setMetadata(metadata); + reporter.report(); + } + + public boolean isFailed(ArrayList 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; + } +} +