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