diff --git a/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/AbstractTestCommandMetaDataFactory.java b/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/AbstractTestCommandMetaDataFactory.java new file mode 100644 index 0000000..b4bac40 --- /dev/null +++ b/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/AbstractTestCommandMetaDataFactory.java @@ -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> create(); +} + diff --git a/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactory.java b/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactory.java new file mode 100644 index 0000000..cbde55e --- /dev/null +++ b/src/main/java/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactory.java @@ -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> create() { + ArrayList> 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; + } +} + diff --git a/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/IntegratedTestCommandMetaDataFactorySpec.groovy b/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/IntegratedTestCommandMetaDataFactorySpec.groovy new file mode 100644 index 0000000..dab12f7 --- /dev/null +++ b/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/IntegratedTestCommandMetaDataFactorySpec.groovy @@ -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 + } +} + diff --git a/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactorySpec.groovy b/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactorySpec.groovy new file mode 100644 index 0000000..54f43ef --- /dev/null +++ b/src/test/groovy/space/kklochko/simple_jbdd/tests/factories/meta/TestCommandMetaDataFactorySpec.groovy @@ -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") + ] + } +} +