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/24 16:25:53 UTC

[isis] branch master updated: ISIS-2944: adds orphaned method detection 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 a3af0b3  ISIS-2944: adds orphaned method detection tests
a3af0b3 is described below

commit a3af0b3c15d6c42d95de38a898b2aebfc7442dc2
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Jan 24 17:24:56 2022 +0100

    ISIS-2944: adds orphaned method detection tests
    
    - yet not enabling OrphanedMemberSupportDetection.WhenAnnotationRequired
---
 ...tionEnforcesMetamodelContributionValidator.java |   2 +-
 .../DomainModelTest_usingBadDomain.java            |  91 ++++++++++++++++
 .../model/bad/OrphanedMemberSupportDetection.java  |  68 ++++++++++++
 .../MemberDetection.java}                          |  79 +-------------
 .../model/good/ProperMemberSupportDiscovery.java   | 117 +--------------------
 5 files changed, 168 insertions(+), 189 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
index 41d6b93..4f16df9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/DomainIncludeAnnotationEnforcesMetamodelContributionValidator.java
@@ -175,7 +175,7 @@ extends MetaModelVisitingValidatorAbstract {
         }
 
         // fallback message
-        unmetContraints.add("conflicting domain-include semantics, "
+        unmetContraints.add("conflicting domain-include semantics, orphaned support method, "
                 + "misspelled prefix or unsupported method signature");
         return unmetContraints;
 
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
index 517dfe8..587d0fc 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
@@ -30,6 +30,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;
 
@@ -63,6 +64,7 @@ import org.apache.isis.testdomain.model.bad.InvalidOrphanedActionSupport;
 import org.apache.isis.testdomain.model.bad.InvalidOrphanedCollectionSupport;
 import org.apache.isis.testdomain.model.bad.InvalidOrphanedPropertySupport;
 import org.apache.isis.testdomain.model.bad.InvalidPropertyAnnotationOnAction;
+import org.apache.isis.testdomain.model.bad.OrphanedMemberSupportDetection;
 import org.apache.isis.testdomain.util.interaction.DomainObjectTesterFactory;
 import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValidator;
 
@@ -270,6 +272,95 @@ class DomainModelTest_usingBadDomain {
                 "Cannot use @DomainObject on interface:");
     }
 
