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 2021/06/29 07:56:36 UTC

[isis] branch master updated: ISIS-1720: adding member 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 2ae73fc  ISIS-1720: adding member tests
2ae73fc is described below

commit 2ae73fcc74e5829e57e40a60e5ed24569f46061d
Author: andi-huber <ah...@apache.org>
AuthorDate: Tue Jun 29 09:56:25 2021 +0200

    ISIS-1720: adding member tests
    
    also fixes 'named' and 'described' handling for mixins
---
 .../services/wrapper/events/ObjectTitleEvent.java  |  3 +-
 .../core/metamodel/spec/ObjectSpecification.java   |  8 ++++
 .../specloader/specimpl/ObjectActionDefault.java   |  4 --
 .../specimpl/ObjectAssociationAbstract.java        |  5 --
 .../specloader/specimpl/ObjectMemberAbstract.java  |  8 +++-
 .../specimpl/OneToOneAssociationDefault.java       |  2 +-
 .../DomainModelTest_usingGoodDomain.java           | 36 ++++++++++++--
 .../testdomain/model/good/ProperMemberSupport.java | 13 +++--
 .../model/good/ProperMemberSupport_action5.java    | 40 +++++++++-------
 .../good/ProperMemberSupport_collection3.java      | 55 ++++++++++++++++++++++
 .../model/good/ProperMemberSupport_property3.java  | 42 ++++++++++-------
 11 files changed, 155 insertions(+), 61 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
index 6658e3e..9125652 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
@@ -22,7 +22,8 @@ package org.apache.isis.applib.services.wrapper.events;
 import org.apache.isis.applib.Identifier;
 
 /**
- * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of an object's title.
+ * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i>
+ * represents an access (reading) of an object's title.
  *
  * <p>
  * The {@link #getReason()} will always be <tt>null</tt>; access is always
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 564962b..dbc6421 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -116,6 +116,14 @@ extends
      */
     Optional<? extends ObjectMember> getMember(String memberId);
 
