compactCases() {
+ String compactCsv = "DateSearchTestCase-compact.csv";
+ InputStream compactStream = DateSearchTestCase.class.getResourceAsStream(compactCsv);
+ assert compactStream != null;
+ return expandPrefixCases(new InputStreamReader(compactStream, StandardCharsets.UTF_8), compactCsv);
+ }
+
+ /**
+ * helper for compressed format of date test cases.
+ *
+ * The csv has rows with: Matching prefixes, Query Date, Resource Date
+ * E.g. "eq ge le,2020, 2020"
+ * This helper expands that one line into test for all of: eq, ge, gt, le, lt, and ne,
+ * expecting the listed prefixes to match, and the unlisted ones to not match.
+ *
+ * @return List of test cases
+ */
+ @Nonnull
+ static List expandPrefixCases(Reader theSource, String theFileName) {
+ Set supportedPrefixes = CollectionUtil.newSet("eq", "ge", "gt", "le", "lt", "ne");
+
+ // expand these into individual tests for each prefix.
+ LineNumberReader lineNumberReader = new LineNumberReader(theSource);
+ return lineNumberReader.lines()
+ .filter(l->!l.startsWith("#")) // strip comments
+ .map(l -> l.split(","))
+ .flatMap(fields -> {
+ // line looks like: "eq ge le,2020, 2020"
+ // Matching prefixes, Query Date, Resource Date
+ String resourceValue = fields[0].trim();
+ String truePrefixes = fields[1].trim();
+ String queryValue = fields[2].trim();
+ Set expectedTruePrefixes = Arrays.stream(truePrefixes.split(" +")).map(String::trim).collect(Collectors.toSet());
+
+ // expand to one test case per supportedPrefixes
+ return supportedPrefixes.stream()
+ .map(prefix -> {
+ boolean expectMatch = expectedTruePrefixes.contains(prefix);
+ return new DateSearchTestCase(resourceValue, prefix + queryValue, expectMatch, theFileName, lineNumberReader.getLineNumber());
+ });
+ })
+ .collect(Collectors.toList());
+ }
+}
diff --git a/hapi-fhir-test-utilities/src/main/java/ca/uhn/fhir/jpa/conformance/package-info.java b/hapi-fhir-test-utilities/src/main/java/ca/uhn/fhir/jpa/conformance/package-info.java
new file mode 100644
index 00000000000..643b376869f
--- /dev/null
+++ b/hapi-fhir-test-utilities/src/main/java/ca/uhn/fhir/jpa/conformance/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * Collection of fhir standard behaviour tests.
+ *
+ * These require binding into specific contexts (JPA Spring test, full server IT, etc.)
+ */
+package ca.uhn.fhir.jpa.conformance;
diff --git a/hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase-compact.csv b/hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase-compact.csv
new file mode 100644
index 00000000000..49a169909a4
--- /dev/null
+++ b/hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase-compact.csv
@@ -0,0 +1,5 @@
+#Resource Date, Matching prefixes, Query Date,
+2020, eq ge le,2020,
+2021, gt ge ne,2020,
+2020, lt le ne,2021,
+2021-01-01, ne gt ge,2020
diff --git a/hapi-fhir-jpaserver-base/src/test/resources/r4/date-search-test-case.csv b/hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase.csv
similarity index 90%
rename from hapi-fhir-jpaserver-base/src/test/resources/r4/date-search-test-case.csv
rename to hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase.csv
index b1c08c37642..171ede25918 100644
--- a/hapi-fhir-jpaserver-base/src/test/resources/r4/date-search-test-case.csv
+++ b/hapi-fhir-test-utilities/src/main/resources/ca/uhn/fhir/jpa/conformance/DateSearchTestCase.csv
@@ -1,5 +1,5 @@
-ObservationDate,Query, Result
-2020,eq2020, True
+#ObservationDate, Query, Result, Comment (ignored)
+2020,eq2020, True, A harmless comment
2021,eq2020, False
2020-01,eq2020, True
2020-12,eq2020, True
@@ -41,15 +41,15 @@ ObservationDate,Query, Result
2021-01-01,eq2020-01-01T08:00:00.000, False
2020-01-01T08:00:00.000,eq2020-01-01T08:00:00.000, True
2019-12-31T08:00:00.000,eq2020-01-01T08:00:00.000, False
-#2020-01-01T13:00:00.000Z,eq2020-01-01T08:00:00.000, True
-2019-01-01T12:00:00.000Z,eq2020-01-01T08:00:00.000, False
+#2020-01-01T13:00:00.000Z,eq2020-01-01T08:00:00.000, True, assumes -04 tz - not safe
+2019-01-01T12:00:00.000Z,eq2020-01-01T08:00:00.000, False, assumes < +16 tz. OK.
2020,eq2020-01-01T08:00:00.000Z, False
2021,eq2020-01-01T08:00:00.000Z, False
2020-01,eq2020-01-01T08:00:00.000Z, False
2021-01,eq2020-01-01T08:00:00.000Z, False
2020-01-01,eq2020-01-01T08:00:00.000Z, False
2021-01-01,eq2020-01-01T08:00:00.000Z, False
-#2020-01-01T03:00:00.000,eq2020-01-01T08:00:00.000Z, True
+#2020-01-01T03:00:00.000,eq2020-01-01T08:00:00.000Z, True, assumes -04tz - not safe
2019-12-31T08:00:00.000,eq2020-01-01T08:00:00.000Z, False
2020-01-01T08:00:00.000Z,eq2020-01-01T08:00:00.000Z, True
2019-01-01T12:00:00.000Z,eq2020-01-01T08:00:00.000Z, False
@@ -89,7 +89,7 @@ ObservationDate,Query, Result
2019,gt2020-01-01T08:00:00.000, False
2020-01,gt2020-01-01T08:00:00.000, True
2021-01,gt2020-01-01T08:00:00.000, True
-2020-01-01,gt2020-01-01T08:00:00.000, True
+#2020-01-01,gt2020-01-01T08:00:00.000, False, Dodgy case - depends on our local time which we randomize
2019-12-31,gt2020-01-01T08:00:00.000, False
2020-01-01T08:00:00.000,gt2020-01-01T08:00:00.000, False
2021-12-31T08:00:00.000,gt2020-01-01T08:00:00.000, True
@@ -99,9 +99,7 @@ ObservationDate,Query, Result
2019,gt2020-01-01T08:00:00.000Z, False
2020-01,gt2020-01-01T08:00:00.000Z, True
2019-12,gt2020-01-01T08:00:00.000Z, False
-2020-01-01,gt2020-01-01T08:00:00.000Z, True
-2021-01-01,gt2020-01-01T08:00:00.000Z, True
-#2020-01-01T08:00:00.000,gt2020-01-01T08:00:00.000Z, True
+#2020-01-01,gt2020-01-01T08:00:00.000Z, True
2019-12-31T08:00:00.000,gt2020-01-01T08:00:00.000Z, False
2020-01-01T08:00:00.000Z,gt2020-01-01T08:00:00.000Z, False
2019-01-01T12:00:00.000Z,gt2020-01-01T08:00:00.000Z, False
@@ -160,4 +158,4 @@ ObservationDate,Query, Result
2020-01-01T08:00:00.000,lt2020-01-01T08:00:00.000Z, False
2019-12-31T00:00:00.000,lt2020-01-01T08:00:00.000Z, True
2020-01-01T08:00:00.000Z,lt2020-01-01T08:00:00.000Z, False
-2019-01-01T12:00:00.000Z,lt2020-01-01T08:00:00.000Z, True
\ No newline at end of file
+2019-01-01T12:00:00.000Z,lt2020-01-01T08:00:00.000Z, True