+    @ParameterizedTest
+    @ValueSource(classes = {
+            OrphanedMemberSupportDetection.WhenEncapsulationEnabled.class,
+            //FIXME OrphanedMemberSupportDetection.WhenAnnotationRequired.class,
+            OrphanedMemberSupportDetection.WhenAnnotationOptional.class
+            })
+    void orphanedMemberSupportDiscovery(final Class<?> classUnderTest) {
+
+        val clsIdUnderTest = Identifier.classIdentifier(LogicalType.fqcn(classUnderTest));
+
+        // namedPlaceOrder(): String = "my name"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "namedPlaceOrder");
+
+        // describedPlaceOrder(): String = "my description"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "describedPlaceOrder");
+
+        // hidePlaceOrder(): boolean = false
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "hidePlaceOrder");
+
+        // disablePlaceOrder(): String = "my disable reason"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "disablePlaceOrder");
+
+        // default0PlaceOrder(): String = "my default-0"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "default0PlaceOrder");
+        // default1PlaceOrder(): String = "my default-1"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "default1PlaceOrder");
+
+        // hide0PlaceOrder(x): boolean = true
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "hide0PlaceOrder");
+        // hide1PlaceOrder(y): boolean = false
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "hide1PlaceOrder");
+
+        // disable0PlaceOrder(x): String = "my disable reason-0"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "disable0PlaceOrder");
+        // disable1PlaceOrder(z): String = "my disable reason-1"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "disable1PlaceOrder");
+
+        // choices0PlaceOrder(x): List.of("my choice")
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "choices0PlaceOrder");
+
+        // autoComplete1PlaceOrder(y, search): List.of("my search arg=" + search)
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "autoComplete1PlaceOrder");
+
+        // validate0PlaceOrder(String x): String = "my validation-0"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "validate0PlaceOrder");
+        // validate1PlaceOrder(String y): String = "my validation-1"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "validate1PlaceOrder");
+        // validatePlaceOrder(String x, final String y): String = "my validation"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "validatePlaceOrder");
+
+        // -- PROPERTY
+
+        // namedEmail(): String = "my email"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "namedEmail");
+
+        // describedEmail: String = "my email described"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "describedEmail");
+
+        // hideEmail(): boolean = true
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "hideEmail");
+
+        // disableEmail(): String = "my email disable"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "disableEmail");
+
+        // defaultEmail(): String = "my default email"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "defaultEmail");
+
+        // choicesEmail(): Collection<String> = List.of("my email choice")
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "choicesEmail");
+
+        // validateEmail(final String email): String = "my email validate"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "validateEmail");
+
+        // -- COLLECTION
+
+        // namedOrders(): String = "my orders"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "namedOrders");
+
+        // describedOrders: String = "my orders described"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "describedOrders");
+
+        // hideOrders(): boolean = true
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "hideOrders");
+
+        // disableOrders(): String = "my orders disabled"
+        validator.assertAnyFailuresContaining(clsIdUnderTest, "disableOrders");
+
+    }
+
     // -- INCUBATING
 
     @Test @Disabled("this case has no vaildation refiner yet")
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/OrphanedMemberSupportDetection.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/OrphanedMemberSupportDetection.java
new file mode 100644
index 0000000..20dc347
--- /dev/null
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/OrphanedMemberSupportDetection.java
@@ -0,0 +1,68 @@
+/*
+ *  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.bad;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Introspection;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.testdomain.model.base.MemberDetection;
+
+public class OrphanedMemberSupportDetection {
+
+
+    @DomainObject(
+            nature = Nature.VIEW_MODEL,
+            introspection = Introspection.ANNOTATION_OPTIONAL)
+    public static class WhenAnnotationOptional
+    extends MemberDetection.PublicBase {
+
+        // expected to produce orphans for ...
+
+        // void placeOrder(final String x, final String y) {}
+        // @Getter @Setter String email;
+        // @Getter @Setter java.util.Collection<String> orders;
+    }
+
+    @DomainObject(
+            nature = Nature.VIEW_MODEL,
+            introspection = Introspection.ANNOTATION_REQUIRED)
+    public static class WhenAnnotationRequired
+    extends MemberDetection.PublicBase {
+
+        // expected to produce orphans for ...
+
+        // void placeOrder(final String x, final String y) {}
+        // @Getter @Setter String email;
+        // @Getter @Setter java.util.Collection<String> orders;
+    }
+
+    @DomainObject(
+            nature = Nature.VIEW_MODEL,
+            introspection = Introspection.ENCAPSULATION_ENABLED)
+    public static class WhenEncapsulationEnabled
+    extends MemberDetection.ProtectedBase {
+
+        // expected to produce orphans for ...
+
+        // void placeOrder(final String x, final String y) {}
+        // @Getter @Setter String email;
+        // @Getter @Setter java.util.Collection<String> orders;
+    }
+
+}
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/base/MemberDetection.java
similarity index 73%
copy from regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java
copy to regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/base/MemberDetection.java
index f8d437e..b5bf120 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/base/MemberDetection.java
@@ -16,24 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testdomain.model.good;
+package org.apache.isis.testdomain.model.base;
 
 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 class MemberDetection {
 
     public static abstract class PublicBase {
 
@@ -87,7 +77,7 @@ public class ProperMemberSupportDiscovery {
     /**
      * annotations required, otherwise not picked up
      */
