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