Skip to content

Commit 9a4237f

Browse files
Improved date and dateTime adapter unit testing to check for ambiguity and resulting time value.
1 parent f7c0a9c commit 9a4237f

File tree

2 files changed

+90
-20
lines changed

2 files changed

+90
-20
lines changed

core/src/test/java/gov/nist/secauto/metaschema/core/datatype/adapter/DateAdapterTest.java

+26-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,39 @@
55

66
package gov.nist.secauto.metaschema.core.datatype.adapter;
77

8+
import static org.junit.jupiter.api.Assertions.assertAll;
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
import gov.nist.secauto.metaschema.core.datatype.object.AmbiguousDate;
12+
813
import org.junit.jupiter.params.ParameterizedTest;
9-
import org.junit.jupiter.params.provider.ValueSource;
14+
import org.junit.jupiter.params.provider.Arguments;
15+
import org.junit.jupiter.params.provider.MethodSource;
16+
17+
import java.time.ZoneOffset;
18+
import java.time.ZonedDateTime;
19+
import java.util.stream.Stream;
1020

1121
import edu.umd.cs.findbugs.annotations.NonNull;
1222

1323
class DateAdapterTest {
1424
private static final DateAdapter ADAPTER = new DateAdapter();
1525

26+
private static Stream<Arguments> provideValues() {
27+
return Stream.of(
28+
Arguments.of("2018-01-01", true, ZonedDateTime.of(2018, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC)),
29+
Arguments.of("2020-06-23Z", false, ZonedDateTime.of(2020, 6, 23, 0, 0, 0, 0, ZoneOffset.UTC)),
30+
Arguments.of("2020-06-23-04:00", false, ZonedDateTime.of(2020, 6, 23, 0, 0, 0, 0, ZoneOffset.of("-04:00"))),
31+
Arguments.of("2020-01-01", true, ZonedDateTime.of(2020, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC)),
32+
Arguments.of("2018-01-01", true, ZonedDateTime.of(2018, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC)));
33+
}
34+
1635
@ParameterizedTest
17-
@ValueSource(strings = { "2018-01-01", "2020-06-23Z", "2020-06-23-04:00", "2020-06-23", "2020-01-01" })
18-
void testSimpleDate(@NonNull String date) {
19-
ADAPTER.parse(date);
36+
@MethodSource("provideValues")
37+
void testSimpleDate(@NonNull String actual, boolean ambiguous, @NonNull ZonedDateTime expected) {
38+
AmbiguousDate date = ADAPTER.parse(actual);
39+
assertAll(
40+
() -> assertEquals(ambiguous, !date.hasTimeZone()),
41+
() -> assertEquals(expected, date.getValue()));
2042
}
2143
}

core/src/test/java/gov/nist/secauto/metaschema/core/datatype/adapter/DateTimeAdapterTest.java

+64-16
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,75 @@
55

66
package gov.nist.secauto.metaschema.core.datatype.adapter;
77

8-
import gov.nist.secauto.metaschema.core.util.ObjectUtils;
8+
import static org.junit.jupiter.api.Assertions.assertAll;
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
import gov.nist.secauto.metaschema.core.datatype.object.AmbiguousDateTime;
912

1013
import org.junit.jupiter.params.ParameterizedTest;
11-
import org.junit.jupiter.params.provider.ValueSource;
14+
import org.junit.jupiter.params.provider.Arguments;
15+
import org.junit.jupiter.params.provider.MethodSource;
16+
17+
import java.time.ZoneOffset;
18+
import java.time.ZonedDateTime;
19+
import java.util.concurrent.TimeUnit;
20+
import java.util.stream.Stream;
21+
22+
import edu.umd.cs.findbugs.annotations.NonNull;
1223

1324
class DateTimeAdapterTest {
25+
private static final DateTimeAdapter ADAPTER = new DateTimeAdapter();
1426

15-
@ParameterizedTest
16-
@ValueSource(strings = {
17-
"2018-01-01T00:00:00",
18-
"2019-09-28T23:20:50.52Z",
19-
"2019-09-28T23:20:50.0Z",
20-
"2019-09-28T23:20:50.5200",
21-
"2019-12-02T16:39:57-08:00",
22-
"2019-12-02T16:39:57.100-08:00",
23-
"2019-12-02T16:39:57",
24-
"2019-12-31T23:59:59Z",
25-
"2019-12-31T23:59:59"
26-
})
27-
void testSimpleDate(String date) {
28-
new DateTimeAdapter().parse(ObjectUtils.requireNonNull(date));
27+
private static Stream<Arguments> provideValues() {
28+
return Stream.of(
29+
Arguments.of(
30+
"2018-01-01T00:00:00",
31+
true,
32+
ZonedDateTime.of(2018, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC)),
33+
Arguments.of(
34+
"2019-09-28T23:20:50.52Z",
35+
false,
36+
ZonedDateTime.of(2019, 9, 28, 23, 20, 50, toNanos(0.52), ZoneOffset.UTC)),
37+
Arguments.of(
38+
"2019-09-28T23:20:50.0Z",
39+
false,
40+
ZonedDateTime.of(2019, 9, 28, 23, 20, 50, 0, ZoneOffset.UTC)),
41+
Arguments.of(
42+
"2019-09-28T23:20:50.5200",
43+
true,
44+
ZonedDateTime.of(2019, 9, 28, 23, 20, 50, toNanos(0.5200), ZoneOffset.UTC)),
45+
Arguments.of(
46+
"2019-12-02T16:39:57-08:00",
47+
false,
48+
ZonedDateTime.of(2019, 12, 2, 16, 39, 57, 0, ZoneOffset.of("-08:00"))),
49+
Arguments.of(
50+
"2019-12-02T16:39:57.100-08:00",
51+
false,
52+
ZonedDateTime.of(2019, 12, 2, 16, 39, 57, toNanos(0.100), ZoneOffset.of("-08:00"))),
53+
Arguments.of(
54+
"2019-12-02T16:39:57",
55+
true,
56+
ZonedDateTime.of(2019, 12, 2, 16, 39, 57, 0, ZoneOffset.UTC)),
57+
Arguments.of(
58+
"2019-12-31T23:59:59Z",
59+
false,
60+
ZonedDateTime.of(2019, 12, 31, 23, 59, 59, 0, ZoneOffset.UTC)),
61+
Arguments.of(
62+
"2019-12-31T23:59:59",
63+
true,
64+
ZonedDateTime.of(2019, 12, 31, 23, 59, 59, 0, ZoneOffset.UTC)));
2965
}
3066

67+
private static int toNanos(double fraction) {
68+
return (int) Math.round(TimeUnit.SECONDS.toNanos(1) * fraction);
69+
}
70+
71+
@ParameterizedTest
72+
@MethodSource("provideValues")
73+
void testSimpleDateTime(@NonNull String actual, boolean ambiguous, @NonNull ZonedDateTime expected) {
74+
AmbiguousDateTime date = ADAPTER.parse(actual);
75+
assertAll(
76+
() -> assertEquals(ambiguous, !date.hasTimeZone()),
77+
() -> assertEquals(expected, date.getValue()));
78+
}
3179
}

0 commit comments

Comments
 (0)