+    default ObjectMember getMemberElseFail(final String memberId) {
+        return getMember(memberId).orElseThrow(()->{
+            val msg = "Member '" + memberId + "' does not correspond "
+                    + "to any of the object's fields or actions.";
+            return new UnsupportedOperationException(msg);
+        });
+    }
+
     /**
      * @param method
      * @return optionally the ObjectMember associated with given {@code method},
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 8f5e5cd..6477603 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -230,10 +230,6 @@ implements ObjectAction {
         return parameters.getElseFail(position);
     }
 
-    protected InteractionHead headFor(final ManagedObject target) {
-        return InteractionHead.regular(target);
-    }
-
     // -- visable, usable
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
index 59a92c1..ab942b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
@@ -27,7 +27,6 @@ import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -51,10 +50,6 @@ implements ObjectAssociation {
         this.specification = specification;
     }
 
-    protected InteractionHead headFor(final ManagedObject ownerAdapter) {
-        return InteractionHead.regular(ownerAdapter);
-    }
-
     @Override
     public FacetHolder getFacetHolder() {
         return getFacetedMethod();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 659989e..b4cc669 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -74,6 +74,10 @@ implements
                 : null;
     }
 
+    protected InteractionHead headFor(final ManagedObject ownerAdapter) {
+        return InteractionHead.regular(ownerAdapter);
+    }
+
     // -- fields
 
     private final Identifier featureIdentifier;
@@ -133,7 +137,7 @@ implements
         return namedFacet
             .getSpecialization()
             .fold(  textFacet->textFacet.translated(),
-                    textFacet->textFacet.textElseNull(domainObjectProvider.get()));
+                    textFacet->textFacet.textElseNull(headFor(domainObjectProvider.get()).getTarget()));
     }
 
     @Override
@@ -154,7 +158,7 @@ implements
         .map(MemberDescribedFacet::getSpecialization)
         .map(specialization->specialization
                 .fold(textFacet->textFacet.translated(),
-                      textFacet->textFacet.textElseNull(domainObjectProvider.get())))
+                      textFacet->textFacet.textElseNull(headFor(domainObjectProvider.get()).getTarget())))
         .orElse(null);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 501493a..0c133a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -94,7 +94,7 @@ implements OneToOneAssociation {
     public String getColumnDescription() {
         return lookupFacet(ColumnDescribedFacet.class)
         .map(ColumnDescribedFacet::translated)
-        .orElseGet(() -> null);
+        .orElse(null);
     }
 
     // -- VISIBLE, USABLE
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 9061d6a..85de79e 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
@@ -29,11 +29,6 @@ import org.junit.jupiter.params.provider.MethodSource;
 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.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.metamodel.Config;
@@ -49,6 +44,7 @@ import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoice
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
 import org.apache.isis.core.metamodel.postprocessors.collparam.ActionParameterChoicesFacetFromParentedCollection;
 import org.apache.isis.core.metamodel.postprocessors.collparam.ActionParameterDefaultsFacetFromAssociatedCollection;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -67,6 +63,11 @@ import org.apache.isis.testdomain.model.good.ProperMemberInheritance_usingInterf
 import org.apache.isis.testdomain.model.good.ProperMemberSupport;
 import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValidator;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 import lombok.val;
 
 @SpringBootTest(
@@ -384,6 +385,18 @@ class DomainModelTest_usingGoodDomain {
 
     }
 
+    @ParameterizedTest
+    @MethodSource("provideImperativelyNamed")
+    void imperativelyNamedMembers(final String memberId, final String named, final String described) {
+
+        val objectSpec = specificationLoader.specForTypeElseFail(ProperMemberSupport.class);
+        val member = objectSpec.getMemberElseFail(memberId);
+        val sampleObject = ManagedObject.of(objectSpec, new ProperMemberSupport());
+
+        assertEquals(named, member.getFriendlyName(()->sampleObject));
+        assertEquals(described, member.getDescription(()->sampleObject));
+    }
+
     // -- HELPER
 
     private void assertHasProperty(final ObjectSpecification spec, final String propertyId) {
@@ -407,5 +420,18 @@ class DomainModelTest_usingGoodDomain {
         );
     }
 
+    static Stream<Arguments> provideImperativelyNamed() {
+        return Stream.of(
+                // regular on type
+                Arguments.of("myAction", "named-imperative[MyAction]", "described-imperative[MyAction]"),
+                Arguments.of("myProp", "named-imperative[MyProp]", "described-imperative[MyProp]"),
+                Arguments.of("myColl", "named-imperative[MyColl]", "described-imperative[MyColl]"),
+                // contributed by mixin(s)
+                Arguments.of("action5", "named-imperative[action5]", "described-imperative[action5]"),
+                Arguments.of("property3", "named-imperative[property3]", "described-imperative[property3]"),
+                Arguments.of("collection3", "named-imperative[collection3]", "described-imperative[collection3]")
+        );
+    }
+
 
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
index 6d97986..9c3729d 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
@@ -63,12 +63,12 @@ public class ProperMemberSupport {
 
     @MemberSupport
     public String namedMyAction() {
-        return null;
+        return "named-imperative[MyAction]";
     }
 
     @MemberSupport
     public String describedMyAction() {
-        return null;
+        return "described-imperative[MyAction]";
     }
 
     @MemberSupport
@@ -156,12 +156,12 @@ public class ProperMemberSupport {
 
     @MemberSupport
     public String namedMyProp() {
-        return null;
+        return "named-imperative[MyProp]";
     }
 
     @MemberSupport
     public String describedMyProp() {
-        return null;
+        return "described-imperative[MyProp]";
     }
 
     @MemberSupport
@@ -202,15 +202,14 @@ public class ProperMemberSupport {
 
     @MemberSupport
     public String namedMyColl() {
-        return null;
+        return "named-imperative[MyColl]";
     }
 
     @MemberSupport
     public String describedMyColl() {
-        return null;
+        return "described-imperative[MyColl]";
     }
 
-
     @MemberSupport
     public String disableMyColl() {
         return null;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action5.java
similarity index 54%
copy from api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
copy to regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action5.java
index 6658e3e..8385400 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action5.java
@@ -16,31 +16,35 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.testdomain.model.good;
 
-package org.apache.isis.applib.services.wrapper.events;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.applib.annotation.Publishing;
 
-import org.apache.isis.applib.Identifier;
+import lombok.RequiredArgsConstructor;
 
-/**
- * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of an object's title.
- *
- * <p>
- * The {@link #getReason()} will always be <tt>null</tt>; access is always
- * allowed.
- *
- * @since 1.x {@index}
- */
-public class ObjectTitleEvent extends AccessEvent {
+@Action(executionPublishing = Publishing.ENABLED)
+@RequiredArgsConstructor
+public class ProperMemberSupport_action5 {
 
-    private final String title;
+    private final ProperMemberSupport mixee;
 
-    public ObjectTitleEvent(final Object source, final Identifier classIdentifier, final String title) {
-        super(source, classIdentifier);
-        this.title = title;
+    public ProperMemberSupport act() {
+        return mixee;
     }
 
-    public String getTitle() {
-        return title;
+    // -- IMPERATIVE NAMING AND DESCRIBING
+
+    @MemberSupport
+    public String namedAct() {
+        return "named-imperative[action5]";
     }
 
+    @MemberSupport
+    public String describedAct() {
+        return "described-imperative[action5]";
+    }
+
+
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_collection3.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_collection3.java
new file mode 100644
index 0000000..8ca643f
--- /dev/null
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_collection3.java
@@ -0,0 +1,55 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testdomain.model.good;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.MemberSupport;
+
+import lombok.RequiredArgsConstructor;
+
+@Collection
+@CollectionLayout(named = "foo", describedAs = "bar") // <-- overruled by imperative naming
+@RequiredArgsConstructor
+public class ProperMemberSupport_collection3 {
+
+    private final ProperMemberSupport holder;
+
+    @MemberSupport
+    public List<String> coll() {
+        return Collections.singletonList(holder.toString());
+    }
+
+    // -- IMPERATIVE NAMING AND DESCRIBING
+
+    @MemberSupport
+    public String namedColl() {
+        return "named-imperative[collection3]";
+    }
+
+    @MemberSupport
+    public String describedColl() {
+        return "described-imperative[collection3]";
+    }
+
+
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_property3.java
similarity index 50%
copy from api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
copy to regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_property3.java
index 6658e3e..85070e3 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/events/ObjectTitleEvent.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_property3.java
@@ -16,31 +16,37 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.testdomain.model.good;
 
-package org.apache.isis.applib.services.wrapper.events;
+import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
 
-import org.apache.isis.applib.Identifier;
+import lombok.RequiredArgsConstructor;
 
-/**
- * <i>Supported only by {@link org.apache.isis.applib.services.wrapper.WrapperFactory} service, </i> represents an access (reading) of an object's title.
- *
- * <p>
- * The {@link #getReason()} will always be <tt>null</tt>; access is always
- * allowed.
- *
- * @since 1.x {@index}
- */
-public class ObjectTitleEvent extends AccessEvent {
+@Property
+@PropertyLayout(named= "foo", describedAs = "bar") // <-- overruled by imperative naming, but used for column naming and describing
+@RequiredArgsConstructor
+public class ProperMemberSupport_property3 {
 
-    private final String title;
+    private final ProperMemberSupport holder;
 
-    public ObjectTitleEvent(final Object source, final Identifier classIdentifier, final String title) {
-        super(source, classIdentifier);
-        this.title = title;
+    @MemberSupport
+    public String prop() {
+        return holder.toString();
     }
 
-    public String getTitle() {
-        return title;
+    // -- IMPERATIVE NAMING AND DESCRIBING
+
+    @MemberSupport
+    public String namedProp() {
+        return "named-imperative[property3]";
     }
 
+    @MemberSupport
+    public String describedProp() {
+        return "described-imperative[property3]";
+    }
+
+
 }