You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/04/05 13:58:06 UTC

[isis] branch master updated: ISIS-2992: fixes VirtualClock construction issues

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 102aa31fbc ISIS-2992: fixes VirtualClock construction issues
102aa31fbc is described below

commit 102aa31fbc065867f7b57ecf2fd5283c3de29849
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Apr 5 15:57:58 2022 +0200

    ISIS-2992: fixes VirtualClock construction issues
---
 .../org/apache/isis/applib/clock/VirtualClock.java |  29 +++--
 .../isis/applib/clock/VirtualClock_Test.java       | 145 +++++++++++++++++++--
 2 files changed, 153 insertions(+), 21 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
index 5dda8a562a..6a52310c5d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/clock/VirtualClock.java
@@ -86,11 +86,11 @@ public interface VirtualClock extends Serializable {
      * Returns a ticking clock set to virtual time.
      */
     static VirtualClock nowAt(@NonNull final java.time.LocalDate virtualNow) {
-        return nowAt(Instant.from(virtualNow));
+        return nowAt(Instant.from(virtualNow.atStartOfDay().atZone(localTimeZone())));
     }
 
     static VirtualClock nowAt(@NonNull final java.time.LocalDateTime virtualNow) {
-        return nowAt(Instant.from(virtualNow));
+        return nowAt(Instant.from(virtualNow.atZone(localTimeZone())));
     }
 
     static VirtualClock nowAt(@NonNull final java.time.OffsetDateTime virtualNow) {
@@ -138,11 +138,11 @@ public interface VirtualClock extends Serializable {
     }
 
     static VirtualClock frozenAt(@NonNull final java.time.LocalDate frozenAt) {
-        return frozenAt(Instant.from(frozenAt));
+        return frozenAt(Instant.from(frozenAt.atStartOfDay(localTimeZone())));
     }
 
     static VirtualClock frozenAt(@NonNull final java.time.LocalDateTime frozenAt) {
-        return frozenAt(Instant.from(frozenAt.atZone(ZoneId.systemDefault())));
+        return frozenAt(Instant.from(frozenAt.atZone(localTimeZone())));
     }
 
     static VirtualClock frozenAt(@NonNull final java.time.OffsetDateTime frozenAt) {
@@ -191,6 +191,17 @@ public interface VirtualClock extends Serializable {
         return frozenAt(frozenAt);
     }
 
+    // -- TIME ZONE
+
+    /**
+     * Used to interpret local time.
+     * <p>
+     * Returns {@link ZoneId#systemDefault()} .
+     */
+    static ZoneId localTimeZone() {
+        return ZoneId.systemDefault();
+    }
+
     // -- UTILITY
 
     /**
@@ -223,7 +234,7 @@ public interface VirtualClock extends Serializable {
      * @see #nowAsLocalDate(ZoneId)
      */
     default LocalDate nowAsLocalDate() {
-        return nowAsLocalDate(ZoneId.systemDefault());
+        return nowAsLocalDate(localTimeZone());
     }
 
     /**
@@ -243,7 +254,7 @@ public interface VirtualClock extends Serializable {
      * @see #nowAsLocalDateTime(ZoneId)
      */
     default LocalDateTime nowAsLocalDateTime() {
-        return nowAsLocalDateTime(ZoneId.systemDefault());
+        return nowAsLocalDateTime(localTimeZone());
     }
 
     /**
@@ -262,7 +273,7 @@ public interface VirtualClock extends Serializable {
      * @see #nowAsOffsetDateTime(ZoneId)
      */
     default OffsetDateTime nowAsOffsetDateTime() {
-        return nowAsOffsetDateTime(ZoneId.systemDefault());
+        return nowAsOffsetDateTime(localTimeZone());
     }
 
     /**
@@ -310,7 +321,7 @@ public interface VirtualClock extends Serializable {
      */
     @Deprecated // forRemoval=? ideally applib should no longer depend on joda.time, use converters instead
     default org.joda.time.DateTime nowAsJodaDateTime() {
-        return nowAsJodaDateTime(ZoneId.systemDefault());
+        return nowAsJodaDateTime(localTimeZone());
     }
 
     /**
@@ -363,7 +374,7 @@ public interface VirtualClock extends Serializable {
      */
     @Deprecated // forRemoval=? ideally applib should no longer depend on joda.time, use converters instead
     default org.joda.time.LocalDate nowAsJodaLocalDate() {
-        val zoneId = ZoneId.systemDefault();
+        val zoneId = localTimeZone();
         return nowAsJodaLocalDate(zoneId);
     }
 
diff --git a/api/applib/src/test/java/org/apache/isis/applib/clock/VirtualClock_Test.java b/api/applib/src/test/java/org/apache/isis/applib/clock/VirtualClock_Test.java
index 5504abfb12..160ee54eff 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/clock/VirtualClock_Test.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/clock/VirtualClock_Test.java
@@ -18,13 +18,18 @@
  */
 package org.apache.isis.applib.clock;
 
+import java.time.Instant;
 import java.time.ZoneId;
+import java.time.ZoneOffset;
 
-import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 class VirtualClock_Test {
 
     private VirtualClock virtualClock;
@@ -34,57 +39,173 @@ class VirtualClock_Test {
         virtualClock = VirtualClock.frozenTestClock();
     }
 
+    // -- FACTORIES (TICKING)
+
+    final static long TOLERANCE_SECONDS = 2;
+
+    @Test
+    void nowAtLocalDate() {
+        final java.time.LocalDate virtualNow = java.time.LocalDate.of(2014, 5, 18);
+        assertTimeEquals(
+                VirtualClock.nowAt(virtualNow),
+                virtualNow.atStartOfDay().atZone(VirtualClock.localTimeZone()).toInstant(),
+                TOLERANCE_SECONDS);
+    }
+
+    @Test
+    void nowAtLocalDateTime() {
+        final java.time.LocalDateTime virtualNow = java.time.LocalDateTime.of(2014, 5, 18, 7, 15);
+        assertTimeEquals(
+                VirtualClock.nowAt(virtualNow),
+                virtualNow.atZone(VirtualClock.localTimeZone()).toInstant(),
+                TOLERANCE_SECONDS);
+    }
+
+    @Test
+    void nowAtOffsetDateTime() {
+        final java.time.OffsetDateTime virtualNow =
+                java.time.OffsetDateTime.of(2014, 5, 18, 7, 15, 0, 0, ZoneOffset.ofHours(-3));
+        assertTimeEquals(
+                VirtualClock.nowAt(virtualNow),
+                virtualNow.toInstant(),
+                TOLERANCE_SECONDS);
+    }
+
+    @Test
+    void nowAtZonedDateTime() {
+        final java.time.ZonedDateTime virtualNow =
+                java.time.ZonedDateTime.of(2014, 5, 18, 7, 15, 0, 0, ZoneOffset.ofHours(-3));
+        assertTimeEquals(
+                VirtualClock.nowAt(virtualNow),
+                virtualNow.toInstant(),
+                TOLERANCE_SECONDS);
+    }
+
+    @Test
+    void nowAtDate() {
+        @SuppressWarnings("deprecation")
+        final java.util.Date virtualNow = new java.util.Date(2014-1900, 5-1, 18);
+        assertTimeEquals(
+                VirtualClock.nowAt(virtualNow),
+                Instant.ofEpochMilli(virtualNow.getTime()),
+                TOLERANCE_SECONDS);
+    }
+
+    // -- FACTORIES (FROZEN)
+
+    @Test
+    void frozenAtLocalDate() {
+        final java.time.LocalDate virtualNow = java.time.LocalDate.of(2014, 5, 18);
+        assertTimeEquals(
+                VirtualClock.frozenAt(virtualNow),
+                virtualNow.atStartOfDay().atZone(VirtualClock.localTimeZone()).toInstant());
+    }
+
     @Test
-    void nowAt() {
-        Assertions.assertThat(virtualClock.nowAsInstant()).isEqualTo("2003-07-17T21:30:25Z");
+    void frozenAtLocalDateTime() {
+        final java.time.LocalDateTime virtualNow = java.time.LocalDateTime.of(2014, 5, 18, 7, 15);
+        assertTimeEquals(
+                VirtualClock.frozenAt(virtualNow),
+                virtualNow.atZone(VirtualClock.localTimeZone()).toInstant());
+    }
+
+    @Test
+    void frozenAtOffsetDateTime() {
+        final java.time.OffsetDateTime virtualNow =
+                java.time.OffsetDateTime.of(2014, 5, 18, 7, 15, 0, 0, ZoneOffset.ofHours(-3));
+        assertTimeEquals(
+                VirtualClock.frozenAt(virtualNow),
+                virtualNow.toInstant());
+    }
+
+    @Test
+    void frozenAtZonedDateTime() {
+        final java.time.ZonedDateTime virtualNow =
+                java.time.ZonedDateTime.of(2014, 5, 18, 7, 15, 0, 0, ZoneOffset.ofHours(-3));
+        assertTimeEquals(
+                VirtualClock.frozenAt(virtualNow),
+                virtualNow.toInstant());
+    }
+
+    @Test
+    void frozenAtDate() {
+        @SuppressWarnings("deprecation")
+        final java.util.Date virtualNow = new java.util.Date(2014-1900, 5-1, 18);
+        assertTimeEquals(
+                VirtualClock.frozenAt(virtualNow),
+                Instant.ofEpochMilli(virtualNow.getTime()));
+    }
+
+
+    // -- QUERIES
+
+    @Test
+    void nowAsInstant() {
+        assertThat(virtualClock.nowAsInstant()).isEqualTo("2003-07-17T21:30:25Z");
     }
 
     @Test
     void nowAsEpochMilli() {
-        Assertions.assertThat(virtualClock.nowAsEpochMilli()).isEqualTo(1058477425000L);
+        assertThat(virtualClock.nowAsEpochMilli()).isEqualTo(1058477425000L);
     }
 
     @Test
     void nowAsLocalDate() {
-        Assertions.assertThat(virtualClock.nowAsLocalDate(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17");
+        assertThat(virtualClock.nowAsLocalDate(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17");
     }
 
     @Test
     void nowAsLocalDateTime() {
-        Assertions.assertThat(virtualClock.nowAsLocalDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25");
+        assertThat(virtualClock.nowAsLocalDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25");
     }
 
     @Test
     void nowAsOffsetDateTime() {
-        Assertions.assertThat(virtualClock.nowAsOffsetDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25Z");
+        assertThat(virtualClock.nowAsOffsetDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25Z");
     }
 
     @Test
     @Disabled // depends on the timezone
     void nowAsJavaUtilDate() {
-        Assertions.assertThat(virtualClock.nowAsJavaUtilDate().toString()).isEqualTo("Thu Jul 17 22:30:25 BST 2003");
+        assertThat(virtualClock.nowAsJavaUtilDate().toString()).isEqualTo("Thu Jul 17 22:30:25 BST 2003");
     }
 
     @Test
     @Disabled // depends on the timezone
     void nowAsJavaSqlTimestamp() {
-        Assertions.assertThat(virtualClock.nowAsJavaSqlTimestamp().toString()).isEqualTo("2003-07-17 22:30:25.0");
+        assertThat(virtualClock.nowAsJavaSqlTimestamp().toString()).isEqualTo("2003-07-17 22:30:25.0");
     }
 
     @Test
     @Disabled // depends on the timezone
     void nowAsXmlGregorianCalendar() {
-        Assertions.assertThat(virtualClock.nowAsXmlGregorianCalendar().toString()).isEqualTo("2003-07-17T22:30:25.000+01:00");
+        assertThat(virtualClock.nowAsXmlGregorianCalendar().toString()).isEqualTo("2003-07-17T22:30:25.000+01:00");
     }
 
     @Test
     void nowAsJodaDateTime() {
-        Assertions.assertThat(virtualClock.nowAsJodaDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25.000Z");
+        assertThat(virtualClock.nowAsJodaDateTime(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17T21:30:25.000Z");
     }
 
     @Test
     void nowAsJodaLocalDate() {
-        Assertions.assertThat(virtualClock.nowAsJodaLocalDate(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17");
+        assertThat(virtualClock.nowAsJodaLocalDate(ZoneId.of("UTC")).toString()).isEqualTo("2003-07-17");
+    }
+
+    // -- HELPER
+
+    static void assertTimeEquals(final VirtualClock virtualClock, final Instant expectedInstant) {
+        assertEquals(virtualClock.nowAsInstant(), expectedInstant);
+    }
+
+    private void assertTimeEquals(final VirtualClock virtualClock,
+            final Instant expectedInstant, final long toleranceSeconds) {
+        final long deltaSeconds = Math.abs(
+                virtualClock.nowAsInstant().getEpochSecond()
+                - expectedInstant.getEpochSecond());
+        assertTrue(deltaSeconds <= toleranceSeconds);
     }
 
+
+
 }
\ No newline at end of file