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/01/04 10:02:52 UTC

[isis] branch master updated: ISIS-2882: activate time precision parsing tests

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 94cae76  ISIS-2882: activate time precision parsing tests
94cae76 is described below

commit 94cae7611b4d6012c5bb2790787f85a3506c3a55
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jan 4 11:02:42 2022 +0100

    ISIS-2882: activate time precision parsing tests
---
 .../JavaUtilDateValueSemanticsProviderTest.java    | 89 ++++++++++++++--------
 1 file changed, 57 insertions(+), 32 deletions(-)

diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
index 2511a16..5670f3c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
@@ -19,25 +19,31 @@
 package org.apache.isis.core.metamodel.facets.value;
 
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Locale;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
+import org.apache.isis.applib.annotation.TimePrecision;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.locale.UserLocale;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.applib.value.semantics.TemporalValueSemantics;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider.Context;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.legacy.JavaUtilDateValueSemantics;
 
+import lombok.NonNull;
 import lombok.val;
 
+/**
+ * Actually testing the LocalDateTimeValueSemantics under the hood.
+ * XXX Maybe move/rename this class.
+ */
 class JavaUtilDateValueSemanticsProviderTest
 extends ValueSemanticsProviderAbstractTestCase {
 
@@ -45,46 +51,33 @@ extends ValueSemanticsProviderAbstractTestCase {
     private final java.util.Date date = new java.util.Date(2013-1900, 03-1, 13, 17, 59, 03);
     private JavaUtilDateValueSemantics valueSemantics;
 
-    @BeforeEach
-    public void setUpObjects() throws Exception {
-
-        ValueSemanticsAbstract<LocalDateTime> delegate =
-                new LocalDateTimeValueSemantics();
-
-        setSemantics(valueSemantics = new JavaUtilDateValueSemantics() {
-            @Override
-            public ValueSemanticsAbstract<LocalDateTime> getDelegate() {
-                return delegate;
-            }
-        });
-    }
-
     @Test
     void testInvalidParse() {
-        try {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.SECOND));
+
+        assertThrows(TextEntryParseException.class, ()->{
             valueSemantics.parseTextRepresentation(null, "invalid entry");
-            fail();
-        } catch (final TextEntryParseException expected) {
-        }
+        });
     }
 
     @Test
     void testRendering() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         assertEquals("Mar 13, 2013, 5:59:03 PM", valueSemantics.simpleTextPresentation(_context , date));
     }
 
-    //FIXME[ISIS-2882] support omitted parts on input
-    @Test @Disabled
+    @Test // support omitted parts on input
     void testParseNoMinutes() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17");
         assertEquals(date.getTime() - 3540_000L - 3000L, parsedDate.getTime());
     }
 
-    //FIXME[ISIS-2882] support omitted parts on input
-    @Test @Disabled
+    @Test // support omitted parts on input
     void testParseNoSeconds() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17:59");
         assertEquals(date.getTime() - 3000L, parsedDate.getTime());
@@ -92,28 +85,60 @@ extends ValueSemanticsProviderAbstractTestCase {
 
     @Test
     void testParseSeconds() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17:59:03");
         assertEquals(date.getTime(), parsedDate.getTime());
     }
 
-    //FIXME[ISIS-2882] support omitted parts on input
-    /**
-     * @see https://stackoverflow.com/questions/30103167/jsr-310-parsing-seconds-fraction-with-variable-length
-     */
-    @Test @Disabled("cannot find a format pattern that can handle both millis and nanos")
+    @Test
     void testParseMillis() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.MILLI_SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17:59:03.123");
         assertEquals(date.getTime() + 123L, parsedDate.getTime());
     }
 
-    //FIXME[ISIS-2882] support omitted parts on input
-    @Test @Disabled
+    @Test
+    void testParseMicros() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.MICRO_SECOND));
+        val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
+        val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17:59:03.123456");
+        assertEquals(date.getTime() + 123L, parsedDate.getTime());
+    }
+
+    @Test
     void testParseNanos() {
+        setSemantics(valueSemantics = createValueSemantics(TimePrecision.NANO_SECOND));
         val _context = Context.of(null, InteractionContext.builder().locale(UserLocale.valueOf(Locale.ENGLISH)).build());
         val parsedDate = valueSemantics.parseTextRepresentation(_context, "2013-03-13 17:59:03.123456789");
         assertEquals(date.getTime() + 123L, parsedDate.getTime());
     }
 
+    // -- HELPER
+
+    /**
+     * Overrides the delegate LocalDateTimeValueSemantics,
+     * such that we can inject a custom TimePrecision for testing.
+     */
+    private JavaUtilDateValueSemantics createValueSemantics(final TimePrecision timePrecision) {
+
+        final ValueSemanticsAbstract<LocalDateTime> delegate =
+                new LocalDateTimeValueSemantics() {
+            @Override protected DateTimeFormatter getTemporalEditingFormat(final Context context,
+                    @NonNull final TemporalValueSemantics.TemporalCharacteristic temporalCharacteristic,
+                    @NonNull final TemporalValueSemantics.OffsetCharacteristic offsetCharacteristic,
+                    @NonNull final TimePrecision _timePrecision,
+                    @NonNull final EditingFormatDirection direction,
+                    @NonNull final TemporalEditingPattern editingPattern) {
+                return super.getTemporalEditingFormat(context,
+                        temporalCharacteristic, offsetCharacteristic, timePrecision, direction, editingPattern);}
+        };
+
+        return new JavaUtilDateValueSemantics() {
+            @Override public ValueSemanticsAbstract<LocalDateTime> getDelegate() {
+                return delegate; }
+        };
+    }
+
 }