-    static abstract class ProtectedBase {
+    public static abstract class ProtectedBase {
 
         // -- ACTION
 
@@ -139,67 +129,4 @@ public class ProperMemberSupportDiscovery {
         @MemberSupport protected String disableOrders() { return "my orders disabled"; }
     }
 
-    @DomainObject(
-            nature = Nature.VIEW_MODEL,
-            introspection = Introspection.ANNOTATION_OPTIONAL)
-    public static class WhenAnnotationOptional
-    extends PublicBase {
-
-        // no annotation required, should be picked up as action
-        public void placeOrder(final String x, final String y) {
-        }
-
-        @Getter @Setter
-        private String email;
-
-        @Getter @Setter
-        private java.util.Collection<String> orders;
-
-    }
-
-    @DomainObject(
-            nature = Nature.VIEW_MODEL,
-            introspection = Introspection.ANNOTATION_REQUIRED)
-    public static class WhenAnnotationRequired
-    extends PublicBase {
-
-        // annotation required, otherwise not picked up as action
-        @Action
-        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(
-            nature = Nature.VIEW_MODEL,
-            introspection = Introspection.ENCAPSULATION_ENABLED)
-    public static class WhenEncapsulationEnabled
-    extends ProtectedBase {
-
-        // annotation required, otherwise not picked up as action
-        @Action
-        //@Override
-        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/model/good/ProperMemberSupportDiscovery.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupportDiscovery.java
index f8d437e..68a3e20 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
@@ -18,16 +18,13 @@
  */
 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 org.apache.isis.testdomain.model.base.MemberDetection;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -35,115 +32,11 @@ 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; }
-        public boolean hide0PlaceOrder(final String x) { return true; }
-        public boolean hide1PlaceOrder(final String y) { return false; }
-        public String disablePlaceOrder() { return "my disable reason"; }
-        public String disable0PlaceOrder(final String x) { return "my disable reason-0";}
-        public String disable1PlaceOrder(final String z) { return "my disable reason-1";}
-        public String default0PlaceOrder() { return "my default-0";}
-        public String default1PlaceOrder() { return "my default-1";}
-
-        public java.util.Collection<String> choices0PlaceOrder(final String x) {
-            return List.of("my choice");
-        }
-        public java.util.Collection<String> autoComplete1PlaceOrder(
-                final String y,
-                @MinLength(3) final String search) {
-            return List.of("my search arg=" + search);
-        }
-
-        public String validate0PlaceOrder(final String x) { return "my validation-0";}
-        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 {
-
-        // -- ACTION
-
-        //FIXME should be allowed without annotation ...
-        //protected abstract void placeOrder(String x, String y);
-
-        @MemberSupport protected String namedPlaceOrder() { return "my name"; }
-        @MemberSupport protected String describedPlaceOrder() { return "my description"; }
-        @MemberSupport protected boolean hidePlaceOrder() { return false; }
-        @MemberSupport protected boolean hide0PlaceOrder(final String x) { return true; }
-        @MemberSupport protected boolean hide1PlaceOrder(final String y) { return false; }
-        @MemberSupport protected String disablePlaceOrder() { return "my disable reason"; }
-        @MemberSupport protected String disable0PlaceOrder(final String x) { return "my disable reason-0";}
-        @MemberSupport protected String disable1PlaceOrder(final String z) { return "my disable reason-1";}
-        @MemberSupport protected String default0PlaceOrder() { return "my default-0";}
-        @MemberSupport protected String default1PlaceOrder() { return "my default-1";}
-
-        @MemberSupport protected java.util.Collection<String> choices0PlaceOrder(final String x) {
-            return List.of("my choice");
-        }
-        @MemberSupport protected java.util.Collection<String> autoComplete1PlaceOrder(
-                final String y,
-                @MinLength(3) final String search) {
-            return List.of("my search arg=" + search);
-        }
-
-        @MemberSupport protected  String validate0PlaceOrder(final String x) { return "my validation-0";}
-        @MemberSupport protected  String validate1PlaceOrder(final String y) { return "my validation-1";}
-        @MemberSupport protected  String validatePlaceOrder(final String x, final String y) { return "my validation";}
-
-
-        // -- 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 orders"; }
-        @MemberSupport protected String describedOrders() { return "my orders described"; }
-        @MemberSupport protected boolean hideOrders() { return true;}
-        @MemberSupport protected String disableOrders() { return "my orders disabled"; }
-    }
-
-    @DomainObject(
+     @DomainObject(
             nature = Nature.VIEW_MODEL,
             introspection = Introspection.ANNOTATION_OPTIONAL)
     public static class WhenAnnotationOptional
-    extends PublicBase {
+    extends MemberDetection.PublicBase {
 
         // no annotation required, should be picked up as action
         public void placeOrder(final String x, final String y) {
@@ -161,7 +54,7 @@ public class ProperMemberSupportDiscovery {
             nature = Nature.VIEW_MODEL,
             introspection = Introspection.ANNOTATION_REQUIRED)
     public static class WhenAnnotationRequired
-    extends PublicBase {
+    extends MemberDetection.PublicBase {
 
         // annotation required, otherwise not picked up as action
         @Action
@@ -182,7 +75,7 @@ public class ProperMemberSupportDiscovery {
             nature = Nature.VIEW_MODEL,
             introspection = Introspection.ENCAPSULATION_ENABLED)
     public static class WhenEncapsulationEnabled
-    extends ProtectedBase {
+    extends MemberDetection.ProtectedBase {
 
         // annotation required, otherwise not picked up as action
         @Action