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 b2fb7b1  ISIS-2877: adds composite value marshalling tests
b2fb7b1 is described below

commit b2fb7b14672a2dcdf6228a2f659ca17b2ca1a975
Author: Andi Huber <[email protected]>
AuthorDate: Tue Feb 1 13:59:11 2022 +0100

    ISIS-2877: adds composite value marshalling tests
---
 .../metamodel/facets/object/value/ValueFacet.java  |  6 ++
 .../facets/object/value/ValueFacetAbstract.java    | 13 ++++
 .../applib/value/CalendarEventSemantics.java       | 20 ------
 .../isis/testdomain/value/ValueSemanticsTest.java  | 76 +++++++++++++---------
 .../testdomain/value/ValueSemanticsTester.java     | 32 +++++++--
 5 files changed, 91 insertions(+), 56 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index 9f2974d..6e26c1c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.OrderRelation;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider.Context;
 import org.apache.isis.commons.collections.Can;
@@ -78,6 +79,11 @@ public interface ValueFacet<T> extends Facet {
     /** no qualifiers allowed on the default semantics provider*/
     Optional<EncoderDecoder<T>> selectDefaultEncoderDecoder();
 
+    // -- ENCODER DECODER
+
+    /** no qualifiers allowed on the default semantics provider*/
+    Optional<ValueComposer<T>> selectDefaultComposer();
+
     // -- PARSER
 
     /** no qualifiers allowed on the default semantics provider*/
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index 6a1abb8..6a9f1b7 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.OrderRelation;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider.Context;
 import org.apache.isis.commons.collections.Can;
@@ -145,6 +146,18 @@ implements ValueFacet<T> {
                 .findFirst();
     }
 
+    // -- COMPOSER
+
+    @Override
+    public Optional<ValueComposer<T>> selectDefaultComposer() {
+        return getValueSemantics()
+                .stream()
+                .filter(isMatchingAnyOf(Can.empty()))
+                .map(ValueSemanticsProvider::getComposer)
+                .filter(_NullSafe::isPresent)
+                .findFirst();
+    }
+
     // -- PARSER
 
     @Override
diff --git 
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
 
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
index e5b5310..3ba7f0c 100644
--- 
a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
+++ 
b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemantics.java
@@ -35,12 +35,10 @@ import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
 import org.apache.isis.applib.value.semantics.DefaultsProvider;
-import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueComposer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.TypedTupleDto;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -57,7 +55,6 @@ public class CalendarEventSemantics
 extends ValueSemanticsAbstract<CalendarEvent>
 implements
     DefaultsProvider<CalendarEvent>,
-    EncoderDecoder<CalendarEvent>,
     Renderer<CalendarEvent>,
     ValueComposer<CalendarEvent> {
 
@@ -79,23 +76,6 @@ implements
                 Instant.now().toEpochMilli(), "Default Calendar", "New Event", 
"empty");
     }
 
-    // -- ENCODER/DECODER
-
-    @Override
-    public String toEncodedString(final CalendarEvent value) {
-        return value!=null
-                ? new CalendarEvent.JaxbAdapter().marshal(value)
-                : null;
-    }
-
-    @Override
-    public CalendarEvent fromEncodedString(final String encodedString) {
-        val text = _Strings.blankToNullOrTrim(encodedString);
-        return text!=null
-                ? new CalendarEvent.JaxbAdapter().unmarshal(text)
-                : null;
-    }
-
     // -- COMPOSER
 
     @Override
diff --git 
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
 
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
index 4ea0fdb..2f6e05d 100644
--- 
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
+++ 
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
@@ -38,6 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.locale.UserLocale;
 import org.apache.isis.applib.services.command.Command;
@@ -48,11 +49,15 @@ import org.apache.isis.applib.value.Password;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.presets.IsisPresets;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.isis.core.metamodel.services.schema.SchemaValueMarshaller;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.schema.cmd.v2.PropertyDto;
 import org.apache.isis.testdomain.conf.Configuration_headless;
