diff --git a/CHANGELOG.md b/CHANGELOG.md index 38f90ae5..b548f502 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] ### Added - [Java, JavaScript] Add `Lineage.background()` and `.ruleBackground()` ([#140](https://github.com/cucumber/query/pull/140)) +- [Java] Add `Query.findAllTestCaseStartedOrderBy` and `.findAllTestCaseFinishedOrderBy` ([#114](https://github.com/cucumber/query/pull/114)) ### Removed - [JavaScript] BREAKING CHANGE: Remove defunct legacy methods from `Query` ([#141](https://github.com/cucumber/query/pull/141)) diff --git a/java/pom.xml b/java/pom.xml index 47b35432..289ff884 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -51,7 +51,7 @@ io.cucumber messages - [29.0.1,32.0.0) + [31.0.1,32.0.0) diff --git a/java/src/main/java/io/cucumber/query/OrderableMessage.java b/java/src/main/java/io/cucumber/query/OrderableMessage.java new file mode 100644 index 00000000..138fac5f --- /dev/null +++ b/java/src/main/java/io/cucumber/query/OrderableMessage.java @@ -0,0 +1,24 @@ +package io.cucumber.query; + +final class OrderableMessage { + private final M message; + private final T orderBy; + + OrderableMessage(M message, T orderBy) { + this.message = message; + this.orderBy = orderBy; + } + + OrderableMessage(M message) { + this.message = message; + this.orderBy = null; + } + + M getMessage() { + return message; + } + + T getOrderBy() { + return orderBy; + } +} diff --git a/java/src/main/java/io/cucumber/query/Query.java b/java/src/main/java/io/cucumber/query/Query.java index 9090e336..43b24f54 100644 --- a/java/src/main/java/io/cucumber/query/Query.java +++ b/java/src/main/java/io/cucumber/query/Query.java @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.EnumMap; import java.util.LinkedHashMap; import java.util.List; @@ -44,6 +45,8 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Function; import static java.util.Collections.emptyList; import static java.util.Comparator.comparing; @@ -82,6 +85,7 @@ public Map countMostSevereTestStepResultStatus() { .collect(groupingBy(identity(), LinkedHashMap::new, counting()))); return results; } + public int countTestCasesStarted() { return findAllTestCaseStarted().size(); } @@ -101,17 +105,37 @@ public List findAllTestCaseStarted() { .isPresent()) .collect(toList()); } - - public List findAllStepDefinitions(){ + + public List findAllStepDefinitions() { return new ArrayList<>(repository.stepDefinitionById.values()); } + public List findAllTestCaseStartedOrderBy(BiFunction> findOrderBy, Comparator order) { + return findAllTestCaseStarted().stream() + .map(testCaseStarted -> findOrderBy.apply(this, testCaseStarted) + .map(orderBy -> new OrderableMessage<>(testCaseStarted, orderBy)) + .orElseGet(() -> new OrderableMessage<>(testCaseStarted))) + .sorted(Comparator.comparing(OrderableMessage::getOrderBy, order)) + .map(OrderableMessage::getMessage) + .collect(toList()); + } + public List findAllTestCaseFinished() { return repository.testCaseFinishedByTestCaseStartedId.values().stream() .filter(testCaseFinished -> !testCaseFinished.getWillBeRetried()) .collect(toList()); } + public List findAllTestCaseFinishedOrderBy(BiFunction> findOrderBy, Comparator order) { + return findAllTestCaseFinished().stream() + .map(testCaseStarted -> findOrderBy.apply(this, testCaseStarted) + .map(orderBy -> new OrderableMessage<>(testCaseStarted, orderBy)) + .orElseGet(() -> new OrderableMessage<>(testCaseStarted))) + .sorted(Comparator.comparing(OrderableMessage::getOrderBy, order)) + .map(OrderableMessage::getMessage) + .collect(toList()); + } + public List findAllTestSteps() { return new ArrayList<>(repository.testStepById.values()); } diff --git a/java/src/test/java/io/cucumber/query/QueryAcceptanceTest.java b/java/src/test/java/io/cucumber/query/QueryAcceptanceTest.java index 0758c0a2..ed65cd47 100644 --- a/java/src/test/java/io/cucumber/query/QueryAcceptanceTest.java +++ b/java/src/test/java/io/cucumber/query/QueryAcceptanceTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import io.cucumber.messages.Convertor; +import io.cucumber.messages.LocationComparator; import io.cucumber.messages.NdjsonToMessageIterable; import io.cucumber.messages.types.*; import org.junit.jupiter.api.Disabled; @@ -15,19 +16,36 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.function.Function; import static com.fasterxml.jackson.core.util.DefaultIndenter.SYSTEM_LINEFEED_INSTANCE; import static io.cucumber.query.Jackson.OBJECT_MAPPER; -import static io.cucumber.query.Repository.RepositoryFeature.*; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_ATTACHMENTS; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_GHERKIN_DOCUMENTS; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_HOOKS; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_STEP_DEFINITIONS; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_SUGGESTIONS; +import static io.cucumber.query.Repository.RepositoryFeature.INCLUDE_UNDEFINED_PARAMETER_TYPES; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; +import static java.util.Comparator.nullsFirst; import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; public class QueryAcceptanceTest { private static final NdjsonToMessageIterable.Deserializer deserializer = (json) -> OBJECT_MAPPER.readValue(json, Envelope.class); + public static final Comparator pickleComparator = Comparator.comparing(Pickle::getUri) + .thenComparing(pickle -> pickle.getLocation().orElse(null), nullsFirst(new LocationComparator())); + private static final Comparator reversePickleComparator = nullsFirst(pickleComparator) + .reversed(); static List acceptance() { List testCases = new ArrayList<>(); @@ -78,9 +96,7 @@ private static T writeQueryResults(QueryTestCase testCa try (InputStream in = Files.newInputStream(testCase.source)) { try (NdjsonToMessageIterable envelopes = new NdjsonToMessageIterable(in, deserializer)) { Repository repository = createRepository(); - for (Envelope envelope : envelopes) { - repository.update(envelope); - } + envelopes.forEach(repository::update); Query query = new Query(repository); Object queryResults = testCase.query.apply(query); DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter() @@ -112,7 +128,16 @@ static Map> createQueries() { queries.put("findAllPickleSteps", (query) -> query.findAllPickleSteps().size()); queries.put("findAllStepDefinitions", (query) -> query.findAllStepDefinitions().size()); queries.put("findAllTestCaseStarted", (query) -> query.findAllTestCaseStarted().size()); + + queries.put("findAllTestCaseStartedOrderBy", (query) -> query.findAllTestCaseStartedOrderBy(Query::findPickleBy, reversePickleComparator) + .stream() + .map(TestCaseStarted::getId) + .collect(toList())); queries.put("findAllTestCaseFinished", (query) -> query.findAllTestCaseFinished().size()); + queries.put("findAllTestCaseFinishedOrderBy", (query) -> query.findAllTestCaseFinishedOrderBy(Query::findPickleBy, reversePickleComparator) + .stream() + .map(TestCaseFinished::getTestCaseStartedId) + .collect(toList())); queries.put("findAllTestRunHookStarted", (query) -> query.findAllTestRunHookStarted().size()); queries.put("findAllTestRunHookFinished", (query) -> query.findAllTestRunHookFinished().size()); queries.put("findAllTestSteps", (query) -> query.findAllTestSteps().size()); diff --git a/testdata/src/attachments.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/attachments.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..3eb156fe --- /dev/null +++ b/testdata/src/attachments.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,9 @@ +[ + "56", + "55", + "54", + "53", + "52", + "51", + "50" +] \ No newline at end of file diff --git a/testdata/src/attachments.findAllTestCaseStartedOrderBy.results.json b/testdata/src/attachments.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..3eb156fe --- /dev/null +++ b/testdata/src/attachments.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,9 @@ +[ + "56", + "55", + "54", + "53", + "52", + "51", + "50" +] \ No newline at end of file diff --git a/testdata/src/empty.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/empty.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..a01887c5 --- /dev/null +++ b/testdata/src/empty.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "4" +] \ No newline at end of file diff --git a/testdata/src/empty.findAllTestCaseStartedOrderBy.results.json b/testdata/src/empty.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..a01887c5 --- /dev/null +++ b/testdata/src/empty.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "4" +] \ No newline at end of file diff --git a/testdata/src/examples-tables.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/examples-tables.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..ed3f61f6 --- /dev/null +++ b/testdata/src/examples-tables.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,9 @@ +[ + "91", + "90", + "89", + "88", + "87", + "86", + "85" +] \ No newline at end of file diff --git a/testdata/src/examples-tables.findAllTestCaseStartedOrderBy.results.json b/testdata/src/examples-tables.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..ed3f61f6 --- /dev/null +++ b/testdata/src/examples-tables.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,9 @@ +[ + "91", + "90", + "89", + "88", + "87", + "86", + "85" +] \ No newline at end of file diff --git a/testdata/src/global-hooks-attachments.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/global-hooks-attachments.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..575b77f4 --- /dev/null +++ b/testdata/src/global-hooks-attachments.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "11" +] \ No newline at end of file diff --git a/testdata/src/global-hooks-attachments.findAllTestCaseStartedOrderBy.results.json b/testdata/src/global-hooks-attachments.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..575b77f4 --- /dev/null +++ b/testdata/src/global-hooks-attachments.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "11" +] \ No newline at end of file diff --git a/testdata/src/global-hooks.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/global-hooks.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..aa9650e7 --- /dev/null +++ b/testdata/src/global-hooks.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,4 @@ +[ + "22", + "21" +] \ No newline at end of file diff --git a/testdata/src/global-hooks.findAllTestCaseStartedOrderBy.results.json b/testdata/src/global-hooks.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..aa9650e7 --- /dev/null +++ b/testdata/src/global-hooks.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,4 @@ +[ + "22", + "21" +] \ No newline at end of file diff --git a/testdata/src/hooks.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/hooks.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..aa9650e7 --- /dev/null +++ b/testdata/src/hooks.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,4 @@ +[ + "22", + "21" +] \ No newline at end of file diff --git a/testdata/src/hooks.findAllTestCaseStartedOrderBy.results.json b/testdata/src/hooks.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..aa9650e7 --- /dev/null +++ b/testdata/src/hooks.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,4 @@ +[ + "22", + "21" +] \ No newline at end of file diff --git a/testdata/src/minimal.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/minimal.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..4aebf7e7 --- /dev/null +++ b/testdata/src/minimal.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "8" +] \ No newline at end of file diff --git a/testdata/src/minimal.findAllTestCaseStartedOrderBy.results.json b/testdata/src/minimal.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..4aebf7e7 --- /dev/null +++ b/testdata/src/minimal.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "8" +] \ No newline at end of file diff --git a/testdata/src/rules.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/rules.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..45508d62 --- /dev/null +++ b/testdata/src/rules.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,5 @@ +[ + "57", + "56", + "55" +] \ No newline at end of file diff --git a/testdata/src/rules.findAllTestCaseStartedOrderBy.results.json b/testdata/src/rules.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..45508d62 --- /dev/null +++ b/testdata/src/rules.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,5 @@ +[ + "57", + "56", + "55" +] \ No newline at end of file diff --git a/testdata/src/unknown-parameter-type.findAllTestCaseFinishedOrderBy.results.json b/testdata/src/unknown-parameter-type.findAllTestCaseFinishedOrderBy.results.json new file mode 100644 index 00000000..4aebf7e7 --- /dev/null +++ b/testdata/src/unknown-parameter-type.findAllTestCaseFinishedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "8" +] \ No newline at end of file diff --git a/testdata/src/unknown-parameter-type.findAllTestCaseStartedOrderBy.results.json b/testdata/src/unknown-parameter-type.findAllTestCaseStartedOrderBy.results.json new file mode 100644 index 00000000..4aebf7e7 --- /dev/null +++ b/testdata/src/unknown-parameter-type.findAllTestCaseStartedOrderBy.results.json @@ -0,0 +1,3 @@ +[ + "8" +] \ No newline at end of file