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 2020/07/17 11:07:37 UTC

[isis] branch master updated: ISIS-2362: fixing NewParameterModelTest (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 5c52238  ISIS-2362: fixing NewParameterModelTest (Tests)
5c52238 is described below

commit 5c52238d5171aa4d9e7a2bc646be5169578a6a40
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jul 17 13:07:18 2020 +0200

    ISIS-2362: fixing NewParameterModelTest (Tests)
---
 .../core/commons/internal/reflection/_Reflect.java | 17 +++++
 .../interactions/managed/ActionInteraction.java    |  5 +-
 .../model/interaction/InteractionNpmDemo.java      |  2 +-
 .../InteractionNpmDemo_biArgDisabled.java          |  9 +--
 .../InteractionNpmDemo_biArgEnabled.java           | 25 +++++---
 .../testdomain/interact/NewParameterModelTest.java | 73 +++++++++++-----------
 .../modelannotation/applib/annotation/Model.java   |  2 +-
 7 files changed, 79 insertions(+), 54 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/reflection/_Reflect.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/reflection/_Reflect.java
index 581e50f..85111f3 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/reflection/_Reflect.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/reflection/_Reflect.java
@@ -33,10 +33,12 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Map;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
@@ -52,6 +54,7 @@ import org.apache.isis.core.commons.internal.collections._Arrays;
 import org.apache.isis.core.commons.internal.functions._Predicates;
 
 import lombok.NonNull;
+import lombok.SneakyThrows;
 import lombok.val;
 import lombok.experimental.UtilityClass;
 
@@ -403,6 +406,20 @@ public final class _Reflect {
     }
 
     // -- FIND GETTER
+    
+    @SneakyThrows
+    public static Stream<PropertyDescriptor> streamGetters(@NonNull Class<?> cls) {
+        return Stream.of(
+                Introspector.getBeanInfo(cls, Object.class)
+                    .getPropertyDescriptors())
+                .filter(pd->pd.getReadMethod()!=null);
+    }
+    
+    public static Map<String, Method> getGettersByName(@NonNull Class<?> cls) {
+        return streamGetters(cls)
+                .collect(Collectors.toMap(PropertyDescriptor::getName, PropertyDescriptor::getReadMethod));
+    }
+
 
     public static Method getGetter(Class<?> cls, String propertyName) throws IntrospectionException {
         final BeanInfo beanInfo = Introspector.getBeanInfo(cls);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
index 71f8fb2..5a2c1c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ActionInteraction.java
@@ -109,7 +109,10 @@ public final class ActionInteraction extends MemberInteraction<ManagedAction, Ac
         void onParameterInvalid(ManagedParameter managedParameter, InteractionVeto veto);
     }
     
-    
+    /**
+     * @deprecated TODO we might rather make validation the responsibility of the {@link ParameterNegotiationModel}
+     * and then maybe provide something like {@code invokeWith(ParameterNegotiationModel model, ... callback)} here
+     */
     public ActionInteraction useParameters(
             @NonNull final Function<ManagedAction, Can<ManagedObject>> actionParameterProvider, 
             final ParameterInvalidCallback parameterInvalidCallback) {
diff --git a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java
index d077a42..569fe2b 100644
--- a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java
+++ b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java
@@ -45,6 +45,6 @@ public class InteractionNpmDemo {
 
     @Property
     @PropertyLayout(multiLine=3)
-    @XmlElement @Getter @Setter private String stringMultiline;
+    @XmlElement @Getter @Setter private String stringMultiline; // not used yet for any tests
     
 }
diff --git a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
index 400de2c..557193c 100644
--- a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
+++ b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgDisabled.java
@@ -33,17 +33,14 @@ public class InteractionNpmDemo_biArgDisabled {
     private final InteractionNpmDemo holder;
     
     @Value @Accessors(fluent = true)            
-    public static class Parameters {                                   
- 
-        //@Parameter @ParameterLayout //TODO[ISIS-2362] support these here
+    public static class Parameters {      
         int a;
-        //@Parameter @ParameterLayout //TODO[ISIS-2362] support these here
         int b;
     }
     
     @Model
-    public int act(Parameters params) {
-        return params.a() + params.b();
+    public int act(int a, int b) {
+        return a + b;
     }
     
     //TODO[ISIS-2362] supporting methods (no arg): rename -> disable()
diff --git a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
index a36e3d8..8624a2c 100644
--- a/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
+++ b/examples/smoketests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo_biArgEnabled.java
@@ -19,6 +19,8 @@
 package org.apache.isis.testdomain.model.interaction;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Parameter;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.extensions.modelannotation.applib.annotation.Model;
 
 import lombok.RequiredArgsConstructor;
@@ -33,29 +35,32 @@ public class InteractionNpmDemo_biArgEnabled {
     private final InteractionNpmDemo holder;
     
     @Value @Accessors(fluent = true)            
-    public static class Parameters {                                   
- 
-        //@Parameter @ParameterLayout //TODO[ISIS-2362] support these here
+    public static class Parameters {      
         int a;
-        //@Parameter @ParameterLayout //TODO[ISIS-2362] support these here
         int b;
     }
     
-    
     @Model
-    public int act(Parameters params) {
-        return params.a() + params.b();
+    public int act(
+            
+            @Parameter(maxLength = 2) // setup so we can test for this facet 
+            @ParameterLayout(describedAs = "first") // setup so we can test for this facet
+            int a,
+            
+            int b) {
+        
+        return a + b;
     }
     
-    // parameter supporting methods, to be referenced by param name ...
+    //TODO[ISIS-2362] parameter supporting methods, to be referenced by param name defaultA(...), choicesB(...) ...
     
     @Model 
-    public int defaultA(Parameters params) {
+    public int default0Act(Parameters params) {
         return 5;
     }
     
     @Model
-    public int[] choicesB(Parameters params) {
+    public int[] choices1Act(Parameters params) {
         return new int[] {1, 2, 3, 4};
     }
 }
diff --git a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
index 1dbb06b..e29c945 100644
--- a/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
+++ b/examples/smoketests/stable/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
@@ -21,12 +21,12 @@ package org.apache.isis.testdomain.interact;
 import java.util.NoSuchElementException;
 import java.util.stream.Collectors;
 
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -34,7 +34,8 @@ import static org.junit.jupiter.api.Assertions.fail;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.testdomain.Smoketest;
 import org.apache.isis.testdomain.conf.Configuration_headless;
@@ -65,6 +66,24 @@ import lombok.val;
 })
 class NewParameterModelTest extends InteractionTestAbstract {
 
+    @Test
+    void paramAnnotations_whenNpm_shouldBeRecognized() {
+
+        val param0Metamodel = startActionInteractionOn(InteractionNpmDemo.class, "biArgEnabled")
+                .getMetamodel().get().getParameters().getElseFail(0);
+        
+        // as with first param's @Parameter(maxLength = 2)
+        val maxLengthFacet = param0Metamodel.getFacet(MaxLengthFacet.class);
+        
+        // as with first param's @ParameterLayout(describedAs = "first")
+        val describedAsFacet = param0Metamodel.getFacet(DescribedAsFacet.class);
+        
+        assertNotNull(maxLengthFacet);
+        assertNotNull(describedAsFacet);
+
+        assertEquals(2, maxLengthFacet.value());
+        assertEquals("first", describedAsFacet.value());
+    }
     
     @Test
     void actionInteraction_withParams_shouldProduceCorrectResult() throws Throwable {
@@ -73,9 +92,7 @@ class NewParameterModelTest extends InteractionTestAbstract {
         .checkVisibility(Where.OBJECT_FORMS)
         .checkUsability(Where.OBJECT_FORMS);
         
-        val params = 
-                //FIXME must instead support Can.of(objectManager.adapt(12), objectManager.adapt(34));
-                Can.of(objectManager.adapt(new InteractionNpmDemo_biArgEnabled.Parameters(12, 34)));
+        val params = Can.of(objectManager.adapt(12), objectManager.adapt(34));
         
         actionInteraction.useParameters(__->params, 
                 (managedParameter, veto)-> fail(veto.toString()));
@@ -91,9 +108,7 @@ class NewParameterModelTest extends InteractionTestAbstract {
         .checkVisibility(Where.OBJECT_FORMS)
         .checkUsability(Where.OBJECT_FORMS);
         
-        val params = 
-                //FIXME[ISIS-2362] must instead support Can.of(objectManager.adapt(12), objectManager.adapt(34), objectManager.adapt(99));
-                Can.of(objectManager.adapt(new InteractionNpmDemo_biArgEnabled.Parameters(12, 34)), objectManager.adapt(99));
+        val params =  Can.of(objectManager.adapt(12), objectManager.adapt(34), objectManager.adapt(99));
         
         actionInteraction.useParameters(__->params, 
                 (managedParameter, veto)-> fail(veto.toString()));
@@ -103,7 +118,7 @@ class NewParameterModelTest extends InteractionTestAbstract {
     }
     
     @Test
-    void actionInteraction_withTooLittleParams_shouldFail() {
+    void actionInteraction_withTooLittleParams_shouldFail() throws Throwable {
 
         val actionInteraction = startActionInteractionOn(InteractionNpmDemo.class, "biArgEnabled")
         .checkVisibility(Where.OBJECT_FORMS)
@@ -119,7 +134,7 @@ class NewParameterModelTest extends InteractionTestAbstract {
 
     }
     
-    @Test @Disabled("[ISIS-2362]")
+    @Test
     void actionInteraction_shouldProvideParameterDefaults() {
 
         val actionInteraction = startActionInteractionOn(InteractionNpmDemo.class, "biArgEnabled")
@@ -139,40 +154,28 @@ class NewParameterModelTest extends InteractionTestAbstract {
         assertComponentWiseEquals(expectedDefaults, actualDefaults);
     }
     
-    @Test @Disabled("[ISIS-2362]")
+    @Test 
     void actionInteraction_shouldProvideChoices() {
 
         val actionInteraction = startActionInteractionOn(InteractionNpmDemo.class, "biArgEnabled")
                 .checkVisibility(Where.OBJECT_FORMS)
                 .checkUsability(Where.OBJECT_FORMS);
 
-        //TODO simplify the API ...
-        
-        val managedAction = actionInteraction.getManagedAction().get(); // should not throw
-        val actionMeta = managedAction.getAction();
-        
-        val pendingArgs = managedAction.getInteractionHead().defaults();
-        
-        val paramMetaList = actionMeta.getParameters();
-        
-        val param0Meta = paramMetaList.getElseFail(0);
-        val param1Meta = paramMetaList.getElseFail(1);
-        
-        //TODO we need to allow ui-component binding
-        
-        
-        
-        val choices0 = param0Meta.getChoices(pendingArgs, InteractionInitiatedBy.USER); 
-        val choices1 = param1Meta.getChoices(pendingArgs, InteractionInitiatedBy.USER);
-        
-        assertTrue(choices0.isEmpty());
+        assertTrue(actionInteraction.getManagedAction().isPresent(), "action is expected to be usable");
+
+        val managedAction = actionInteraction.getManagedAction().get(); 
+        val pendingArgs = managedAction.startParameterNegotiation();
+
+        val param0Choices = pendingArgs.getObservableParamChoices(0); // observable
+        val param1Choices = pendingArgs.getObservableParamChoices(1); // observable
         
-        val expectedChoices = new InteractionDemo_biArgEnabled(null).choices1Act();
-        val actualChoices = choices1.map(ManagedObject::getPojo);
+        assertTrue(param0Choices.getValue().isEmpty());
         
-        assertComponentWiseEquals(expectedChoices, actualChoices);
+        val expectedChoices = new InteractionNpmDemo_biArgEnabled(null).choices1Act(null);
+        val actualChoices = param1Choices.getValue();
         
+        assertComponentWiseUnwrappedEquals(expectedChoices, actualChoices);
     }
-
+    
 
 }
diff --git a/extensions/core/model-annotation/src/main/java/org/apache/isis/extensions/modelannotation/applib/annotation/Model.java b/extensions/core/model-annotation/src/main/java/org/apache/isis/extensions/modelannotation/applib/annotation/Model.java
index 20dce43..36ed7b7 100644
--- a/extensions/core/model-annotation/src/main/java/org/apache/isis/extensions/modelannotation/applib/annotation/Model.java
+++ b/extensions/core/model-annotation/src/main/java/org/apache/isis/extensions/modelannotation/applib/annotation/Model.java
@@ -27,7 +27,7 @@ import java.lang.annotation.Target;
 
 /**
  * Indicates that a method is a supporting-method, one that contributes (hide, validate, ...) 
- * to an <em>Action/</em>.
+ * to an <em>Action</em>.
  * <p>
  * By placing the {@link Model} annotation on a method, a contract with the meta-model is enforced, 
  * such that this method must be recognized and cannot be ignored.