@@ -125,37 +130,51 @@ class ValueSemanticsTest {
                 new PropertyInteractionProbe<T>() {
 
                     @Override
+                    public void testComposer(
+                            final ValueSemanticsProvider.Context context,
+                            final ValueComposer<T> composer) {
+
+                        // composer round-trip test
+                        val dto = composer.decompose(example.getValue());
+
+                        tester.assertValueEquals(
+                                example.getValue(),
+                                composer.compose(dto),
+                                "decompose/compose roundtrip failed");
+
+
+                      val valueMixin = 
composer.getValueMixin(example.getValue());
+                      if(valueMixin!=null) {
+
+                          val spec = 
specLoader.specForTypeElseFail(valueMixin.getClass());
+                          val interaction = ActionInteraction
+                                  .start(ManagedObject.of(spec,  valueMixin), 
"act", Where.ANYWHERE);
+
+                          val pendingParams = interaction
+                                  .startParameterNegotiation()
+                                  .get();
+
+                          val managedAction = 
interaction.getManagedActionElseFail();
+                          val typedTuple = pendingParams.getParamValues();
+
+                          val recoveredValue = managedAction
+                                  .invoke(typedTuple, 
InteractionInitiatedBy.PASS_THROUGH)
+                                  .leftIfAny()
+                                  .getPojo();
+
+                          tester.assertValueEquals(
+                                  example.getValue(),
+                                  recoveredValue,
+                                  "serialization roundtrip failed");
+                      }
+
+                    }
+
+                    @Override
                     public void testEncoderDecoder(
                             final ValueSemanticsProvider.Context context,
                             final EncoderDecoder<T> codec) {
 
-//                        val valueMixin = 
composer.getValueMixin(example.getValue());
-//                        if(valueMixin!=null) {
-//
-//                            val spec = 
specLoader.specForTypeElseFail(valueMixin.getClass());
-//                            val interaction = ActionInteraction
-//                                    .start(ManagedObject.of(spec,  
valueMixin), "act", Where.ANYWHERE);
-//
-//                            val pendingParams = interaction
-//                                    .startParameterNegotiation()
-//                                    .get();
-//
-//                            val managedAction = 
interaction.getManagedActionElseFail();
-//                            val typedTuple = pendingParams.getParamValues();
-//
-//                            val recoveredValue = managedAction
-//                                    .invoke(typedTuple, 
InteractionInitiatedBy.PASS_THROUGH)
-//                                    .leftIfAny()
-//                                    .getPojo();
-//
-//                            tester.assertValueEquals(
-//                                    example.getValue(),
-//                                    recoveredValue,
-//                                    "serialization roundtrip failed");
-//
-//                            return;
-//                        }
-
                         // CoderDecoder round-trip test
                         val serialized = 
codec.toEncodedString(example.getValue());
 
@@ -195,8 +214,7 @@ class ValueSemanticsTest {
                     @Override
                     public void testCommand(
                             final ValueSemanticsProvider.Context context,
-                            final Command command,
-                            final EncoderDecoder<T> codec) {
+                            final Command command) {
 
                         val propertyDto = 
(PropertyDto)command.getCommandDto().getMember();
                         val newValueRecordedDto = propertyDto.getNewValue();
diff --git 
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
 
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
index a497efc..2ce3797 100644
--- 
a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
+++ 
b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTester.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.OrderRelation;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
+import org.apache.isis.applib.value.semantics.ValueComposer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Refs;
@@ -73,10 +74,11 @@ public class ValueSemanticsTester<T> {
     }
 
     public static interface PropertyInteractionProbe<T> {
+        void testComposer(ValueSemanticsProvider.Context context, 
ValueComposer<T> composer);
         void testEncoderDecoder(ValueSemanticsProvider.Context context, 
EncoderDecoder<T> codec);
         void testParser(ValueSemanticsProvider.Context context, Parser<T> 
parser);
         void testRenderer(ValueSemanticsProvider.Context context, Renderer<T> 
renderer);
-        void testCommand(ValueSemanticsProvider.Context context, Command 
command, EncoderDecoder<T> codec);
+        void testCommand(ValueSemanticsProvider.Context context, Command 
command);
     }
 
     @SneakyThrows
@@ -92,9 +94,20 @@ public class ValueSemanticsTester<T> {
         val context = valueFacet(prop)
                 .createValueSemanticsContext(prop);
 
-        val codec = codec(prop);
+        val composerIfAny = composer(prop);
+        if(composerIfAny.isPresent()) {
+            probe.testComposer(context, composerIfAny.get());
+        }
+
+        val codecIfAny = codec(prop);
+        if(codecIfAny.isPresent()) {
+            probe.testEncoderDecoder(context, codecIfAny.get());
+        }
 
-        probe.testEncoderDecoder(context, codec);
+        assertTrue(composerIfAny.isPresent()
+                || codecIfAny.isPresent(), ()->
+                        "either codec or composer must be available for "
+                            + context.getFeatureIdentifier());
 
         val parserIfAny = parser(prop);
         if(parserIfAny.isPresent()) {
@@ -116,7 +129,7 @@ public class ValueSemanticsTester<T> {
             propInteraction.modifyProperty(managedProp->
                 ManagedObject.of(managedProp.getElementType(), 
newProperyValueProvider.apply(managedProp)));
 
-            probe.testCommand(context, command, codec);
+            probe.testCommand(context, command);
         });
     }
 
@@ -171,11 +184,16 @@ public class ValueSemanticsTester<T> {
         return _Casts.uncheckedCast(valueFacet);
     }
 
-    private EncoderDecoder<T> codec(
+    private Optional<ValueComposer<T>> composer(
+            final ObjectFeature feature) {
+        val valueFacet = valueFacet(feature);
+        return valueFacet.selectDefaultComposer();
+    }
+
+    private Optional<EncoderDecoder<T>> codec(
             final ObjectFeature feature) {
         val valueFacet = valueFacet(feature);
-        return valueFacet.selectDefaultEncoderDecoder()
-                .orElseThrow(()->_Exceptions.noSuchElement());
+        return valueFacet.selectDefaultEncoderDecoder();
     }
 
     private Optional<Parser<T>> parser(

Reply via email to