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/21 09:55:25 UTC

[isis] branch master updated: ISIS-2944: adds more member discovery tests (props and colls)

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 4e07e1b  ISIS-2944: adds more member discovery tests (props and colls)
4e07e1b is described below

commit 4e07e1ba781178e3c93215f2fb256fe514f5545f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jan 21 10:55:14 2022 +0100

    ISIS-2944: adds more member discovery tests (props and colls)
---
 .../managed/PropertyNegotiationModel.java          | 10 ++-
 .../DomainModelTest_usingGoodDomain.java           | 74 +++++++++++++++++++--
 .../model/good/ProperMemberSupportDiscovery.java   | 76 +++++++++++++++++++++-
 .../interaction/DomainObjectTesterFactory.java     | 25 ++++++-
 4 files changed, 175 insertions(+), 10 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
index 8e775f6..e42d0ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
@@ -47,7 +47,8 @@ public class PropertyNegotiationModel implements ManagedValue {
     private final @NonNull ManagedProperty managedProperty;
     private Bindable<String> proposedValueAsText;
 
-    PropertyNegotiationModel(final ManagedProperty managedProperty) {
+    PropertyNegotiationModel(
+            final ManagedProperty managedProperty) {
         this.managedProperty = managedProperty;
         val propMeta = managedProperty.getMetaModel();
 
@@ -152,6 +153,13 @@ public class PropertyNegotiationModel implements ManagedValue {
         return validationFeedbackActive.getValue();
     }
 
+    /**
+     * exposed for testing
+     */
+    public void activateValidationFeedback() {
+        validationFeedbackActive.setValue(true);
+    }
+
     public void invalidateChoicesAndValidation() {
         choices.invalidate();
         validation.invalidate();
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 135f8a0..430d7e6 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -27,6 +27,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -458,8 +459,6 @@ class DomainModelTest_usingGoodDomain {
 
     }
 
-
-
     @Test
     void viewmodelWithEncapsulatedMembers() {
 
@@ -564,11 +563,21 @@ class DomainModelTest_usingGoodDomain {
     }
 
     @SuppressWarnings("unchecked")
-    @Test
-    void properMemberSupportDiscovery() {
+    @ParameterizedTest
+    @ValueSource(classes = {
+            //FIXME ProperMemberSupportDiscovery.WhenEncapsulationEnabled.class,
+            ProperMemberSupportDiscovery.WhenAnnotationRequired.class,
+            //FIXME ProperMemberSupportDiscovery.WhenAnnotationOptional.class
+            })
+    void properMemberSupportDiscovery(final Class<?> classUnderTest) {
 
         val act = testerFactory
-                .actionTester(ProperMemberSupportDiscovery.WhenAnnotationRequired.class, "placeOrder");
+                .actionTester(classUnderTest, "placeOrder");
+        val prop = testerFactory
+                .propertyTester(classUnderTest, "email");
+        val coll = testerFactory
+                .collectionTester(classUnderTest, "orders");
+
         act.assertExists(true);
 
         // namedPlaceOrder(): String = "my name"
@@ -665,6 +674,61 @@ class DomainModelTest_usingGoodDomain {
                             "my validation");
                 });
 
+        // namedEmail(): String = "my email"
+        prop.assertFriendlyName("my email");
+
+        // describedEmail: String = "my email described"
+        prop.assertDescription("my email described");
+
+        // hideEmail(): boolean = true
+        prop.assertVisibilityIsVetoed();
+
+        // disableEmail(): String = "my email disable"
+        prop.assertUsabilityIsVetoedWith("my email disable");
+
+        // defaultEmail(): String = "my default email"
+        prop.assertValueNegotiation(
+                propNeg->{
+                    assertEquals(
+                            "my default email",
+                            propNeg.getValue().getValue().getPojo());
+                },
+                propNegPostCommit->{});
+
+
+        // choicesEmail(): Collection<String> = List.of("my email choice")
+        prop.assertValueNegotiation(
+                propNeg->{
+                    assertEquals(
+                            Can.of("my email choice"),
+                            propNeg.getChoices().getValue().map(ManagedObject::getPojo));
+                },
+                propNegPostCommit->{});
+
+
+        // validateEmail(final String email): String = "my email validate"
+        prop.assertValueNegotiation(
+                propNeg->{},
+                propNegPostCommit->{
+                    assertEquals(
+                            "my email validate",
+                            propNegPostCommit.getValidationMessage().getValue());
+                });
+
+        // -- COLLECTION
+
+        // namedOrders(): String = "my orders"
+        coll.assertFriendlyName("my orders");
+
+        // describedOrders: String = "my orders described"
+        coll.assertDescription("my orders described");
+
+        // hideOrders(): boolean = true
+        coll.assertVisibilityIsVetoed();
+
+        // disableOrders(): String = "my orders disabled"
+        coll.assertUsabilityIsVetoedWith("my orders disabled");
+
     }
 
 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java
index fadd0d5..0bc149f 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java
@@ -21,16 +21,24 @@ package org.apache.isis.testdomain.model.good;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Introspection;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.MinLength;
 import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
 
 public class ProperMemberSupportDiscovery {
 
     public static abstract class PublicBase {
 
+        // -- ACTION
+
         public String namedPlaceOrder() { return "my name"; }
         public String describedPlaceOrder() { return "my description"; }
         public boolean hidePlaceOrder() { return false; }
@@ -55,13 +63,35 @@ public class ProperMemberSupportDiscovery {
         public String validate1PlaceOrder(final String y) { return "my validation-1";}
         public String validatePlaceOrder(final String x, final String y) { return "my validation";}
 
+        // -- PROPERTY
+
+        public String namedEmail() { return "my email";}
+        public String describedEmail() { return "my email described";}
+        public boolean hideEmail() { return true;}
+        public String disableEmail() { return "my email disable";}
+        public String defaultEmail() { return "my default email";}
+        public java.util.Collection<String> choicesEmail() {
+            return List.of("my email choice");
+        }
+        public String validateEmail(final String email) { return "my email validate";}
+
+        // -- COLLECTION
+
+        public String namedOrders() { return "my orders"; }
+        public String describedOrders() { return "my orders described"; }
+        public boolean hideOrders() { return true;}
+        public String disableOrders() { return "my orders disabled"; }
+
     }
 
+    /**
+     * annotations required, otherwise not picked up
+     */
     static abstract class ProtectedBase {
 
-        protected abstract void placeOrder(String x, String y);
+        // -- ACTION
 
-        // annotations required, otherwise not picked up as action
+        protected abstract void placeOrder(String x, String y);
 
         @MemberSupport protected String namedPlaceOrder() { return "my name"; }
         @MemberSupport protected String describedPlaceOrder() { return "my description"; }
@@ -83,6 +113,24 @@ public class ProperMemberSupportDiscovery {
             return List.of("my search");
         }
 
+        // -- PROPERTY
+
+        @MemberSupport protected String namedEmail() { return "my email";}
+        @MemberSupport protected String describedEmail() { return "my email described";}
+        @MemberSupport protected boolean hideEmail() { return true;}
+        @MemberSupport protected String disableEmail() { return "my email disable";}
+        @MemberSupport protected String defaultEmail() { return "my default email";}
+        @MemberSupport protected java.util.Collection<String> choicesEmail() {
+            return List.of("my email choice");
+        }
+        @MemberSupport protected String validateEmail(final String email) { return "my email validate";}
+
+        // -- COLLECTION
+
+        @MemberSupport protected String namedOrders() { return "my oders"; }
+        @MemberSupport protected String describedOrders() { return "my orders described"; }
+        @MemberSupport protected boolean hideOrders() { return true;}
+        @MemberSupport protected String disableOrders() { return "my orders disabled"; }
     }
 
     @DomainObject(
@@ -94,6 +142,12 @@ public class ProperMemberSupportDiscovery {
         public void placeOrder(final String x, final String y) {
         }
 
+        @Getter @Setter
+        private String email;
+
+        @Getter @Setter
+        private java.util.Collection<String> orders;
+
     }
 
     @DomainObject(
@@ -107,6 +161,14 @@ public class ProperMemberSupportDiscovery {
         public void placeOrder(final String x, final String y) {
         }
 
+        @Property
+        @Getter @Setter
+        private String email;
+
+        @Collection
+        @Getter @Setter
+        private java.util.Collection<String> orders;
+
     }
 
     @DomainObject(
@@ -118,9 +180,17 @@ public class ProperMemberSupportDiscovery {
         // annotation required, otherwise not picked up as action
         @Action
         @Override
-        public void placeOrder(final String x, final String y) {
+        protected void placeOrder(final String x, final String y) {
         }
 
+        @Property
+        @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
+        private String email;
+
+        @Collection
+        @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED)
+        private java.util.Collection<String> orders;
+
     }
 
 
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
index d1ec9ce..4d0e82a 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/interaction/DomainObjectTesterFactory.java
@@ -66,6 +66,7 @@ import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedValue;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction;
+import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationModel;
 import org.apache.isis.core.metamodel.interactions.managed.nonscalar.DataTableModel;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
@@ -722,6 +723,24 @@ public class DomainObjectTesterFactory {
 
         }
 
+        public void assertValueNegotiation(
+                final Consumer<PropertyNegotiationModel> when,
+                final Consumer<PropertyNegotiationModel> then) {
+
+            assertExists(true);
+
+            managedPropertyIfAny
+            .ifPresent(managedProperty->{
+                interactionService.runAnonymous(()->{
+                    val propNeg = managedProperty.startNegotiation();
+                    when.accept(propNeg);
+                    propNeg.activateValidationFeedback();
+                    propNeg.submit();
+                    then.accept(propNeg);
+                });
+            });
+        }
+
         /**
          * Supported by all properties that reflect a value type.
          * Uses value-semantics under the hood to do the conversion.
@@ -941,10 +960,14 @@ public class DomainObjectTesterFactory {
                     .getDescription().orElse(""));
         }
 
-        public final void assertVisibility(final boolean isExpectedVisible) {
+        private final void assertVisibility(final boolean isExpectedVisible) {
             assertVisibilityIsVetoedWith(isExpectedVisible ? null : "Hidden");
         }
 
+        public final void assertVisibilityIsVetoed() {
+            assertVisibility(false);
+        }
+
         public final void assertVisibilityIsNotVetoed() {
             assertVisibility(true);
         }