diff --git a/.gitignore b/.gitignore index 377559525bb..687d4138552 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,9 @@ component/objectstore/xml/tmp/objects/ component/objectstore/xml/xml/objects/ component/objectstore/xml/tmp/tests/ +# backup files +*.bak + # log files *.log diff --git a/api/applib/src/main/java/org/apache/causeway/applib/events/domain/AbstractDomainEvent.java b/api/applib/src/main/java/org/apache/causeway/applib/events/domain/AbstractDomainEvent.java index ba20e5388ff..2df31e83d16 100644 --- a/api/applib/src/main/java/org/apache/causeway/applib/events/domain/AbstractDomainEvent.java +++ b/api/applib/src/main/java/org/apache/causeway/applib/events/domain/AbstractDomainEvent.java @@ -119,24 +119,26 @@ public S getSource() { *

*/ @Getter - private Object mixedIn; + private Object mixee; /** * Not API - set by the framework. */ - public void setMixedIn(final Object mixedIn) { - this.mixedIn = mixedIn; + public final void setMixee(final Object mixee) { + this.mixee = mixee; } /** * The subject of the event, which will be either the * {@link #getSource() source} for a regular action, or the - * {@link #getMixedIn() mixed-in} domain object for a mixin. + * {@link #getMixee() mixed-in} domain object for a mixin. */ public T getSubject() { - val mixedIn = getMixedIn(); - val mixedInElseSource = mixedIn != null ? mixedIn : getSource(); + val mixee = getMixee(); + val mixedInElseSource = mixee != null + ? mixee + : getSource(); return _Casts.uncheckedCast(mixedInElseSource); } @@ -194,7 +196,7 @@ public boolean isExecuted() { /** * Not API, set by the framework. */ - public void setEventPhase(final Phase phase) { + public final void setEventPhase(final Phase phase) { this.eventPhase = phase; } @@ -208,7 +210,7 @@ public void setEventPhase(final Phase phase) { /** * Not API, set by the framework if the no-arg constructor is used. */ - public void setIdentifier(final Identifier identifier) { + public final void setIdentifier(final Identifier identifier) { this.identifier = identifier; } @@ -226,7 +228,7 @@ public void setIdentifier(final Identifier identifier) { * * @see #veto(String, Object...) */ - public void hide() { + public final void hide() { this.hidden = true; } @@ -275,7 +277,7 @@ public boolean isDisabled() { * @see #disable(org.apache.causeway.applib.services.i18n.TranslatableString) * @see #veto(String, Object...) */ - public void disable(final String reason) { + public final void disable(final String reason) { this.disabledReason = reason; } @@ -286,7 +288,7 @@ public void disable(final String reason) { * @see #disable(java.lang.String) * @see #veto(org.apache.causeway.applib.services.i18n.TranslatableString) */ - public void disable(final TranslatableString reason) { + public final void disable(final TranslatableString reason) { this.disabledReasonTranslatable = reason; } @@ -478,7 +480,7 @@ public Object get(final Object key) { * * Set user-data, for the use of a subsequent {@link #getEventPhase() phase}. */ - public void put(final Object key, final Object value) { + public final void put(final Object key, final Object value) { userData.put(key, value); } diff --git a/api/applib/src/main/java/org/apache/causeway/applib/events/domain/ActionDomainEvent.java b/api/applib/src/main/java/org/apache/causeway/applib/events/domain/ActionDomainEvent.java index 0fe33d3b7ff..76b50c2ee06 100644 --- a/api/applib/src/main/java/org/apache/causeway/applib/events/domain/ActionDomainEvent.java +++ b/api/applib/src/main/java/org/apache/causeway/applib/events/domain/ActionDomainEvent.java @@ -139,12 +139,6 @@ public ActionDomainEvent(final S source) { @Getter private List> parameterTypes; - /** - * Populated only for mixins; holds the underlying domain object that the mixin contributes to. - */ - @Getter - private Object mixedIn; - /** * The arguments being used to invoke the action. * @@ -208,14 +202,6 @@ public void setParameterNames(final List parameterNames) { public void setParameterTypes(final List> parameterTypes) { this.parameterTypes = parameterTypes; } - /** - * @apiNote : NOT API, set by the framework - */ - @Override - public void setMixedIn(final Object mixedIn) { - this.mixedIn = mixedIn; - } - private static final ToString> toString = ObjectContracts.> toString("source", ActionDomainEvent::getSource) diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventFacetAbstract.java new file mode 100644 index 00000000000..8eedca62dac --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventFacetAbstract.java @@ -0,0 +1,99 @@ +/* + * 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.causeway.core.metamodel.facets; + +import java.util.function.BiConsumer; + +import org.apache.causeway.core.metamodel.facetapi.Facet; +import org.apache.causeway.core.metamodel.facetapi.FacetAbstract; +import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; + +import lombok.NonNull; + +/** + * Base for any event-type holding facets, + * while defining the facet-type is up to implementors. + */ +public abstract class DomainEventFacetAbstract +extends FacetAbstract { + + public static enum EventTypeOrigin { + /** {@link #eventType} originates from configured defaults */ + DEFAULT, + /** {@link #eventType} originates from domain object annotation */ + ANNOTATED_OBJECT, + /** {@link #eventType} originates from member annotation */ + ANNOTATED_MEMBER; + public boolean isDefault() { return this==DEFAULT; } + public boolean isAnnotatedObject() { return this==ANNOTATED_OBJECT; } + public boolean isAnnotatedMember() { return this==ANNOTATED_MEMBER; } + } + + private Class eventType; + private EventTypeOrigin eventTypeOrigin; + + protected DomainEventFacetAbstract( + final Class facetType, + final Class eventType, + final EventTypeOrigin eventTypeOrigin, + final FacetHolder holder) { + super(facetType, holder); + this.eventType = eventType; + this.eventTypeOrigin = eventTypeOrigin; + } + + public final Class getEventType() { + return eventType; + } + + public final EventTypeOrigin getEventTypeOrigin() { + return eventTypeOrigin; + } + + /** called during meta-model post-processing only */ + protected final void updateEventType( + final Class eventType, + final EventTypeOrigin eventTypeOrigin) { + this.eventType = eventType; + this.eventTypeOrigin = eventTypeOrigin; + } + + /** + * Called by meta-model post-processors, to honor domain object annotations on mixees. + * (required only, if this facet belongs to a mixed-in member) + */ + public void initWithMixee(final ObjectSpecification mixeeSpec) {} + + + @Override + public void visitAttributes(final BiConsumer visitor) { + super.visitAttributes(visitor); + visitor.accept("eventType", getEventType()); + visitor.accept("eventTypeOrigin", getEventTypeOrigin().name()); + } + + @Override + public boolean semanticEquals(final @NonNull Facet other) { + return other instanceof DomainEventFacetAbstract + ? this.getEventType() == ((DomainEventFacetAbstract)other).getEventType() + : false; + } + +} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventHelper.java index a7dafe25b25..e23619b2d1a 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventHelper.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/DomainEventHelper.java @@ -125,10 +125,10 @@ private ActionDomainEvent postEventForAction( final Identifier identifier = facetHolder.getFeatureIdentifier(); event = newActionDomainEvent(eventType, identifier, source, arguments); - // copy over if have - head.getMixedIn() + // copy over if mixee is present + head.getMixee() .ifPresent(mixedInAdapter-> - event.setMixedIn(mixedInAdapter.getPojo())); + event.setMixee(mixedInAdapter.getPojo())); if(objectAction != null) { // should always be the case... @@ -251,9 +251,9 @@ public PropertyDomainEvent postEventForProperty( event = newPropertyDomainEvent(eventType, identifier, source, oldValue, newValue); // copy over if have - head.getMixedIn() - .ifPresent(mixedInAdapter-> - event.setMixedIn(mixedInAdapter.getPojo())); + head.getMixee() + .ifPresent(mixeeAdapter-> + event.setMixee(mixeeAdapter.getPojo())); } @@ -343,9 +343,9 @@ public CollectionDomainEvent postEventForCollection( event = newCollectionDomainEvent(eventType, phase, identifier, source); // copy over if have - head.getMixedIn() - .ifPresent(mixedInAdapter-> - event.setMixedIn(mixedInAdapter.getPojo())); + head.getMixee() + .ifPresent(mixeeAdapter-> + event.setMixee(mixeeAdapter.getPojo())); event.setEventPhase(phase); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/SingleClassValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/SingleClassValueFacetAbstract.java index f70e2cd7182..ab5c676d97c 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/SingleClassValueFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/SingleClassValueFacetAbstract.java @@ -33,7 +33,7 @@ public abstract class SingleClassValueFacetAbstract private final Class value; - public SingleClassValueFacetAbstract( + protected SingleClassValueFacetAbstract( final Class facetType, final FacetHolder holder, final Class value) { diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java index af4ddfcfc69..57ce939e5fa 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java @@ -23,7 +23,6 @@ import javax.inject.Inject; import org.apache.causeway.applib.annotation.Action; -import org.apache.causeway.applib.events.domain.ActionDomainEvent; import org.apache.causeway.applib.mixins.system.HasInteractionId; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants; import org.apache.causeway.core.metamodel.context.MetaModelContext; @@ -33,11 +32,8 @@ import org.apache.causeway.core.metamodel.facets.actions.action.choicesfrom.ChoicesFromFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.actions.action.explicit.ActionExplicitFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault; +import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; +import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEvent; import org.apache.causeway.core.metamodel.facets.actions.action.prototype.PrototypeFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation; @@ -45,10 +41,7 @@ import org.apache.causeway.core.metamodel.facets.members.layout.group.LayoutGroupFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.members.publish.command.CommandPublishingFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.members.publish.execution.ExecutionPublishingActionFacetForActionAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.specloader.validator.MetaModelValidatorForAmbiguousMixinAnnotations; -import org.apache.causeway.core.metamodel.util.EventUtil; import lombok.val; @@ -111,63 +104,41 @@ void processInvocation(final ProcessMethodContext processMethodContext, final Op val cls = processMethodContext.getCls(); val typeSpec = getSpecificationLoader().loadSpecification(cls); + if(typeSpec.isMixin()) { + /* don't process mixed in actions, as we would require the actual mixee + * (deferred to post processing) */ + //TODO[CAUSEWAY-3409] breaks tests ... return; + } + val holder = processMethodContext.getFacetHolder(); // // Set up ActionDomainEventFacet, which will act as the hiding/disabling/validating advisor // - // search for @Action(domainEvent=...), else use the default event type - val actionDomainEventFacet = - actionIfAny - .map(Action::domainEvent) - .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class) - .map(domainEvent -> - (ActionDomainEventFacetAbstract) - new ActionDomainEventFacetForActionAnnotation( - defaultFromDomainObjectIfRequired(typeSpec, domainEvent), holder)) - .orElse( - new ActionDomainEventFacetDefault( - defaultFromDomainObjectIfRequired(typeSpec, ActionDomainEvent.Default.class), holder) - ); - - if(EventUtil.eventTypeIsPostable( - actionDomainEventFacet.getEventType(), - ActionDomainEvent.Noop.class, - ActionDomainEvent.Default.class, - getConfiguration().getApplib().getAnnotation().getAction().getDomainEvent().isPostForDefault())) { + ActionDomainEventFacet + .createRegular(actionIfAny, typeSpec, holder) + .ifPresent(actionDomainEventFacet->{ + addFacet(actionDomainEventFacet); - } - // replace the current actionInvocationFacet with one that will - // emit the appropriate domain event and then delegate onto the underlying + // replace the current actionInvocationFacet with one that will + // emit the appropriate domain event and then delegate onto the underlying + + addFacet( + //TODO[CAUSEWAY-3409] we don't install those for the mixin case, if bailing out above + new ActionInvocationFacetForDomainEvent( + actionDomainEventFacet.getEventType(), actionDomainEventFacet.getEventTypeOrigin(), + actionMethod, typeSpec, returnSpec, holder)); + }); - addFacet(actionDomainEventFacet instanceof ActionDomainEventFacetForActionAnnotation - ? new ActionInvocationFacetForDomainEventFromActionAnnotation( - actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder) - : new ActionInvocationFacetForDomainEventFromDefault( - actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder)); } finally { processMethodContext.removeMethod(actionMethod.asMethodForIntrospection()); } } - private static Class> defaultFromDomainObjectIfRequired( - final ObjectSpecification typeSpec, - final Class> actionDomainEventType) { - - if (actionDomainEventType == ActionDomainEvent.Default.class) { - val typeFromDomainObject = - typeSpec.getFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class); - if (typeFromDomainObject != null) { - return typeFromDomainObject.getEventType(); - } - } - return actionDomainEventType; - } - void processHidden(final ProcessMethodContext processMethodContext, final Optional actionIfAny) { val facetedMethod = processMethodContext.getFacetHolder(); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacet.java index 87bcc3c7c00..d7150a4e161 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacet.java @@ -18,16 +18,239 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action.invocation; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacet; +import java.lang.reflect.Method; +import java.util.Optional; + +import org.apache.causeway.applib.annotation.Action; +import org.apache.causeway.applib.events.domain.AbstractDomainEvent; +import org.apache.causeway.applib.events.domain.ActionDomainEvent; +import org.apache.causeway.applib.services.i18n.TranslatableString; +import org.apache.causeway.applib.services.i18n.TranslationContext; +import org.apache.causeway.applib.services.i18n.TranslationService; +import org.apache.causeway.commons.collections.Can; +import org.apache.causeway.commons.internal.assertions._Assert; +import org.apache.causeway.commons.internal.reflection._Annotations; +import org.apache.causeway.core.metamodel.consent.Consent.VetoReason; +import org.apache.causeway.core.metamodel.facetapi.Facet; +import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventHelper; +import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation; +import org.apache.causeway.core.metamodel.interactions.ActionInteractionContext; +import org.apache.causeway.core.metamodel.interactions.ActionValidityContext; import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor; import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor; +import org.apache.causeway.core.metamodel.interactions.InteractionContext; +import org.apache.causeway.core.metamodel.interactions.UsabilityContext; import org.apache.causeway.core.metamodel.interactions.ValidatingInteractionAdvisor; +import org.apache.causeway.core.metamodel.interactions.ValidityContext; +import org.apache.causeway.core.metamodel.interactions.VisibilityContext; +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; +import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; +import org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionMixedIn; +import org.apache.causeway.core.metamodel.util.EventUtil; -/** - * Corresponds to @Action(domainEvent=...) annotation in the Causeway programming model. - */ -public interface ActionDomainEventFacet -extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor, -ValidatingInteractionAdvisor { +import lombok.NonNull; +import lombok.val; + +public class ActionDomainEventFacet +extends DomainEventFacetAbstract> +implements + HidingInteractionAdvisor, + DisablingInteractionAdvisor, + ValidatingInteractionAdvisor { + + // -- FACET TYPE + + private static Class type() { + return ActionDomainEventFacet.class; + } + + // -- FACTORIES + + /** + * For regular (non mixed-in) members only. + *

+ * @return empty, if event is not post-able + */ + public static Optional createRegular( + final @NonNull Optional actionIfAny, + final @NonNull ObjectSpecification typeSpec, + final @NonNull FacetHolder facetHolder){ + + val actionDomainEventFacet = + actionIfAny + .map(Action::domainEvent) + .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class) + .map(domainEvent -> + new ActionDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, domainEvent), EventTypeOrigin.ANNOTATED_MEMBER, facetHolder)) + .orElse( + new ActionDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, ActionDomainEvent.Default.class), EventTypeOrigin.DEFAULT, facetHolder) + ); + + return EventUtil.eventTypeIsPostable( + actionDomainEventFacet.getEventType(), + ActionDomainEvent.Noop.class, + ActionDomainEvent.Default.class, + facetHolder.getConfiguration().getApplib().getAnnotation().getAction().getDomainEvent().isPostForDefault()) + ? Optional.of(actionDomainEventFacet) + : Optional.empty(); + } + + /** + * For mixed-in members. + */ + public static Optional createMixedIn( + final @NonNull ObjectSpecification mixeeSpecification, + final @NonNull ObjectActionMixedIn mixedInAction) { + + + val facetedMethod = mixedInAction.getFacetedMethod(); + final Method method = facetedMethod.getMethod().asMethodElseFail(); // no-arg method, should have a regular facade + + //TODO[CAUSEWAY-3409] what if the @Action annotation is not on the method but on the (mixin) type + final Action actionAnnot = + _Annotations.synthesize(method, Action.class) + .orElse(null); + + if(actionAnnot != null) { + final Class> actionDomainEventType = + defaultFromDomainObjectIfRequired( + mixeeSpecification, actionAnnot.domainEvent()); + + return Optional.of( + new ActionDomainEventFacet( + actionDomainEventType, EventTypeOrigin.ANNOTATED_MEMBER, mixedInAction)); + } + + return Optional.empty(); + + } + + // -- CONSTRUCTION + + private final TranslationService translationService; + private final TranslationContext translationContext; + private final DomainEventHelper domainEventHelper; + + protected ActionDomainEventFacet( + final Class> eventType, + final EventTypeOrigin eventTypeOrigin, + final FacetHolder holder) { + + super(type(), eventType, eventTypeOrigin, holder); + + this.translationService = getTranslationService(); + this.translationContext = holder.getTranslationContext(); + + domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); + } + + @Override + public void initWithMixee(final ObjectSpecification mixeeSpec) { + if(!getEventTypeOrigin().isDefault()) return; // skip if already set explicitly + mixeeSpec + .lookupFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class) + .ifPresent(facetOnMixee-> + super.updateEventType(facetOnMixee.getEventType(), EventTypeOrigin.ANNOTATED_OBJECT)); + } + + @Override + public String hides(final VisibilityContext ic) { + + final ActionDomainEvent event = + domainEventHelper.postEventForAction( + AbstractDomainEvent.Phase.HIDE, + getEventType(), + actionFrom(ic), getFacetHolder(), + ic.getHead(), + // corresponds to programming model 'hidePlaceOrder()', + // which does no longer consider args + Can.empty(), + // result pojo n/a + null); + if (event != null && event.isHidden()) { + return "Hidden by subscriber"; + } + return null; + } + + @Override + public Optional disables(final UsabilityContext ic) { + + final ActionDomainEvent event = + domainEventHelper.postEventForAction( + AbstractDomainEvent.Phase.DISABLE, + getEventType(), + actionFrom(ic), getFacetHolder(), + ic.getHead(), + // corresponds to programming model 'disablePlaceOrder()', + // which does no longer consider args + Can.empty(), + // result pojo n/a + null); + if (event != null && event.isDisabled()) { + final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable(); + final String reasonString = reasonTranslatable != null + ? reasonTranslatable.translate(translationService, translationContext) + : event.getDisabledReason(); + + if(reasonString!=null) { + return VetoReason.explicit(reasonString).toOptional(); + } + } + return Optional.empty(); + } + + @Override + public String invalidates(final ValidityContext ic) { + + _Assert.assertTrue(ic instanceof ActionValidityContext, ()-> + String.format("expecting an action context but got %s", ic.getIdentifier())); + + final ActionValidityContext aic = (ActionValidityContext) ic; + final ActionDomainEvent event = + domainEventHelper.postEventForAction( + AbstractDomainEvent.Phase.VALIDATE, + getEventType(), + actionFrom(ic), getFacetHolder(), + ic.getHead(), aic.getArgs(), + null); + if (event != null && event.isInvalid()) { + final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable(); + if(reasonTranslatable != null) { + return reasonTranslatable.translate(translationService, translationContext); + } + return event.getInvalidityReason(); + } + + return null; + } + + // -- HELPER + + private static ObjectAction actionFrom(final InteractionContext ic) { + if(!(ic instanceof ActionInteractionContext)) { + throw new IllegalStateException( + "Expecting ic to be of type ActionInteractionContext, instead was: " + ic); + } + return ((ActionInteractionContext) ic).getObjectAction(); + } + + private static Class> defaultFromDomainObjectIfRequired( + final ObjectSpecification typeSpec, + final Class> actionDomainEventType) { + + if (actionDomainEventType == ActionDomainEvent.Default.class) { + val typeFromDomainObject = + typeSpec.getFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class); + if (typeFromDomainObject != null) { + return typeFromDomainObject.getEventType(); + } + } + return actionDomainEventType; + } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java deleted file mode 100644 index eb3e5a8ff05..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.actions.action.invocation; - -import java.util.Optional; - -import org.apache.causeway.applib.events.domain.AbstractDomainEvent; -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.applib.services.i18n.TranslatableString; -import org.apache.causeway.applib.services.i18n.TranslationContext; -import org.apache.causeway.applib.services.i18n.TranslationService; -import org.apache.causeway.commons.collections.Can; -import org.apache.causeway.commons.internal.assertions._Assert; -import org.apache.causeway.core.metamodel.consent.Consent.VetoReason; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.DomainEventHelper; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; -import org.apache.causeway.core.metamodel.interactions.ActionInteractionContext; -import org.apache.causeway.core.metamodel.interactions.ActionValidityContext; -import org.apache.causeway.core.metamodel.interactions.InteractionContext; -import org.apache.causeway.core.metamodel.interactions.UsabilityContext; -import org.apache.causeway.core.metamodel.interactions.ValidityContext; -import org.apache.causeway.core.metamodel.interactions.VisibilityContext; -import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; - -import lombok.Getter; -import lombok.Setter; - -public abstract class ActionDomainEventFacetAbstract -extends SingleClassValueFacetAbstract -implements ActionDomainEventFacet { - - @Getter @Setter private Class> eventType; - private final TranslationService translationService; - private final TranslationContext translationContext; - private final DomainEventHelper domainEventHelper; - - public ActionDomainEventFacetAbstract( - final Class> eventType, - final FacetHolder holder) { - - super(ActionDomainEventFacet.class, holder, eventType); - setEventType(eventType); - - this.translationService = getTranslationService(); - this.translationContext = holder.getTranslationContext(); - - domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); - } - - @Override - public Class value() { - return eventType; - } - - @Override - public String hides(final VisibilityContext ic) { - - final ActionDomainEvent event = - domainEventHelper.postEventForAction( - AbstractDomainEvent.Phase.HIDE, - getEventType(), - actionFrom(ic), getFacetHolder(), - ic.getHead(), - // corresponds to programming model 'hidePlaceOrder()', - // which does no longer consider args - Can.empty(), - // result pojo n/a - null); - if (event != null && event.isHidden()) { - return "Hidden by subscriber"; - } - return null; - } - - @Override - public Optional disables(final UsabilityContext ic) { - - final ActionDomainEvent event = - domainEventHelper.postEventForAction( - AbstractDomainEvent.Phase.DISABLE, - getEventType(), - actionFrom(ic), getFacetHolder(), - ic.getHead(), - // corresponds to programming model 'disablePlaceOrder()', - // which does no longer consider args - Can.empty(), - // result pojo n/a - null); - if (event != null && event.isDisabled()) { - final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable(); - final String reasonString = reasonTranslatable != null - ? reasonTranslatable.translate(translationService, translationContext) - : event.getDisabledReason(); - - if(reasonString!=null) { - return VetoReason.explicit(reasonString).toOptional(); - } - } - return Optional.empty(); - } - - @Override - public String invalidates(final ValidityContext ic) { - - _Assert.assertTrue(ic instanceof ActionValidityContext, ()-> - String.format("expecting an action context but got %s", ic.getIdentifier())); - - final ActionValidityContext aic = (ActionValidityContext) ic; - final ActionDomainEvent event = - domainEventHelper.postEventForAction( - AbstractDomainEvent.Phase.VALIDATE, - getEventType(), - actionFrom(ic), getFacetHolder(), - ic.getHead(), aic.getArgs(), - null); - if (event != null && event.isInvalid()) { - final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable(); - if(reasonTranslatable != null) { - return reasonTranslatable.translate(translationService, translationContext); - } - return event.getInvalidityReason(); - } - - return null; - } - - // -- HELPER - - private static ObjectAction actionFrom(final InteractionContext ic) { - if(!(ic instanceof ActionInteractionContext)) { - throw new IllegalStateException( - "Expecting ic to be of type ActionInteractionContext, instead was: " + ic); - } - return ((ActionInteractionContext) ic).getObjectAction(); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java deleted file mode 100644 index 311f7c3a4ff..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetDefault.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.actions.action.invocation; - -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; - -public class ActionDomainEventFacetDefault extends ActionDomainEventFacetAbstract { - - public ActionDomainEventFacetDefault( - final Class> eventType, final FacetHolder holder) { - super(eventType, holder); - } - - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java deleted file mode 100644 index 6c70005485e..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForActionAnnotation.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.actions.action.invocation; - -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; - -public class ActionDomainEventFacetForActionAnnotation extends ActionDomainEventFacetAbstract { - - public ActionDomainEventFacetForActionAnnotation( - final Class> eventType, final FacetHolder holder) { - super(eventType, holder); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java index eb188b7b373..d85051424e1 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetAbstract.java @@ -18,20 +18,46 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action.invocation; +import java.util.function.BiConsumer; + +import org.apache.causeway.applib.events.domain.ActionDomainEvent; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facetapi.FacetAbstract; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; +import org.apache.causeway.core.metamodel.facets.ImperativeFacet; + +import lombok.NonNull; public abstract class ActionInvocationFacetAbstract -extends FacetAbstract -implements ActionInvocationFacet { +extends DomainEventFacetAbstract> +implements ActionInvocationFacet, ImperativeFacet { private static final Class type() { return ActionInvocationFacet.class; } - public ActionInvocationFacetAbstract(final FacetHolder holder) { - super(type(), holder); + protected ActionInvocationFacetAbstract( + final Class> eventType, + final EventTypeOrigin eventTypeOrigin, + final FacetHolder holder) { + super(type(), eventType, eventTypeOrigin, holder); + } + + @Override + public void visitAttributes(final BiConsumer visitor) { + super.visitAttributes(visitor); + ImperativeFacet.visitAttributes(this, visitor); + visitor.accept("declaringType", getDeclaringType()); + visitor.accept("returnType", getReturnType()); + //visitor.accept("eventType", getEventType()); done already in super + //visitor.accept("eventTypeOrigin", getEventTypeOrigin()); done already in super + } + + @Override + public boolean semanticEquals(final @NonNull Facet other) { + return other instanceof ActionInvocationFacetAbstract + ? this.getEventType() == ((ActionInvocationFacetAbstract)other).getEventType() + : false; } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEvent.java similarity index 92% rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEvent.java index 2fa08e526dc..780ccbc3157 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEvent.java @@ -36,7 +36,9 @@ import org.apache.causeway.core.metamodel.commons.CanonicalInvoker; import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy; import org.apache.causeway.core.metamodel.execution.InteractionInternal; +import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; import org.apache.causeway.core.metamodel.facets.DomainEventHelper; import org.apache.causeway.core.metamodel.facets.ImperativeFacet; import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet; @@ -54,26 +56,24 @@ import lombok.SneakyThrows; import lombok.val; -public abstract class ActionInvocationFacetForDomainEventAbstract -extends ActionInvocationFacetAbstract -implements ImperativeFacet { +public class ActionInvocationFacetForDomainEvent +extends ActionInvocationFacetAbstract { - @Getter private final Class> eventType; @Getter(onMethod_ = {@Override}) private final @NonNull Can methods; - @Getter(onMethod = @__(@Override)) private final ObjectSpecification declaringType; - @Getter(onMethod = @__(@Override)) private final ObjectSpecification returnType; + @Getter(onMethod_ = {@Override}) private final ObjectSpecification declaringType; + @Getter(onMethod_ = {@Override}) private final ObjectSpecification returnType; private final ServiceRegistry serviceRegistry; private final DomainEventHelper domainEventHelper; - public ActionInvocationFacetForDomainEventAbstract( + public ActionInvocationFacetForDomainEvent( final Class> eventType, + final EventTypeOrigin eventTypeOrigin, final MethodFacade method, final ObjectSpecification declaringType, final ObjectSpecification returnType, final FacetHolder holder) { - super(holder); - this.eventType = eventType; + super(eventType, eventTypeOrigin, holder); this.methods = ImperativeFacet.singleMethod(method); this.declaringType = declaringType; this.returnType = returnType; @@ -106,15 +106,6 @@ public ManagedObject invoke( .getValue().orElse(null); } - @Override - public void visitAttributes(final BiConsumer visitor) { - super.visitAttributes(visitor); - ImperativeFacet.visitAttributes(this, visitor); - visitor.accept("declaringType", declaringType); - visitor.accept("returnType", returnType); - visitor.accept("eventType", eventType); - } - // -- HELPER private ManagedObject doInvoke( diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java deleted file mode 100644 index bfd6385159b..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromActionAnnotation.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.actions.action.invocation; - -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; - -public class ActionInvocationFacetForDomainEventFromActionAnnotation -extends ActionInvocationFacetForDomainEventAbstract { - - public ActionInvocationFacetForDomainEventFromActionAnnotation( - final Class> eventType, - final MethodFacade method, - final ObjectSpecification onType, - final ObjectSpecification returnType, - final FacetHolder holder) { - - super(eventType, method, onType, returnType, holder); - } -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java deleted file mode 100644 index 0a0c0d6e2f2..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventFromDefault.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.actions.action.invocation; - -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; - -public class ActionInvocationFacetForDomainEventFromDefault -extends ActionInvocationFacetForDomainEventAbstract { - - public ActionInvocationFacetForDomainEventFromDefault( - final Class> eventType, - final MethodFacade method, - final ObjectSpecification onType, - final ObjectSpecification returnType, - final FacetHolder holder) { - - super(eventType, method, onType, returnType, holder); - } -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java index b4225d010f1..2b19c3c89aa 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java @@ -24,7 +24,6 @@ import org.apache.causeway.applib.annotation.Collection; import org.apache.causeway.applib.annotation.SemanticsOf; -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FeatureType; @@ -34,15 +33,10 @@ import org.apache.causeway.core.metamodel.facets.actions.contributing.ContributingFacetAbstract; import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract; import org.apache.causeway.core.metamodel.facets.collections.collection.hidden.HiddenFacetForCollectionAnnotation; -import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetDefault; -import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation; +import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet; import org.apache.causeway.core.metamodel.facets.collections.collection.typeof.TypeOfFacetForCollectionAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.CollectionDomainEventDefaultFacetForDomainObjectAnnotation; import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.specloader.validator.MetaModelValidatorForAmbiguousMixinAnnotations; -import org.apache.causeway.core.metamodel.util.EventUtil; import lombok.val; @@ -107,45 +101,11 @@ void processModify(final ProcessMethodContext processMethodContext, final Option // // search for @Collection(domainEvent=...) - val collectionDomainEventFacet = collectionIfAny - .map(Collection::domainEvent) - .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class) - .map(domainEvent -> - (CollectionDomainEventFacetAbstract) - new CollectionDomainEventFacetForCollectionAnnotation( - defaultFromDomainObjectIfRequired(typeSpec, domainEvent), holder)) - .orElse( - new CollectionDomainEventFacetDefault( - defaultFromDomainObjectIfRequired(typeSpec, CollectionDomainEvent.Default.class), holder)); - if(!CollectionDomainEvent.Noop.class.isAssignableFrom(collectionDomainEventFacet.getEventType())) { - addFacet(collectionDomainEventFacet); - } - - if(EventUtil.eventTypeIsPostable( - collectionDomainEventFacet.getEventType(), - CollectionDomainEvent.Noop.class, - CollectionDomainEvent.Default.class, - getConfiguration().getApplib().getAnnotation().getCollection().getDomainEvent().isPostForDefault() - )) { - addFacet(collectionDomainEventFacet); - } - - } - - public static Class> defaultFromDomainObjectIfRequired( - final ObjectSpecification typeSpec, - final Class> collectionDomainEventType) { - if (collectionDomainEventType == CollectionDomainEvent.Default.class) { - final CollectionDomainEventDefaultFacetForDomainObjectAnnotation typeFromDomainObject = - typeSpec.getFacet(CollectionDomainEventDefaultFacetForDomainObjectAnnotation.class); - if (typeFromDomainObject != null) { - return typeFromDomainObject.getEventType(); - } - } - return collectionDomainEventType; + addFacetIfPresent( + CollectionDomainEventFacet + .createRegular(collectionIfAny, typeSpec, getterFacet, holder)); } - void processHidden(final ProcessMethodContext processMethodContext, final Optional collectionIfAny) { val holder = processMethodContext.getFacetHolder(); @@ -180,5 +140,4 @@ void processTypeOf(final ProcessMethodContext processMethodContext, final Option }); } - } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java index 68871f9fc02..41c1069f296 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacet.java @@ -18,14 +18,149 @@ */ package org.apache.causeway.core.metamodel.facets.collections.collection.modify; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacet; +import java.lang.reflect.Method; +import java.util.Optional; + +import org.apache.causeway.applib.annotation.Collection; +import org.apache.causeway.applib.events.domain.AbstractDomainEvent; +import org.apache.causeway.applib.events.domain.CollectionDomainEvent; +import org.apache.causeway.commons.internal.base._Casts; +import org.apache.causeway.commons.internal.reflection._Annotations; +import org.apache.causeway.core.metamodel.facetapi.Facet; +import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventHelper; +import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.CollectionDomainEventDefaultFacetForDomainObjectAnnotation; +import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor; +import org.apache.causeway.core.metamodel.interactions.VisibilityContext; +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; +import org.apache.causeway.core.metamodel.specloader.specimpl.OneToManyAssociationMixedIn; +import org.apache.causeway.core.metamodel.util.EventUtil; -/** - * Corresponds to @Collection(domainEvent=...) annotation in the Causeway programming model. - */ -public interface CollectionDomainEventFacet -extends SingleClassValueFacet, HidingInteractionAdvisor { +import lombok.NonNull; +import lombok.val; -} +public class CollectionDomainEventFacet +extends DomainEventFacetAbstract> +implements HidingInteractionAdvisor { + + // -- FACET TYPE + + private static Class type() { + return CollectionDomainEventFacet.class; + } + + // -- FACTORIES + + /** + * For regular (non mixed-in) members only. + *

+ * @return empty, if event is not post-able + */ + public static Optional createRegular( + final Optional collectionIfAny, + final ObjectSpecification typeSpec, + final PropertyOrCollectionAccessorFacet getterFacet, + final FacetHolder facetHolder) { + + val collectionDomainEventFacet = collectionIfAny + .map(Collection::domainEvent) + .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class) + .map(domainEvent -> + new CollectionDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, domainEvent), + EventTypeOrigin.ANNOTATED_MEMBER, facetHolder)) + .orElse( + new CollectionDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, CollectionDomainEvent.Default.class), + EventTypeOrigin.DEFAULT, facetHolder)); + + return EventUtil.eventTypeIsPostable( + collectionDomainEventFacet.getEventType(), + CollectionDomainEvent.Noop.class, + CollectionDomainEvent.Default.class, + facetHolder.getConfiguration().getApplib().getAnnotation().getCollection().getDomainEvent().isPostForDefault()) + ? Optional.of(collectionDomainEventFacet) + : Optional.empty(); + } + + /** + * For mixed-in members. + */ + public static Optional createMixedIn( + final @NonNull ObjectSpecification mixeeSpecification, + final @NonNull OneToManyAssociationMixedIn mixedInCollection) { + + val facetedMethod = mixedInCollection.getFacetedMethod(); + final Method method = facetedMethod.getMethod().asMethodElseFail(); // no-arg method, should have a regular facade + + //TODO[CAUSEWAY-3409] what if the @Collection annotation is not on the method but on the (mixin) type + final Collection collectionAnnot = + _Annotations.synthesize(method, Collection.class) + .orElse(null); + if(collectionAnnot != null) { + final Class> collectionDomainEventType = + defaultFromDomainObjectIfRequired( + mixeeSpecification, collectionAnnot.domainEvent()); + return Optional.of( + new CollectionDomainEventFacet( + collectionDomainEventType, EventTypeOrigin.ANNOTATED_MEMBER, mixedInCollection)); + } + return Optional.empty(); + } + + // -- CONSTRUCTION + + private final DomainEventHelper domainEventHelper; + + protected CollectionDomainEventFacet( + final Class> eventType, + final EventTypeOrigin eventTypeOrigin, + final FacetHolder holder) { + super(type(), eventType, eventTypeOrigin, holder); + domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); + } + + @Override + public void initWithMixee(final ObjectSpecification mixeeSpec) { + if(!getEventTypeOrigin().isDefault()) return; // skip if already set explicitly + mixeeSpec + .lookupFacet(CollectionDomainEventDefaultFacetForDomainObjectAnnotation.class) + .ifPresent(facetOnMixee-> + super.updateEventType(facetOnMixee.getEventType(), EventTypeOrigin.ANNOTATED_OBJECT)); + } + + @Override + public String hides(final VisibilityContext ic) { + + final CollectionDomainEvent event = + domainEventHelper.postEventForCollection( + AbstractDomainEvent.Phase.HIDE, + _Casts.uncheckedCast(getEventType()), + getFacetHolder(), ic.getHead() + ); + if (event != null && event.isHidden()) { + return "Hidden by subscriber"; + } + return null; + } + + // -- HELPER + + private static Class> defaultFromDomainObjectIfRequired( + final ObjectSpecification typeSpec, + final Class> collectionDomainEventType) { + if (collectionDomainEventType == CollectionDomainEvent.Default.class) { + final CollectionDomainEventDefaultFacetForDomainObjectAnnotation typeFromDomainObject = + typeSpec.getFacet(CollectionDomainEventDefaultFacetForDomainObjectAnnotation.class); + if (typeFromDomainObject != null) { + return typeFromDomainObject.getEventType(); + } + } + return collectionDomainEventType; + } + + +} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java deleted file mode 100644 index 573034371f3..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetAbstract.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.collections.collection.modify; - -import org.apache.causeway.applib.events.domain.AbstractDomainEvent; -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; -import org.apache.causeway.commons.internal.base._Casts; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.DomainEventHelper; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; -import org.apache.causeway.core.metamodel.interactions.VisibilityContext; - -public abstract class CollectionDomainEventFacetAbstract - extends SingleClassValueFacetAbstract - implements CollectionDomainEventFacet { - - private final DomainEventHelper domainEventHelper; - - public CollectionDomainEventFacetAbstract( - final Class> eventType, - final FacetHolder holder) { - - super(CollectionDomainEventFacet.class, holder, eventType); - this.eventType = eventType; - - domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); - } - - private Class> eventType; - - @Override - public Class value() { - return eventType; - } - - public Class> getEventType() { - return _Casts.uncheckedCast(eventType); - } - - public void setEventType(final Class> eventType) { - this.eventType = eventType; - } - - @Override - public String hides(final VisibilityContext ic) { - - final CollectionDomainEvent event = - domainEventHelper.postEventForCollection( - AbstractDomainEvent.Phase.HIDE, - getEventType(), - getFacetHolder(), ic.getHead() - ); - if (event != null && event.isHidden()) { - return "Hidden by subscriber"; - } - return null; - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java deleted file mode 100644 index bc63fb0e1e3..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetDefault.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.collections.collection.modify; - -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; - -public class CollectionDomainEventFacetDefault extends CollectionDomainEventFacetAbstract { - - public CollectionDomainEventFacetDefault( - final Class> eventType, final FacetHolder holder) { - super(eventType, holder); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java deleted file mode 100644 index c3c5309a84a..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForCollectionAnnotation.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.collections.collection.modify; - -import org.apache.causeway.applib.annotation.Collection; -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; -import org.apache.causeway.applib.services.inject.ServiceInjector; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; - -public class CollectionDomainEventFacetForCollectionAnnotation extends CollectionDomainEventFacetAbstract { - - static CollectionDomainEventFacet create( - final Collection collection, - final ServiceInjector servicesInjector, - final SpecificationLoader specificationLoader, - final FacetHolder holder) { - Class> collectionInteractionEventType = collection.domainEvent(); - return new CollectionDomainEventFacetForCollectionAnnotation( - collectionInteractionEventType, holder); - } - - public CollectionDomainEventFacetForCollectionAnnotation( - final Class> eventType, final FacetHolder holder) { - super(eventType, holder); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java index e63564c2dce..5f87c62213a 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java @@ -34,9 +34,6 @@ import org.apache.causeway.applib.annotation.Nature; import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.applib.annotation.Value; -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; import org.apache.causeway.applib.events.lifecycle.ObjectCreatedEvent; import org.apache.causeway.applib.events.lifecycle.ObjectLoadedEvent; import org.apache.causeway.applib.events.lifecycle.ObjectPersistedEvent; @@ -528,9 +525,8 @@ private void processDomainEventAction( domainObjectIfAny .map(DomainObject::actionDomainEvent) - .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class) - .map(domainEvent -> new ActionDomainEventDefaultFacetForDomainObjectAnnotation( - holder, domainEvent)) + .flatMap(domainEvent -> ActionDomainEventDefaultFacetForDomainObjectAnnotation + .create(domainEvent, holder)) .ifPresent(super::addFacet); } @@ -541,9 +537,8 @@ private void processDomainEventProperty( domainObjectIfAny .map(DomainObject::propertyDomainEvent) - .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class) - .map(domainEvent -> new PropertyDomainEventDefaultFacetForDomainObjectAnnotation( - holder, domainEvent)) + .flatMap(domainEvent -> PropertyDomainEventDefaultFacetForDomainObjectAnnotation + .create(domainEvent, holder)) .ifPresent(super::addFacet); } @@ -553,9 +548,8 @@ private void processDomainEventCollection( domainObjectIfAny .map(DomainObject::collectionDomainEvent) - .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class) - .map(domainEvent -> new CollectionDomainEventDefaultFacetForDomainObjectAnnotation( - holder, domainEvent)) + .flatMap(domainEvent -> CollectionDomainEventDefaultFacetForDomainObjectAnnotation + .create(domainEvent, holder)) .ifPresent(super::addFacet); } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java index 0abd2ee326d..6f5108d6b63 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/ActionDomainEventDefaultFacetForDomainObjectAnnotation.java @@ -18,10 +18,12 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents; +import java.util.Optional; + import org.apache.causeway.applib.events.domain.ActionDomainEvent; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; /** @@ -29,23 +31,24 @@ * for any actions as a fallback/default. */ public class ActionDomainEventDefaultFacetForDomainObjectAnnotation -extends SingleClassValueFacetAbstract { - +extends DomainEventFacetAbstract> { - private final Class> eventType; - public Class> getEventType() { - return eventType; + public static Optional create( + final Class> domainEvent, + final FacetHolder holder) { + return domainEvent != ActionDomainEvent.Default.class + ? Optional.of(new ActionDomainEventDefaultFacetForDomainObjectAnnotation(domainEvent, holder)) + : Optional.empty(); } private static Class type() { return ActionDomainEventDefaultFacetForDomainObjectAnnotation.class; } - public ActionDomainEventDefaultFacetForDomainObjectAnnotation( - final FacetHolder holder, - final Class> value) { - super(type(), holder, value); - this.eventType = value; + private ActionDomainEventDefaultFacetForDomainObjectAnnotation( + final Class> value, + final FacetHolder holder) { + super(type(), value, EventTypeOrigin.ANNOTATED_OBJECT, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java index 97516bdb6e0..89dd9292a8f 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/CollectionDomainEventDefaultFacetForDomainObjectAnnotation.java @@ -18,10 +18,12 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents; +import java.util.Optional; + import org.apache.causeway.applib.events.domain.CollectionDomainEvent; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; /** @@ -29,22 +31,24 @@ * for any actions as a fallback/default. */ public class CollectionDomainEventDefaultFacetForDomainObjectAnnotation -extends SingleClassValueFacetAbstract { +extends DomainEventFacetAbstract> { - private final Class> eventType; - public Class> getEventType() { - return eventType; + public static Optional create( + final Class> domainEvent, + final FacetHolder holder) { + return domainEvent != CollectionDomainEvent.Default.class + ? Optional.of(new CollectionDomainEventDefaultFacetForDomainObjectAnnotation(domainEvent, holder)) + : Optional.empty(); } private static Class type() { return CollectionDomainEventDefaultFacetForDomainObjectAnnotation.class; } - public CollectionDomainEventDefaultFacetForDomainObjectAnnotation( - final FacetHolder holder, - final Class> value) { - super(type(), holder, value); - this.eventType = value; + private CollectionDomainEventDefaultFacetForDomainObjectAnnotation( + final Class> value, + final FacetHolder holder) { + super(type(), value, EventTypeOrigin.ANNOTATED_OBJECT, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java index 8b8a7ae038a..3827e1f7a9d 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/object/domainobject/domainevents/PropertyDomainEventDefaultFacetForDomainObjectAnnotation.java @@ -18,10 +18,12 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents; +import java.util.Optional; + import org.apache.causeway.applib.events.domain.PropertyDomainEvent; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; /** @@ -29,22 +31,24 @@ * for any actions as a fallback/default. */ public class PropertyDomainEventDefaultFacetForDomainObjectAnnotation -extends SingleClassValueFacetAbstract { +extends DomainEventFacetAbstract> { - private final Class> eventType; - public Class> getEventType() { - return eventType; + public static Optional create( + final Class> domainEvent, + final FacetHolder holder) { + return domainEvent != PropertyDomainEvent.Default.class + ? Optional.of(new PropertyDomainEventDefaultFacetForDomainObjectAnnotation(domainEvent, holder)) + : Optional.empty(); } private static Class type() { return PropertyDomainEventDefaultFacetForDomainObjectAnnotation.class; } - public PropertyDomainEventDefaultFacetForDomainObjectAnnotation( - final FacetHolder holder, - final Class> value) { - super(type(), holder, value); - this.eventType = value; + private PropertyDomainEventDefaultFacetForDomainObjectAnnotation( + final Class> value, + final FacetHolder holder) { + super(type(), value, EventTypeOrigin.ANNOTATED_OBJECT, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java index 5a6d9930fc3..2455af6334d 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java @@ -25,7 +25,6 @@ import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.applib.annotation.SemanticsOf; -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; import org.apache.causeway.applib.mixins.system.HasInteractionId; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FeatureType; @@ -35,7 +34,6 @@ import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract; import org.apache.causeway.core.metamodel.facets.members.publish.command.CommandPublishingFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.members.publish.execution.ExecutionPublishingPropertyFacetForPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.PropertyDomainEventDefaultFacetForDomainObjectAnnotation; import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.facets.properties.projection.ProjectingFacetFromPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.disabled.DisabledFacetForPropertyAnnotation; @@ -45,23 +43,17 @@ import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetInvertedByNullableAnnotationOnProperty; import org.apache.causeway.core.metamodel.facets.properties.property.maxlength.MaxLengthFacetForPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromPropertyAnnotation; +import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEvent; +import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet; +import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEvent; import org.apache.causeway.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.regex.RegExFacetForPatternAnnotationOnProperty; import org.apache.causeway.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.snapshot.SnapshotExcludeFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet; import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.specloader.validator.MetaModelValidatorForAmbiguousMixinAnnotations; import org.apache.causeway.core.metamodel.specloader.validator.MetaModelValidatorForConflictingOptionality; -import org.apache.causeway.core.metamodel.util.EventUtil; import lombok.val; @@ -136,76 +128,35 @@ void processModify(final ProcessMethodContext processMethodContext, final Option // // search for @Property(domainEvent=...), else use default event type - val propertyDomainEventFacet = propertyIfAny - .map(Property::domainEvent) - .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class) - .map(domainEvent -> (PropertyDomainEventFacetAbstract) new PropertyDomainEventFacetForPropertyAnnotation( - defaultFromDomainObjectIfRequired(typeSpec, domainEvent), getterFacet, holder)) - .orElse(new PropertyDomainEventFacetDefault( - defaultFromDomainObjectIfRequired(typeSpec, PropertyDomainEvent.Default.class), getterFacet, - holder)); - - if(EventUtil.eventTypeIsPostable( - propertyDomainEventFacet.getEventType(), - PropertyDomainEvent.Noop.class, - PropertyDomainEvent.Default.class, - getConfiguration().getApplib().getAnnotation().getProperty().getDomainEvent().isPostForDefault() - )) { - addFacet(propertyDomainEventFacet); - } - - - // - // if the property is mutable, then replace the current setter and clear facets with equivalents that - // emit the appropriate domain event and then delegate onto the underlying - // + PropertyDomainEventFacet + .createRegular(propertyIfAny, typeSpec, getterFacet, holder) + .ifPresent(propertyDomainEventFacet->{ - final PropertySetterFacet setterFacet = holder.getFacet(PropertySetterFacet.class); - if(setterFacet != null) { - // the current setter facet will end up as the underlying facet - final PropertySetterFacet replacementFacet; - - if(propertyDomainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation) { - replacementFacet = new PropertySetterFacetForDomainEventFromPropertyAnnotation( - propertyDomainEventFacet.getEventType(), getterFacet, setterFacet, propertyDomainEventFacet, holder); - } else - // default - { - replacementFacet = new PropertySetterFacetForDomainEventFromDefault( - propertyDomainEventFacet.getEventType(), getterFacet, setterFacet, propertyDomainEventFacet, holder); - } - addFacet(replacementFacet); - } - - final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class); - if(clearFacet != null) { - // the current clear facet will end up as the underlying facet - final PropertyClearFacet replacementFacet; - - if(propertyDomainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation) { - replacementFacet = new PropertyClearFacetForDomainEventFromPropertyAnnotation( - propertyDomainEventFacet.getEventType(), getterFacet, clearFacet, propertyDomainEventFacet, holder); - } else - // default - { - replacementFacet = new PropertyClearFacetForDomainEventFromDefault( - propertyDomainEventFacet.getEventType(), getterFacet, clearFacet, propertyDomainEventFacet, holder); - } - addFacet(replacementFacet); - } - } + addFacet(propertyDomainEventFacet); - public static Class> defaultFromDomainObjectIfRequired( - final ObjectSpecification typeSpec, - final Class> propertyDomainEventType) { - if (propertyDomainEventType == PropertyDomainEvent.Default.class) { - final PropertyDomainEventDefaultFacetForDomainObjectAnnotation typeFromDomainObject = - typeSpec.getFacet(PropertyDomainEventDefaultFacetForDomainObjectAnnotation.class); - if (typeFromDomainObject != null) { - return typeFromDomainObject.getEventType(); - } - } - return propertyDomainEventType; + var eventType = propertyDomainEventFacet.getEventType(); + var eventTypeOrigin = propertyDomainEventFacet.getEventTypeOrigin(); + + // + // if the property is mutable, then replace the current setter and clear facets with equivalents that + // emit the appropriate domain event and then delegate onto the underlying + // + + holder.lookupFacet(PropertySetterFacet.class) + .ifPresent(setterFacet-> + //TODO[CAUSEWAY-3409] we don't install those for the mixin case + // the current setter facet will end up as the underlying facet + addFacet(new PropertySetterFacetForDomainEvent( + eventType, eventTypeOrigin, getterFacet, setterFacet, holder))); + + + holder.lookupFacet(PropertyClearFacet.class) + .ifPresent(clearFacet-> + //TODO[CAUSEWAY-3409] we don't install those for the mixin case + // the current clear facet will end up as the underlying facet + addFacet(new PropertyClearFacetForDomainEvent( + eventType, eventTypeOrigin, getterFacet, clearFacet, holder))); + }); } void processHidden(final ProcessMethodContext processMethodContext, final Optional propertyIfAny) { diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEvent.java similarity index 74% rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromDefault.java rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEvent.java index 4d011ed387a..025f328b6fd 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromDefault.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEvent.java @@ -23,18 +23,17 @@ import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet; -public class PropertyClearFacetForDomainEventFromDefault +public class PropertyClearFacetForDomainEvent extends PropertySetterOrClearFacetForDomainEventAbstract implements PropertyClearFacet { - - public PropertyClearFacetForDomainEventFromDefault( + public PropertyClearFacetForDomainEvent( final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacet, - final PropertyClearFacet clearFacet, - final PropertyDomainEventFacetAbstract propertyInteractionFacet, - final FacetHolder holder) { + final EventTypeOrigin eventTypeOrigin, + final PropertyOrCollectionAccessorFacet getterFacet, + final PropertyClearFacet clearFacet, + final FacetHolder holder) { - super(PropertyClearFacet.class, eventType, getterFacet, null, clearFacet, propertyInteractionFacet, holder); + super(PropertyClearFacet.class, eventType, eventTypeOrigin, getterFacet, null, clearFacet, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromPropertyAnnotation.java deleted file mode 100644 index 57890d7765b..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventFromPropertyAnnotation.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.properties.property.modify; - -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet; - -public class PropertyClearFacetForDomainEventFromPropertyAnnotation -extends PropertySetterOrClearFacetForDomainEventAbstract -implements PropertyClearFacet { - - - public PropertyClearFacetForDomainEventFromPropertyAnnotation( - final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacet, - final PropertyClearFacet clearFacet, - final PropertyDomainEventFacetAbstract propertyInteractionFacet, - final FacetHolder holder) { - - super(PropertyClearFacet.class, eventType, getterFacet, null, clearFacet, propertyInteractionFacet, holder); - } -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java index 35755e3b4f7..564d5f005c6 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacet.java @@ -18,15 +18,241 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property.modify; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacet; +import java.lang.reflect.Method; +import java.util.Optional; +import java.util.function.BiConsumer; + +import org.apache.causeway.applib.annotation.Property; +import org.apache.causeway.applib.events.domain.AbstractDomainEvent; +import org.apache.causeway.applib.events.domain.PropertyDomainEvent; +import org.apache.causeway.applib.services.i18n.TranslatableString; +import org.apache.causeway.applib.services.i18n.TranslationContext; +import org.apache.causeway.applib.services.i18n.TranslationService; +import org.apache.causeway.commons.internal.base._Casts; +import org.apache.causeway.commons.internal.reflection._Annotations; +import org.apache.causeway.core.metamodel.consent.Consent.VetoReason; +import org.apache.causeway.core.metamodel.facetapi.Facet; +import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; +import org.apache.causeway.core.metamodel.facets.DomainEventHelper; +import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.PropertyDomainEventDefaultFacetForDomainObjectAnnotation; +import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.interactions.DisablingInteractionAdvisor; import org.apache.causeway.core.metamodel.interactions.HidingInteractionAdvisor; +import org.apache.causeway.core.metamodel.interactions.ProposedHolder; +import org.apache.causeway.core.metamodel.interactions.UsabilityContext; import org.apache.causeway.core.metamodel.interactions.ValidatingInteractionAdvisor; +import org.apache.causeway.core.metamodel.interactions.ValidityContext; +import org.apache.causeway.core.metamodel.interactions.VisibilityContext; +import org.apache.causeway.core.metamodel.object.ManagedObject; +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; +import org.apache.causeway.core.metamodel.specloader.specimpl.OneToOneAssociationMixedIn; +import org.apache.causeway.core.metamodel.util.EventUtil; -/** - * Corresponds to @Property(domainEvent=...) annotation in the Causeway programming model. - */ -public interface PropertyDomainEventFacet -extends SingleClassValueFacet, HidingInteractionAdvisor, DisablingInteractionAdvisor, ValidatingInteractionAdvisor { +import lombok.NonNull; +import lombok.val; + +public class PropertyDomainEventFacet +extends DomainEventFacetAbstract> +implements + HidingInteractionAdvisor, + DisablingInteractionAdvisor, + ValidatingInteractionAdvisor { + + // -- FACET TYPE + + private static Class type() { + return PropertyDomainEventFacet.class; + } + + // -- FACTORIES + + /** + * For regular (non mixed-in) members only. + *

+ * @return empty, if event is not post-able + */ + public static Optional createRegular( + final @NonNull Optional propertyIfAny, + final @NonNull ObjectSpecification typeSpec, + final @NonNull PropertyOrCollectionAccessorFacet getterFacet, + final @NonNull FacetHolder facetHolder) { + + val propertyDomainEventFacet = propertyIfAny + .map(Property::domainEvent) + .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class) + .map(domainEvent -> new PropertyDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, domainEvent), + EventTypeOrigin.ANNOTATED_MEMBER, getterFacet, facetHolder)) + .orElse(new PropertyDomainEventFacet( + defaultFromDomainObjectIfRequired(typeSpec, PropertyDomainEvent.Default.class), + EventTypeOrigin.DEFAULT, getterFacet, facetHolder)); + + return EventUtil.eventTypeIsPostable( + propertyDomainEventFacet.getEventType(), + PropertyDomainEvent.Noop.class, + PropertyDomainEvent.Default.class, + facetHolder.getConfiguration().getApplib().getAnnotation().getProperty().getDomainEvent().isPostForDefault()) + ? Optional.of(propertyDomainEventFacet) + : Optional.empty(); + } + + /** + * For mixed-in members. + */ + public static Optional createMixedIn( + final @NonNull ObjectSpecification mixeeSpecification, + final @NonNull OneToOneAssociationMixedIn mixedInProperty) { + + val facetedMethod = mixedInProperty.getFacetedMethod(); + final Method method = facetedMethod.getMethod().asMethodElseFail(); // no-arg method, should have a regular facade + + //TODO[CAUSEWAY-3409] what if the @Property annotation is not on the method but on the (mixin) type + final Property propertyAnnot = + _Annotations.synthesize(method, Property.class) + .orElse(null); + + if(propertyAnnot != null) { + final Class> propertyDomainEventType = + defaultFromDomainObjectIfRequired( + mixeeSpecification, propertyAnnot.domainEvent()); + val getterFacet = (PropertyOrCollectionAccessorFacet)null; + + return Optional.of( + new PropertyDomainEventFacet( + propertyDomainEventType, EventTypeOrigin.ANNOTATED_MEMBER, getterFacet, mixedInProperty)); + } + + return Optional.empty(); + } + + // -- CONSTRUCTION + + private final DomainEventHelper domainEventHelper; + + private final PropertyOrCollectionAccessorFacet getterFacetIfAny; + private final TranslationService translationService; + private final TranslationContext translationContext; + + /** + * @param getterFacetIfAny - will be null if this is for a mixin {@link OneToOneAssociationMixedIn}. + */ + protected PropertyDomainEventFacet( + final Class> eventType, + final EventTypeOrigin eventTypeOrigin, + final PropertyOrCollectionAccessorFacet getterFacetIfAny, + final FacetHolder holder) { + + super(type(), eventType, eventTypeOrigin, holder); + this.getterFacetIfAny = getterFacetIfAny; + + this.translationService = getTranslationService(); + this.translationContext = holder.getTranslationContext(); + + domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); + } + + @Override + public void initWithMixee(final ObjectSpecification mixeeSpec) { + if(!getEventTypeOrigin().isDefault()) return; // skip if already set explicitly + mixeeSpec + .lookupFacet(PropertyDomainEventDefaultFacetForDomainObjectAnnotation.class) + .ifPresent(facetOnMixee-> + super.updateEventType(facetOnMixee.getEventType(), EventTypeOrigin.ANNOTATED_OBJECT)); + } + + @Override + public String hides(final VisibilityContext ic) { + + final PropertyDomainEvent event = + domainEventHelper.postEventForProperty( + AbstractDomainEvent.Phase.HIDE, + _Casts.uncheckedCast(getEventType()), null, + getFacetHolder(), ic.getHead(), + null, null); + if (event != null && event.isHidden()) { + return "Hidden by subscriber"; + } + return null; + } + + @Override + public Optional disables(final UsabilityContext ic) { + + final PropertyDomainEvent event = + domainEventHelper.postEventForProperty( + AbstractDomainEvent.Phase.DISABLE, + _Casts.uncheckedCast(getEventType()), null, + getFacetHolder(), ic.getHead(), + null, null); + if (event != null + && event.isDisabled()) { + + final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable(); + final String reasonString = reasonTranslatable != null + ? reasonTranslatable.translate(translationService, translationContext) + : event.getDisabledReason(); + + return Optional.ofNullable(reasonString) + .map(VetoReason::explicit); + } + return Optional.empty(); + } + + @Override + public String invalidates(final ValidityContext ic) { + + if(getterFacetIfAny == null) { + return null; + } + + // if this is a mixin, then this ain't true. + if(!(ic instanceof ProposedHolder)) { + return null; + } + final ProposedHolder ph = (ProposedHolder) ic; + + final Object oldValue = getterFacetIfAny.getProperty(ic.getTarget(), ic.getInitiatedBy()); + final ManagedObject proposedAdapter = ph.getProposed(); + final Object proposedValue = proposedAdapter != null ? proposedAdapter.getPojo() : null; + + final PropertyDomainEvent event = + domainEventHelper.postEventForProperty( + AbstractDomainEvent.Phase.VALIDATE, + _Casts.uncheckedCast(getEventType()), null, + getFacetHolder(), ic.getHead(), + oldValue, proposedValue); + if (event != null && event.isInvalid()) { + final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable(); + if(reasonTranslatable != null) { + return reasonTranslatable.translate(translationService, translationContext); + } + return event.getInvalidityReason(); + } + + return null; + } + + + @Override + public void visitAttributes(final BiConsumer visitor) { + super.visitAttributes(visitor); + visitor.accept("getterFacet", getterFacetIfAny); + } + + // -- HELPER + + private static Class> defaultFromDomainObjectIfRequired( + final ObjectSpecification typeSpec, + final Class> propertyDomainEventType) { + if (propertyDomainEventType == PropertyDomainEvent.Default.class) { + final PropertyDomainEventDefaultFacetForDomainObjectAnnotation typeFromDomainObject = + typeSpec.getFacet(PropertyDomainEventDefaultFacetForDomainObjectAnnotation.class); + if (typeFromDomainObject != null) { + return typeFromDomainObject.getEventType(); + } + } + return propertyDomainEventType; + } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java deleted file mode 100644 index 614a515af75..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.properties.property.modify; - -import java.util.Optional; -import java.util.function.BiConsumer; - -import org.apache.causeway.applib.annotation.DomainObject; -import org.apache.causeway.applib.events.domain.AbstractDomainEvent; -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.applib.services.i18n.TranslatableString; -import org.apache.causeway.applib.services.i18n.TranslationContext; -import org.apache.causeway.applib.services.i18n.TranslationService; -import org.apache.causeway.commons.internal.base._Casts; -import org.apache.causeway.core.metamodel.consent.Consent.VetoReason; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.DomainEventHelper; -import org.apache.causeway.core.metamodel.facets.SingleClassValueFacetAbstract; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.interactions.ProposedHolder; -import org.apache.causeway.core.metamodel.interactions.UsabilityContext; -import org.apache.causeway.core.metamodel.interactions.ValidityContext; -import org.apache.causeway.core.metamodel.interactions.VisibilityContext; -import org.apache.causeway.core.metamodel.object.ManagedObject; -import org.apache.causeway.core.metamodel.specloader.specimpl.OneToOneAssociationMixedIn; - -public abstract class PropertyDomainEventFacetAbstract -extends SingleClassValueFacetAbstract implements PropertyDomainEventFacet { - - private final DomainEventHelper domainEventHelper; - - private final PropertyOrCollectionAccessorFacet getterFacetIfAny; - private final TranslationService translationService; - private final TranslationContext translationContext; - - /** - * @param getterFacetIfAny - will be null if this is for a mixin {@link OneToOneAssociationMixedIn}. - */ - public PropertyDomainEventFacetAbstract( - final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacetIfAny, - final FacetHolder holder ) { - - super(PropertyDomainEventFacet.class, holder, eventType); - this.eventType = eventType; - this.getterFacetIfAny = getterFacetIfAny; - - this.translationService = getTranslationService(); - this.translationContext = holder.getTranslationContext(); - - domainEventHelper = DomainEventHelper.ofServiceRegistry(getServiceRegistry()); - } - - private Class> eventType; - - @Override - public Class value() { - return eventType; - } - - public Class> getEventType() { - return _Casts.uncheckedCast(eventType); - } - - /** - * Can be overwritten if this facet is on a mixin where the subject (mixedInType) is annotated with - * {@link DomainObject#propertyDomainEvent()}. - */ - public void setEventType(final Class> eventType) { - this.eventType = eventType; - } - - @Override - public String hides(final VisibilityContext ic) { - - final PropertyDomainEvent event = - domainEventHelper.postEventForProperty( - AbstractDomainEvent.Phase.HIDE, - getEventType(), null, - getFacetHolder(), ic.getHead(), - null, null); - if (event != null && event.isHidden()) { - return "Hidden by subscriber"; - } - return null; - } - - @Override - public Optional disables(final UsabilityContext ic) { - - final PropertyDomainEvent event = - domainEventHelper.postEventForProperty( - AbstractDomainEvent.Phase.DISABLE, - getEventType(), null, - getFacetHolder(), ic.getHead(), - null, null); - if (event != null - && event.isDisabled()) { - - final TranslatableString reasonTranslatable = event.getDisabledReasonTranslatable(); - final String reasonString = reasonTranslatable != null - ? reasonTranslatable.translate(translationService, translationContext) - : event.getDisabledReason(); - - return Optional.ofNullable(reasonString) - .map(VetoReason::explicit); - } - return Optional.empty(); - } - - @Override - public String invalidates(final ValidityContext ic) { - - if(getterFacetIfAny == null) { - return null; - } - - // if this is a mixin, then this ain't true. - if(!(ic instanceof ProposedHolder)) { - return null; - } - final ProposedHolder ph = (ProposedHolder) ic; - - final Object oldValue = getterFacetIfAny.getProperty(ic.getTarget(), ic.getInitiatedBy()); - final ManagedObject proposedAdapter = ph.getProposed(); - final Object proposedValue = proposedAdapter != null ? proposedAdapter.getPojo() : null; - - final PropertyDomainEvent event = - domainEventHelper.postEventForProperty( - AbstractDomainEvent.Phase.VALIDATE, - getEventType(), null, - getFacetHolder(), ic.getHead(), - oldValue, proposedValue); - if (event != null && event.isInvalid()) { - final TranslatableString reasonTranslatable = event.getInvalidityReasonTranslatable(); - if(reasonTranslatable != null) { - return reasonTranslatable.translate(translationService, translationContext); - } - return event.getInvalidityReason(); - } - - return null; - } - - - @Override - public void visitAttributes(final BiConsumer visitor) { - super.visitAttributes(visitor); - visitor.accept("getterFacet", getterFacetIfAny); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java deleted file mode 100644 index 345f66ed08e..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetDefault.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.properties.property.modify; - -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.specloader.specimpl.OneToOneAssociationMixedIn; - -public class PropertyDomainEventFacetDefault extends PropertyDomainEventFacetAbstract { - - /** - * @param getterFacetIfAny - will be null if this is for a mixin {@link OneToOneAssociationMixedIn}. - */ - public PropertyDomainEventFacetDefault( - final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacetIfAny, - final FacetHolder holder) { - - super(eventType, getterFacetIfAny, holder); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java deleted file mode 100644 index 1979de2be9f..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPropertyAnnotation.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.properties.property.modify; - -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.specloader.specimpl.OneToOneAssociationMixedIn; - -public class PropertyDomainEventFacetForPropertyAnnotation extends PropertyDomainEventFacetAbstract { - - /** - * @param getterFacetIfAny - will be null if this is for a mixin {@link OneToOneAssociationMixedIn}. - */ - public PropertyDomainEventFacetForPropertyAnnotation( - final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacetIfAny, - final FacetHolder holder) { - super(eventType, getterFacetIfAny, holder); - } - - -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEvent.java similarity index 73% rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromDefault.java rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEvent.java index 5aea1911ea0..ade1fa2df24 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromDefault.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEvent.java @@ -23,19 +23,18 @@ import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet; -public class PropertySetterFacetForDomainEventFromDefault +public class PropertySetterFacetForDomainEvent extends PropertySetterOrClearFacetForDomainEventAbstract implements PropertySetterFacet { - - public PropertySetterFacetForDomainEventFromDefault( + public PropertySetterFacetForDomainEvent( final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacet, - final PropertySetterFacet setterFacet, - final PropertyDomainEventFacetAbstract propertyInteractionFacet, - final FacetHolder holder) { + final EventTypeOrigin eventTypeOrigin, + final PropertyOrCollectionAccessorFacet getterFacet, + final PropertySetterFacet setterFacet, + final FacetHolder holder) { - super(PropertySetterFacet.class, eventType, getterFacet, setterFacet, null, propertyInteractionFacet, holder); + super(PropertySetterFacet.class, eventType, eventTypeOrigin, getterFacet, setterFacet, null, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromPropertyAnnotation.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromPropertyAnnotation.java deleted file mode 100644 index 4103cecf755..00000000000 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventFromPropertyAnnotation.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets.properties.property.modify; - -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.facets.properties.update.modify.PropertySetterFacet; - -public class PropertySetterFacetForDomainEventFromPropertyAnnotation -extends PropertySetterOrClearFacetForDomainEventAbstract -implements PropertySetterFacet { - - - public PropertySetterFacetForDomainEventFromPropertyAnnotation( - final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacet, - final PropertySetterFacet setterFacet, - final PropertyDomainEventFacetAbstract propertyInteractionFacet, - final FacetHolder holder) { - - super(PropertySetterFacet.class, eventType, getterFacet, setterFacet, null, propertyInteractionFacet, holder); - } -} diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java index f57830b7e5d..2306ba8e274 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java @@ -28,8 +28,8 @@ import org.apache.causeway.core.metamodel.execution.InteractionInternal; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract; import org.apache.causeway.core.metamodel.facets.DomainEventHelper; -import org.apache.causeway.core.metamodel.facets.SingleValueFacetAbstract; import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearFacet; import org.apache.causeway.core.metamodel.facets.properties.update.clear.PropertyClearingAccessor; @@ -48,7 +48,7 @@ import lombok.val; public abstract class PropertySetterOrClearFacetForDomainEventAbstract -extends SingleValueFacetAbstract>> +extends DomainEventFacetAbstract> implements PropertyClearingAccessor, PropertySettingAccessor { @@ -62,13 +62,13 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract protected PropertySetterOrClearFacetForDomainEventAbstract( final Class facetType, final Class> eventType, - final PropertyOrCollectionAccessorFacet getterFacet, - final PropertySetterFacet setterFacet, - final PropertyClearFacet clearFacet, - final PropertyDomainEventFacetAbstract propertyDomainEventFacet, - final FacetHolder holder) { + final EventTypeOrigin eventTypeOrigin, + final PropertyOrCollectionAccessorFacet getterFacet, + final PropertySetterFacet setterFacet, + final PropertyClearFacet clearFacet, + final FacetHolder holder) { - super(facetType, eventType, holder); + super(facetType, eventType, eventTypeOrigin, holder); this.getterFacet = getterFacet; this.setterFacet = setterFacet; this.clearFacet = clearFacet; @@ -199,7 +199,7 @@ public Object execute(final PropertyEdit currentExecution) { val propertyDomainEvent = domainEventHelper.postEventForProperty( AbstractDomainEvent.Phase.EXECUTING, - PropertySetterOrClearFacetForDomainEventAbstract.this.getEventType(), null, + uncheckedCast(PropertySetterOrClearFacetForDomainEventAbstract.this.getEventType()), null, PropertySetterOrClearFacetForDomainEventAbstract.this.getFacetHolder(), head, oldValuePojo, newValuePojo); @@ -225,7 +225,8 @@ public Object execute(final PropertyEdit currentExecution) { // ... post the executed event domainEventHelper.postEventForProperty( AbstractDomainEvent.Phase.EXECUTED, - PropertySetterOrClearFacetForDomainEventAbstract.this.getEventType(), uncheckedCast(propertyDomainEvent), + uncheckedCast(PropertySetterOrClearFacetForDomainEventAbstract.this.getEventType()), + uncheckedCast(propertyDomainEvent), PropertySetterOrClearFacetForDomainEventAbstract.this.getFacetHolder(), head, oldValuePojo, actualNewValue); } @@ -279,10 +280,6 @@ private ManagedObject doSetOrClearProperty( ); } - public Class> getEventType() { - return uncheckedCast(value()); - } - private InteractionDtoFactory getInteractionDtoServiceInternal() { return getServiceRegistry().lookupServiceElseFail(InteractionDtoFactory.class); } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionHead.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionHead.java index a1af639dc67..2586c896c92 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionHead.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/InteractionHead.java @@ -63,9 +63,9 @@ public static InteractionHead mixin(final @NonNull ManagedObject owner, final @N /** * as used by the domain event subsystem - * @return optionally the owner, based on whether the target is a mixin + * @return optionally the owner (mixee), based on whether the target is a mixin */ - public Optional getMixedIn() { + public Optional getMixee() { return Objects.equals(getOwner(), getTarget()) ? Optional.empty() : Optional.of(getOwner()); diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java index d6913e8154e..d9d4fcaae55 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java @@ -18,39 +18,18 @@ */ package org.apache.causeway.core.metamodel.postprocessors.members; -import java.lang.reflect.Method; - import javax.inject.Inject; -import org.apache.causeway.applib.annotation.Collection; -import org.apache.causeway.applib.annotation.Property; -import org.apache.causeway.applib.events.domain.ActionDomainEvent; -import org.apache.causeway.applib.events.domain.CollectionDomainEvent; -import org.apache.causeway.applib.events.domain.PropertyDomainEvent; -import org.apache.causeway.commons.internal.reflection._Annotations; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FacetUtil; -import org.apache.causeway.core.metamodel.facets.FacetedMethod; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.collections.collection.CollectionAnnotationFacetFactory; import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacet; -import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.CollectionDomainEventDefaultFacetForDomainObjectAnnotation; -import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.PropertyDomainEventDefaultFacetForDomainObjectAnnotation; -import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; -import org.apache.causeway.core.metamodel.facets.properties.property.PropertyAnnotationFacetFactory; import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.postprocessors.ObjectSpecificationPostProcessorAbstract; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation; import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; -import org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionMixedIn; import org.apache.causeway.core.metamodel.specloader.specimpl.OneToManyAssociationMixedIn; import org.apache.causeway.core.metamodel.specloader.specimpl.OneToOneAssociationMixedIn; @@ -64,106 +43,47 @@ public TweakDomainEventsForMixinPostProcessor(final MetaModelContext metaModelCo @Override public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction objectAction) { - - if(objectAction instanceof ObjectActionMixedIn) { - // unlike collection and property mixins, there is no need to create the DomainEventFacet, it will - // have been created in the ActionAnnotationFacetFactory - final ActionDomainEventDefaultFacetForDomainObjectAnnotation actionDomainEventDefaultFacet = - objectSpecification.getFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class); - - if(actionDomainEventDefaultFacet != null) { - final ObjectActionMixedIn actionMixedIn = (ObjectActionMixedIn) objectAction; - final ActionDomainEventFacet actionFacet = actionMixedIn.getFacet(ActionDomainEventFacet.class); - if (actionFacet instanceof ActionDomainEventFacetAbstract) { - final ActionDomainEventFacetAbstract facetAbstract = (ActionDomainEventFacetAbstract) actionFacet; - if (facetAbstract.getEventType() == ActionDomainEvent.Default.class) { - final ActionDomainEventFacetAbstract existing = (ActionDomainEventFacetAbstract) actionFacet; - existing.setEventType(actionDomainEventDefaultFacet.getEventType()); - } - } - } + if(objectAction.isMixedIn()) { + + //TODO[CAUSEWAY-3409] yet already created in ActionAnnotationFacetFactory + //FacetUtil.addFacetIfPresent( + //ActionDomainEventFacet.createMixedIn(objectSpecification, (ObjectActionMixedIn)objectAction)); + //TODO[CAUSEWAY-3409] even when this lookup returns empty, we still might need an event-type holding facet + objectAction + .lookupFacet(ActionDomainEventFacet.class) + .ifPresent(actionDomainEventFacet-> + actionDomainEventFacet.initWithMixee(objectSpecification)); } } @Override public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation property) { - if(property instanceof OneToOneAssociationMixedIn) { - final OneToOneAssociationMixedIn propertyMixin = (OneToOneAssociationMixedIn) property; - final FacetedMethod facetedMethod = propertyMixin.getFacetedMethod(); - final Method method = facetedMethod.getMethod().asMethodElseFail(); // no-arg method, should have a regular facade - - { - // this is basically a subset of the code that is in CollectionAnnotationFacetFactory, - // ignoring stuff which is deprecated for Causeway v2 + if(property.isMixedIn()) { - final Property propertyAnnot = - _Annotations.synthesize(method, Property.class) - .orElse(null); - - if(propertyAnnot != null) { - final Class> propertyDomainEventType = - PropertyAnnotationFacetFactory.defaultFromDomainObjectIfRequired( - objectSpecification, propertyAnnot.domainEvent()); - final PropertyOrCollectionAccessorFacet getterFacetIfAny = null; - FacetUtil.addFacet( - new PropertyDomainEventFacetForPropertyAnnotation( - propertyDomainEventType, getterFacetIfAny, property)); - } - } - final PropertyDomainEventDefaultFacetForDomainObjectAnnotation propertyDomainEventDefaultFacet = - objectSpecification.getFacet(PropertyDomainEventDefaultFacetForDomainObjectAnnotation.class); - if(propertyDomainEventDefaultFacet != null) { - final PropertyDomainEventFacet propertyFacet = property.getFacet(PropertyDomainEventFacet.class); - if (propertyFacet instanceof PropertyDomainEventFacetAbstract) { - final PropertyDomainEventFacetAbstract facetAbstract = (PropertyDomainEventFacetAbstract) propertyFacet; - if (facetAbstract.getEventType() == PropertyDomainEvent.Default.class) { - final PropertyDomainEventFacetAbstract existing = (PropertyDomainEventFacetAbstract) propertyFacet; - existing.setEventType(propertyDomainEventDefaultFacet.getEventType()); - } - } - } + FacetUtil.addFacetIfPresent( + PropertyDomainEventFacet.createMixedIn(objectSpecification, (OneToOneAssociationMixedIn)property)); +//TODO[CAUSEWAY-3409] even when this lookup returns empty, we still might need an event-type holding facet + property + .lookupFacet(PropertyDomainEventFacet.class) + .ifPresent(propertyDomainEventFacet-> + propertyDomainEventFacet.initWithMixee(objectSpecification)); } } @Override public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation collection) { - if(collection instanceof OneToManyAssociationMixedIn) { - final OneToManyAssociationMixedIn collectionMixin = (OneToManyAssociationMixedIn) collection; - final FacetedMethod facetedMethod = collectionMixin.getFacetedMethod(); - final Method method = facetedMethod.getMethod().asMethodElseFail(); // no-arg method, should have a regular facade - - { - // this is basically a subset of the code that is in CollectionAnnotationFacetFactory, - // ignoring stuff which is deprecated for Causeway v2 - - final Collection collectionAnnot = - _Annotations.synthesize(method, Collection.class) - .orElse(null); + if(collection.isMixedIn()) { - if(collectionAnnot != null) { - final Class> collectionDomainEventType = - CollectionAnnotationFacetFactory.defaultFromDomainObjectIfRequired( - objectSpecification, collectionAnnot.domainEvent()); - FacetUtil.addFacet( - new CollectionDomainEventFacetForCollectionAnnotation( - collectionDomainEventType, collection)); - } + FacetUtil.addFacetIfPresent( + CollectionDomainEventFacet.createMixedIn(objectSpecification, (OneToManyAssociationMixedIn)collection)); +//TODO[CAUSEWAY-3409] even when this lookup returns empty, we still might need an event-type holding facet + collection + .lookupFacet(CollectionDomainEventFacet.class) + .ifPresent(collectionDomainEventFacet-> + collectionDomainEventFacet.initWithMixee(objectSpecification)); - final CollectionDomainEventDefaultFacetForDomainObjectAnnotation collectionDomainEventDefaultFacet = - objectSpecification.getFacet(CollectionDomainEventDefaultFacetForDomainObjectAnnotation.class); - if(collectionDomainEventDefaultFacet != null) { - final CollectionDomainEventFacet collectionFacet = collection.getFacet(CollectionDomainEventFacet.class); - if (collectionFacet instanceof CollectionDomainEventFacetAbstract) { - final CollectionDomainEventFacetAbstract facetAbstract = (CollectionDomainEventFacetAbstract) collectionFacet; - if (facetAbstract.getEventType() == CollectionDomainEvent.Default.class) { - final CollectionDomainEventFacetAbstract existing = (CollectionDomainEventFacetAbstract) collectionFacet; - existing.setEventType(collectionDomainEventDefaultFacet.getEventType()); - } - } - } - } } } diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java index 29eec9ce699..263d0ca7502 100644 --- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java +++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/ObjectAction.java @@ -404,7 +404,7 @@ public static String friendlyNameFor( final @NonNull ObjectAction action, final @NonNull InteractionHead head) { - val mixeeAdapter = head.getMixedIn().orElse(null); + val mixeeAdapter = head.getMixee().orElse(null); if(mixeeAdapter != null) { val mixinSpec = action.getDeclaringType(); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryJupiterTestCase.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryJupiterTestCase.java deleted file mode 100644 index 1b152f3b23c..00000000000 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryJupiterTestCase.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets; - -import java.lang.reflect.Method; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.mockito.Mockito; - -import org.apache.causeway.applib.Identifier; -import org.apache.causeway.applib.id.LogicalType; -import org.apache.causeway.commons.collections.ImmutableEnumSet; -import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; -import org.apache.causeway.core.metamodel._testing.MethodRemover_forTesting; -import org.apache.causeway.core.metamodel.context.HasMetaModelContext; -import org.apache.causeway.core.metamodel.context.MetaModelContext; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facetapi.FeatureType; -import org.apache.causeway.core.metamodel.facetapi.MethodRemover; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; -import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation; -import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter; -import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; -import org.apache.causeway.core.metamodel.valuesemantics.IntValueSemantics; - -import lombok.Getter; -import lombok.Setter; - -public abstract class AbstractFacetFactoryJupiterTestCase -implements HasMetaModelContext { - - @Getter(onMethod_ = {@Override}) - protected MetaModelContext metaModelContext; - - protected MethodRemover mockMethodRemover; - protected FacetHolder mockFacetHolder; - protected ObjectSpecification mockOnType; - protected ObjectSpecification mockObjSpec; - protected OneToOneAssociation mockOneToOneAssociation; - protected OneToManyAssociation mockOneToManyAssociation; - protected OneToOneActionParameter mockOneToOneActionParameter; - - protected FacetHolder facetHolder; - protected FacetedMethod facetedMethod; - protected FacetedMethodParameter facetedMethodParameter; - - public static class Customer { - @Getter @Setter private String firstName; - } - - protected void setUpMmc() { - metaModelContext = MetaModelContext_forTesting.builder() - .valueSemantic(new IntValueSemantics()) - .build(); - } - - @BeforeEach - protected void setUpFacetedMethodAndParameter() throws Exception { - - setUpMmc(); - - mockMethodRemover = Mockito.mock(MethodRemover.class); - mockFacetHolder = Mockito.mock(FacetHolder.class); - mockOnType = Mockito.mock(ObjectSpecification.class); - mockObjSpec = Mockito.mock(ObjectSpecification.class); - mockOneToOneAssociation = Mockito.mock(OneToOneAssociation.class); - mockOneToManyAssociation = Mockito.mock(OneToManyAssociation.class); - mockOneToOneActionParameter = Mockito.mock(OneToOneActionParameter.class); - - facetHolder = FacetHolder.simple( - getMetaModelContext(), - Identifier.propertyIdentifier(LogicalType.fqcn(Customer.class), "firstName")); - facetedMethod = facetedSetter( - AbstractFacetFactoryTest.Customer.class, "firstName"); - facetedMethodParameter = new FacetedMethodParameter(getMetaModelContext(), - FeatureType.ACTION_PARAMETER_SINGULAR, facetedMethod.getOwningType(), - facetedMethod.getMethod(), 0); - } - - @AfterEach - protected void tearDown() throws Exception { - facetHolder = null; - facetedMethod = null; - facetedMethodParameter = null; - } - - protected MethodRemover defaultMethodRemover() { - return new MethodRemover_forTesting(); - } - - protected FacetedMethod facetedSetter(final Class declaringClass, final String propertyName) { - return FacetedMethod.createSetterForProperty(getMetaModelContext(), - declaringClass, propertyName); - } - - protected FacetedMethod facetedAction(final Class declaringClass, final String methodName) { - return FacetedMethod.createForAction(getMetaModelContext(), - declaringClass, methodName); - } - - protected boolean contains(final Class[] types, final Class type) { - return Utils.contains(types, type); - } - - protected static boolean contains(final ImmutableEnumSet featureTypes, final FeatureType featureType) { - return Utils.contains(featureTypes, featureType); - } - - protected Method findMethod(final Class type, final String methodName, final Class[] methodTypes) { - return Utils.findMethod(type, methodName, methodTypes); - } - - protected Method findMethod(final Class type, final String methodName) { - return Utils.findMethod(type, methodName); - } - - protected void expectNoMethodsRemoved() { - Mockito.verifyNoInteractions(mockMethodRemover); - } - -} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryTest.java deleted file mode 100644 index 5caadfa6314..00000000000 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/AbstractFacetFactoryTest.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets; - -import java.lang.reflect.Method; -import java.util.Optional; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.mockito.Mockito; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.apache.causeway.applib.Identifier; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; -import org.apache.causeway.applib.id.LogicalType; -import org.apache.causeway.applib.services.i18n.TranslationService; -import org.apache.causeway.applib.services.iactnlayer.InteractionContext; -import org.apache.causeway.applib.services.iactnlayer.InteractionService; -import org.apache.causeway.commons.collections.ImmutableEnumSet; -import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; -import org.apache.causeway.core.metamodel._testing.MethodRemover_forTesting; -import org.apache.causeway.core.metamodel.context.MetaModelContext; -import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facetapi.FeatureType; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; -import org.apache.causeway.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory; -import org.apache.causeway.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory; -import org.apache.causeway.core.metamodel.facets.properties.propertylayout.PropertyLayoutFacetFactory; -import org.apache.causeway.core.security.authentication.InteractionContextFactory; - -public abstract class AbstractFacetFactoryTest { - - public static class Customer { - - private String firstName; - - public String getFirstName() { - return firstName; - } - - public void setFirstName(final String firstName) { - this.firstName = firstName; - } - } - - protected TranslationService mockTranslationService; - protected InteractionService mockInteractionService; - protected final InteractionContext iaContext = InteractionContextFactory.testing(); - protected MethodRemover_forTesting methodRemover; - - protected FacetHolder facetHolder; - protected FacetedMethod facetedMethod; - protected FacetedMethodParameter facetedMethodParameter; - protected MetaModelContext_forTesting metaModelContext; - - @BeforeEach - protected void setUp() throws Exception { - - mockTranslationService = Mockito.mock(TranslationService.class); - mockInteractionService = Mockito.mock(InteractionService.class); - - methodRemover = new MethodRemover_forTesting(); - - metaModelContext = MetaModelContext_forTesting.builder() - .translationService(mockTranslationService) - .interactionService(mockInteractionService) - .build(); - - Mockito.when(mockInteractionService.currentInteractionContext()).thenReturn(Optional.of(iaContext)); - - facetHolder = FacetHolder.simple( - metaModelContext, - Identifier.propertyIdentifier(LogicalType.fqcn(Customer.class), "firstName")); - - facetedMethod = FacetedMethod.createSetterForProperty(metaModelContext, Customer.class, "firstName"); - facetedMethodParameter = new FacetedMethodParameter( - metaModelContext, - FeatureType.ACTION_PARAMETER_SINGULAR, - facetedMethod.getOwningType(), - facetedMethod.getMethod(), 0); - } - - @AfterEach - protected void tearDown() throws Exception { - methodRemover = null; - facetedMethod = null; - } - - protected static boolean contains(final Class[] types, final Class type) { - return Utils.contains(types, type); - } - - protected static boolean contains(final ImmutableEnumSet featureTypes, final FeatureType featureType) { - return Utils.contains(featureTypes, featureType); - } - - protected static Method findMethod(final Class type, final String methodName, final Class[] signature) { - return Utils.findMethod(type, methodName, signature); - } - - protected Method findMethod(final Class type, final String methodName) { - return Utils.findMethod(type, methodName); - } - - protected void processMethod( - final FacetFactory facetFactory, - final Class type, - final String methodName, - final Class[] signature) { - - facetFactory.process(ProcessMethodContext - .forTesting(type, null, - findMethod(type, methodName, signature), - methodRemover, facetedMethod)); - } - - protected void processParams( - final FacetFactory facetFactory, - final Class type, - final String methodName, - final Class[] signature) { - - facetFactory.processParams(FacetFactory.ProcessParameterContext - .forTesting(type, IntrospectionPolicy.ANNOTATION_OPTIONAL, - findMethod(type, methodName, signature), - null, facetedMethodParameter)); - } - - protected void assertNoMethodsRemoved() { - assertTrue(methodRemover.getRemovedMethodMethodCalls().isEmpty()); - assertTrue(methodRemover.getRemoveMethodArgsCalls().isEmpty()); - } - - // -- FACTORIES - - protected static PropertyLayoutFacetFactory createPropertyLayoutFacetFactory(final MetaModelContext mmc) { - return new PropertyLayoutFacetFactory(mmc); - } - - protected static CollectionLayoutFacetFactory createCollectionLayoutFacetFactory(final MetaModelContext mmc) { - return new CollectionLayoutFacetFactory(mmc); - } - - protected static ActionLayoutFacetFactory createActionLayoutFacetFactory(final MetaModelContext mmc) { - return new ActionLayoutFacetFactory(mmc); - } - - -} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java index b8e14db1e17..727e10932f0 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newActionInteractionEvent.java @@ -44,7 +44,7 @@ public void defaultEventType() throws Exception { final SomeDomainObject sdo = new SomeDomainObject(); final Identifier identifier = Identifier.actionIdentifier(LogicalType.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class}); - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final ActionDomainEvent ev = DomainEventHelper.newActionDomainEvent( ActionDomainEvent.Default.class, identifier, sdo, new Object[]{1, "bar"}); assertSame(ev.getSource(), sdo); @@ -59,7 +59,7 @@ public void actionInvokedEventDefaultEventType() throws Exception { final SomeDomainObject sdo = new SomeDomainObject(); final Identifier identifier = Identifier.actionIdentifier(LogicalType.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class}); - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final ActionDomainEvent ev = DomainEventHelper.newActionDomainEvent( ActionDomainEvent.Default.class, identifier, sdo, new Object[]{1, "bar"}); assertSame(ev.getSource(), sdo); @@ -74,7 +74,7 @@ public void customEventType() throws Exception { final SomeDomainObject sdo = new SomeDomainObject(); final Identifier identifier = Identifier.actionIdentifier(LogicalType.fqcn(SomeDomainObject.class), "foo", new Class[]{int.class, String.class}); - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final ActionDomainEvent ev = DomainEventHelper.newActionDomainEvent( SomeDomainObjectFooInvokedDomainEvent.class, identifier, sdo, new Object[]{1, "bar"}); assertSame(ev.getSource(), sdo); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java index b84ae842f55..bba85e45632 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forAdd.java @@ -47,7 +47,7 @@ public void defaultEventType() throws Exception { final Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( CollectionDomainEvent.Default.class, null, identifier, sdo); assertSame(ev.getSource(), sdo); assertThat(ev.getIdentifier(), is(identifier)); @@ -60,7 +60,7 @@ public void collectionAddedToDefaultEventType() throws Exception { final Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo); assertSame(ev.getSource(), sdo); assertThat(ev.getIdentifier(), is(identifier)); @@ -73,7 +73,7 @@ public void customEventType() throws Exception { final Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( SomeDomainObjectCollectionDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo); assertThat(ev.getSource(), is(sdo)); assertThat(ev.getIdentifier(), is(identifier)); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java index 15ce1b1a0f4..018c24fa681 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newCollectionDomainEvent_forRemove.java @@ -47,7 +47,7 @@ public void defaultEventType() throws Exception { Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo); assertSame(ev.getSource(), sdo); assertThat(ev.getIdentifier(), is(identifier)); @@ -60,7 +60,7 @@ public void collectionRemovedFromDefaultEventType() throws Exception { Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( CollectionDomainEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo); assertSame(ev.getSource(), sdo); assertThat(ev.getIdentifier(), is(identifier)); @@ -73,7 +73,7 @@ public void customEventType() throws Exception { Identifier identifier = Identifier.collectionIdentifier( LogicalType.fqcn(SomeDomainObject.class), "references"); - final CollectionDomainEvent ev = Utils.domainEventHelper().newCollectionDomainEvent( + final CollectionDomainEvent ev = _Utils.domainEventHelper().newCollectionDomainEvent( SomeDomainObjectCollectionRemovedFromDomainEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo); assertThat(ev.getSource(), is(sdo)); assertThat(ev.getIdentifier(), is(identifier)); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java index 7b7d1f74fd8..4922496b0e8 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java @@ -48,7 +48,7 @@ public void defaultEventType() throws Exception { LocalDate oldValue = LocalDate.of(2013,4,1); LocalDate newValue = null; - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final PropertyDomainEvent ev = DomainEventHelper.newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue); assertSame(ev.getSource(), sdo); @@ -67,7 +67,7 @@ public void customEventType() throws Exception { LocalDate oldValue = LocalDate.of(2013,4,1); LocalDate newValue = null; - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final PropertyDomainEvent ev = DomainEventHelper.newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue); assertSame(ev.getSource(), sdo); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java index 98ba96faed7..4f6bcff2be8 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java @@ -45,7 +45,7 @@ public void defaultEventType() throws Exception { LocalDate oldValue = LocalDate.of(2013,4,1); LocalDate newValue = LocalDate.of(2013,5,2); - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final PropertyDomainEvent ev = DomainEventHelper.newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue); assertThat(ev.getSource(), is((Object)sdo)); @@ -64,7 +64,7 @@ public void customEventType() throws Exception { LocalDate oldValue = LocalDate.of(2013,4,1); LocalDate newValue = LocalDate.of(2013,5,2); - Utils.domainEventHelper(); + _Utils.domainEventHelper(); final PropertyDomainEvent ev = DomainEventHelper.newPropertyDomainEvent(SomeDatePropertyChangedDomainEvent.class, identifier, sdo, oldValue, newValue); assertThat(ev.getSource(), is(sdo)); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java new file mode 100644 index 00000000000..5fbd61fcef1 --- /dev/null +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/FacetFactoryTestAbstract.java @@ -0,0 +1,284 @@ +/* + * 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.causeway.core.metamodel.facets; + +import java.lang.reflect.Method; +import java.util.Optional; +import java.util.function.BiConsumer; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.apache.causeway.applib.Identifier; +import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; +import org.apache.causeway.applib.id.LogicalType; +import org.apache.causeway.applib.services.i18n.TranslationService; +import org.apache.causeway.applib.services.iactnlayer.InteractionContext; +import org.apache.causeway.applib.services.iactnlayer.InteractionService; +import org.apache.causeway.commons.collections.ImmutableEnumSet; +import org.apache.causeway.commons.internal.assertions._Assert; +import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; +import org.apache.causeway.core.metamodel._testing.MethodRemover_forTesting; +import org.apache.causeway.core.metamodel.context.HasMetaModelContext; +import org.apache.causeway.core.metamodel.context.MetaModelContext; +import org.apache.causeway.core.metamodel.facetapi.FacetHolder; +import org.apache.causeway.core.metamodel.facetapi.FeatureType; +import org.apache.causeway.core.metamodel.facetapi.MethodRemover; +import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessParameterContext; +import org.apache.causeway.core.metamodel.valuesemantics.IntValueSemantics; +import org.apache.causeway.core.security.authentication.InteractionContextFactory; + +import lombok.Getter; +import lombok.NonNull; +import lombok.val; +import lombok.experimental.Accessors; + +public abstract class FacetFactoryTestAbstract +implements HasMetaModelContext { + + // -- SCENARIO HELPER + + @lombok.Value + @Getter @Accessors(fluent=true) + public static class Scenario { + private final Class declaringClass; + private final String memberId; + private final Method annotatedMethod; + private final FacetHolder facetHolder; + private final FacetedMethod facetedMethod; + private final FacetedMethodParameter facetedMethodParameter; + + public static Scenario act( + final @NonNull MetaModelContext mmc, + final Class declaringClass, final String memberId) { + + val facetHolder = facetHolder(mmc, declaringClass, memberId); + val actionMethod = _Utils.findMethodByNameOrFail(declaringClass, memberId); + val facetedMethod = FacetedMethod.createForAction(mmc, declaringClass, memberId, actionMethod.getParameterTypes()); + val facetedMethodParameter = + actionMethod.getParameterCount()==0 + ? (FacetedMethodParameter)null + : new FacetedMethodParameter(mmc, + FeatureType.ACTION_PARAMETER_SINGULAR, facetedMethod.getOwningType(), + facetedMethod.getMethod(), 0); + + return new Scenario(declaringClass, memberId, actionMethod, facetHolder, facetedMethod, facetedMethodParameter); + } + + public static Scenario prop( + final @NonNull MetaModelContext mmc, + final Class declaringClass, final String memberId) { + + val facetHolder = facetHolder(mmc, declaringClass, memberId); + val getter = _Utils.findGetterOrFail(declaringClass, memberId); + val facetedMethod = FacetedMethod.createForProperty(mmc, declaringClass, getter); + val facetedMethodParameter = (FacetedMethodParameter)null; + return new Scenario(declaringClass, memberId, getter, facetHolder, facetedMethod, facetedMethodParameter); + } + + private static FacetHolder facetHolder( + final @NonNull MetaModelContext mmc, + final Class declaringClass, final String memberId) { + return FacetHolder.simple(mmc, + Identifier.propertyIdentifier(LogicalType.fqcn(declaringClass), memberId)); + } + + } + + // -- + + @Getter(onMethod_ = {@Override}) + private MetaModelContext metaModelContext; + + private TranslationService mockTranslationService; + private InteractionService mockInteractionService; + private final InteractionContext iaContext = InteractionContextFactory.testing(); + protected MethodRemover_forTesting methodRemover; //TODO[CAUSEWAY-3409] make private + + /** + * Override, if a custom {@link MetaModelContext_forTesting} is required for certain tests. + */ + protected MetaModelContext_forTesting setUpMmc( + final MetaModelContext_forTesting.MetaModelContext_forTestingBuilder builder) { + return builder.build(); + } + + @BeforeEach + protected void setUpAll() { + + mockTranslationService = Mockito.mock(TranslationService.class); + mockInteractionService = Mockito.mock(InteractionService.class); + + methodRemover = new MethodRemover_forTesting(); + + metaModelContext = setUpMmc(MetaModelContext_forTesting.builder() + .translationService(mockTranslationService) + .interactionService(mockInteractionService) + .valueSemantic(new IntValueSemantics())); + + Mockito.when(mockInteractionService.currentInteractionContext()).thenReturn(Optional.of(iaContext)); + } + + @AfterEach + protected void tearDownAll() { + methodRemover = null; + } + + @FunctionalInterface + public static interface MemberScenarioConsumer { + void accept( + ProcessMethodContext processMethodContext, + FacetHolder facetHolder, + FacetedMethod facetedMethod, + FacetedMethodParameter facetedMethodParameter); + } + + @FunctionalInterface + public static interface ParameterScenarioConsumer { + void accept( + ProcessParameterContext processParameterContext, + FacetHolder facetHolder, + FacetedMethod facetedMethod, + FacetedMethodParameter facetedMethodParameter); + } + + /** + * Action scenario. + */ + protected void actionScenario( + final Class declaringClass, final String actionName, final MemberScenarioConsumer consumer) { + val scenario = Scenario.act(getMetaModelContext(), declaringClass, actionName); + val processMethodContext = ProcessMethodContext + .forTesting(declaringClass, FeatureType.ACTION, scenario.annotatedMethod(), methodRemover, scenario.facetedMethod()); + consumer.accept(processMethodContext, scenario.facetHolder, scenario.facetedMethod, scenario.facetedMethodParameter); + } + + /** + * Action Parameter scenario. + */ + protected void parameterScenario( + final Class declaringClass, final String actionName, final int paramIndex, + final ParameterScenarioConsumer consumer) { + _Assert.assertEquals(0, paramIndex, ()->"not yet implemented otherwise"); + val scenario = Scenario.act(getMetaModelContext(), declaringClass, actionName); + val processParameterContext = + FacetFactory.ProcessParameterContext.forTesting( + declaringClass, IntrospectionPolicy.ANNOTATION_OPTIONAL, scenario.annotatedMethod(), null, scenario.facetedMethodParameter()); + consumer.accept(processParameterContext, scenario.facetHolder, scenario.facetedMethod, scenario.facetedMethodParameter); + } + + /** + * Property scenario. + */ + protected void propertyScenario( + final Class declaringClass, final String propertyName, final MemberScenarioConsumer consumer) { + val scenario = Scenario.prop(getMetaModelContext(), declaringClass, propertyName); + val processMethodContext = ProcessMethodContext + .forTesting(declaringClass, FeatureType.PROPERTY, scenario.annotatedMethod(), methodRemover, scenario.facetedMethod()); + consumer.accept(processMethodContext, scenario.facetHolder, scenario.facetedMethod, scenario.facetedMethodParameter); + } + + /** + * Collection scenario. + */ + protected void collectionScenario( + final Class declaringClass, final String propertyName, final MemberScenarioConsumer consumer) { + val scenario = Scenario.prop(getMetaModelContext(), declaringClass, propertyName); + val processMethodContext = ProcessMethodContext + .forTesting(declaringClass, FeatureType.COLLECTION, scenario.annotatedMethod(), methodRemover, scenario.facetedMethod()); + consumer.accept(processMethodContext, scenario.facetHolder, scenario.facetedMethod, scenario.facetedMethodParameter); + } + + /** + * DomainObject scenario. + */ + protected void objectScenario(final Class declaringClass, final BiConsumer consumer) { + val facetHolder = FacetHolder.simple(getMetaModelContext(), + Identifier.classIdentifier(LogicalType.fqcn(declaringClass))); + val processClassContext = ProcessClassContext + .forTesting(declaringClass, methodRemover, facetHolder); + consumer.accept(processClassContext, facetHolder); + } + + protected MethodRemover defaultMethodRemover() { + return new MethodRemover_forTesting(); + } + + protected FacetedMethod facetedSetter(final Class declaringClass, final String propertyName) { + return FacetedMethod.createSetterForProperty(getMetaModelContext(), + declaringClass, propertyName); + } + + protected FacetedMethod facetedAction(final Class declaringClass, final String methodName) { + return FacetedMethod.createForAction(getMetaModelContext(), + declaringClass, methodName); + } + + protected boolean contains(final Class[] types, final Class type) { + return _Utils.contains(types, type); + } + + protected static boolean contains(final ImmutableEnumSet featureTypes, final FeatureType featureType) { + return _Utils.contains(featureTypes, featureType); + } + + protected Method findMethodExactOrFail(final Class type, final String methodName, final Class[] methodTypes) { + return _Utils.findMethodExactOrFail(type, methodName, methodTypes); + } + + protected Method findMethodExactOrFail(final Class type, final String methodName) { + return _Utils.findMethodExactOrFail(type, methodName); + } + + protected Optional findMethodExact(final Class type, final String methodName) { + return _Utils.findMethodExact(type, methodName); + } + + // -- EXPECTATIONS + + protected final void assertNoMethodsRemoved() { + assertTrue(methodRemover.getRemovedMethodMethodCalls().isEmpty()); + assertTrue(methodRemover.getRemoveMethodArgsCalls().isEmpty()); + } + + protected final void assertMethodWasRemoved(final Method method) { + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method)); + } + + public void assertMethodEquals(final Method a, final Method b) { + assertEquals(a.getName(), b.getName()); + assertEquals(a.getParameterCount(), b.getParameterCount()); + assertArrayEquals(a.getParameterTypes(), b.getParameterTypes()); + + val ownerA = a.getDeclaringClass(); + val ownerB = b.getDeclaringClass(); + + assertTrue(ownerA.isAssignableFrom(ownerB) + || ownerB.isAssignableFrom(ownerA)); + + } + +} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/Utils.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/Utils.java deleted file mode 100644 index 67b62290e8b..00000000000 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/Utils.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.causeway.core.metamodel.facets; - -import java.lang.reflect.Method; - -import org.apache.causeway.commons.collections.ImmutableEnumSet; -import org.apache.causeway.commons.internal._Constants; -import org.apache.causeway.core.metamodel.facetapi.FeatureType; - -class Utils { - - static DomainEventHelper domainEventHelper() { - return DomainEventHelper.ofEventService(null); - } - - protected static boolean contains(final Class[] array, final Class val) { - for (final Class element : array) { - if (element == val) { - return true; - } - } - return false; - } - - protected static boolean contains(ImmutableEnumSet featureTypes, final FeatureType featureType) { - if(featureTypes==null || featureType==null) { - return false; - } - return featureTypes.contains(featureType); - } - - protected static Method findMethod(final Class type, final String methodName, final Class[] methodTypes) { - try { - return type.getMethod(methodName, methodTypes); - } catch (final SecurityException e) { - return null; - } catch (final NoSuchMethodException e) { - return null; - } - } - - protected static Method findMethod(final Class type, final String methodName) { - return findMethod(type, methodName, _Constants.emptyClasses); - } - -} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/_Utils.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/_Utils.java new file mode 100644 index 00000000000..93ecefb123c --- /dev/null +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/_Utils.java @@ -0,0 +1,98 @@ +/* + * 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.causeway.core.metamodel.facets; + +import java.lang.reflect.Method; +import java.util.Optional; + +import org.apache.causeway.commons.collections.Can; +import org.apache.causeway.commons.collections.ImmutableEnumSet; +import org.apache.causeway.commons.internal._Constants; +import org.apache.causeway.commons.internal.base._Strings; +import org.apache.causeway.commons.internal.exceptions._Exceptions; +import org.apache.causeway.commons.internal.reflection._ClassCache; +import org.apache.causeway.core.metamodel.facetapi.FeatureType; + +import lombok.val; + +class _Utils { + + static DomainEventHelper domainEventHelper() { + return DomainEventHelper.ofEventService(null); + } + + protected static boolean contains(final Class[] array, final Class val) { + for (final Class element : array) { + if (element == val) { + return true; + } + } + return false; + } + + protected static boolean contains(final ImmutableEnumSet featureTypes, final FeatureType featureType) { + if(featureTypes==null || featureType==null) { + return false; + } + return featureTypes.contains(featureType); + } + + protected static Optional findMethodExact(final Class type, final String methodName, final Class[] methodTypes) { + try { + return Optional.ofNullable(type.getMethod(methodName, methodTypes)); + } catch (final SecurityException e) { + return Optional.empty(); + } catch (final NoSuchMethodException e) { + return Optional.empty(); + } + } + + protected static Optional findMethodExact(final Class type, final String methodName) { + return findMethodExact(type, methodName, _Constants.emptyClasses); + } + + protected static Method findMethodExactOrFail(final Class type, final String methodName, final Class[] methodTypes) { + return findMethodExact(type, methodName, methodTypes) + .orElseThrow(()-> + _Exceptions.noSuchElement("method '%s' not found in %s", methodName, type)); + } + + protected static Method findMethodExactOrFail(final Class type, final String methodName) { + return findMethodExactOrFail(type, methodName, _Constants.emptyClasses); + } + + protected static Can findMethodsByName(final Class type, final String methodName) { + return _ClassCache.getInstance().streamPublicOrDeclaredMethods(type) + .filter(method->method.getName().equals(methodName)) + .collect(Can.toCan()); + } + + protected static Method findMethodByNameOrFail(final Class type, final String methodName) { + return findMethodsByName(type, methodName).getSingletonOrFail(); + } + + protected static Method findGetterOrFail(final Class declaringClass, final String propertyName) { + val getter = _Utils.findMethodExact(declaringClass, "get" + _Strings.capitalize(propertyName)) + .or(()->_Utils.findMethodExact(declaringClass, "is" + _Strings.capitalize(propertyName))) + .orElseThrow(()-> + _Exceptions.noSuchElement("getter '%s' not found in %s", propertyName, declaringClass)); + return getter; + } + +} diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java index b1b9e06729b..ed3957a8ca0 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java @@ -22,20 +22,18 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.Set; -import org.mockito.Mockito; +import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.commons.internal.reflection._MethodFacades; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FeatureType; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.FacetedMethod; import org.apache.causeway.core.metamodel.facets.actions.validate.ActionValidationFacet; import org.apache.causeway.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethod; @@ -49,103 +47,84 @@ import org.apache.causeway.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet; import org.apache.causeway.core.metamodel.facets.param.defaults.methodnum.ActionParameterDefaultsFacetViaMethod; import org.apache.causeway.core.metamodel.facets.param.defaults.methodnum.ActionParameterDefaultsFacetViaMethodFactory; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import lombok.val; -class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest { +class ActionMethodsFacetFactoryTest +extends FacetFactoryTestAbstract { - @Override - public void setUp() throws Exception { - super.setUp(); - - val specLoader = metaModelContext.getSpecificationLoader(); - ObjectSpecification voidSpec = specLoader.loadSpecification(void.class); - - Mockito.when(mockInteractionService.currentInteractionContext()).thenReturn(Optional.of(iaContext)); - } - - public void testInstallsValidateMethodNoArgsFacetAndRemovesMethod() { - val facetFactory = new ActionValidationFacetViaMethodFactory(metaModelContext); + @Test + void installsValidateMethodNoArgsFacetAndRemovesMethod() { + val facetFactory = new ActionValidationFacetViaMethodFactory(getMetaModelContext()); @SuppressWarnings("unused") class Customer { + public void someAction() {} + public String validateSomeAction() { return null;} + } - public void someAction() { - } + final Method validateMethod = findMethodExactOrFail(Customer.class, "validateSomeAction"); - public String validateSomeAction() { - return null; - } - } - final Method actionMethod = findMethod(Customer.class, "someAction"); - final Method validateMethod = findMethod(Customer.class, "validateSomeAction"); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.process(processMethodContext); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod)); + //then + final Facet facet = facetedMethod.getFacet(ActionValidationFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionValidationFacetViaMethod); + val actionValidationFacetViaMethod = (ActionValidationFacetViaMethod) facet; + assertMethodEquals(validateMethod, actionValidationFacetViaMethod.getMethods().getFirstElseFail().asMethodElseFail()); - final Facet facet = facetedMethod.getFacet(ActionValidationFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionValidationFacetViaMethod); - final ActionValidationFacetViaMethod actionValidationFacetViaMethod = (ActionValidationFacetViaMethod) facet; - assertEquals(validateMethod, actionValidationFacetViaMethod.getMethods().getFirstElseFail()); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod)); + }); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod)); } - public void testInstallsValidateMethodSomeArgsFacetAndRemovesMethod() { - val facetFactory = new ActionValidationFacetViaMethodFactory(metaModelContext); + @Test + void installsValidateMethodSomeArgsFacetAndRemovesMethod() { + val facetFactory = new ActionValidationFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final int x, final int y) { - } - - @SuppressWarnings("unused") - public String validateSomeAction(final int x, final int y) { - return null; - } + public void someAction(final int x, final int y) {} + public String validateSomeAction(final int x, final int y) { return null;} } - final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, int.class }); - final Method validateMethod = findMethod(Customer.class, "validateSomeAction", new Class[] { int.class, int.class }); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetedMethod)); + final Method validateMethod = findMethodExactOrFail(Customer.class, "validateSomeAction", new Class[] { int.class, int.class }); - final Facet facet = facetedMethod.getFacet(ActionValidationFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionValidationFacetViaMethod); - final ActionValidationFacetViaMethod actionValidationFacetViaMethod = (ActionValidationFacetViaMethod) facet; - assertEquals(validateMethod, actionValidationFacetViaMethod.getMethods().getFirstElseFail()); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.process(processMethodContext); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod)); + //then + final Facet facet = facetedMethod.getFacet(ActionValidationFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionValidationFacetViaMethod); + val actionValidationFacetViaMethod = (ActionValidationFacetViaMethod) facet; + assertMethodEquals(validateMethod, actionValidationFacetViaMethod.getMethods().getFirstElseFail().asMethodElseFail()); + + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(validateMethod)); + }); } - public void testInstallsParameterDefaultsMethodAndRemovesMethod() { - val facetFactory = new ActionParameterDefaultsFacetViaMethodFactory(metaModelContext); + @Test + void installsParameterDefaultsMethodAndRemovesMethod() { + val facetFactory = new ActionParameterDefaultsFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final int x, final long y) { - } - - @SuppressWarnings("unused") - public int default0SomeAction() { - return 0; - } - - @SuppressWarnings("unused") - public long default1SomeAction() { - return 0; - } + public void someAction(final int x, final long y) {} + public int default0SomeAction() { return 0; } + public long default1SomeAction() { return 0; } } - final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class }); - final Method default0Method = findMethod(Customer.class, "default0SomeAction", new Class[] {}); - final Method default1Method = findMethod(Customer.class, "default1SomeAction", new Class[]{}); + final Method actionMethod = findMethodExactOrFail(Customer.class, "someAction", new Class[] { int.class, long.class }); + final Method default0Method = findMethodExactOrFail(Customer.class, "default0SomeAction", new Class[] {}); + final Method default1Method = findMethodExactOrFail(Customer.class, "default1SomeAction", new Class[]{}); final FacetedMethod facetHolderWithParms = FacetedMethod - .createForAction(metaModelContext, Customer.class, _MethodFacades.regular(actionMethod)); + .createForAction(getMetaModelContext(), Customer.class, _MethodFacades.regular(actionMethod)); facetFactory.process(ProcessMethodContext .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetHolderWithParms)); @@ -154,7 +133,7 @@ public long default1SomeAction() { assertNotNull(facet0); assertTrue(facet0 instanceof ActionParameterDefaultsFacetViaMethod); final ActionParameterDefaultsFacetViaMethod actionDefaultFacetViaMethod0 = (ActionParameterDefaultsFacetViaMethod) facet0; - assertEquals(default0Method, actionDefaultFacetViaMethod0.getMethods().getFirstElseFail()); + assertMethodEquals(default0Method, actionDefaultFacetViaMethod0.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(default0Method)); @@ -162,43 +141,32 @@ public long default1SomeAction() { assertNotNull(facet1); assertTrue(facet1 instanceof ActionParameterDefaultsFacetViaMethod); final ActionParameterDefaultsFacetViaMethod actionDefaultFacetViaMethod1 = (ActionParameterDefaultsFacetViaMethod) facet1; - assertEquals(default1Method, actionDefaultFacetViaMethod1.getMethods().getFirstElseFail()); + assertMethodEquals(default1Method, actionDefaultFacetViaMethod1.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(default1Method)); } - public void testInstallsParameterChoicesMethodAndRemovesMethod() { - val facetFactory = new ActionParameterChoicesFacetViaMethodFactory(metaModelContext); + @Test + void installsParameterChoicesMethodAndRemovesMethod() { + val facetFactory = new ActionParameterChoicesFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final int x, final long y, final long z) { - } - - @SuppressWarnings("unused") - public Collection choices0SomeAction() { - return Collections.emptyList(); - } - - @SuppressWarnings("unused") - public List choices1SomeAction() { - return Collections.emptyList(); - } - @SuppressWarnings("unused") - public Set choices2SomeAction() { - return Collections.emptySet(); - } + public void someAction(final int x, final long y, final long z) {} + public Collection choices0SomeAction() { return Collections.emptyList(); } + public List choices1SomeAction() { return Collections.emptyList(); } + public Set choices2SomeAction() { return Collections.emptySet(); } } - final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class, long.class }); - final Method choices0Method = findMethod(Customer.class, "choices0SomeAction", new Class[] {}); - final Method choices1Method = findMethod(Customer.class, "choices1SomeAction", new Class[] {}); - final Method choices2Method = findMethod(Customer.class, "choices2SomeAction", new Class[] {}); + final Method actionMethod = findMethodExactOrFail(Customer.class, "someAction", new Class[] { int.class, long.class, long.class }); + final Method choices0Method = findMethodExactOrFail(Customer.class, "choices0SomeAction", new Class[] {}); + final Method choices1Method = findMethodExactOrFail(Customer.class, "choices1SomeAction", new Class[] {}); + final Method choices2Method = findMethodExactOrFail(Customer.class, "choices2SomeAction", new Class[] {}); final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction( - metaModelContext, Customer.class, _MethodFacades.regular(actionMethod)); + getMetaModelContext(), Customer.class, _MethodFacades.regular(actionMethod)); facetFactory.process(ProcessMethodContext .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetHolderWithParms)); @@ -207,7 +175,7 @@ public Set choices2SomeAction() { assertNotNull(facet0); assertTrue(facet0 instanceof ActionParameterChoicesFacetViaMethod); final ActionParameterChoicesFacetViaMethod actionChoicesFacetViaMethod0 = (ActionParameterChoicesFacetViaMethod) facet0; - assertEquals(choices0Method, actionChoicesFacetViaMethod0.getMethods().getFirstElseFail()); + assertMethodEquals(choices0Method, actionChoicesFacetViaMethod0.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(choices0Method)); @@ -215,7 +183,7 @@ public Set choices2SomeAction() { assertNotNull(facet1); assertTrue(facet1 instanceof ActionParameterChoicesFacetViaMethod); final ActionParameterChoicesFacetViaMethod actionChoicesFacetViaMethod1 = (ActionParameterChoicesFacetViaMethod) facet1; - assertEquals(choices1Method, actionChoicesFacetViaMethod1.getMethods().getFirstElseFail()); + assertMethodEquals(choices1Method, actionChoicesFacetViaMethod1.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(choices1Method)); @@ -223,15 +191,16 @@ public Set choices2SomeAction() { assertNotNull(facet2); assertTrue(facet2 instanceof ActionParameterChoicesFacetViaMethod); final ActionParameterChoicesFacetViaMethod actionChoicesFacetViaMethod2 = (ActionParameterChoicesFacetViaMethod) facet2; - assertEquals(choices2Method, actionChoicesFacetViaMethod2.getMethods().getFirstElseFail()); + assertMethodEquals(choices2Method, actionChoicesFacetViaMethod2.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(choices2Method)); } - public void testInstallsParameterAutoCompleteMethodAndRemovesMethod() { - val facetFactory = new ActionParameterAutoCompleteFacetViaMethodFactory(metaModelContext); + @Test + void installsParameterAutoCompleteMethodAndRemovesMethod() { + val facetFactory = new ActionParameterAutoCompleteFacetViaMethodFactory(getMetaModelContext()); class Customer { @SuppressWarnings("unused") @@ -244,11 +213,11 @@ public List autoComplete0SomeAction(final String searchArg) { } } - final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class }); - final Method autoComplete0Method = findMethod(Customer.class, "autoComplete0SomeAction", new Class[] {String.class}); + final Method actionMethod = findMethodExactOrFail(Customer.class, "someAction", new Class[] { int.class, long.class }); + final Method autoComplete0Method = findMethodExactOrFail(Customer.class, "autoComplete0SomeAction", new Class[] {String.class}); final FacetedMethod facetHolderWithParms = FacetedMethod - .createForAction(metaModelContext, Customer.class, _MethodFacades.regular(actionMethod)); + .createForAction(getMetaModelContext(), Customer.class, _MethodFacades.regular(actionMethod)); facetFactory.process(ProcessMethodContext .forTesting(Customer.class, FeatureType.ACTION, actionMethod, methodRemover, facetHolderWithParms)); @@ -257,10 +226,9 @@ public List autoComplete0SomeAction(final String searchArg) { assertNotNull(facet0); assertTrue(facet0 instanceof ActionParameterAutoCompleteFacetViaMethod); final ActionParameterAutoCompleteFacetViaMethod actionAutoCompleteFacetViaMethod0 = (ActionParameterAutoCompleteFacetViaMethod) facet0; - assertEquals(autoComplete0Method, actionAutoCompleteFacetViaMethod0.getMethods().getFirstElseFail()); + assertMethodEquals(autoComplete0Method, actionAutoCompleteFacetViaMethod0.getMethods().getFirstElseFail().asMethodElseFail()); assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(autoComplete0Method)); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/IteratorFilteringFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/IteratorFilteringFacetFactoryTest.java index 696aea12c75..1a848f404c1 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/IteratorFilteringFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/IteratorFilteringFacetFactoryTest.java @@ -21,67 +21,66 @@ import java.lang.reflect.Method; import java.util.Iterator; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory; -class IteratorFilteringFacetFactoryTest extends AbstractFacetFactoryTest { +class IteratorFilteringFacetFactoryTest +extends FacetFactoryTestAbstract { private IteratorFilteringFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new IteratorFilteringFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new IteratorFilteringFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testRequestsRemoverToRemoveIteratorMethods() { + @Test + void testRequestsRemoverToRemoveIteratorMethods() { class Customer { @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod)); - - assertEquals(1, methodRemover.getRemoveMethodArgsCalls().size()); + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + assertEquals(1, methodRemover.getRemoveMethodArgsCalls().size()); + }); } - public void testNoIteratorMethodFiltered() { + @Test + void testNoIteratorMethodFiltered() { class Customer { @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - + final Method actionMethod = findMethodExactOrFail(Customer.class, "someAction"); assertFalse(facetFactory.recognizes(actionMethod)); } - public void xxxtestIterableIteratorMethodFiltered() { + @Test @Disabled("seems iterator() is not recognized") + void testIterableIteratorMethodFiltered() { class Customer implements Iterable { @SuppressWarnings("unused") - public void someAction() { - } - + public void someAction() {} @Override - public Iterator iterator() { - return null; - } + public Iterator iterator() { return null; } } - final Method iteratorMethod = findMethod(Customer.class, "iterator"); - + final Method iteratorMethod = findMethodExactOrFail(Customer.class, "iterator"); assertTrue(facetFactory.recognizes(iteratorMethod)); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java index f8e0f64d25c..41a47446191 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java @@ -18,7 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action; -import java.lang.reflect.Method; import java.util.UUID; import org.junit.jupiter.api.AfterEach; @@ -27,65 +26,48 @@ import org.apache.causeway.applib.mixins.system.HasInteractionId; import org.apache.causeway.core.config.metamodel.facets.ActionConfigOptions; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.domainobject.domainevents.ActionDomainEventDefaultFacetForDomainObjectAnnotation; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; -import lombok.val; - class ActionAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { ActionAnnotationFacetFactory facetFactory; - Method actionMethod; - - ObjectSpecification mockTypeSpec; - ObjectSpecification mockReturnTypeSpec; - void expectRemoveMethod(final Method actionMethod) { - Mockito.verify(mockMethodRemover, Mockito.atLeastOnce()).removeMethod(actionMethod); - } + private ObjectSpecification mockTypeSpec; @BeforeEach public void setUp() throws Exception { mockTypeSpec = Mockito.mock(ObjectSpecification.class); - mockReturnTypeSpec = Mockito.mock(ObjectSpecification.class); - facetFactory = new ActionAnnotationFacetFactory(metaModelContext); + facetFactory = new ActionAnnotationFacetFactory(getMetaModelContext()); Mockito.when(mockTypeSpec.getFacet(ActionDomainEventDefaultFacetForDomainObjectAnnotation.class)) .thenReturn(null); - actionMethod = findMethod(Customer.class, "someAction"); } - @Override @AfterEach public void tearDown() throws Exception { facetFactory = null; } class Customer { - public void someAction() { - } + public void someAction() {} } class SomeHasInteractionId implements HasInteractionId { - public void someAction() { - } - + public void someAction() {} @Override public UUID getInteractionId() { return null; } - - } void allowingPublishingConfigurationToReturn(final ActionConfigOptions.PublishingPolicy value) { - val config = metaModelContext.getConfiguration(); - config.getApplib().getAnnotation().getAction().setExecutionPublishing(value); + getConfiguration().getApplib().getAnnotation().getAction().setExecutionPublishing(value); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java index 4412c49703f..d6dfc8dec21 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java @@ -20,6 +20,8 @@ import java.lang.reflect.Method; +import org.junit.jupiter.api.BeforeEach; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -28,11 +30,11 @@ import org.apache.causeway.commons.internal.reflection._MethodFacades; import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FeatureType; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.FacetedMethod; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract; +import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEvent; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacet; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethod; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory; @@ -45,11 +47,10 @@ @SuppressWarnings("unused") class ActionAnnotationFacetFactoryTest_ActionInvocation -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private ObjectSpecification voidSpec; private ObjectSpecification stringSpec; - private ObjectSpecification customerSpec; private ActionAnnotationFacetFactory facetFactory; private void processInvocation( @@ -59,68 +60,68 @@ private void processInvocation( facetFactory.processInvocation(processMethodContext, actionIfAny); } - @Override - public void setUp() throws Exception { - super.setUp(); - this.facetFactory = new ActionAnnotationFacetFactory(metaModelContext); + @BeforeEach + public void setUp() { + + this.facetFactory = new ActionAnnotationFacetFactory(getMetaModelContext()); - val specLoader = metaModelContext.getSpecificationLoader(); + val specLoader = getSpecificationLoader(); voidSpec = specLoader.loadSpecification(void.class); stringSpec = specLoader.loadSpecification(java.lang.String.class); - customerSpec = specLoader.loadSpecification(Customer.class); } public void testActionInvocationFacetIsInstalledAndMethodRemoved() { class Customer { - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - processInvocation(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); + final Method actionMethod = findMethodExactOrFail(Customer.class, "someAction"); - final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionInvocationFacetForDomainEventAbstract); - final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet; - assertEquals(actionMethod, actionInvocationFacetViaMethod.getMethods().getFirstElseFail()); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processInvocation(facetFactory, processMethodContext); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(actionMethod)); + //then + final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionInvocationFacetForDomainEvent); + final ActionInvocationFacetForDomainEvent actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEvent) facet; + assertEquals(actionMethod, actionInvocationFacetViaMethod.getMethods().getFirstElseFail()); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(actionMethod)); + }); } public void testActionReturnTypeWhenVoid() { class Customer { - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - processInvocation(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); - final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet; - assertEquals(voidSpec, actionInvocationFacetViaMethod.getReturnType()); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processInvocation(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); + final ActionInvocationFacetForDomainEvent actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEvent) facet; + assertEquals(voidSpec, actionInvocationFacetViaMethod.getReturnType()); + }); } public void testActionReturnTypeWhenNotVoid() { class Customer { - public String someAction() { - return null; - } + public String someAction() { return null; } } - final Method actionMethod = findMethod(Customer.class, "someAction"); - processInvocation(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); - final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet; - assertEquals(stringSpec, actionInvocationFacetViaMethod.getReturnType()); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processInvocation(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); + final ActionInvocationFacetForDomainEvent actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEvent) facet; + assertEquals(stringSpec, actionInvocationFacetViaMethod.getReturnType()); + }); } public void testActionOnType() { @@ -131,19 +132,19 @@ public String someAction() { } } - val customerSpec = metaModelContext.getSpecificationLoader().loadSpecification(LocalCustomer.class); - - final Method actionMethod = findMethod(LocalCustomer.class, "someAction"); - - processInvocation(facetFactory, ProcessMethodContext - .forTesting(LocalCustomer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); - final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = - (ActionInvocationFacetForDomainEventAbstract) facet; - assertEquals( - customerSpec, - actionInvocationFacetViaMethod.getDeclaringType()); + val customerSpec = getSpecificationLoader().loadSpecification(LocalCustomer.class); + + actionScenario(LocalCustomer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processInvocation(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class); + final ActionInvocationFacetForDomainEvent actionInvocationFacetViaMethod = + (ActionInvocationFacetForDomainEvent) facet; + assertEquals( + customerSpec, + actionInvocationFacetViaMethod.getDeclaringType()); + }); } public void testActionsPickedUpFromSuperclass() { @@ -156,10 +157,10 @@ public void someAction(final int x, final long y) { class CustomerEx extends Customer { } - final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class }); + final Method actionMethod = findMethodExactOrFail(CustomerEx.class, "someAction", new Class[] { int.class, long.class }); final FacetedMethod facetHolderWithParms = FacetedMethod - .createForAction(metaModelContext, CustomerEx.class, _MethodFacades.regular(actionMethod)); + .createForAction(getMetaModelContext(), CustomerEx.class, _MethodFacades.regular(actionMethod)); processInvocation(facetFactory, ProcessMethodContext .forTesting(CustomerEx.class, null, actionMethod, methodRemover, facetHolderWithParms)); @@ -170,18 +171,12 @@ class CustomerEx extends Customer { public void testActionsPickedUpFromSuperclassButHelpersFromSubClass() { - val facetFactoryForChoices = new ActionParameterChoicesFacetViaMethodFactory(metaModelContext); - val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory(metaModelContext); + val facetFactoryForChoices = new ActionParameterChoicesFacetViaMethodFactory(getMetaModelContext()); + val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory(getMetaModelContext()); class Customer { - - public void someAction(final int x, final long y) { - } - - - public int[] choices0SomeAction() { - return new int[0]; - } + public void someAction(final int x, final long y) { } + public int[] choices0SomeAction() { return new int[0]; } } class CustomerEx extends Customer { @@ -189,24 +184,20 @@ class CustomerEx extends Customer { public int[] choices0SomeAction() { return new int[0]; } - - public long[] choices1SomeAction() { return new long[0]; } - - public String disableSomeAction() { return null; } } - final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class }); - final Method choices0Method = findMethod(CustomerEx.class, "choices0SomeAction", new Class[] {}); - final Method choices1Method = findMethod(CustomerEx.class, "choices1SomeAction", new Class[] {}); - final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] {}); + final Method actionMethod = findMethodExactOrFail(CustomerEx.class, "someAction", new Class[] { int.class, long.class }); + final Method choices0Method = findMethodExactOrFail(CustomerEx.class, "choices0SomeAction", new Class[] {}); + final Method choices1Method = findMethodExactOrFail(CustomerEx.class, "choices1SomeAction", new Class[] {}); + final Method disableMethod = findMethodExactOrFail(CustomerEx.class, "disableSomeAction", new Class[] {}); - final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(metaModelContext, CustomerEx.class, + final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(getMetaModelContext(), CustomerEx.class, _MethodFacades.regular(actionMethod)); final ProcessMethodContext processMethodContext = ProcessMethodContext diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java index 771f4b708a5..f45a9add28a 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java @@ -53,22 +53,22 @@ public void someAction() { } // given - val cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processHidden(facetFactory, processMethodContext); - - // then - val hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacet); - assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT)); - - val hiddenFacetImpl = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacetImpl); - assertTrue(hiddenFacet == hiddenFacetImpl); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + + // when + processHidden(facetFactory, processMethodContext); + + // then + val hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacet); + assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT)); + + val hiddenFacetImpl = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacetImpl); + assertTrue(hiddenFacet == hiddenFacetImpl); + + }); + } } \ No newline at end of file diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java index 90d1c062375..dd84c1cf1b6 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java @@ -21,20 +21,18 @@ import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.applib.annotation.Action; import org.apache.causeway.applib.events.domain.ActionDomainEvent; import org.apache.causeway.core.metamodel.facetapi.Facet; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract.EventTypeOrigin; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetAbstract; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation; import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation; -import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault; +import org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEvent; import static org.apache.causeway.core.metamodel.commons.matchers.CausewayMatchers.classEqualTo; @@ -53,120 +51,105 @@ private void processInvocation( void withPostsActionInvokedEvent() { class Customer { - class SomeActionInvokedDomainEvent extends ActionDomainEvent {} - @Action(domainEvent = SomeActionInvokedDomainEvent.class) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - super.metaModelContext.getConfiguration() - .getApplib().getAnnotation().getAction().getDomainEvent().setPostForDefault(true); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processInvocation(facetFactory, processMethodContext); - - // expect - expectRemoveMethod(actionMethod); - - // then - final ActionDomainEventFacet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof ActionDomainEventFacetAbstract); - final ActionDomainEventFacetAbstract domainEventFacetImpl = (ActionDomainEventFacetAbstract) domainEventFacet; - assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); - - final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); - assertNotNull(invocationFacet); - assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation); - final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet; - assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + getConfiguration() + .getApplib().getAnnotation().getAction().getDomainEvent().setPostForDefault(true); + + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processInvocation(facetFactory, processMethodContext); + + // expect + assertMethodWasRemoved(findMethodExactOrFail(Customer.class, "someAction")); + + // then + final ActionDomainEventFacet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof ActionDomainEventFacet); + final ActionDomainEventFacet domainEventFacetImpl = domainEventFacet; + assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + + final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); + assertNotNull(invocationFacet); + assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEvent); + final ActionInvocationFacetForDomainEvent invocationFacetImpl = (ActionInvocationFacetForDomainEvent) invocationFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, invocationFacetImpl.getEventTypeOrigin()); + assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + }); } @Test void withActionInteractionEvent() { class Customer { - class SomeActionInvokedDomainEvent extends ActionDomainEvent {} - @Action(domainEvent = SomeActionInvokedDomainEvent.class) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processInvocation(facetFactory, processMethodContext); - - // expect - expectRemoveMethod(actionMethod); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation); - final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = - (ActionDomainEventFacetForActionAnnotation) domainEventFacet; - assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); - - final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); - assertNotNull(invocationFacet); - - assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation); - final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = - (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet; - assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processInvocation(facetFactory, processMethodContext); + + // expect + assertMethodWasRemoved(findMethodExactOrFail(Customer.class, "someAction")); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof ActionDomainEventFacet); + final ActionDomainEventFacet domainEventFacetImpl = (ActionDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isAnnotatedMember()); + assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + + final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); + assertNotNull(invocationFacet); + + assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEvent); + final ActionInvocationFacetForDomainEvent invocationFacetImpl = (ActionInvocationFacetForDomainEvent) invocationFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, invocationFacetImpl.getEventTypeOrigin()); + assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + }); } @Test void withActionDomainEvent() { class Customer { - class SomeActionInvokedDomainEvent extends ActionDomainEvent {} - @Action(domainEvent= SomeActionInvokedDomainEvent.class) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processInvocation(facetFactory, processMethodContext); - - // expect - expectRemoveMethod(actionMethod); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof ActionDomainEventFacetForActionAnnotation); - final ActionDomainEventFacetForActionAnnotation domainEventFacetImpl = (ActionDomainEventFacetForActionAnnotation) domainEventFacet; - assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); - - final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); - assertNotNull(invocationFacet); - assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromActionAnnotation); - final ActionInvocationFacetForDomainEventFromActionAnnotation invocationFacetImpl = (ActionInvocationFacetForDomainEventFromActionAnnotation) invocationFacet; - assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processInvocation(facetFactory, processMethodContext); + + // expect + assertMethodWasRemoved(findMethodExactOrFail(Customer.class, "someAction")); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof ActionDomainEventFacet); + final ActionDomainEventFacet domainEventFacetImpl = (ActionDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isAnnotatedMember()); + assertThat(domainEventFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + + final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); + assertNotNull(invocationFacet); + assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEvent); + final ActionInvocationFacetForDomainEvent invocationFacetImpl = (ActionInvocationFacetForDomainEvent) invocationFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, invocationFacetImpl.getEventTypeOrigin()); + assertThat(invocationFacetImpl.getEventType(), classEqualTo(Customer.SomeActionInvokedDomainEvent.class)); + }); } @Test @@ -174,36 +157,33 @@ void withDefaultEvent() { class Customer { @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - super.metaModelContext.getConfiguration() - .getApplib().getAnnotation().getAction().getDomainEvent().setPostForDefault(true); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processInvocation(facetFactory, processMethodContext); - - // expect - expectRemoveMethod(actionMethod); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof ActionDomainEventFacetDefault); - final ActionDomainEventFacetDefault domainEventFacetImpl = (ActionDomainEventFacetDefault) domainEventFacet; - assertThat(domainEventFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class)); - - final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); - assertNotNull(invocationFacet); - assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEventFromDefault); - final ActionInvocationFacetForDomainEventFromDefault invocationFacetImpl = (ActionInvocationFacetForDomainEventFromDefault) invocationFacet; - assertThat(invocationFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class)); + getConfiguration() + .getApplib().getAnnotation().getAction().getDomainEvent().setPostForDefault(true); + + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processInvocation(facetFactory, processMethodContext); + + // expect + assertMethodWasRemoved(findMethodExactOrFail(Customer.class, "someAction")); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(ActionDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof ActionDomainEventFacet); + final ActionDomainEventFacet domainEventFacetImpl = (ActionDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isDefault()); + assertThat(domainEventFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class)); + + final Facet invocationFacet = facetedMethod.getFacet(ActionInvocationFacet.class); + assertNotNull(invocationFacet); + assertTrue(invocationFacet instanceof ActionInvocationFacetForDomainEvent); + final ActionInvocationFacetForDomainEvent invocationFacetImpl = (ActionInvocationFacetForDomainEvent) invocationFacet; + assertThat(invocationFacetImpl.getEventType(), classEqualTo(ActionDomainEvent.Default.class)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java index 9298ffb8fba..28f3bdc4d73 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_RestrictTo.java @@ -43,22 +43,17 @@ void whenRestrictedToPrototyping() { class Customer { @Action(restrictTo = org.apache.causeway.applib.annotation.RestrictTo.PROTOTYPING) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processRestrictTo(facetFactory, processMethodContext); - - // then - final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); - assertNotNull(facet); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRestrictTo(facetFactory, processMethodContext); + // then + final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); + assertNotNull(facet); + }); } @Test @@ -66,22 +61,17 @@ void whenRestrictedToNoRestriction() { class Customer { @Action(restrictTo = org.apache.causeway.applib.annotation.RestrictTo.NO_RESTRICTIONS) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processRestrictTo(facetFactory, processMethodContext); - - // then - final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); - assertNull(facet); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRestrictTo(facetFactory, processMethodContext); + // then + final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); + assertNull(facet); + }); } @Test @@ -89,22 +79,17 @@ void whenNotPresent() { class Customer { @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processRestrictTo(facetFactory, processMethodContext); - - // then - final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); - assertNull(facet); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRestrictTo(facetFactory, processMethodContext); + // then + final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class); + assertNull(facet); + }); } } \ No newline at end of file diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java index 6c0c83d03ed..473cad797ca 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Semantics.java @@ -45,23 +45,18 @@ void whenSafe() { class Customer { @Action(semantics = SemanticsOf.SAFE) - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processSemantics(facetFactory, processMethodContext); - - // then - final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); - assertNotNull(facet); - assertThat(facet.value(), is(SemanticsOf.SAFE)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processSemantics(facetFactory, processMethodContext); + // then + final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); + assertNotNull(facet); + assertThat(facet.value(), is(SemanticsOf.SAFE)); + }); } @Test @@ -69,23 +64,18 @@ void whenNotSpecified() { class Customer { @Action() - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processSemantics(facetFactory, processMethodContext); - - // then - final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); - assertNotNull(facet); - assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processSemantics(facetFactory, processMethodContext); + // then + final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); + assertNotNull(facet); + assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT)); + }); } @Test @@ -93,23 +83,18 @@ void whenNoAnnotation() { class Customer { @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processSemantics(facetFactory, processMethodContext); - - // then - final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); - assertNotNull(facet); - assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processSemantics(facetFactory, processMethodContext); + // then + final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); + assertNotNull(facet); + assertThat(facet.value(), is(SemanticsOf.NON_IDEMPOTENT)); + }); } } \ No newline at end of file diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java index 0e2c9f4dac8..5e1007fd3f6 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_TypeOf.java @@ -55,22 +55,17 @@ void whenDeprecatedTypeOfAnnotationOnActionNotReturningCollection() { class Customer { @SuppressWarnings("unused") - public Customer someAction() { - return null; - } + public Customer someAction() { return null; } } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext.forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNull(facet); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNull(facet); + }); } @Test @@ -81,24 +76,19 @@ class Order { class Customer { @SuppressWarnings("rawtypes") @Action(typeOf = Order.class) - public Collection someAction() { - return null; - } + public Collection someAction() { return null; } } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext.forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacetForActionAnnotation); - assertThat(facet.value().getElementType(), classEqualTo(Order.class)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacetForActionAnnotation); + assertThat(facet.value().getElementType(), classEqualTo(Order.class)); + }); } @Test @@ -108,23 +98,17 @@ class Order { } class Customer { @Action(typeOf = Order.class) - public Customer someAction() { - return null; - } + public Customer someAction() { return null; } } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNull(facet); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNull(facet); + }); } @Test @@ -134,26 +118,20 @@ class Order { } class Customer { @SuppressWarnings("unused") - public Order[] someAction() { - return null; - } + public Order[] someAction() { return null; } } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacet); - assertThat(facet.value().getElementType(), classEqualTo(Order.class)); - assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacet); + assertThat(facet.value().getElementType(), classEqualTo(Order.class)); + assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); + }); } @Test @@ -163,25 +141,18 @@ class Order { } class Customer { @SuppressWarnings("unused") - public Collection someAction() { - return null; - } + public Collection someAction() { return null; } } // given - final Class cls = Customer.class; - actionMethod = findMethod(cls, "someAction"); - - // when - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, actionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertEquals(TypeOfFacetFromFeature.class, facet.getClass()); - assertThat(facet.value().getElementType(), classEqualTo(Order.class)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertEquals(TypeOfFacetFromFeature.class, facet.getClass()); + assertThat(facet.value().getElementType(), classEqualTo(Order.class)); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java index 9414fdb9e00..334eb5e3b34 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_commandPublishing.java @@ -18,8 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action; -import java.lang.reflect.Method; - import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -47,14 +45,12 @@ private void processCommandPublishing( @Test void given_HasInteractionId_thenIgnored() { // given - final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction"); - - // when - processCommandPublishing(facetFactory, ProcessMethodContext - .forTesting(SomeHasInteractionId.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + actionScenario(SomeHasInteractionId.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processCommandPublishing(facetFactory, processMethodContext); + // then + assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + }); } @Test @@ -63,17 +59,15 @@ void given_annotation_but_command_not_specified_then_facet_not_added() { // given class Customer { @Action() - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - // when - processCommandPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processCommandPublishing(facetFactory, processMethodContext); + // then + assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + }); } @Test @@ -82,19 +76,17 @@ void given_annotation_with_command_enabled_then_facet_added() { // given class Customer { @Action(commandPublishing = Publishing.ENABLED) - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - // when - processCommandPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - // then - final Facet facet = facetedMethod.getFacet(CommandPublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CommandPublishingFacetForActionAnnotation); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processCommandPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(CommandPublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CommandPublishingFacetForActionAnnotation); + }); } @@ -104,17 +96,15 @@ void given_annotation_with_command_disabled_then_facet_not_added() { // given class Customer { @Action(commandPublishing = Publishing.DISABLED) - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - // when - processCommandPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - // then - assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processCommandPublishing(facetFactory, processMethodContext); + // then + assertFalse(CommandPublishingFacet.isPublishingEnabled(facetedMethod)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java index a9bba2ebe07..da5b1760cf1 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_executionPublishing.java @@ -18,8 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action; -import java.lang.reflect.Method; - import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -51,15 +49,11 @@ private void processExecutionPublishing( @Test void given_HasInteractionId_thenIgnored() { - - final Method actionMethod = findMethod(SomeHasInteractionId.class, "someAction"); - - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(SomeHasInteractionId.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); - - expectNoMethodsRemoved(); + actionScenario(SomeHasInteractionId.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + processExecutionPublishing(facetFactory, processMethodContext); + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + assertNoMethodsRemoved(); + }); } @Test @@ -67,17 +61,13 @@ void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_t // given allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction"); - - facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {}); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(ActionAnnotationFacetFactoryTest.Customer.class, null, - actionMethod, mockMethodRemover, facetedMethod)); - - // then - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + actionScenario(ActionAnnotationFacetFactoryTest.Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {}); + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + }); } @Test @@ -85,20 +75,15 @@ void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantic // given allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction"); - - facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {}); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(ActionAnnotationFacetFactoryTest.Customer.class, null, - actionMethod, mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); - assertNotNull(facet); - final ExecutionPublishingActionFacetFromConfiguration facetImpl = (ExecutionPublishingActionFacetFromConfiguration) facet; - _Blackhole.consume(facetImpl); + actionScenario(ActionAnnotationFacetFactoryTest.Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {}); + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ExecutionPublishingActionFacetFromConfiguration); + }); } @Test @@ -106,14 +91,11 @@ void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_the // given allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction"); - - // when - assertThrows(IllegalStateException.class, ()-> - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(ActionAnnotationFacetFactoryTest.Customer.class, null, - actionMethod, mockMethodRemover, facetedMethod))); - + actionScenario(ActionAnnotationFacetFactoryTest.Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + assertThrows(IllegalStateException.class, ()-> + processExecutionPublishing(facetFactory, processMethodContext)); + }); } @Test @@ -121,37 +103,28 @@ void given_noAnnotation_and_configurationSetToNone_thenNone() { // given allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE); - final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction"); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(ActionAnnotationFacetFactoryTest.Customer.class, null, - actionMethod, mockMethodRemover, facetedMethod)); - - // then - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); - - expectNoMethodsRemoved(); - + actionScenario(ActionAnnotationFacetFactoryTest.Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + assertNoMethodsRemoved(); + }); } @Test void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() { // given - final Method actionMethod = findMethod(ActionAnnotationFacetFactoryTest.Customer.class, "someAction"); - allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.ALL); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(ActionAnnotationFacetFactoryTest.Customer.class, null, - actionMethod, mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ExecutionPublishingActionFacetFromConfiguration); + actionScenario(ActionAnnotationFacetFactoryTest.Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ExecutionPublishingActionFacetFromConfiguration); + }); } @Test @@ -159,21 +132,18 @@ void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_t class Customer { @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) - public void someAction() { - } + public void someAction() {} } allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(Customer.class, "someAction"); - - facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {}); - - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); - - expectNoMethodsRemoved(); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.SAFE, facetedMethod) {}); + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + assertNoMethodsRemoved(); + }); } @Test @@ -181,29 +151,22 @@ void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantic // given class Customer { - @Action( - executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED - ) - public void someAction() { - } + @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) + public void someAction() {} } allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(Customer.class, "someAction"); - - facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {}); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); - assertNotNull(facet); - final ExecutionPublishingActionFacetForActionAnnotation facetImpl = (ExecutionPublishingActionFacetForActionAnnotation) facet; - _Blackhole.consume(facetImpl); - - expectNoMethodsRemoved(); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetedMethod.addFacet(new ActionSemanticsFacetAbstract(SemanticsOf.IDEMPOTENT, facetedMethod) {}); + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); + assertNotNull(facet); + final ExecutionPublishingActionFacetForActionAnnotation facetImpl = (ExecutionPublishingActionFacetForActionAnnotation) facet; + _Blackhole.consume(facetImpl); + assertNoMethodsRemoved(); + }); } @Test @@ -211,16 +174,15 @@ void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_the class Customer { @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) - public void someAction() { - } + public void someAction() { } } allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.IGNORE_QUERY_ONLY); - final Method actionMethod = findMethod(Customer.class, "someAction"); - - assertThrows(IllegalStateException.class, ()-> - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod))); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + assertThrows(IllegalStateException.class, ()-> + processExecutionPublishing(facetFactory, processMethodContext)); + }); } @Test @@ -228,20 +190,17 @@ void given_asConfigured_and_configurationSetToNone_thenNone() { class Customer { @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) - public void someAction() { - } + public void someAction() {} } allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE); - final Method actionMethod = findMethod(Customer.class, "someAction"); - - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); - - expectNoMethodsRemoved(); - + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + assertNoMethodsRemoved(); + }); } @Test @@ -249,26 +208,19 @@ void given_asConfigured_and_configurationSetToAll_thenFacetAdded() { // given class Customer { - @Action( - executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED - ) - public void someAction() { - } + @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.AS_CONFIGURED) + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.ALL); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ExecutionPublishingActionFacetForActionAnnotation); - - expectNoMethodsRemoved(); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ExecutionPublishingActionFacetForActionAnnotation); + assertNoMethodsRemoved(); + }); } @Test @@ -276,25 +228,19 @@ void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() { // given class Customer { - @Action( - executionPublishing = org.apache.causeway.applib.annotation.Publishing.ENABLED - ) - public void someAction() { - } + @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.ENABLED) + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - // even though configuration is disabled allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ExecutionPublishingActionFacetForActionAnnotation); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(ExecutionPublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ExecutionPublishingActionFacetForActionAnnotation); + }); } @Test @@ -302,23 +248,17 @@ void given_disabled_irrespectiveOfConfiguration_thenNone() { // given class Customer { - @Action( - executionPublishing = org.apache.causeway.applib.annotation.Publishing.DISABLED - ) - public void someAction() { - } + @Action(executionPublishing = org.apache.causeway.applib.annotation.Publishing.DISABLED) + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - // even though configuration is disabled allowingPublishingConfigurationToReturn(ActionConfigOptions.PublishingPolicy.NONE); - - // when - processExecutionPublishing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, mockMethodRemover, facetedMethod)); - - // then - assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processExecutionPublishing(facetFactory, processMethodContext); + // then + assertFalse(ExecutionPublishingFacet.isPublishingEnabled(facetedMethod)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java index de33004aca5..9c90946dd48 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java @@ -18,22 +18,24 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action; -import java.lang.reflect.Method; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.applib.annotation.Action; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFallbackToNonIdempotent; import org.apache.causeway.core.metamodel.facets.actions.semantics.ActionSemanticsFacet; import lombok.val; class ActionSemanticsFacetFallbackToNonIdempotentFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private ActionAnnotationFacetFactory facetFactory; @@ -43,35 +45,32 @@ private void processSemantics( facetFactory.processSemantics(processMethodContext, actionIfAny); } - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new ActionAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new ActionAnnotationFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testNoAnnotationPickedUp() { + @Test + void noAnnotationPickedUp() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - processSemantics(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionSemanticsFacetFallbackToNonIdempotent); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processSemantics(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionSemanticsFacetFallbackToNonIdempotent); - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java index e30eeae7e8c..9249e6cf9e1 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java @@ -18,7 +18,9 @@ */ package org.apache.causeway.core.metamodel.facets.actions.action; -import java.lang.reflect.Method; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,15 +28,15 @@ import org.apache.causeway.applib.annotation.Action; import org.apache.causeway.applib.annotation.RestrictTo; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actions.prototype.PrototypeFacet; import org.apache.causeway.core.metamodel.facets.actions.prototype.PrototypeFacetAbstract; import lombok.val; class PrototypeFacetAnnotationFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private ActionAnnotationFacetFactory facetFactory; @@ -44,35 +46,32 @@ private void processRestrictTo( facetFactory.processRestrictTo(processMethodContext, actionIfAny); } - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new ActionAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new ActionAnnotationFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testAnnotationPickedUp() { + @Test + void testAnnotationPickedUp() { class Customer { @Action(restrictTo = RestrictTo.PROTOTYPING) - public void someAction() { - } + public void someAction() {} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - processRestrictTo(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PrototypeFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PrototypeFacetAbstract); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + processRestrictTo(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(PrototypeFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PrototypeFacetAbstract); - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java index 8aede2957ac..91c0990260d 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java @@ -18,51 +18,50 @@ */ package org.apache.causeway.core.metamodel.facets.actions.bookmarkable; -import java.lang.reflect.Method; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet; import org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacetAbstract; import org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory; class BookmarkableAnnotationFacetFactoryTest_action -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private BookmarkPolicyFacetFallbackFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new BookmarkPolicyFacetFallbackFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new BookmarkPolicyFacetFallbackFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testBookmarkableAnnotationPickedUpOnClass() { + @Test + void bookmarkableAnnotationPickedUpOnClass() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") public void placeOrder(){} } - final Method actionMethod = findMethod(Customer.class, "placeOrder"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof BookmarkPolicyFacetAbstract); + actionScenario(Customer.class, "placeOrder", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.process(processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof BookmarkPolicyFacetAbstract); - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java index fc03efe6e36..2f2e2ed6ceb 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java @@ -16,8 +16,6 @@ * under the License. */ package org.apache.causeway.core.metamodel.facets.actions.layout; -import java.lang.reflect.Method; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,8 +32,7 @@ import org.apache.causeway.applib.annotation.Where; import org.apache.causeway.applib.layout.component.CssClassFaPosition; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actions.position.ActionPositionFacet; import org.apache.causeway.core.metamodel.facets.actions.position.ActionPositionFacetFallback; import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet; @@ -44,13 +41,13 @@ import lombok.val; class ActionLayoutAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { ActionLayoutFacetFactory facetFactory; @BeforeEach void setUp() throws Exception { - facetFactory = new ActionLayoutFacetFactory(metaModelContext); + facetFactory = new ActionLayoutFacetFactory(getMetaModelContext()); } @Test @@ -58,21 +55,18 @@ void testActionLayoutAnnotation_position() { class Customer { @ActionLayout(position = ActionLayout.Position.PANEL) - public String foz() { - return null; - } + public String foz() { return null; } } - final Method method = findMethod(Customer.class, "foz"); - - facetFactory.process(ProcessMethodContext.forTesting(Customer.class, null, method, mockMethodRemover, - facetedMethod)); + actionScenario(Customer.class, "foz", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetFactory.process(processMethodContext); - final Facet facet = facetedMethod.getFacet(ActionPositionFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionPositionFacetForActionLayoutAnnotation); - val actionLayoutFacetAnnotation = (ActionPositionFacetForActionLayoutAnnotation) facet; - assertEquals(ActionLayout.Position.PANEL, actionLayoutFacetAnnotation.position()); + final Facet facet = facetedMethod.getFacet(ActionPositionFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionPositionFacetForActionLayoutAnnotation); + val actionLayoutFacetAnnotation = (ActionPositionFacetForActionLayoutAnnotation) facet; + assertEquals(ActionLayout.Position.PANEL, actionLayoutFacetAnnotation.position()); + }); } @Test @@ -85,16 +79,15 @@ public String foz() { } } - final Method method = findMethod(Customer.class, "foz"); - - facetFactory.process(ProcessMethodContext.forTesting(Customer.class, null, method, mockMethodRemover, - facetedMethod)); + actionScenario(Customer.class, "foz", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetFactory.process(processMethodContext); - final Facet facet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HiddenFacetForActionLayoutAnnotation); - val actionLayoutFacetAnnotation = (HiddenFacetForActionLayoutAnnotation) facet; - assertEquals(Where.ALL_TABLES, actionLayoutFacetAnnotation.where()); + final Facet facet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HiddenFacetForActionLayoutAnnotation); + val actionLayoutFacetAnnotation = (HiddenFacetForActionLayoutAnnotation) facet; + assertEquals(Where.ALL_TABLES, actionLayoutFacetAnnotation.where()); + }); } @Test @@ -103,35 +96,28 @@ void testActionLayoutFallbackPickedUp() { class Customer { @SuppressWarnings("unused") // no @ActionLayout - public String foo() { - return null; - } + public String foo() { return null; } } - final Method method = findMethod(Customer.class, "foo"); - facetFactory.process(ProcessMethodContext.forTesting(Customer.class, null, method, mockMethodRemover, - facetedMethod)); + actionScenario(Customer.class, "foo", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetFactory.process(processMethodContext); - final Facet facet = facetedMethod.getFacet(ActionPositionFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ActionPositionFacetFallback); + final Facet facet = facetedMethod.getFacet(ActionPositionFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ActionPositionFacetFallback); + }); } - static class CssClassFa extends ActionLayoutAnnotationFacetFactoryTest { - - @Test - void testDefaultPosition() { + @Test + void testCssClassFa_defaultPosition() { - class Customer { - @ActionLayout(cssClassFa = "font-awesome") - public String foz() { - return null; - } - } - final Method method = findMethod(Customer.class, "foz"); + class Customer { + @ActionLayout(cssClassFa = "font-awesome") + public String foz() { return null; } + } - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, mockMethodRemover, facetedMethod)); + actionScenario(Customer.class, "foz", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetFactory.process(processMethodContext); Facet facet = facetedMethod.getFacet(CssClassFaFacet.class); assertThat(facet, is(notNullValue())); @@ -139,21 +125,22 @@ public String foz() { val classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet; assertThat(classFaFacetForActionLayoutAnnotation.asSpaceSeparated(), is(equalTo("fa fa-fw fa-font-awesome"))); assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(CssClassFaPosition.LEFT)); - } - @Test - void testRightPosition() { + }); + } + + @Test + void testCssClassFa_rightPosition() { - class Customer { - @ActionLayout(cssClassFa = "font-awesome", cssClassFaPosition = CssClassFaPosition.RIGHT) - public String foz() { - return null; - } + class Customer { + @ActionLayout(cssClassFa = "font-awesome", cssClassFaPosition = CssClassFaPosition.RIGHT) + public String foz() { + return null; } - final Method method = findMethod(Customer.class, "foz"); + } - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, mockMethodRemover, facetedMethod)); + actionScenario(Customer.class, "foz", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + facetFactory.process(processMethodContext); Facet facet = facetedMethod.getFacet(CssClassFaFacet.class); assertThat(facet, is(notNullValue())); @@ -161,7 +148,8 @@ public String foz() { val classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet; assertThat(classFaFacetForActionLayoutAnnotation.asSpaceSeparated(), is(equalTo("fa fa-fw fa-font-awesome"))); assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(CssClassFaPosition.RIGHT)); - } + + }); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactoryTest.java index acf506c79a2..6007ef7ce83 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetFromDomainServiceFacetFactoryTest.java @@ -18,9 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.derived; - - - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -33,20 +30,17 @@ import org.apache.causeway.applib.annotation.DomainService; import org.apache.causeway.applib.annotation.NatureOfService; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; -import org.apache.causeway.core.metamodel.facets.FacetedMethod; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacet; -@SuppressWarnings("unused") -public class NotInServiceMenuFacetFromDomainServiceFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +class NotInServiceMenuFacetFromDomainServiceFacetFactoryTest +extends FacetFactoryTestAbstract { private NotInServiceMenuFacetFromDomainServiceFacetFactory facetFactory; @BeforeEach public void setUp() throws Exception { - facetFactory = new NotInServiceMenuFacetFromDomainServiceFacetFactory(metaModelContext); + facetFactory = new NotInServiceMenuFacetFromDomainServiceFacetFactory(getMetaModelContext()); } @Test @@ -55,27 +49,22 @@ public void whenRest() throws Exception { // given @DomainService(nature = NatureOfService.REST) class CustomerService { - - public String name() { - return "Joe"; - } + @SuppressWarnings("unused") + public String name() { return "Joe"; } } - expectNoMethodsRemoved(); - - facetedMethod = FacetedMethod - .createForAction(metaModelContext, CustomerService.class, "name"); + actionScenario(CustomerService.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); + assertNotNull(facet); + assertThat(facet instanceof NotInServiceMenuFacetFromDomainServiceFacet, is(true)); + final NotInServiceMenuFacetFromDomainServiceFacet facetDerivedFromDomainServiceFacet = (NotInServiceMenuFacetFromDomainServiceFacet) facet; + assertEquals(NatureOfService.REST, facetDerivedFromDomainServiceFacet.getNatureOfService()); + assertNoMethodsRemoved(); + }); - // when - facetFactory.process(ProcessMethodContext - .forTesting(CustomerService.class, null, facetedMethod.getMethod().asMethod().orElseThrow(), mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); - assertNotNull(facet); - assertThat(facet instanceof NotInServiceMenuFacetFromDomainServiceFacet, is(true)); - final NotInServiceMenuFacetFromDomainServiceFacet facetDerivedFromDomainServiceFacet = (NotInServiceMenuFacetFromDomainServiceFacet) facet; - assertEquals(NatureOfService.REST, facetDerivedFromDomainServiceFacet.getNatureOfService()); } @Test @@ -84,24 +73,18 @@ public void whenView() throws Exception { // given @DomainService() class CustomerService { - - public String name() { - return "Joe"; - } + @SuppressWarnings("unused") + public String name() { return "Joe"; } } - expectNoMethodsRemoved(); - - facetedMethod = FacetedMethod - .createForAction(metaModelContext, CustomerService.class, "name"); - - // when - facetFactory.process(ProcessMethodContext - .forTesting(CustomerService.class, null, facetedMethod.getMethod().asMethod().orElseThrow(), mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); - assertThat(facet, is(nullValue())); + actionScenario(CustomerService.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); + assertThat(facet, is(nullValue())); + assertNoMethodsRemoved(); + }); } @Test @@ -110,24 +93,18 @@ public void whenMenu() throws Exception { // given @DomainService() class CustomerService { - - public String name() { - return "Joe"; - } + @SuppressWarnings("unused") + public String name() { return "Joe"; } } - expectNoMethodsRemoved(); - - facetedMethod = FacetedMethod - .createForAction(metaModelContext, CustomerService.class, "name"); - - // when - facetFactory.process(ProcessMethodContext - .forTesting(CustomerService.class, null, facetedMethod.getMethod().asMethod().orElseThrow(), mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); - assertThat(facet, is(nullValue())); + actionScenario(CustomerService.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); + assertThat(facet, is(nullValue())); + assertNoMethodsRemoved(); + }); } @Test @@ -135,24 +112,18 @@ public void whenNone() throws Exception { // given class CustomerService { - - public String name() { - return "Joe"; - } + @SuppressWarnings("unused") + public String name() { return "Joe"; } } - expectNoMethodsRemoved(); - - facetedMethod = FacetedMethod - .createForAction(metaModelContext, CustomerService.class, "name"); - - // when - facetFactory.process(ProcessMethodContext - .forTesting(CustomerService.class, null, facetedMethod.getMethod().asMethod().orElseThrow(), mockMethodRemover, facetedMethod)); - - // then - final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); - assertThat(facet, is(nullValue())); + actionScenario(CustomerService.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.lookupNonFallbackFacet(NotInServiceMenuFacet.class).orElse(null); + assertThat(facet, is(nullValue())); + assertNoMethodsRemoved(); + }); } } \ No newline at end of file diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java index 81a9082fba4..8924fed9bb5 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java @@ -23,13 +23,13 @@ import java.util.List; import java.util.Set; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessor; import org.apache.causeway.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory; import org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet; @@ -37,163 +37,150 @@ import lombok.val; class CollectionFieldMethodsFacetFactoryTest -extends AbstractFacetFactoryTest { - - @Override - public void setUp() throws Exception { - super.setUp(); - } - - public void testPropertyAccessorFacetIsInstalledForJavaUtilCollectionAndMethodRemoved() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); +extends FacetFactoryTestAbstract { + @Test + void propertyAccessorFacetIsInstalledForJavaUtilCollectionAndMethodRemoved() { + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings({ "rawtypes", "unused" }) class Customer { - @SuppressWarnings({ "rawtypes", "unused" }) - public Collection getOrders() { - return null; - } + public Collection getOrders() { return null; } } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); + final Method collectionAccessorMethod = findMethodExactOrFail(Customer.class, "getOrders"); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + }); } - - public void testPropertyAccessorFacetIsInstalledForJavaUtilListAndMethodRemoved() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); - + @Test + void propertyAccessorFacetIsInstalledForJavaUtilListAndMethodRemoved() { + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings({ "rawtypes", "unused" }) class Customer { - @SuppressWarnings({ "rawtypes", "unused" }) - public List getOrders() { - return null; - } + public List getOrders() { return null; } } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); + final Method collectionAccessorMethod = findMethodExactOrFail(Customer.class, "getOrders"); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + }); } - public void testPropertyAccessorFacetIsInstalledForJavaUtilSetAndMethodRemoved() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); - + @Test + void propertyAccessorFacetIsInstalledForJavaUtilSetAndMethodRemoved() { + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings({ "rawtypes", "unused" }) class Customer { - @SuppressWarnings({ "rawtypes", "unused" }) - public Set getOrders() { - return null; - } + public Set getOrders() { return null; } } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); + final Method collectionAccessorMethod = findMethodExactOrFail(Customer.class, "getOrders"); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + }); } - public void testPropertyAccessorFacetIsInstalledForObjectArrayAndMethodRemoved() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); - + @Test + void propertyAccessorFacetIsInstalledForObjectArrayAndMethodRemoved() { + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Object[] getOrders() { - return null; - } + public Object[] getOrders() { return null; } } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); + final Method collectionAccessorMethod = findMethodExactOrFail(Customer.class, "getOrders"); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + }); } public void testPropertyAccessorFacetIsInstalledForOrderArrayAndMethodRemoved() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); - - @SuppressWarnings("hiding") + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); class Order { } + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Order[] getOrders() { - return null; - } + public Order[] getOrders() { return null; } } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); + final Method collectionAccessorMethod = findMethodExactOrFail(Customer.class, "getOrders"); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + final CollectionAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(collectionAccessorMethod)); + }); } - public void testMethodFoundInSuperclass() { - val facetFactory = new CollectionAccessorFacetViaAccessorFactory(metaModelContext); - - @SuppressWarnings("hiding") + @Test + void methodFoundInSuperclass() { + val facetFactory = new CollectionAccessorFacetViaAccessorFactory(getMetaModelContext()); class Order { } + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Collection getOrders() { - return null; - } + public Collection getOrders() { return null; } } - class CustomerEx extends Customer { } - - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - - facetFactory.process(ProcessMethodContext - .forTesting(CustomerEx.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); - final CollectionAccessorFacetViaAccessor collectionAccessorFacetViaMethod = (CollectionAccessorFacetViaAccessor) facet; - assertEquals(collectionAccessorMethod, collectionAccessorFacetViaMethod.getMethods().getFirstElseFail()); + final Method collectionAccessorMethod = findMethodExactOrFail(CustomerEx.class, "getOrders"); + collectionScenario(CustomerEx.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof CollectionAccessorFacetViaAccessor); + val collectionAccessorFacetViaMethod = (CollectionAccessorFacetViaAccessor) facet; + assertMethodEquals(collectionAccessorMethod, collectionAccessorFacetViaMethod.getMethods().getFirstElseFail().asMethodElseFail()); + }); } - - static class Order { - } - - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java index 5ce1cf60631..a6a7b2988ee 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest.java @@ -16,7 +16,6 @@ * under the License. */ package org.apache.causeway.core.metamodel.facets.collections.collection; -import java.lang.reflect.Method; import java.util.List; import java.util.Optional; @@ -24,48 +23,32 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.calls; import org.apache.causeway.applib.annotation.Collection; import org.apache.causeway.applib.annotation.Where; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CollectionSemantics; import org.apache.causeway.core.metamodel.commons.matchers.CausewayMatchers; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet; import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacetFromFeature; import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet; import org.apache.causeway.core.metamodel.facets.collections.collection.hidden.HiddenFacetForCollectionAnnotation; import org.apache.causeway.core.metamodel.facets.collections.collection.typeof.TypeOfFacetForCollectionAnnotation; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import lombok.val; @SuppressWarnings("unused") class CollectionAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { CollectionAnnotationFacetFactory facetFactory; - Method collectionMethod; - - ObjectSpecification mockTypeSpec; - ObjectSpecification mockReturnTypeSpec; - - void expectRemoveMethod(final Method actionMethod) { - - mockTypeSpec = Mockito.mock(ObjectSpecification.class); - mockReturnTypeSpec = Mockito.mock(ObjectSpecification.class); - - Mockito.verify(mockMethodRemover, calls(1)).removeMethod(actionMethod); - } private static void processModify( final CollectionAnnotationFacetFactory facetFactory, final FacetFactory.ProcessMethodContext processMethodContext) { @@ -79,26 +62,22 @@ private static void processHidden( facetFactory.processHidden(processMethodContext, collectionIfAny); } - private static void processTypeOf( final CollectionAnnotationFacetFactory facetFactory, final FacetFactory.ProcessMethodContext processMethodContext) { val collectionIfAny = processMethodContext.synthesizeOnMethod(Collection.class); facetFactory.processTypeOf(processMethodContext, collectionIfAny); } - @BeforeEach public void setUp() throws Exception { - facetFactory = new CollectionAnnotationFacetFactory(metaModelContext); + facetFactory = new CollectionAnnotationFacetFactory(getMetaModelContext()); } - @Override @AfterEach public void tearDown() throws Exception { facetFactory = null; } - @Deprecated(forRemoval = true, since = "2.0.0-RC2") static class Hidden extends CollectionAnnotationFacetFactoryTest { @@ -109,33 +88,28 @@ class Order { } class Customer { @Collection(hidden = Where.REFERENCES_PARENT) - public List getOrders() { - return null; - } - - public void setOrders(final List orders) { - } + public List getOrders() { return null; } + public void setOrders(final List orders) {} } // given - final Class cls = Customer.class; - collectionMethod = findMethod(Customer.class, "getOrders"); - - // when - final FacetFactory.ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, collectionMethod, mockMethodRemover, facetedMethod); - processHidden(facetFactory, processMethodContext); - - // then - final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacet); - assertTrue(hiddenFacet instanceof HiddenFacetForCollectionAnnotation); - final HiddenFacetForCollectionAnnotation hiddenFacetImpl = (HiddenFacetForCollectionAnnotation) hiddenFacet; - assertThat(hiddenFacetImpl.where(), is(Where.REFERENCES_PARENT)); - - final Facet hiddenFacetForColl = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacetForColl); - assertTrue(hiddenFacet == hiddenFacetForColl); + propertyScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + + // when + processHidden(facetFactory, processMethodContext); + + // then + final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacet); + assertTrue(hiddenFacet instanceof HiddenFacetForCollectionAnnotation); + final HiddenFacetForCollectionAnnotation hiddenFacetImpl = (HiddenFacetForCollectionAnnotation) hiddenFacet; + assertThat(hiddenFacetImpl.where(), is(Where.REFERENCES_PARENT)); + + final Facet hiddenFacetForColl = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacetForColl); + assertTrue(hiddenFacet == hiddenFacetForColl); + + }); } } @@ -150,28 +124,20 @@ class Order { } class Customer { @Collection(typeOf = Order.class) - public List getOrders() { - return null; - } - - public void setOrders(final List orders) { - } + public List getOrders() { return null; } + public void setOrders(final List orders) {} } // given - final Class cls = Customer.class; - collectionMethod = findMethod(Customer.class, "getOrders"); - - // when - final FacetFactory.ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, collectionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacetForCollectionAnnotation); - assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); + propertyScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacetForCollectionAnnotation); + assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); + }); } @Test @@ -180,29 +146,22 @@ void whenInferFromType() { class Order { } class Customer { - public Order[] getOrders() { - return null; - } - - public void setOrders(final Order[] orders) { - } + public Order[] getOrders() { return null; } + public void setOrders(final Order[] orders) {} } // given - final Class cls = Customer.class; - collectionMethod = findMethod(Customer.class, "getOrders"); - - // when - final FacetFactory.ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, collectionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacet); - assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); - assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); + propertyScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacet); + assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); + assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); + }); } @Test @@ -211,28 +170,21 @@ void whenInferFromGenerics() { class Order { } class Customer { - public java.util.Collection getOrders() { - return null; - } - - public void setOrders(final java.util.Collection orders) { - } + public java.util.Collection getOrders() { return null; } + public void setOrders(final java.util.Collection orders) {} } // given - final Class cls = Customer.class; - collectionMethod = findMethod(Customer.class, "getOrders"); - - // when - final FacetFactory.ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(cls, null, collectionMethod, mockMethodRemover, facetedMethod); - processTypeOf(facetFactory, processMethodContext); - - // then - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacetFromFeature); - assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); + propertyScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processTypeOf(facetFactory, processMethodContext); + + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacetFromFeature); + assertThat(facet.value().getElementType(), CausewayMatchers.classEqualTo(Order.class)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java index 4cbab12ab9f..71ebd76851d 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java @@ -18,11 +18,13 @@ */ package org.apache.causeway.core.metamodel.facets.collections.collection; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Optional; import org.hamcrest.Matchers; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -31,94 +33,82 @@ import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CollectionSemantics; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet; import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacetFromFeature; class CollectionAnnotationFacetFactoryTest_typeOf -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private CollectionAnnotationFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - facetFactory = new CollectionAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new CollectionAnnotationFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - - public void testTypeOfFacetInferredForActionWithGenericCollectionReturnType() { + @Test + void typeOfFacetInferredForActionWithGenericCollectionReturnType() { class Order { } + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Collection someAction() { - return null; - } + public Collection someAction() { return null;} } - final Method actionMethod = findMethod(Customer.class, "someAction"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacetFromFeature); - final TypeOfFacetFromFeature typeOfFacetInferredFromGenerics = (TypeOfFacetFromFeature) facet; - assertEquals(Order.class, typeOfFacetInferredFromGenerics.value().getElementType()); - + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.process(processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacetFromFeature); + final TypeOfFacetFromFeature typeOfFacetInferredFromGenerics = (TypeOfFacetFromFeature) facet; + assertEquals(Order.class, typeOfFacetInferredFromGenerics.value().getElementType()); + }); } - public void testTypeOfFacetInferredForCollectionWithGenericCollectionReturnType() { + @Test + void typeOfFacetInferredForCollectionWithGenericCollectionReturnType() { class Order { } + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Collection getOrders() { - return null; - } + public Collection getOrders() { return null; } } - - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TypeOfFacetFromFeature); - final TypeOfFacetFromFeature typeOfFacetInferredFromGenerics = (TypeOfFacetFromFeature) facet; - assertEquals(Order.class, typeOfFacetInferredFromGenerics.value().getElementType()); - + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TypeOfFacetFromFeature); + final TypeOfFacetFromFeature typeOfFacetInferredFromGenerics = (TypeOfFacetFromFeature) facet; + assertEquals(Order.class, typeOfFacetInferredFromGenerics.value().getElementType()); + }); } - public void testTypeOfFacetIsInferredForCollectionFromOrderArray() { + @Test + void typeOfFacetIsInferredForCollectionFromOrderArray() { class Order { } + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public Order[] getOrders() { - return null; - } + public Order[] getOrders() { return null;} } - final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, collectionAccessorMethod, methodRemover, facetedMethod)); - - final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); - assertNotNull(facet); - assertEquals(Order.class, facet.value().getElementType()); - assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); - + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final TypeOfFacet facet = facetedMethod.getFacet(TypeOfFacet.class); + assertNotNull(facet); + assertEquals(Order.class, facet.value().getElementType()); + assertThat(facet.value().getCollectionSemantics(), Matchers.is(Optional.of(CollectionSemantics.ARRAY))); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/layout/annotation/CollectionLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/layout/annotation/CollectionLayoutAnnotationFactoryTest.java index 6a520605a8f..6373bd96277 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/layout/annotation/CollectionLayoutAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/collections/layout/annotation/CollectionLayoutAnnotationFactoryTest.java @@ -18,7 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.collections.layout.annotation; -import java.lang.reflect.Method; import java.util.SortedSet; import org.junit.jupiter.api.Test; @@ -36,8 +35,7 @@ import org.apache.causeway.applib.annotation.Where; import org.apache.causeway.commons.internal.collections._Sets; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet; import org.apache.causeway.core.metamodel.facets.all.i8n.staatic.HasStaticText; import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet; @@ -47,50 +45,44 @@ import lombok.val; -class CollectionLayoutAnnotationFactoryTest extends AbstractFacetFactoryTest { +class CollectionLayoutAnnotationFactoryTest +extends FacetFactoryTestAbstract { @Test - public void testCollectionLayoutAnnotation_named() { - val facetFactory = new CollectionLayoutFacetFactory(metaModelContext); - + void collectionLayoutAnnotation_named() { + val facetFactory = new CollectionLayoutFacetFactory(getMetaModelContext()); class Customer { @CollectionLayout(named = "1st names") - public SortedSet getFirstNames() { - return _Sets.newTreeSet(); - } + public SortedSet getFirstNames() { return _Sets.newTreeSet(); } } - final Method method = findMethod(Customer.class, "getFirstNames"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - val facet = facetedMethod.getFacet(MemberNamedFacet.class); - assertThat(facet, is(notNullValue())); - assertThat(facet, is(instanceOf(MemberNamedFacetForCollectionLayoutAnnotation.class))); - assertThat(((HasStaticText)facet).text(), is(equalTo("1st names"))); + collectionScenario(Customer.class, "firstNames", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + val facet = facetedMethod.getFacet(MemberNamedFacet.class); + assertThat(facet, is(notNullValue())); + assertThat(facet, is(instanceOf(MemberNamedFacetForCollectionLayoutAnnotation.class))); + assertThat(((HasStaticText)facet).text(), is(equalTo("1st names"))); + }); } @Test - void testCollectionLayoutAnnotation_hidden() { - val facetFactory = new CollectionLayoutFacetFactory(metaModelContext); - + void collectionLayoutAnnotation_hidden() { + val facetFactory = new CollectionLayoutFacetFactory(getMetaModelContext()); class Customer { @CollectionLayout(hidden = Where.OBJECT_FORMS) - public SortedSet getFirstNames() { - return _Sets.newTreeSet(); - } + public SortedSet getFirstNames() { return _Sets.newTreeSet(); } } - final Method method = findMethod(Customer.class, "getFirstNames"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HiddenFacetForCollectionLayoutAnnotation); - final HiddenFacetForCollectionLayoutAnnotation collLayoutFacetAnnotation = (HiddenFacetForCollectionLayoutAnnotation) facet; - assertEquals(Where.OBJECT_FORMS, collLayoutFacetAnnotation.where()); - + collectionScenario(Customer.class, "firstNames", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HiddenFacetForCollectionLayoutAnnotation); + final HiddenFacetForCollectionLayoutAnnotation collLayoutFacetAnnotation = (HiddenFacetForCollectionLayoutAnnotation) facet; + assertEquals(Where.OBJECT_FORMS, collLayoutFacetAnnotation.where()); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/bookmarkpolicy/BookmarkableAnnotationFacetFactoryTest_class.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/bookmarkpolicy/BookmarkableAnnotationFacetFactoryTest_class.java index 9ab1b8d46a5..a6559cef5e7 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/bookmarkpolicy/BookmarkableAnnotationFacetFactoryTest_class.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/bookmarkpolicy/BookmarkableAnnotationFacetFactoryTest_class.java @@ -18,6 +18,10 @@ */ package org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -25,42 +29,42 @@ import org.apache.causeway.applib.annotation.BookmarkPolicy; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory; class BookmarkableAnnotationFacetFactoryTest_class -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private BookmarkPolicyFacetFallbackFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new BookmarkPolicyFacetFallbackFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new BookmarkPolicyFacetFallbackFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testBookmarkablePolicyInferredPickedUpOnClassAndDefaultsToAlways() { + @Test + void bookmarkablePolicyInferredPickedUpOnClassAndDefaultsToAlways() { class Customer { } - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod)); + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(BookmarkPolicyFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof BookmarkPolicyFacetFallback); + BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet; + assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.NEVER)); - final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof BookmarkPolicyFacetFallback); - BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet; - assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.NEVER)); + assertNoMethodsRemoved(); + }); - assertNoMethodsRemoved(); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java index a740b6298d8..6dcc1331eda 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CallbackFacetFactoryTestAbstract.java @@ -18,39 +18,44 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; -import org.junit.jupiter.api.Assertions; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.apache.causeway.commons.collections.Can; import org.apache.causeway.commons.internal.reflection._MethodFacades; +import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.ImperativeFacet; import org.apache.causeway.core.metamodel.facets.object.callbacks.CallbackFacetFactory; import lombok.val; abstract class CallbackFacetFactoryTestAbstract -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { protected CallbackFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new CallbackFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new CallbackFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } + /** + * see also ObjectSupportFacetFactoryTestAbstract#assertPicksUp + */ protected void assertPicksUp( final int expectedCallbackCount, final FacetFactory facetFactory, @@ -58,24 +63,29 @@ protected void assertPicksUp( final ProgrammingModelConstants.CallbackMethod callbackMethod, final Class facetType) { - // when - facetFactory.process(ProcessClassContext - .forTesting(type, methodRemover, facetedMethod)); - - val callbackMethods = callbackMethod.getMethodNames() - .map(methodName->findMethod(type, methodName)) - .map(_MethodFacades::regular); - - Assertions.assertEquals(expectedCallbackCount, callbackMethods.size()); - - val facet = facetedMethod.getFacet(facetType); - assertNotNull(facet); - assertTrue(facet instanceof ImperativeFacet); - val imperativeFacet = facet; - - callbackMethods.forEach(method->{ - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method)); - assertTrue(imperativeFacet.getMethods().contains(method)); + objectScenario(type, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + val callbackMethods = callbackMethod.getMethodNames().stream() + .map(methodName->findMethodExact(type, methodName)) + .flatMap(Optional::stream) + .map(_MethodFacades::regular) + .map(MethodFacade::asMethodElseFail) + .collect(Can.toCan()); + + assertEquals(expectedCallbackCount, callbackMethods.size()); + + val facet = facetHolder.getFacet(facetType); + assertNotNull(facet); + assertTrue(facet instanceof ImperativeFacet); + val imperativeFacet = facet; + + callbackMethods.forEach(method->{ + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method)); + assertTrue(imperativeFacet.getMethods() + .map(MethodFacade::asMethodElseFail).contains(method)); + }); }); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java index 285e0dc4426..0c7a784beb3 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/CreatedCallbackFacetFactoryTest.java @@ -18,17 +18,19 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.CreatedCallbackFacet; -public class CreatedCallbackFacetFactoryTest +class CreatedCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testCreatedLifecycleMethodPickedUpOn() { + @Test + void createdLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void created() { - } + public void created() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.CREATED, CreatedCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java index e2425348a50..c6aa21b803e 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/LoadedCallbackFacetFactoryTest.java @@ -18,17 +18,19 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.LoadedCallbackFacet; -public class LoadedCallbackFacetFactoryTest +class LoadedCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testLoadedLifecycleMethodPickedUpOn() { + @Test + void loadedLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void loaded() { - } + public void loaded() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.LOADED, LoadedCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java index 9f8c80eea91..9bd72628295 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistedCallbackFacetFactoryTest.java @@ -18,42 +18,40 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.PersistedCallbackFacet; -public class PersistedCallbackFacetFactoryTest +class PersistedCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testPersistedLifecycleMethodPickedUpOn() { + @Test + void persistedLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void persisted() { - } + public void persisted() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class); } - public void testSavedLifecycleMethodPickedUpOn() { + @Test + void savedLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void saved() { - } + public void saved() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class); } - public void testSavedAndPersistedLifecycleMethodPickedUpOn() { + @Test + void savedAndPersistedLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void saved() { - } - - @SuppressWarnings("unused") - public void persisted() { - } + public void saved() {} + public void persisted() {} } assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.PERSISTED, PersistedCallbackFacet.class); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java index 18d6a637a38..15d7ec74db5 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/PersistingCallbackFacetFactoryTest.java @@ -18,41 +18,39 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.PersistingCallbackFacet; -public class PersistingCallbackFacetFactoryTest +class PersistingCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testPersistingLifecycleMethodPickedUpOn() { + @Test + void persistingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void persisting() { - } + public void persisting() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class); } - public void testSavingLifecycleMethodPickedUpOn() { + @Test + void savingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void saving() { - } + public void saving() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class); } - public void testSavingAndPersistingLifecycleMethodPickedUpOn() { + @Test + void savingAndPersistingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void saving() { - } - - @SuppressWarnings("unused") - public void persisting() { - } + public void saving() {} + public void persisting() {} } - assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.PERSISTING, PersistingCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java index 796925f4528..6bc6f4e84d6 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/RemovingCallbackFacetFactoryTest.java @@ -18,38 +18,38 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.RemovingCallbackFacet; -public class RemovingCallbackFacetFactoryTest +class RemovingCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testRemovingLifecycleMethodPickedUpOn() { + @Test + void removingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void removing() { - } + public void removing() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class); } - public void testDeletingLifecycleMethodPickedUpOn() { + @Test + void deletingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void deleting() { - } + public void deleting() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class); } - public void testRemovingAndDeletingLifecycleMethodPickedUpOn() { + @Test + void removingAndDeletingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void removing() { - } - @SuppressWarnings("unused") - public void deleting() { - } + public void removing() {} + public void deleting() {} } assertPicksUp(2, facetFactory, Customer.class, CallbackMethod.REMOVING, RemovingCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java index 2ea7879a929..c8d6286b0de 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatedCallbackFacetFactoryTest.java @@ -18,17 +18,19 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.UpdatedCallbackFacet; -public class UpdatedCallbackFacetFactoryTest +class UpdatedCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testUpdatedLifecycleMethodPickedUpOn() { + @Test + void updatedLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void updated() { - } + public void updated() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.UPDATED, UpdatedCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java index a9e2d3a2c10..c37c45522ac 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/callback/UpdatingCallbackFacetFactoryTest.java @@ -18,17 +18,19 @@ */ package org.apache.causeway.core.metamodel.facets.object.callback; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.CallbackMethod; import org.apache.causeway.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet; -public class UpdatingCallbackFacetFactoryTest +class UpdatingCallbackFacetFactoryTest extends CallbackFacetFactoryTestAbstract { - public void testUpdatingLifecycleMethodPickedUpOn() { + @Test + void updatingLifecycleMethodPickedUpOn() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void updating() { - } + public void updating() {} } assertPicksUp(1, facetFactory, Customer.class, CallbackMethod.UPDATING, UpdatingCallbackFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java index 65141e5105a..e53b110ef02 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/cssclassfa/CssClassFaFacetOnTypeAnnotationFactoryTest.java @@ -16,9 +16,9 @@ * under the License. */ package org.apache.causeway.core.metamodel.facets.object.cssclassfa; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; -public class CssClassFaFacetOnTypeAnnotationFactoryTest extends AbstractFacetFactoryJupiterTestCase { +public class CssClassFaFacetOnTypeAnnotationFactoryTest extends FacetFactoryTestAbstract { // @Test // public void testCssClassFaAnnotationPickedUpOnClass() { diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java index 10fb45c4d79..833441bd4c4 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java @@ -18,13 +18,16 @@ */ package org.apache.causeway.core.metamodel.facets.object.disabled; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; public class ObjectDisabledMethodFacetFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testDisabledMethodPickedUpAndMethodRemoved() { + @Test + void disabledMethodPickedUpAndMethodRemoved() { class Customer { @SuppressWarnings("unused") public String disabled() { diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java index c7275bbc0e8..40772fffe3f 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java @@ -18,50 +18,50 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainobject; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.applib.annotation.Bounding; import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.choices.ChoicesFacetFromBoundedAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.choices.ChoicesFacet; -import lombok.val; - class ChoicesFacetFromBoundedAnnotationFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private DomainObjectAnnotationFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testBoundedAnnotationPickedUpOnClass() { + @Test + void boundedAnnotationPickedUpOnClass() { @DomainObject(bounding = Bounding.BOUNDED) class Customer { } + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.processBounded(processClassContext.synthesizeOnType(DomainObject.class), processClassContext); + //then + final Facet facet = facetHolder.getFacet(ChoicesFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ChoicesFacetFromBoundedAbstract); - val context = ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod); - facetFactory.processBounded(context.synthesizeOnType(DomainObject.class), context); - - final Facet facet = facetedMethod.getFacet(ChoicesFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ChoicesFacetFromBoundedAbstract); + assertNoMethodsRemoved(); + }); - assertNoMethodsRemoved(); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java index 1bf882baba1..e12a068b13f 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java @@ -38,11 +38,9 @@ import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.applib.id.LogicalType; import org.apache.causeway.applib.mixins.system.HasInteractionId; -import org.apache.causeway.core.config.CausewayConfiguration; import org.apache.causeway.core.config.metamodel.facets.DomainObjectConfigOptions; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.autocomplete.AutoCompleteFacet; import org.apache.causeway.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation; import org.apache.causeway.core.metamodel.facets.object.domainobject.choices.ChoicesFacetForDomainObjectAnnotation; @@ -59,20 +57,17 @@ import org.apache.causeway.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation; import org.apache.causeway.core.metamodel.facets.objectvalue.choices.ChoicesFacet; -import lombok.val; - class DomainObjectAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { DomainObjectAnnotationFacetFactory facetFactory; @BeforeEach void setUp() throws Exception { - facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext); + facetFactory = new DomainObjectAnnotationFacetFactory(getMetaModelContext()); } @AfterEach - @Override protected void tearDown() throws Exception { facetFactory = null; } @@ -91,15 +86,15 @@ public UUID getInteractionId() { void allowingEntityChangePublishingToReturn(final DomainObjectConfigOptions.EntityChangePublishingPolicy value) { if(value!=null) { - val config = super.metaModelContext.getConfiguration(); - config.getApplib().getAnnotation().getDomainObject().setEntityChangePublishing(value); + getConfiguration() + .getApplib().getAnnotation().getDomainObject().setEntityChangePublishing(value); } } void allowingObjectsEditingToReturn(final DomainObjectConfigOptions.EditingObjectsConfiguration value) { if(value!=null) { - final CausewayConfiguration config = super.metaModelContext.getConfiguration(); - config.getApplib().getAnnotation().getDomainObject().setEditing(value); + getConfiguration() + .getApplib().getAnnotation().getDomainObject().setEditing(value); } } @@ -127,31 +122,31 @@ public static class WhenNotAnnotatedAndDefaultsFromConfiguration extends EntityC @Test void configured_value_set_to_all() { allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.processEntityChangePublishing( + processClassContext.synthesizeOnType(DomainObject.class), processClassContext); - val context = ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder); - facetFactory.processEntityChangePublishing(context.synthesizeOnType(DomainObject.class), context); - - final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); - assertThat(facet, is(notNullValue())); - assertTrue(facet instanceof EntityChangePublishingFacetFromConfiguration); - assertThat(facet.isEnabled(), is(true)); + final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertThat(facet, is(notNullValue())); + assertTrue(facet instanceof EntityChangePublishingFacetFromConfiguration); + assertThat(facet.isEnabled(), is(true)); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test void configured_value_set_to_none() { allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.NONE); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); - - final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); - assertNotNull(facet); - assertThat(facet.isEnabled(), is(false)); + final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertNotNull(facet); + assertThat(facet.isEnabled(), is(false)); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -161,30 +156,30 @@ public static class WithDomainObjectAnnotationWithAuditingSetToAsConfigured exte @Test public void configured_value_set_to_all() { allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL); + objectScenario(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, mockMethodRemover, facetHolder)); - - final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured); - assertThat(facet.isEnabled(), is(true)); + final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured); + assertThat(facet.isEnabled(), is(true)); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void configured_value_set_to_none() { allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.NONE); + objectScenario(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndAuditingSetToAsConfigured.class, mockMethodRemover, facetHolder)); + final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertNotNull(facet); + assertThat(facet.isEnabled(), is(false)); - final EntityChangePublishingFacet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); - assertNotNull(facet); - assertThat(facet.isEnabled(), is(false)); - - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -194,15 +189,15 @@ public static class WithDomainObjectAnnotationWithAuditingSetToEnabled extends E @Test public void irrespective_of_configured_value() { allowingEntityChangePublishingToReturn(null); + objectScenario(CustomerWithDomainObjectAndAuditingSetToEnabled.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndAuditingSetToEnabled.class, mockMethodRemover, facetHolder)); + final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof EntityChangePublishingFacetForDomainObjectAnnotation); - final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof EntityChangePublishingFacetForDomainObjectAnnotation); - - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -212,13 +207,13 @@ public static class WithDomainObjectAnnotationWithAuditingSetToDisabled extends @Test public void irrespective_of_configured_value() { allowingEntityChangePublishingToReturn(DomainObjectConfigOptions.EntityChangePublishingPolicy.ALL); + objectScenario(CustomerWithDomainObjectAndAuditingSetToDisabled.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndAuditingSetToDisabled.class, mockMethodRemover, facetHolder)); - - assertFalse(EntityChangePublishingFacet.isPublishingEnabled(facetHolder)); + assertFalse(EntityChangePublishingFacet.isPublishingEnabled(facetHolder)); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -250,67 +245,68 @@ class CustomerWithDomainObjectButNoAutoCompleteRepository { @Test public void whenDomainObjectAndAutoCompleteRepositoryAndAction() { - facetFactory.process(ProcessClassContext - .forTesting( - CustomerWithDomainObjectAndAutoCompleteRepositoryAndAction.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndAutoCompleteRepositoryAndAction.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); - assertNotNull(facet); + final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); + assertNotNull(facet); + + assertTrue(facet instanceof AutoCompleteFacetForDomainObjectAnnotation); - assertTrue(facet instanceof AutoCompleteFacetForDomainObjectAnnotation); + final AutoCompleteFacetForDomainObjectAnnotation autoCompleteFacet = (AutoCompleteFacetForDomainObjectAnnotation) facet; - final AutoCompleteFacetForDomainObjectAnnotation autoCompleteFacet = (AutoCompleteFacetForDomainObjectAnnotation) facet; + assertThat(CustomerRepository.class.isAssignableFrom(autoCompleteFacet.getRepositoryClass()), is(true)); + assertThat(autoCompleteFacet.getActionName(), is("lookup")); - assertThat(CustomerRepository.class.isAssignableFrom(autoCompleteFacet.getRepositoryClass()), is(true)); - assertThat(autoCompleteFacet.getActionName(), is("lookup")); + assertNoMethodsRemoved(); + }); - expectNoMethodsRemoved(); } @Test public void whenDomainObjectAndAutoCompleteRepository() { - facetFactory.process(ProcessClassContext - .forTesting( - CustomerWithDomainObjectAndAutoCompleteRepository.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndAutoCompleteRepository.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); - assertNotNull(facet); + final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); + assertNotNull(facet); - assertTrue(facet instanceof AutoCompleteFacetForDomainObjectAnnotation); + assertTrue(facet instanceof AutoCompleteFacetForDomainObjectAnnotation); - final AutoCompleteFacetForDomainObjectAnnotation autoCompleteFacet = (AutoCompleteFacetForDomainObjectAnnotation) facet; + final AutoCompleteFacetForDomainObjectAnnotation autoCompleteFacet = (AutoCompleteFacetForDomainObjectAnnotation) facet; - assertThat(CustomerRepositoryWithDefaultMethodName.class.isAssignableFrom(autoCompleteFacet.getRepositoryClass()), is(true)); - assertThat(autoCompleteFacet.getActionName(), is("autoComplete")); + assertThat(CustomerRepositoryWithDefaultMethodName.class.isAssignableFrom(autoCompleteFacet.getRepositoryClass()), is(true)); + assertThat(autoCompleteFacet.getActionName(), is("autoComplete")); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenDomainObjectAnnotationButNoAutoComplete() { - facetFactory.process(ProcessClassContext - .forTesting( - CustomerWithDomainObjectButNoAutoCompleteRepository.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectButNoAutoCompleteRepository.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenNoDomainObjectAnnotation() { - facetFactory.process(ProcessClassContext - .forTesting( - DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(AutoCompleteFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -339,39 +335,43 @@ public void setUp() throws Exception { @Test public void whenDomainObjectAndBoundedSetToTrue() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndBoundedSetToTrue.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndBoundedSetToTrue.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ChoicesFacet.class); - assertNotNull(facet); + final Facet facet = facetHolder.getFacet(ChoicesFacet.class); + assertNotNull(facet); - assertTrue(facet instanceof ChoicesFacetForDomainObjectAnnotation); + assertTrue(facet instanceof ChoicesFacetForDomainObjectAnnotation); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + + }); } @Test public void whenDomainObjectAndAutoCompleteRepository() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndBoundedSetToFalse.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndBoundedSetToFalse.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ChoicesFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ChoicesFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenNoDomainObjectAnnotation() { - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ChoicesFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ChoicesFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -400,42 +400,45 @@ public static class WhenNotAnnotatedAndDefaultsFromConfiguration extends Editing public void configured_value_set_to_true() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE); - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNull(facet); + + assertNoMethodsRemoved(); - expectNoMethodsRemoved(); + }); } @Test public void configured_value_set_to_false() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE); - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ImmutableFacetFromConfiguration); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ImmutableFacetFromConfiguration); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void configured_value_set_to_defaults() { //allowingConfigurationToReturn("causeway.objects.editing", "foobar"); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNotNull(facet); // default is now non-editable - assertTrue(facet instanceof ImmutableFacetFromConfiguration); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNotNull(facet); // default is now non-editable + assertTrue(facet instanceof ImmutableFacetFromConfiguration); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -445,42 +448,42 @@ public static class WithDomainObjectAnnotationWithEditingSetToAsConfigured exten @Test public void configured_value_set_to_true() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE); + objectScenario(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, mockMethodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void configured_value_set_to_false() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE); + objectScenario(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, mockMethodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotation); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotation); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void configured_value_set_to_defaults() { //allowingConfigurationToReturn("causeway.objects.editing", "foobar"); + objectScenario(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndEditingSetToAsConfigured.class, mockMethodRemover, facetHolder)); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNotNull(facet); // default is now non-editable + assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotationAsConfigured); - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNotNull(facet); // default is now non-editable - assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotationAsConfigured); - - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -489,17 +492,15 @@ public static class WithDomainObjectAnnotationWithEditingSetToEnabled extends Ed @Test public void irrespective_of_configured_value() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.FALSE); + objectScenario(CustomerWithDomainObjectAndEditingSetToEnabled.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting( - CustomerWithDomainObjectAndEditingSetToEnabled.class, mockMethodRemover, facetHolder)); - - final ImmutableFacet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNull(facet); + final ImmutableFacet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } - } public static class WithDomainObjectAnnotationWithEditingSetToDisabled extends Editing { @@ -507,20 +508,17 @@ public static class WithDomainObjectAnnotationWithEditingSetToDisabled extends E @Test public void irrespective_of_configured_value() { allowingObjectsEditingToReturn(DomainObjectConfigOptions.EditingObjectsConfiguration.TRUE); + objectScenario(CustomerWithDomainObjectAndEditingSetToDisabled.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - facetFactory.process(ProcessClassContext - .forTesting( - CustomerWithDomainObjectAndEditingSetToDisabled.class, mockMethodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(ImmutableFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotation); + final Facet facet = facetHolder.getFacet(ImmutableFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotation); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } - } - } public static class LogicalTypeName extends DomainObjectAnnotationFacetFactoryTest { @@ -545,31 +543,33 @@ public void setUp() throws Exception { public void whenDomainObjectAndObjectTypeSetToTrue() { assertThat(LogicalType.infer(CustomerWithDomainObjectAndObjectTypeSet.class).getLogicalTypeName(), is("CUS")); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); } @Test public void whenDomainObjectAndObjectTypeNotSet() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectButNoObjectType.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectButNoObjectType.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AliasedFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(AliasedFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenNoDomainObjectAnnotation() { - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(AliasedFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(AliasedFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } @@ -602,51 +602,57 @@ public void setUp() throws Exception { @Test public void whenDomainObjectAndNatureSetToJdoEntity() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndNatureSetToJdoEntity.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndNatureSetToJdoEntity.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ViewModelFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ViewModelFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenDomainObjectAndNatureSetToNotSpecified() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndNatureSetToNotSpecified.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndNatureSetToNotSpecified.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - final Facet facet = facetHolder.getFacet(ViewModelFacet.class); - assertNull(facet); + final Facet facet = facetHolder.getFacet(ViewModelFacet.class); + assertNull(facet); - expectNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } @Test public void whenDomainObjectAndNatureSetToViewModel() { - facetFactory.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndNatureSetToViewModel.class, mockMethodRemover, facetHolder)); + objectScenario(CustomerWithDomainObjectAndNatureSetToViewModel.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + + final Facet facet = facetHolder.getFacet(ViewModelFacet.class); + assertNotNull(facet); - final Facet facet = facetHolder.getFacet(ViewModelFacet.class); - assertNotNull(facet); + assertTrue(facet instanceof ViewModelFacetForDomainObjectAnnotation); - assertTrue(facet instanceof ViewModelFacetForDomainObjectAnnotation); + assertNoMethodsRemoved(); + }); - expectNoMethodsRemoved(); } @Test public void whenNoDomainObjectAnnotation() { - facetFactory.process(ProcessClassContext - .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); + objectScenario(DomainObjectAnnotationFacetFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + + final Facet facet = facetHolder.getFacet(ViewModelFacet.class); + assertNull(facet); - final Facet facet = facetHolder.getFacet(ViewModelFacet.class); - assertNull(facet); + assertNoMethodsRemoved(); + }); - expectNoMethodsRemoved(); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java index e201e555174..278c45d3db0 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java @@ -27,10 +27,10 @@ import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.applib.id.LogicalType; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; class NamedAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { @Test void logicalTypeNameAnnotationPickedUpOnClass() { diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java index 6196e983d38..d2d93016fdb 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java @@ -21,9 +21,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.Mockito; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; @@ -37,8 +35,7 @@ import org.apache.causeway.applib.annotation.DomainObjectLayout; import org.apache.causeway.applib.layout.component.CssClassFaPosition; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.described.ObjectDescribedFacet; import org.apache.causeway.core.metamodel.facets.all.named.ObjectNamedFacet; import org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet; @@ -49,9 +46,8 @@ import lombok.val; -@ExtendWith(MockitoExtension.class) class DomainObjectLayoutFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { DomainObjectLayoutFacetFactory facetFactory; @@ -59,14 +55,12 @@ class DomainObjectLayoutFactoryTest @BeforeEach public void setUp() throws Exception { - facetFactory = new DomainObjectLayoutFacetFactory(metaModelContext); + facetFactory = new DomainObjectLayoutFacetFactory(getMetaModelContext()); } - @Override @AfterEach public void tearDown() throws Exception { facetFactory = null; - super.tearDown(); } // -- DOMAIN OBJECTS FOR TESTING @@ -87,22 +81,12 @@ class CustomerWithDefaults { } // -- LAYOUT TESTS - public static class Bookmarking extends DomainObjectLayoutFactoryTest { + public static class DomainObjectLayout_bookmarking extends DomainObjectLayoutFactoryTest { - public static class ForDomainObjectLayout extends Bookmarking { - - @BeforeEach - public void setUp2() throws Exception { - - } - - @Test - public void whenSpecified() { - - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(BookmarkPolicyFacet.class); assertNotNull(facet); @@ -113,93 +97,65 @@ public void whenSpecified() { assertThat(facetImpl.value(), is(BookmarkPolicy.AS_ROOT)); - expectNoMethodsRemoved(); - } - - @Test - public void whenDefaults() { + assertNoMethodsRemoved(); - final Class cls = CustomerWithDefaults.class; + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final BookmarkPolicyFacet facet = facetHolder.getFacet(BookmarkPolicyFacet.class); assertThat(facet.value(), is(BookmarkPolicy.NOT_SPECIFIED)); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } } // -- - public static class CssClass extends DomainObjectLayoutFactoryTest { + public static class DomainObjectLayout_cssClass extends DomainObjectLayoutFactoryTest { - @Mock ManagedObject mockAdapter; - - public static class ForDomainObjectLayout extends CssClass { - - @Override - @BeforeEach - public void setUp() throws Exception { - super.setUp(); - } - - @Test - public void whenSpecified() { - - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(CssClassFacet.class); assertNotNull(facet); assertTrue(facet instanceof CssClassFacetForDomainObjectLayoutAnnotation); - final CssClassFacetForDomainObjectLayoutAnnotation facetImpl = + val facetImpl = (CssClassFacetForDomainObjectLayoutAnnotation) facet; + val mockAdapter = Mockito.mock(ManagedObject.class); assertThat(facetImpl.cssClass(mockAdapter), is("foobar")); - expectNoMethodsRemoved(); - } - - @Test - public void whenDefaults() { - - final Class cls = CustomerWithDefaults.class; + assertNoMethodsRemoved(); + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(CssClassFacet.class); assertNull(facet); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } - } - public static class CssClassFa extends DomainObjectLayoutFactoryTest { - - @Mock ManagedObject mockAdapter; - - public static class ForDomainObjectLayout extends CssClassFa { - - @BeforeEach - public void setUp2() throws Exception { - } - - - @Test - public void whenSpecified() { + public static class DomainObjectLayout_cssClassFa extends DomainObjectLayoutFactoryTest { - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(CssClassFaFacet.class); assertNotNull(facet); @@ -209,44 +165,30 @@ public void whenSpecified() { assertThat(facetImpl.asSpaceSeparated(), equalTo("fa fa-fw fa-foo")); assertThat(facetImpl.getPosition(), is(CssClassFaPosition.RIGHT)); - expectNoMethodsRemoved(); - } - - @Test - public void whenDefaults() { + assertNoMethodsRemoved(); - final Class cls = CustomerWithDefaults.class; + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(CssClassFaFacet.class); assertNull(facet); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } - - } - public static class DescribedAs extends DomainObjectLayoutFactoryTest { - - @Mock ManagedObject mockAdapter; + public static class DomainObjectLayout_describedAs extends DomainObjectLayoutFactoryTest { - public static class ForDomainObjectLayout extends DescribedAs { - - @BeforeEach - public void setUp2() throws Exception { - } - - @Test - public void whenSpecified() { - - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(ObjectDescribedFacet.class); assertNotNull(facet); @@ -255,44 +197,30 @@ public void whenSpecified() { final ObjectDescribedFacetForDomainObjectLayoutAnnotation facetImpl = (ObjectDescribedFacetForDomainObjectLayoutAnnotation) facet; assertThat(facetImpl.text(), is("This is a description")); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); - @Test - public void whenDefaults() { - - final Class cls = CustomerWithDefaults.class; + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(ObjectDescribedFacet.class); assertNull(facet); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } - - } - public static class Named extends DomainObjectLayoutFactoryTest { - - @Mock ManagedObject mockAdapter; - - public static class ForDomainObjectLayout extends Named { - - @BeforeEach - public void setUp2() throws Exception { - } + public static class DomainObjectLayout_named extends DomainObjectLayoutFactoryTest { - @Test - public void whenSpecified() { - - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class); assertNotNull(namedFacet); @@ -300,44 +228,29 @@ public void whenSpecified() { assertEquals("Name override", namedFacet.singular()); - expectNoMethodsRemoved(); - } - - @Test - public void whenDefaults() { - - final Class cls = CustomerWithDefaults.class; + assertNoMethodsRemoved(); + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); val facet = facetHolder.getFacet(ObjectNamedFacet.class); assertNull(facet); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } - - } - public static class Paged extends DomainObjectLayoutFactoryTest { - - @Mock ManagedObject mockAdapter; - - public static class ForDomainObjectLayout extends Paged { - - @BeforeEach - public void setUp2() throws Exception { - } + public static class DomainObjectLayout_paged extends DomainObjectLayoutFactoryTest { - @Test - public void whenSpecified() { - - final Class cls = DomainObjectLayoutFactoryTest.Customer.class; - - facetFactory.process(ProcessClassContext - .forTesting(cls, mockMethodRemover, facetHolder)); + @Test + public void whenSpecified() { + objectScenario(DomainObjectLayoutFactoryTest.Customer.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(PagedFacet.class); assertNotNull(facet); @@ -346,24 +259,21 @@ public void whenSpecified() { final PagedFacetForDomainObjectLayoutAnnotation facetImpl = (PagedFacetForDomainObjectLayoutAnnotation) facet; assertThat(facetImpl.value(), is(20)); - expectNoMethodsRemoved(); - } - - @Test - public void whenDefaults() { + assertNoMethodsRemoved(); - final Class cls = CustomerWithDefaults.class; + }); + } - facetFactory.process(ProcessClassContext - .forTesting(cls,mockMethodRemover, facetHolder)); + @Test + public void whenDefaults() { + objectScenario(CustomerWithDefaults.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); final Facet facet = facetHolder.getFacet(PagedFacet.class); assertNull(facet); - expectNoMethodsRemoved(); - } + assertNoMethodsRemoved(); + }); } - } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java index 572d009e7a9..77a3103d9ac 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java @@ -18,31 +18,30 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainservice.annotation; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.applib.annotation.DomainService; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.domainservice.DomainServiceFacet; class DomainServiceFacetAnnotationFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private DomainServiceFacetAnnotationFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new DomainServiceFacetAnnotationFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new DomainServiceFacetAnnotationFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } public void testAggregatedAnnotationPickedUpOnClass() { @@ -51,16 +50,19 @@ public void testAggregatedAnnotationPickedUpOnClass() { class Customers { } - facetFactory.process(ProcessClassContext - .forTesting(Customers.class, methodRemover, facetHolder)); + objectScenario(Customers.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(DomainServiceFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DomainServiceFacetForAnnotation); + DomainServiceFacetForAnnotation domainServiceFacet = (DomainServiceFacetForAnnotation) facet; + assertNotNull(domainServiceFacet); - final Facet facet = facetHolder.getFacet(DomainServiceFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DomainServiceFacetForAnnotation); - DomainServiceFacetForAnnotation domainServiceFacet = (DomainServiceFacetForAnnotation) facet; - assertNotNull(domainServiceFacet); + assertNoMethodsRemoved(); + }); - assertNoMethodsRemoved(); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservicelayout/annotation/DomainServiceLayoutFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservicelayout/annotation/DomainServiceLayoutFacetFactoryTest.java index b96a8743abd..8a391159820 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservicelayout/annotation/DomainServiceLayoutFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/domainservicelayout/annotation/DomainServiceLayoutFacetFactoryTest.java @@ -18,6 +18,9 @@ */ package org.apache.causeway.core.metamodel.facets.object.domainservicelayout.annotation; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -26,102 +29,106 @@ import org.apache.causeway.applib.annotation.DomainService; import org.apache.causeway.applib.annotation.DomainServiceLayout; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet; import org.apache.causeway.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacetFactory; class DomainServiceLayoutFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private DomainServiceLayoutFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new DomainServiceLayoutFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new DomainServiceLayoutFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } - public void testAnnotationPickedUpOnClass() { + void testAnnotationPickedUpOnClass() { @DomainService @DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.SECONDARY) class Customers { } - facetFactory.process(ProcessClassContext - .forTesting(Customers.class, methodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); - DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; - //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("123")); - assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); - - assertNoMethodsRemoved(); + objectScenario(Customers.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); + DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; + //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("123")); + assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); + + assertNoMethodsRemoved(); + }); } - - public void testDomainServiceAnnotationPickedUpOnClass() { + void testDomainServiceAnnotationPickedUpOnClass() { @DomainService class Customers { } - facetFactory.process(ProcessClassContext - .forTesting(Customers.class, methodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); - DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; - assertNotNull(domainServiceLayoutFacet); - - assertNoMethodsRemoved(); + objectScenario(Customers.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); + DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; + assertNotNull(domainServiceLayoutFacet); + + assertNoMethodsRemoved(); + }); } - public void testDomainServiceAndDomainServiceLayoutAnnotationWhenCompatiblePickedUpOnClass() { + void testDomainServiceAndDomainServiceLayoutAnnotationWhenCompatiblePickedUpOnClass() { @DomainService//(menuOrder = "123") @DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.SECONDARY) class Customers { } - facetFactory.process(ProcessClassContext - .forTesting(Customers.class, methodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); - DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; - //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("123")); - assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); - - assertNoMethodsRemoved(); + objectScenario(Customers.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); + DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; + //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("123")); + assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); + + assertNoMethodsRemoved(); + }); } - public void testDomainServiceAndDomainServiceLayoutAnnotation_takes_the_minimum() { + void testDomainServiceAndDomainServiceLayoutAnnotation_takes_the_minimum() { @DomainService//(menuOrder = "1") @DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.SECONDARY) class Customers { } - facetFactory.process(ProcessClassContext - .forTesting(Customers.class, methodRemover, facetHolder)); + objectScenario(Customers.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); + DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; + //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("1")); + assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); - final Facet facet = facetHolder.getFacet(DomainServiceLayoutFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DomainServiceLayoutFacetAnnotation); - DomainServiceLayoutFacetAnnotation domainServiceLayoutFacet = (DomainServiceLayoutFacetAnnotation) facet; - //assertThat(domainServiceLayoutFacet.getMenuOrder(), is("1")); - assertThat(domainServiceLayoutFacet.getMenuBar(), is(DomainServiceLayout.MenuBar.SECONDARY)); + assertNoMethodsRemoved(); + }); - assertNoMethodsRemoved(); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/hidden/ObjectHiddenMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/hidden/ObjectHiddenMethodFacetFactoryTest.java index 2be131b6a91..6d81e95afd6 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/hidden/ObjectHiddenMethodFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/hidden/ObjectHiddenMethodFacetFactoryTest.java @@ -18,13 +18,16 @@ */ package org.apache.causeway.core.metamodel.facets.object.hidden; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; -public class ObjectHiddenMethodFacetFactoryTest +class ObjectHiddenMethodFacetFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testDisabledMethodPickedUpAndMethodRemovedBooleanType() { + @Test + void disabledMethodPickedUpAndMethodRemovedBooleanType() { class Customer { @SuppressWarnings("unused") public boolean hidden() { diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java index bdde5f40d1e..d6a2f372f92 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodFactoryTest.java @@ -18,19 +18,20 @@ */ package org.apache.causeway.core.metamodel.facets.object.ident.cssclass; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; -public class CssClassFacetMethodFactoryTest +class CssClassFacetMethodFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testIconNameMethodPickedUpOnClassAndMethodRemoved() { + @Test + void iconNameMethodPickedUpOnClassAndMethodRemoved() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String cssClass() { - return null; - } + public String cssClass() { return null; } } assertPicksUp(1, facetFactory, Customer.class, ObjectSupportMethod.CSS_CLASS, CssClassFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java index c892065dd64..158a7469532 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodTest.java @@ -30,8 +30,8 @@ import org.apache.causeway.applib.annotation.Introspection; import org.apache.causeway.applib.annotation.MemberSupport; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.members.cssclass.CssClassFacet; import org.apache.causeway.core.metamodel.facets.object.cssclass.method.CssClassFacetViaCssClassMethod; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactory; @@ -39,7 +39,7 @@ import lombok.val; class CssClassFacetMethodTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { static final String CSS_CLASS = "someCssClass"; @@ -54,20 +54,12 @@ static class DomainObjectInCssClassMethod { @BeforeEach void setup() { - super.setUpMmc(); facetFactory = new ObjectSupportFacetFactory(getMetaModelContext()); } @AfterEach - @Override protected void tearDown() throws Exception { facetFactory = null; - super.tearDown(); - } - - @BeforeEach - void setUp() throws Exception { - super.setUpMmc(); } @Test diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/icon/IconFacetMethodFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/icon/IconFacetMethodFactoryTest.java index 516f45939e9..d56ae9f9f35 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/icon/IconFacetMethodFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/icon/IconFacetMethodFactoryTest.java @@ -18,19 +18,21 @@ */ package org.apache.causeway.core.metamodel.facets.object.ident.icon; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facets.object.icon.IconFacet; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; -public class IconFacetMethodFactoryTest +class IconFacetMethodFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testIconNameMethodPickedUpOnClassAndMethodRemoved() { + @Test + void iconNameMethodPickedUpOnClassAndMethodRemoved() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String iconName() { - return null; - } + public String iconName() { return null; } + } assertPicksUp(1, facetFactory, Customer.class, ObjectSupportMethod.ICON_NAME, IconFacet.class); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java index 4dde1055ba4..9ee390ca60f 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/layout/LayoutFacetFactoryTest.java @@ -18,14 +18,17 @@ */ package org.apache.causeway.core.metamodel.facets.object.ident.layout; +import org.junit.jupiter.api.Test; + import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facets.object.layout.LayoutFacet; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; -public class LayoutFacetFactoryTest +class LayoutFacetFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testLayoutMethodPickedUpOnClassAndMethodRemoved() { + @Test + void layoutMethodPickedUpOnClassAndMethodRemoved() { class Customer { @SuppressWarnings("unused") public String layout() { diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java index f50e827d668..fdf088551ee 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java @@ -25,7 +25,6 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -37,51 +36,35 @@ import org.apache.causeway.applib.annotation.DomainObject; import org.apache.causeway.applib.annotation.Nature; import org.apache.causeway.applib.annotation.Title; -import org.apache.causeway.applib.services.iactnlayer.InteractionService; -import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; import org.apache.causeway.core.metamodel.facets.Evaluators; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.title.TitleFacet; import org.apache.causeway.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory; import org.apache.causeway.core.metamodel.facets.object.title.annotation.TitleFacetViaTitleAnnotation; import org.apache.causeway.core.metamodel.object.ManagedObject; -import org.apache.causeway.core.metamodel.valuesemantics.IntValueSemantics; import lombok.val; class TitleAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { private TitleAnnotationFacetFactory facetFactory; @BeforeEach public void setUp() throws Exception { - - val mockInteractionService = Mockito.mock(InteractionService.class); - - metaModelContext = MetaModelContext_forTesting.builder() - .interactionService(mockInteractionService) - .valueSemantic(new IntValueSemantics()) - .build(); - - assertNotNull(getInteractionService()); - facetFactory = new TitleAnnotationFacetFactory(metaModelContext); + facetFactory = new TitleAnnotationFacetFactory(getMetaModelContext()); } @AfterEach - @Override public void tearDown() throws Exception { facetFactory = null; - super.tearDown(); } // -- SCENARIO 1 public static class Customer1 { - @Title public String someTitle() { return "Some Title"; @@ -90,25 +73,30 @@ public String someTitle() { @Test public void testTitleAnnotatedMethodPickedUpOnClassRemoved() throws Exception { - facetFactory.process(ProcessClassContext - .forTesting(Customer1.class, mockMethodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(TitleFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TitleFacetViaTitleAnnotation); - final TitleFacetViaTitleAnnotation titleFacetViaTitleAnnotation = - (TitleFacetViaTitleAnnotation) facet; - - final List titleMethods = Arrays.asList(Customer1.class.getMethod("someTitle")); - for (int i = 0; i < titleMethods.size(); i++) { - final Evaluators.MethodEvaluator titleEvaluator = - (Evaluators.MethodEvaluator) titleFacetViaTitleAnnotation.getComponents() - .getElseFail(i) - .getTitleEvaluator(); - - assertEquals(titleMethods.get(i), - titleEvaluator.getMethod()); - } + + val someTitleMethod = Customer1.class.getMethod("someTitle"); + + objectScenario(Customer1.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + + final Facet facet = facetHolder.getFacet(TitleFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TitleFacetViaTitleAnnotation); + final TitleFacetViaTitleAnnotation titleFacetViaTitleAnnotation = + (TitleFacetViaTitleAnnotation) facet; + + final List titleMethods = Arrays.asList(someTitleMethod); + for (int i = 0; i < titleMethods.size(); i++) { + final Evaluators.MethodEvaluator titleEvaluator = + (Evaluators.MethodEvaluator) titleFacetViaTitleAnnotation.getComponents() + .getElseFail(i) + .getTitleEvaluator(); + + assertEquals(titleMethods.get(i), + titleEvaluator.getMethod()); + } + }); + } // -- SCENARIO 2 @@ -135,35 +123,38 @@ public String titleElement3() { @Test public void testTitleAnnotatedMethodsPickedUpOnClass() throws Exception { - facetFactory.process(ProcessClassContext - .forTesting(Customer2.class, mockMethodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(TitleFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TitleFacetViaTitleAnnotation); - final TitleFacetViaTitleAnnotation titleFacetViaTitleAnnotation = - (TitleFacetViaTitleAnnotation) facet; - final List titleMethods = Arrays.asList( Customer2.class.getMethod("titleElement1"), Customer2.class.getMethod("titleElement3"), Customer2.class.getMethod("titleElement2")); - for (int i = 0; i < titleMethods.size(); i++) { - final Evaluators.MethodEvaluator titleEvaluator = - (Evaluators.MethodEvaluator) titleFacetViaTitleAnnotation.getComponents() - .getElseFail(i) - .getTitleEvaluator(); + objectScenario(Customer2.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); - assertEquals(titleMethods.get(i), - titleEvaluator.getMethod()); - } + final Facet facet = facetHolder.getFacet(TitleFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TitleFacetViaTitleAnnotation); + final TitleFacetViaTitleAnnotation titleFacetViaTitleAnnotation = + (TitleFacetViaTitleAnnotation) facet; + + for (int i = 0; i < titleMethods.size(); i++) { + final Evaluators.MethodEvaluator titleEvaluator = + (Evaluators.MethodEvaluator) titleFacetViaTitleAnnotation.getComponents() + .getElseFail(i) + .getTitleEvaluator(); - final Customer2 customer = new Customer2(); - val objectAdapter = ManagedObject.adaptSingular(getSpecificationLoader(), customer); + assertEquals(titleMethods.get(i), + titleEvaluator.getMethod()); + } + + final Customer2 customer = new Customer2(); + val objectAdapter = ManagedObject.adaptSingular(getSpecificationLoader(), customer); + + final String title = titleFacetViaTitleAnnotation.title(objectAdapter); + assertThat(title, is("titleElement1. titleElement3,titleElement2")); + + }); - final String title = titleFacetViaTitleAnnotation.title(objectAdapter); - assertThat(title, is("titleElement1. titleElement3,titleElement2")); } // -- SCENARIO 3 @@ -174,10 +165,10 @@ public static class Customer3 { @Test public void testNoExplicitTitleAnnotations() { - facetFactory.process(ProcessClassContext - .forTesting(Customer3.class, mockMethodRemover, facetedMethod)); - - assertNull(facetedMethod.getFacet(TitleFacet.class)); + objectScenario(Customer3.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + assertNull(facetHolder.getFacet(TitleFacet.class)); + }); } // -- SCENARIO 4 @@ -237,13 +228,15 @@ public void titleAnnotatedMethodsSomeOfWhichReturnNulls() throws Exception { assertEquals("3", pThree.getTitle()); } - facetFactory.process(ProcessClassContext - .forTesting(Customer4.class, mockMethodRemover, facetedMethod)); + objectScenario(Customer4.class, (processClassContext, facetHolder)->{ + facetFactory.process(processClassContext); + + val objectAdapter = getObjectManager().adapt(new Customer4()); - val objectAdapter = getObjectManager().adapt(new Customer4()); + assertThat(objectAdapter.getTitle(), + is("titleElement1 titleElement3 titleElement5 3 this needs to be trimmed")); + }); - assertThat(objectAdapter.getTitle(), - is("titleElement1 titleElement3 titleElement5 3 this needs to be trimmed")); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java index 0ea9e9c5a66..6b2c50846f7 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java @@ -30,12 +30,14 @@ import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; import org.apache.causeway.core.metamodel.context.MetaModelContext; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.title.methods.TitleFacetViaTitleMethod; import org.apache.causeway.core.metamodel.object.ManagedObject; +import lombok.val; + class TitleFacetViaMethodTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { private TitleFacetViaTitleMethod facet; @@ -55,7 +57,7 @@ public void setUp() throws Exception { metaModelContext = MetaModelContext_forTesting.builder() .build(); - mockFacetHolder = Mockito.mock(FacetHolder.class); + val mockFacetHolder = Mockito.mock(FacetHolder.class); Mockito.when(mockFacetHolder.getMetaModelContext()).thenReturn(metaModelContext); pojo = new DomainObjectWithProblemInItsTitleMethod(); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java index c214e71c64c..a8c92916152 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java @@ -20,7 +20,9 @@ import java.lang.reflect.Method; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -29,63 +31,75 @@ import org.apache.causeway.commons.internal._Constants; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetedMethod; import org.apache.causeway.core.metamodel.facets.object.support.ObjectSupportFacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.title.TitleFacet; import org.apache.causeway.core.metamodel.facets.object.title.methods.TitleFacetFromToStringMethod; +import lombok.val; + class TitleFacetViaMethodsFactoryTest extends ObjectSupportFacetFactoryTestAbstract { - public void testTitleMethodPickedUpOnClassAndMethodRemoved() { + @Test + void titleMethodPickedUpOnClassAndMethodRemoved() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String title() { - return "Some title"; - } + public String title() { return "Some title"; } } assertPicksUp(1, facetFactory, Customer.class, ObjectSupportMethod.TITLE, TitleFacet.class); } - public void testToStringMethodPickedUpOnClassAndMethodRemoved() { + @Test + void toStringMethodPickedUpOnClassAndMethodRemoved() { class Customer { @Override - public String toString() { - return "Some title via toString"; - } + public String toString() { return "Some title via toString"; } } - final Method toStringMethod = findMethod(Customer.class, "toString"); - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod)); + final Method toStringMethod = findMethodExactOrFail(Customer.class, "toString"); + + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(TitleFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof TitleFacetFromToStringMethod); + val titleFacetViaTitleMethod = (TitleFacetFromToStringMethod) facet; + assertMethodEquals(toStringMethod, titleFacetViaTitleMethod.getMethods().getFirstElseFail().asMethodElseFail()); - final Facet facet = facetedMethod.getFacet(TitleFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof TitleFacetFromToStringMethod); - final TitleFacetFromToStringMethod titleFacetViaTitleMethod = (TitleFacetFromToStringMethod) facet; - assertEquals(toStringMethod, titleFacetViaTitleMethod.getMethods().getFirstElseFail()); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(toStringMethod)); + }); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(toStringMethod)); } - public void testTitleFacetOnJavaObjectToStringIsIgnored() throws NoSuchMethodException, SecurityException { + @Test + void titleFacetOnJavaObjectToStringIsIgnored() throws NoSuchMethodException, SecurityException { final Method sampleMethod = Object.class .getMethod("toString", _Constants.emptyClasses); + + val facetedMethod = Mockito.mock(FacetedMethod.class); + assertFalse(TitleFacetFromToStringMethod .create(sampleMethod, facetedMethod) .isPresent()); } - public void testNoExplicitTitleOrToStringMethod() { + @Test + void noExplicitTitleOrToStringMethod() { class Customer { } - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod)); + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + assertNull(facetHolder.getFacet(TitleFacet.class)); + assertFalse(methodRemover.getRemovedMethodMethodCalls().isEmpty()); + }); - assertNull(facetedMethod.getFacet(TitleFacet.class)); - assertFalse(methodRemover.getRemovedMethodMethodCalls().isEmpty()); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java index 37282acd7c1..e54b09dca98 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java @@ -27,10 +27,10 @@ import org.apache.causeway.applib.annotation.Value; import org.apache.causeway.applib.id.LogicalType; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; public class LogicalTypeInferenceTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { public static class Customer { } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactoryTest.java index 0da528835a8..a5c54b4b798 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactoryTest.java @@ -21,8 +21,6 @@ import java.lang.reflect.Method; import java.util.stream.Stream; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -34,8 +32,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.commons.internal._Constants; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.navparent.NavigableParentFacet; import org.apache.causeway.core.metamodel.facets.object.navparent.annotation.NavigableParentTestSamples.DomainObjectInvalidParentAnnot; import org.apache.causeway.core.metamodel.facets.object.navparent.annotation.NavigableParentTestSamples.DomainObjectProperAnnot; @@ -44,23 +42,7 @@ import lombok.val; class NavigableParentAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { - - private NavigableParentAnnotationFacetFactory facetFactory; - - @BeforeEach - void setUp() throws Exception { - super.setUpMmc(); - super.setUpFacetedMethodAndParameter(); - } - - @AfterEach - @Override - protected void tearDown() throws Exception { - facetFactory = null; - super.tearDown(); - } - +extends FacetFactoryTestAbstract { static Stream navigableTypeArgs() { return Stream.of( @@ -79,7 +61,7 @@ protected void navigableType( val domainClass = domainObject.getClass(); val facetedMethod = facetedAction(domainClass, parentMethodName); - facetFactory = new NavigableParentAnnotationFacetFactory(getMetaModelContext()); + val facetFactory = new NavigableParentAnnotationFacetFactory(getMetaModelContext()); facetFactory.process(ProcessClassContext .forTesting(domainClass, defaultMethodRemover(), facetedMethod)); diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java index c1662be3a51..1b5978d9f81 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java @@ -18,56 +18,54 @@ */ package org.apache.causeway.core.metamodel.facets.object.recreatable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.applib.ViewModel; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.object.viewmodel.ViewModelFacet; import org.apache.causeway.core.metamodel.facets.object.viewmodel.ViewModelFacetFactory; import org.apache.causeway.core.metamodel.facets.object.viewmodel.ViewModelFacetForViewModelInterface; class RecreatableObjectFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private ViewModelFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new ViewModelFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new ViewModelFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } static class Customer implements ViewModel { - @Override - public String viewModelMemento() { - return null; - } - - public Customer(final String memento) { - } + public String viewModelMemento() { return null; } + public Customer(final String memento) { } } - public void testViewModelInterfacePickedUpOnClassAndDefaultsToAlways() { - - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetedMethod)); + @Test + void viewModelInterfacePickedUpOnClassAndDefaultsToAlways() { - final Facet facet = facetedMethod.getFacet(ViewModelFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof ViewModelFacetForViewModelInterface); + objectScenario(Customer.class, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + final Facet facet = facetHolder.getFacet(ViewModelFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof ViewModelFacetForViewModelInterface); - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactoryTestAbstract.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactoryTestAbstract.java index 3c608e67acf..55c115b566a 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactoryTestAbstract.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/support/ObjectSupportFacetFactoryTestAbstract.java @@ -18,37 +18,41 @@ */ package org.apache.causeway.core.metamodel.facets.object.support; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.commons.internal.reflection._MethodFacades; +import org.apache.causeway.commons.internal.reflection._MethodFacades.MethodFacade; import org.apache.causeway.core.config.progmodel.ProgrammingModelConstants; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessClassContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.ImperativeFacet; import lombok.val; public abstract class ObjectSupportFacetFactoryTestAbstract -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { protected ObjectSupportFacetFactory facetFactory; - @Override - public void setUp() throws Exception { - super.setUp(); - facetFactory = new ObjectSupportFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new ObjectSupportFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } + /** + * see also CallbackFacetFactoryTestAbstract#assertPicksUp + */ protected void assertPicksUp( final int expectedSupportMethodCount, final FacetFactory facetFactory, @@ -56,24 +60,28 @@ protected void assertPicksUp( final ProgrammingModelConstants.ObjectSupportMethod supportMethodEnum, final Class facetType) { - // when - facetFactory.process(ProcessClassContext - .forTesting(type, methodRemover, facetedMethod)); + objectScenario(type, (processClassContext, facetHolder) -> { + //when + facetFactory.process(processClassContext); + //then + val supportMethods = supportMethodEnum.getMethodNames() + .map(methodName->findMethodExactOrFail(type, methodName)) + .map(_MethodFacades::regular) + .map(MethodFacade::asMethodElseFail); - val supportMethods = supportMethodEnum.getMethodNames() - .map(methodName->findMethod(type, methodName)) - .map(_MethodFacades::regular); + assertEquals(expectedSupportMethodCount, supportMethods.size()); - assertEquals(expectedSupportMethodCount, supportMethods.size()); + val facet = facetHolder.getFacet(facetType); + assertNotNull(facet); + assertTrue(facet instanceof ImperativeFacet); + val imperativeFacet = (ImperativeFacet)facet; - val facet = facetedMethod.getFacet(facetType); - assertNotNull(facet); - assertTrue(facet instanceof ImperativeFacet); - val imperativeFacet = (ImperativeFacet)facet; + supportMethods.forEach(method->{ + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method)); + assertTrue(imperativeFacet.getMethods() + .map(MethodFacade::asMethodElseFail).contains(method)); + }); - supportMethods.forEach(method->{ - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(method)); - assertTrue(imperativeFacet.getMethods().contains(method)); }); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/ordering/memberorder/LayoutOrderTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/ordering/memberorder/LayoutOrderTest.java index 74d0e479a17..af854d8333c 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/ordering/memberorder/LayoutOrderTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/ordering/memberorder/LayoutOrderTest.java @@ -18,9 +18,10 @@ */ package org.apache.causeway.core.metamodel.facets.ordering.memberorder; -import java.lang.reflect.Method; import java.util.Collection; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -28,110 +29,81 @@ import org.apache.causeway.applib.annotation.ActionLayout; import org.apache.causeway.applib.annotation.CollectionLayout; import org.apache.causeway.applib.annotation.PropertyLayout; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; +import org.apache.causeway.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory; +import org.apache.causeway.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory; import org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacet; import org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacetFromActionLayoutAnnotation; import org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacetFromCollectionLayoutAnnotation; import org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacetFromPropertyLayoutAnnotation; +import org.apache.causeway.core.metamodel.facets.properties.propertylayout.PropertyLayoutFacetFactory; import lombok.val; class LayoutOrderTest -extends AbstractFacetFactoryTest { - - @Override - protected void setUp() throws Exception { - super.setUp(); +extends FacetFactoryTestAbstract { -//FIXME -// context.checking(new Expectations() {{ -// allowing(mockTranslationService).translate(with(any(TranslationContext.class)), with(any(String.class))); -// will(new Action() { -// @Override -// public Object invoke(final Invocation invocation) throws Throwable { -// return invocation.getParameter(1); -// } -// -// @Override -// public void describeTo(final Description description) { -// description.appendText("Returns parameter #1"); -// } -// }); -// }}); - } - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - - public void testMemberOrderAnnotationPickedUpOnProperty() { + @Test + void memberOrderAnnotationPickedUpOnProperty() { + val facetFactory = new PropertyLayoutFacetFactory(getMetaModelContext()); class Customer { @PropertyLayout(sequence = "1") - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - val facetFactory = super.createPropertyLayoutFacetFactory(metaModelContext); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - val facet = facetedMethod.getFacet(LayoutOrderFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof LayoutOrderFacetFromPropertyLayoutAnnotation); - assertEquals("1", facet.getSequence()); - - assertNoMethodsRemoved(); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + val facet = facetedMethod.getFacet(LayoutOrderFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof LayoutOrderFacetFromPropertyLayoutAnnotation); + assertEquals("1", facet.getSequence()); + + assertNoMethodsRemoved(); + }); } - public void testMemberOrderAnnotationPickedUpOnCollection() { + @Test + void memberOrderAnnotationPickedUpOnCollection() { + val facetFactory = new CollectionLayoutFacetFactory(getMetaModelContext()); class Order { } + @SuppressWarnings("unused") class Customer { @CollectionLayout(sequence = "2") - public Collection getOrders() { - return null; - } - - @SuppressWarnings("unused") - public void addToOrders(final Order o) { - } + public Collection getOrders() { return null;} + public void addToOrders(final Order o) {} } - final Method method = findMethod(Customer.class, "getOrders"); - - val facetFactory = super.createCollectionLayoutFacetFactory(metaModelContext); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - val facet = facetedMethod.getFacet(LayoutOrderFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof LayoutOrderFacetFromCollectionLayoutAnnotation); - assertEquals("2", facet.getSequence()); - - assertNoMethodsRemoved(); + collectionScenario(Customer.class, "orders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + val facet = facetedMethod.getFacet(LayoutOrderFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof LayoutOrderFacetFromCollectionLayoutAnnotation); + assertEquals("2", facet.getSequence()); + + assertNoMethodsRemoved(); + }); } - public void testMemberOrderAnnotationPickedUpOnAction() { + @Test + void memberOrderAnnotationPickedUpOnAction() { + val facetFactory = new ActionLayoutFacetFactory(getMetaModelContext()); class Customer { @ActionLayout(sequence = "3") - public void someAction() { - } + public void someAction() {} } - final Method method = findMethod(Customer.class, "someAction"); - - val facetFactory = super.createActionLayoutFacetFactory(metaModelContext); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - val facet = facetedMethod.getFacet(LayoutOrderFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof LayoutOrderFacetFromActionLayoutAnnotation); - assertEquals("3", facet.getSequence()); - - assertNoMethodsRemoved(); + actionScenario(Customer.class, "someAction", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.process(processMethodContext); + //then + val facet = facetedMethod.getFacet(LayoutOrderFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof LayoutOrderFacetFromActionLayoutAnnotation); + assertEquals("3", facet.getSequence()); + + assertNoMethodsRemoved(); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java index 9de99b0f569..b7e8fbf492a 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/LabelAtFacetForParameterLayoutAnnotationFactoryTest.java @@ -18,44 +18,41 @@ */ package org.apache.causeway.core.metamodel.facets.param.layout.annotation; -import java.lang.reflect.Method; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.applib.annotation.LabelPosition; import org.apache.causeway.applib.annotation.ParameterLayout; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.labelat.LabelAtFacet; import org.apache.causeway.core.metamodel.facets.param.layout.LabelAtFacetForParameterLayoutAnnotation; import org.apache.causeway.core.metamodel.facets.param.layout.ParameterLayoutFacetFactory; -public class LabelAtFacetForParameterLayoutAnnotationFactoryTest extends AbstractFacetFactoryTest { +class LabelAtFacetForParameterLayoutAnnotationFactoryTest +extends FacetFactoryTestAbstract { - public void testParameterLayoutAnnotationPickedUp() { - final ParameterLayoutFacetFactory facetFactory = new ParameterLayoutFacetFactory(metaModelContext); + void testParameterLayoutAnnotationPickedUp() { + final ParameterLayoutFacetFactory facetFactory = new ParameterLayoutFacetFactory(getMetaModelContext()); class Customer { @SuppressWarnings("unused") - public void someAction(@ParameterLayout(labelPosition = LabelPosition.LEFT) final String foo) { - } + public void someAction( + @ParameterLayout(labelPosition = LabelPosition.LEFT) + final String foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class }); - - facetFactory.processParams(FacetFactory.ProcessParameterContext.forTesting( - Customer.class, - IntrospectionPolicy.ANNOTATION_OPTIONAL, - method, null, facetedMethodParameter)); - final Facet facet = facetedMethodParameter.getFacet(LabelAtFacet.class); - assertThat(facet, is(notNullValue())); - assertThat(facet, is(instanceOf(LabelAtFacetForParameterLayoutAnnotation.class))); - final LabelAtFacetForParameterLayoutAnnotation layoutAnnotation = (LabelAtFacetForParameterLayoutAnnotation) facet; - assertThat(layoutAnnotation.label(), is(LabelPosition.LEFT)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParams(processParameterContext); + //then + final Facet facet = facetedMethodParameter.getFacet(LabelAtFacet.class); + assertThat(facet, is(notNullValue())); + assertThat(facet, is(instanceOf(LabelAtFacetForParameterLayoutAnnotation.class))); + final LabelAtFacetForParameterLayoutAnnotation layoutAnnotation = (LabelAtFacetForParameterLayoutAnnotation) facet; + assertThat(layoutAnnotation.label(), is(LabelPosition.LEFT)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java index 0d3b7deadb6..d07f4e97cd8 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java @@ -18,18 +18,14 @@ */ package org.apache.causeway.core.metamodel.facets.param.layout.annotation; -import java.lang.reflect.Method; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.applib.annotation.ParameterLayout; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.named.ParamNamedFacet; import org.apache.causeway.core.metamodel.facets.param.layout.NamedFacetForParameterLayoutAnnotation; import org.apache.causeway.core.metamodel.facets.param.layout.ParameterLayoutFacetFactory; @@ -37,29 +33,30 @@ import lombok.val; class NamedFacetForParameterLayoutAnnotationFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private static final String NAME = "an action"; public void testParameterLayoutAnnotationNamed() { - final ParameterLayoutFacetFactory facetFactory = new ParameterLayoutFacetFactory(metaModelContext); + final ParameterLayoutFacetFactory facetFactory = new ParameterLayoutFacetFactory(getMetaModelContext()); class Customer { @SuppressWarnings("unused") - public void someAction(@ParameterLayout(named = NAME) final String foo) { - } + public void someAction( + @ParameterLayout(named = NAME) + final String foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[]{String.class}); - facetFactory.processParams(FacetFactory.ProcessParameterContext.forTesting( - Customer.class, - IntrospectionPolicy.ANNOTATION_OPTIONAL, - method, null, facetedMethodParameter)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParams(processParameterContext); + //then + val facet = facetedMethodParameter.getFacet(ParamNamedFacet.class); + assertThat(facet, is(notNullValue())); + assertThat(facet, is(instanceOf(NamedFacetForParameterLayoutAnnotation.class))); + assertEquals(NAME, facet.text()); + }); - val facet = facetedMethodParameter.getFacet(ParamNamedFacet.class); - assertThat(facet, is(notNullValue())); - assertThat(facet, is(instanceOf(NamedFacetForParameterLayoutAnnotation.class))); - assertEquals(NAME, facet.text()); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java index d235d202978..8a755a0667d 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/name/ParameterNameFacetTest.java @@ -18,8 +18,6 @@ */ package org.apache.causeway.core.metamodel.facets.param.name; -import java.lang.reflect.Method; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,12 +25,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.applib.annotation.ParameterLayout; import org.apache.causeway.commons.internal.reflection._Reflect; import org.apache.causeway.core.metamodel._testing.MetaModelContext_forTesting; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.named.ParamNamedFacet; import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel; @@ -42,26 +38,17 @@ * needs the javac -parameter flag set when compiling this test */ class ParameterNameFacetTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { - ProgrammingModel programmingModel; - Method actionMethod; + protected ProgrammingModel programmingModel; @BeforeEach public void setUp() throws Exception { - - val metaModelContext = MetaModelContext_forTesting.builder() - .build(); - - super.setUpFacetedMethodAndParameter(); - - programmingModel = metaModelContext.getProgrammingModel(); + programmingModel = ((MetaModelContext_forTesting)getMetaModelContext()).getProgrammingModel(); } - @Override @AfterEach public void tearDown() throws Exception { - super.tearDown(); programmingModel = null; } @@ -95,21 +82,14 @@ public void someAction(final String anAwesomeName) { } } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - val processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - - programmingModel.streamFactories() - .forEach(facetFactory->facetFactory.processParams(processParameterContext)); - - // then - val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class); - - assertEquals("An Awesome Name", namedFacet.text()); - + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + programmingModel.streamFactories() + .forEach(facetFactory->facetFactory.processParams(processParameterContext)); + // then + val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class); + assertEquals("An Awesome Name", namedFacet.text()); + }); } @Test @@ -118,27 +98,19 @@ public void explicitNameShouldTakePrecedenceOverReflective() { class Customer { @SuppressWarnings("unused") public void someAction( - @ParameterLayout( - named = "Even Better Name" - ) + @ParameterLayout(named = "Even Better Name") final String anAwesomeName) { } } - - // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - val processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - programmingModel.streamFactories().forEach(facetFactory->facetFactory.processParams(processParameterContext)); - - // then - val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class); - assertNotNull(namedFacet); - assertEquals("Even Better Name", namedFacet.text()); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + programmingModel.streamFactories().forEach(facetFactory->facetFactory.processParams(processParameterContext)); + // then + val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class); + assertNotNull(namedFacet); + assertEquals("Even Better Name", namedFacet.text()); + }); } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java index 5367b1fb2e1..8c669ae0ce3 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java @@ -18,28 +18,22 @@ */ package org.apache.causeway.core.metamodel.facets.param.parameter; -import java.lang.reflect.Method; import java.util.regex.Pattern; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.Mockito; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.calls; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.applib.annotation.Optionality; import org.apache.causeway.applib.annotation.Parameter; import org.apache.causeway.applib.spec.Specification; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; -import org.apache.causeway.core.metamodel.facets.FacetFactory; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet; import org.apache.causeway.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet; import org.apache.causeway.core.metamodel.facets.objectvalue.mustsatisfyspec.MustSatisfySpecificationFacet; @@ -48,30 +42,20 @@ import org.apache.causeway.core.metamodel.facets.param.parameter.maxlen.MaxLengthFacetForParameterAnnotation; import org.apache.causeway.core.metamodel.facets.param.parameter.mustsatisfy.MustSatisfySpecificationFacetForParameterAnnotation; import org.apache.causeway.core.metamodel.facets.param.parameter.regex.RegExFacetForParameterAnnotation; -import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import lombok.val; @SuppressWarnings("unused") class ParameterAnnotationFacetFactoryTest -extends AbstractFacetFactoryJupiterTestCase { +extends FacetFactoryTestAbstract { ParameterAnnotationFacetFactory facetFactory; - Method actionMethod; - - @Mock ObjectSpecification mockTypeSpec; - @Mock ObjectSpecification mockReturnTypeSpec; - - void expectRemoveMethod(final Method actionMethod) { - Mockito.verify(mockMethodRemover, calls(1)).removeMethod(actionMethod); - } @BeforeEach public void setUp() throws Exception { - facetFactory = new ParameterAnnotationFacetFactory(metaModelContext); + facetFactory = new ParameterAnnotationFacetFactory(getMetaModelContext()); } - @Override @AfterEach public void tearDown() throws Exception { facetFactory = null; @@ -84,26 +68,20 @@ public void withAnnotation() { class Customer { public void someAction( - @Parameter( - maxLength = 30 - ) + @Parameter(maxLength = 30) final String name) { } } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final MaxLengthFacet maxLengthFacet = facetedMethodParameter.getFacet(MaxLengthFacet.class); - assertNotNull(maxLengthFacet); - assertTrue(maxLengthFacet instanceof MaxLengthFacetForParameterAnnotation); - assertThat(maxLengthFacet.value(), is(30)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final MaxLengthFacet maxLengthFacet = facetedMethodParameter.getFacet(MaxLengthFacet.class); + assertNotNull(maxLengthFacet); + assertTrue(maxLengthFacet instanceof MaxLengthFacetForParameterAnnotation); + assertThat(maxLengthFacet.value(), is(30)); + }); } } @@ -123,41 +101,32 @@ public String satisfies(final Object obj) { } } - @Test public void withAnnotation() { class Customer { public void someAction( - @Parameter( - mustSatisfy = {NotTooHot.class, NotTooCold.class} - ) - final String name - ) { - } + @Parameter(mustSatisfy = {NotTooHot.class, NotTooCold.class}) + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final MustSatisfySpecificationFacet mustSatisfySpecificationFacet = facetedMethodParameter.getFacet(MustSatisfySpecificationFacet.class); - assertNotNull(mustSatisfySpecificationFacet); - assertTrue(mustSatisfySpecificationFacet instanceof MustSatisfySpecificationFacetForParameterAnnotation); - MustSatisfySpecificationFacetForParameterAnnotation mustSatisfySpecificationFacetImpl = (MustSatisfySpecificationFacetForParameterAnnotation) mustSatisfySpecificationFacet; - val specifications = mustSatisfySpecificationFacetImpl.getSpecifications(); - assertThat(specifications.size(), is(2)); - - assertTrue(specifications.getElseFail(0) instanceof NotTooHot); - assertTrue(specifications.getElseFail(1) instanceof NotTooCold); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + + // then + final MustSatisfySpecificationFacet mustSatisfySpecificationFacet = facetedMethodParameter.getFacet(MustSatisfySpecificationFacet.class); + assertNotNull(mustSatisfySpecificationFacet); + assertTrue(mustSatisfySpecificationFacet instanceof MustSatisfySpecificationFacetForParameterAnnotation); + MustSatisfySpecificationFacetForParameterAnnotation mustSatisfySpecificationFacetImpl = (MustSatisfySpecificationFacetForParameterAnnotation) mustSatisfySpecificationFacet; + val specifications = mustSatisfySpecificationFacetImpl.getSpecifications(); + assertThat(specifications.size(), is(2)); + + assertTrue(specifications.getElseFail(0) instanceof NotTooHot); + assertTrue(specifications.getElseFail(1) instanceof NotTooCold); + }); } - } public static class Mandatory extends ParameterAnnotationFacetFactoryTest { @@ -167,27 +136,19 @@ public void whenOptionalityIsTrue() { class Customer { public void someAction( - @Parameter( - optionality = Optionality.OPTIONAL - ) - final String name - ) { - } + @Parameter(optionality = Optionality.OPTIONAL) + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNotNull(mandatoryFacet); - assertTrue(mandatoryFacet instanceof MandatoryFacetForParameterAnnotation.Optional); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNotNull(mandatoryFacet); + assertTrue(mandatoryFacet instanceof MandatoryFacetForParameterAnnotation.Optional); + }); } @Test @@ -195,27 +156,19 @@ public void whenOptionalityIsFalse() { class Customer { public void someAction( - @Parameter( - optionality = Optionality.MANDATORY - ) - final String name - ) { - } + @Parameter(optionality = Optionality.MANDATORY) + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNotNull(mandatoryFacet); - assertTrue(mandatoryFacet instanceof MandatoryFacetForParameterAnnotation.Required); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNotNull(mandatoryFacet); + assertTrue(mandatoryFacet instanceof MandatoryFacetForParameterAnnotation.Required); + }); } @Test @@ -223,26 +176,18 @@ public void whenOptionalityIsDefault() { class Customer { public void someAction( - @Parameter( - optionality = Optionality.DEFAULT - ) - final String name - ) { - } + @Parameter(optionality = Optionality.DEFAULT) + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNull(mandatoryFacet); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNull(mandatoryFacet); + }); } @Test @@ -250,24 +195,17 @@ public void whenNone() { class Customer { public void someAction( - final String name - ) { - } + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - - // then - final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNull(mandatoryFacet); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNull(mandatoryFacet); + }); } } @@ -281,29 +219,22 @@ class Customer { public void someAction( @Parameter( regexPattern = "[123].*", - regexPatternFlags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE - ) - final String name - ) { - } + regexPatternFlags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE) + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - - // then - final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); - assertNotNull(regExFacet); - assertTrue(regExFacet instanceof RegExFacetForParameterAnnotation); - assertThat(regExFacet.patternFlags(), is(10)); - assertThat(regExFacet.regexp(), is("[123].*")); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); + assertNotNull(regExFacet); + assertTrue(regExFacet instanceof RegExFacetForParameterAnnotation); + assertThat(regExFacet.patternFlags(), is(10)); + assertThat(regExFacet.regexp(), is("[123].*")); + + }); } @Test @@ -311,25 +242,19 @@ public void whenNone() { class Customer { public void someAction( - @Parameter( - ) - final String name - ) { - } + @Parameter() + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - // then - final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); - assertNull(regExFacet); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); + assertNull(regExFacet); + + }); } @Test @@ -337,27 +262,18 @@ public void whenEmptyString() { class Customer { public void someAction( - @Parameter( - regexPattern = "" - ) - final String name - ) { - } + @Parameter(regexPattern = "") + final String name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{String.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - - // then - final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); - assertNull(regExFacet); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); + assertNull(regExFacet); + }); } @Test @@ -365,30 +281,19 @@ public void whenNotAnnotatedOnStringParameter() { class Customer { public void someAction( - @Parameter( - regexPattern = "[123].*" - ) - final int name - ) { - } + @Parameter(regexPattern = "[123].*") + final int name) {} } // given - actionMethod = findMethod(Customer.class, "someAction", new Class[]{int.class} ); - - // when - final FacetFactory.ProcessParameterContext processParameterContext = - FacetFactory.ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, actionMethod, null, facetedMethodParameter); - facetFactory.processParams(processParameterContext); - - - // then - final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); - assertNotNull(regExFacet); - + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.processParams(processParameterContext); + // then + final RegExFacet regExFacet = facetedMethodParameter.getFacet(RegExFacet.class); + assertNotNull(regExFacet); + + }); } - } - } \ No newline at end of file diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java index 39e9f71f05d..e5a984f266c 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest.java @@ -18,100 +18,96 @@ */ package org.apache.causeway.core.metamodel.facets.param.parameter; -import java.lang.reflect.Method; - +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.lang.Nullable; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.applib.annotation.Optionality; import org.apache.causeway.applib.annotation.Parameter; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessParameterContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet; import org.apache.causeway.core.metamodel.facets.param.parameter.mandatory.MandatoryFacetForParameterAnnotation; import org.apache.causeway.core.metamodel.facets.param.parameter.mandatory.MandatoryFacetInvertedByNullableAnnotationOnParameter; -class ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest extends AbstractFacetFactoryTest { +class ParameterOptionalityOrNullableAnnotationOnParameterFacetFactoryTest +extends FacetFactoryTestAbstract { private ParameterAnnotationFacetFactory facetFactory; - @Override - public void setUp() throws Exception { - super.setUp(); - facetFactory = new ParameterAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new ParameterAnnotationFacetFactory(getMetaModelContext()); } - public void testParameterAnnotationWithOptionalityPickedUpOnActionParameter() { - + @Test + void parameterAnnotationWithOptionalityPickedUpOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(@Parameter(optionality = Optionality.OPTIONAL) final String foo) { - } + public void someAction( + @Parameter(optionality = Optionality.OPTIONAL) + final String foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class }); - - facetFactory.processParamsOptional( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - final Facet facet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof MandatoryFacetForParameterAnnotation.Optional); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParamsOptional(processParameterContext); + //then + final Facet facet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof MandatoryFacetForParameterAnnotation.Optional); + }); } - public void testParameterAnnotationWithOptionalityIgnoredForPrimitiveOnActionParameter() { - + @Test + void parameterAnnotationWithOptionalityIgnoredForPrimitiveOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(@Parameter(optionality = Optionality.OPTIONAL) final int foo) { - } + public void someAction( + @Parameter(optionality = Optionality.OPTIONAL) + final int foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class }); - - facetFactory.processParamsOptional( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParamsOptional(processParameterContext); + //then + assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + }); } - public void testNullableAnnotationPickedUpOnActionParameter() { - + @Test + void nullableAnnotationPickedUpOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final @Nullable String foo) { - } + public void someAction( + final @Nullable String foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class }); - - facetFactory.processParamsOptional( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - final Facet facet = facetedMethodParameter.getFacet(MandatoryFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof MandatoryFacetInvertedByNullableAnnotationOnParameter); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParamsOptional(processParameterContext); + //then + final Facet facet = facetedMethodParameter.getFacet(MandatoryFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof MandatoryFacetInvertedByNullableAnnotationOnParameter); + }); } - public void testNullableAnnotationIgnoredForPrimitiveOnActionParameter() { - + @Test + void nullableAnnotationIgnoredForPrimitiveOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final @Nullable int foo) { - } + public void someAction( + final @Nullable int foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class }); - - facetFactory.processParamsOptional( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParamsOptional(processParameterContext); + //then + assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java index 803f5456d42..f69d6270c3f 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java @@ -18,70 +18,64 @@ */ package org.apache.causeway.core.metamodel.facets.param.parameter; -import java.lang.reflect.Method; - import javax.validation.constraints.Pattern; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.apache.causeway.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessParameterContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.regex.RegExFacet; import org.apache.causeway.core.metamodel.facets.param.parameter.regex.RegExFacetForPatternAnnotationOnParameter; -class RegExAnnotationOnParameterFacetFactoryTest extends AbstractFacetFactoryTest { +class RegExAnnotationOnParameterFacetFactoryTest +extends FacetFactoryTestAbstract { private ParameterAnnotationFacetFactory facetFactory; - @Override @BeforeEach - public void setUp() throws Exception { - super.setUp(); - facetFactory = new ParameterAnnotationFacetFactory(metaModelContext); + protected void setUp() { + facetFactory = new ParameterAnnotationFacetFactory(getMetaModelContext()); } - public void testRegExAnnotationPickedUpOnActionParameter() { - + @Test + void regExAnnotationPickedUpOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(@Pattern(regexp = "^A.*", flags = { Pattern.Flag.CASE_INSENSITIVE }) final String foo) { - } + public void someAction( + @Pattern(regexp = "^A.*", flags = { Pattern.Flag.CASE_INSENSITIVE }) + final String foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { String.class }); - - facetFactory.processParams( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - final Facet facet = facetedMethodParameter.getFacet(RegExFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof RegExFacetForPatternAnnotationOnParameter); - final RegExFacetForPatternAnnotationOnParameter regExFacet = (RegExFacetForPatternAnnotationOnParameter) facet; - assertEquals("^A.*", regExFacet.regexp()); - assertEquals(2, regExFacet.patternFlags()); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParams(processParameterContext); + //then + final Facet facet = facetedMethodParameter.getFacet(RegExFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof RegExFacetForPatternAnnotationOnParameter); + final RegExFacetForPatternAnnotationOnParameter regExFacet = (RegExFacetForPatternAnnotationOnParameter) facet; + assertEquals("^A.*", regExFacet.regexp()); + assertEquals(2, regExFacet.patternFlags()); + }); } - public void testRegExAnnotationIgnoredForPrimitiveOnActionParameter() { - + @Test + void regExAnnotationIgnoredForPrimitiveOnActionParameter() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public void someAction(final int foo) { - } + public void someAction(final int foo) {} } - final Method method = findMethod(Customer.class, "someAction", new Class[] { int.class }); - - facetFactory.processParams( - ProcessParameterContext.forTesting( - Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, null, facetedMethodParameter)); - - assertNull(facetedMethod.getFacet(RegExFacet.class)); + parameterScenario(Customer.class, "someAction", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + //when + facetFactory.processParams(processParameterContext); + //then + assertNull(facetedMethod.getFacet(RegExFacet.class)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java index 8e231d851f4..0f07e424a97 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java @@ -20,15 +20,14 @@ import java.lang.reflect.Method; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facetapi.FeatureType; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacet; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethod; import org.apache.causeway.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory; @@ -62,448 +61,380 @@ import lombok.val; class PropertyMethodsFacetFactoryTest -extends AbstractFacetFactoryTest { - - @Override - public void setUp() throws Exception { - super.setUp(); - } - - public void testPropertyAccessorFacetIsInstalledAndMethodRemoved() { - val facetFactory = new PropertyAccessorFacetViaAccessorFactory(metaModelContext); +extends FacetFactoryTestAbstract { + @Test + void propertyAccessorFacetIsInstalledAndMethodRemoved() { + val facetFactory = new PropertyAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyAccessorFacetViaAccessor); - final PropertyAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (PropertyAccessorFacetViaAccessor) facet; - assertEquals(propertyAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail()); - - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyAccessorMethod)); + final Method propertyAccessorMethod = findMethodExactOrFail(Customer.class, "getFirstName"); + + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyAccessorFacetViaAccessor); + final PropertyAccessorFacetViaAccessor propertyAccessorFacetViaAccessor = (PropertyAccessorFacetViaAccessor) facet; + assertMethodEquals(propertyAccessorMethod, propertyAccessorFacetViaAccessor.getMethods().getFirstElseFail().asMethodElseFail()); + + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyAccessorMethod)); + }); } - public void testSetterFacetIsInstalledForSetterMethodAndMethodRemoved() { - val facetFactory = new PropertySetterFacetFactory(metaModelContext); - + @Test + void setterFacetIsInstalledForSetterMethodAndMethodRemoved() { + val facetFactory = new PropertySetterFacetFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public void setFirstName(final String firstName) { - } + public String getFirstName() { return null; } + public void setFirstName(final String firstName) { } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertySetterMethod = findMethod(Customer.class, "setFirstName", new Class[] { String.class }); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PropertySetterFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertySetterFacetViaSetterMethod); - final PropertySetterFacetViaSetterMethod propertySetterFacet = (PropertySetterFacetViaSetterMethod) facet; - assertEquals(propertySetterMethod, propertySetterFacet.getMethods().getFirstElseFail()); - - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertySetterMethod)); + final Method propertySetterMethod = findMethodExactOrFail(Customer.class, "setFirstName", new Class[] { String.class }); + + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertySetterFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertySetterFacetViaSetterMethod); + final PropertySetterFacetViaSetterMethod propertySetterFacet = (PropertySetterFacetViaSetterMethod) facet; + assertMethodEquals(propertySetterMethod, propertySetterFacet.getMethods().getFirstElseFail().asMethodElseFail()); + + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertySetterMethod)); + }); } - public void testInitializationFacetIsInstalledForSetterMethodAndMethodRemoved() { - val facetFactory = new PropertySetterFacetFactory(metaModelContext); - + @Test + void initializationFacetIsInstalledForSetterMethodAndMethodRemoved() { + val facetFactory = new PropertySetterFacetFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public void setFirstName(final String firstName) { - } + public String getFirstName() { return null; } + public void setFirstName(final String firstName) {} } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertySetterMethod = findMethod(Customer.class, "setFirstName", new Class[] { String.class }); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PropertyInitializationFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyInitializationFacet); - final PropertyInitializationFacetViaSetterMethod propertySetterFacet = (PropertyInitializationFacetViaSetterMethod) facet; - assertEquals(propertySetterMethod, propertySetterFacet.getMethods().getFirstElseFail()); - - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertySetterMethod)); + final Method propertySetterMethod = findMethodExactOrFail(Customer.class, "setFirstName", new Class[] { String.class }); + + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyInitializationFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyInitializationFacet); + final PropertyInitializationFacetViaSetterMethod propertySetterFacet = (PropertyInitializationFacetViaSetterMethod) facet; + assertMethodEquals(propertySetterMethod, propertySetterFacet.getMethods().getFirstElseFail().asMethodElseFail()); + + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertySetterMethod)); + }); } - public void testSetterFacetIsInstalledMeansNoDisabledOrDerivedFacetsInstalled() { - val facetFactory = new PropertySetterFacetFactory(metaModelContext); - + @Test + void setterFacetIsInstalledMeansNoDisabledOrDerivedFacetsInstalled() { + val facetFactory = new PropertySetterFacetFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public void setFirstName(final String firstName) { - } + public String getFirstName() { return null; } + public void setFirstName(final String firstName) {} } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); - - assertNull(facetedMethod.getFacet(SnapshotExcludeFacet.class)); - assertNull(facetedMethod.getFacet(SnapshotExcludeFacet.class)); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + assertNull(facetedMethod.getFacet(SnapshotExcludeFacet.class)); + }); } - public void testClearFacetViaSetterIfNoExplicitClearMethod() { - val facetFactory = new PropertySetterFacetFactory(metaModelContext); - + @Test + void clearFacetViaSetterIfNoExplicitClearMethod() { + val facetFactory = new PropertySetterFacetFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public void setFirstName(final String firstName) { - } + public String getFirstName() { return null; } + public void setFirstName(final String firstName) { } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertySetterMethod = findMethod(Customer.class, "setFirstName", new Class[] { String.class }); - - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(PropertyClearFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyClearFacetViaSetterMethod); - final PropertyClearFacetViaSetterMethod propertyClearFacet = (PropertyClearFacetViaSetterMethod) facet; - assertEquals(propertySetterMethod, propertyClearFacet.getMethods().getFirstElseFail()); + final Method propertySetterMethod = findMethodExactOrFail(Customer.class, "setFirstName", new Class[] { String.class }); + + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyClearFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyClearFacetViaSetterMethod); + final PropertyClearFacetViaSetterMethod propertyClearFacet = (PropertyClearFacetViaSetterMethod) facet; + assertMethodEquals(propertySetterMethod, propertyClearFacet.getMethods().getFirstElseFail().asMethodElseFail()); + }); } - public void testChoicesFacetFoundAndMethodRemoved() { - val facetFactory = new PropertyChoicesFacetViaMethodFactory(metaModelContext); - + @Test + void choicesFacetFoundAndMethodRemoved() { + val facetFactory = new PropertyChoicesFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String[] choicesFirstName() { - return null; - } + public String getFirstName() { return null; } + public String[] choicesFirstName() { return null; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyChoicesMethod = findMethod(Customer.class, "choicesFirstName"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyChoicesMethod = findMethodExactOrFail(Customer.class, "choicesFirstName"); - final Facet facet = facetedMethod.getFacet(PropertyChoicesFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyChoicesFacetViaMethod); - final PropertyChoicesFacetViaMethod propertyChoicesFacet = (PropertyChoicesFacetViaMethod) facet; - assertEquals(propertyChoicesMethod, propertyChoicesFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyChoicesFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyChoicesFacetViaMethod); + final PropertyChoicesFacetViaMethod propertyChoicesFacet = (PropertyChoicesFacetViaMethod) facet; + assertMethodEquals(propertyChoicesMethod, propertyChoicesFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyChoicesMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyChoicesMethod)); + }); } - public void testAutoCompleteFacetFoundAndMethodRemoved() { - - val facetFactory = new PropertyAutoCompleteFacetMethodFactory(metaModelContext); - + @Test + void autoCompleteFacetFoundAndMethodRemoved() { + val facetFactory = new PropertyAutoCompleteFacetMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String[] autoCompleteFirstName(final String searchArg) { - return null; - } + public String getFirstName() { return null; } + public String[] autoCompleteFirstName(final String searchArg) { return null; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyAutoCompleteMethod = findMethod(Customer.class, "autoCompleteFirstName", new Class[]{String.class}); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyAutoCompleteMethod = findMethodExactOrFail(Customer.class, "autoCompleteFirstName", new Class[]{String.class}); - final Facet facet = facetedMethod.getFacet(PropertyAutoCompleteFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyAutoCompleteFacetMethod); - final PropertyAutoCompleteFacetMethod propertyAutoCompleteFacet = (PropertyAutoCompleteFacetMethod) facet; - assertEquals(propertyAutoCompleteMethod, propertyAutoCompleteFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyAutoCompleteFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyAutoCompleteFacetMethod); + final PropertyAutoCompleteFacetMethod propertyAutoCompleteFacet = (PropertyAutoCompleteFacetMethod) facet; + assertMethodEquals(propertyAutoCompleteMethod, propertyAutoCompleteFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyAutoCompleteMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyAutoCompleteMethod)); + }); } - public void testDefaultFacetFoundAndMethodRemoved() { - val facetFactory = new PropertyDefaultFacetViaMethodFactory(metaModelContext); - + @Test + void defaultFacetFoundAndMethodRemoved() { + val facetFactory = new PropertyDefaultFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String defaultFirstName() { - return null; - } + public String getFirstName() { return null; } + public String defaultFirstName() { return null; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyDefaultMethod = findMethod(Customer.class, "defaultFirstName"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyDefaultMethod = findMethodExactOrFail(Customer.class, "defaultFirstName"); - final Facet facet = facetedMethod.getFacet(PropertyDefaultFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyDefaultFacetViaMethod); - final PropertyDefaultFacetViaMethod propertyDefaultFacet = (PropertyDefaultFacetViaMethod) facet; - assertEquals(propertyDefaultMethod, propertyDefaultFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyDefaultFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyDefaultFacetViaMethod); + final PropertyDefaultFacetViaMethod propertyDefaultFacet = (PropertyDefaultFacetViaMethod) facet; + assertMethodEquals(propertyDefaultMethod, propertyDefaultFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDefaultMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDefaultMethod)); + }); } - public void testValidateFacetFoundAndMethodRemoved() { - val facetFactory = new PropertyValidateFacetViaMethodFactory(metaModelContext); - + @Test + void validateFacetFoundAndMethodRemoved() { + val facetFactory = new PropertyValidateFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String validateFirstName(final String firstName) { - return null; - } + public String getFirstName() { return null; } + public String validateFirstName(final String firstName) { return null;} } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyValidateMethod = findMethod(Customer.class, "validateFirstName", new Class[] { String.class }); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyValidateMethod = findMethodExactOrFail(Customer.class, "validateFirstName", new Class[] { String.class }); - final Facet facet = facetedMethod.getFacet(PropertyValidateFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyValidateFacetViaMethod); - final PropertyValidateFacetViaMethod propertyValidateFacet = (PropertyValidateFacetViaMethod) facet; - assertEquals(propertyValidateMethod, propertyValidateFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyValidateFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyValidateFacetViaMethod); + final PropertyValidateFacetViaMethod propertyValidateFacet = (PropertyValidateFacetViaMethod) facet; + assertMethodEquals(propertyValidateMethod, propertyValidateFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyValidateMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyValidateMethod)); + }); } - public void testDisableFacetFoundAndMethodRemoved() { - val facetFactory = new DisableForContextFacetViaMethodFactory(metaModelContext); - + @Test + void disableFacetFoundAndMethodRemoved() { + val facetFactory = new DisableForContextFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String disableFirstName() { - return "disabled"; - } + public String getFirstName() { return null; } + public String disableFirstName() { return "disabled"; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyDisableMethod = findMethod(Customer.class, "disableFirstName", new Class[] {}); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyDisableMethod = findMethodExactOrFail(Customer.class, "disableFirstName", new Class[] {}); - final Facet facet = facetedMethod.getFacet(DisableForContextFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DisableForContextFacetViaMethod); - final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet; - assertEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(DisableForContextFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DisableForContextFacetViaMethod); + final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet; + assertMethodEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDisableMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDisableMethod)); + }); } - public void testDisableFacetNoArgsFoundAndMethodRemoved() { - - val facetFactory = new DisableForContextFacetViaMethodFactory(metaModelContext); - + @Test + void disableFacetNoArgsFoundAndMethodRemoved() { + val facetFactory = new DisableForContextFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public String disableFirstName() { - return "disabled"; - } + public String getFirstName() { return null; } + public String disableFirstName() { return "disabled"; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyDisableMethod = findMethod(Customer.class, "disableFirstName"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyDisableMethod = findMethodExactOrFail(Customer.class, "disableFirstName"); - final Facet facet = facetedMethod.getFacet(DisableForContextFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DisableForContextFacetViaMethod); - final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet; - assertEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(DisableForContextFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DisableForContextFacetViaMethod); + final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet; + assertMethodEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDisableMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyDisableMethod)); + }); } - public void testHiddenFacetFoundAndMethodRemoved() { - val facetFactory = new HideForContextFacetViaMethodFactory(metaModelContext); - + @Test + void hiddenFacetFoundAndMethodRemoved() { + val facetFactory = new HideForContextFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public boolean hideFirstName() { - return true; - } + public String getFirstName() { return null; } + public boolean hideFirstName() { return true; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyHideMethod = findMethod(Customer.class, "hideFirstName", new Class[] {}); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyHideMethod = findMethodExactOrFail(Customer.class, "hideFirstName", new Class[] {}); - final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HideForContextFacetViaMethod); - final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; - assertEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HideForContextFacetViaMethod); + final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; + assertMethodEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyHideMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyHideMethod)); + }); } - public void testHiddenFacetWithNoArgFoundAndMethodRemoved() { - val facetFactory = new HideForContextFacetViaMethodFactory(metaModelContext); - + @Test + void hiddenFacetWithNoArgFoundAndMethodRemoved() { + val facetFactory = new HideForContextFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } - - @SuppressWarnings("unused") - public boolean hideFirstName() { - return true; - } + public String getFirstName() { return null; } + public boolean hideFirstName() { return true; } } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyHideMethod = findMethod(Customer.class, "hideFirstName"); - facetFactory.process(ProcessMethodContext - .forTesting(Customer.class, FeatureType.PROPERTY, propertyAccessorMethod, methodRemover, facetedMethod)); + final Method propertyHideMethod = findMethodExactOrFail(Customer.class, "hideFirstName"); - final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HideForContextFacetViaMethod); - final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; - assertEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HideForContextFacetViaMethod); + final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; + assertMethodEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); - assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyHideMethod)); + assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(propertyHideMethod)); + }); } - public void testPropertyFoundOnSuperclass() { - val facetFactory = new PropertyAccessorFacetViaAccessorFactory(metaModelContext); - + @Test + void propertyFoundOnSuperclass() { + val facetFactory = new PropertyAccessorFacetViaAccessorFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - class CustomerEx extends Customer { } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); + final Method propertyAccessorMethod = findMethodExactOrFail(CustomerEx.class, "getFirstName"); - facetFactory.process(ProcessMethodContext - .forTesting(CustomerEx.class, null, propertyAccessorMethod, methodRemover, facetedMethod)); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof PropertyAccessorFacetViaAccessor); + final PropertyAccessorFacetViaAccessor accessorFacet = (PropertyAccessorFacetViaAccessor) facet; + assertMethodEquals(propertyAccessorMethod, accessorFacet.getMethods().getFirstElseFail().asMethodElseFail()); + }); - final Facet facet = facetedMethod.getFacet(PropertyOrCollectionAccessorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof PropertyAccessorFacetViaAccessor); - final PropertyAccessorFacetViaAccessor accessorFacet = (PropertyAccessorFacetViaAccessor) facet; - assertEquals(propertyAccessorMethod, accessorFacet.getMethods().getFirstElseFail()); } - public void testPropertyFoundOnSuperclassButHelperMethodFoundOnSubclass() { - val facetFactory = new PropertyAccessorFacetViaAccessorFactory(metaModelContext); - val facetFactoryForHide = new HideForContextFacetViaMethodFactory(metaModelContext); - val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory(metaModelContext); - + @Test + void propertyFoundOnSuperclassButHelperMethodFoundOnSubclass() { + val facetFactory = new PropertyAccessorFacetViaAccessorFactory(getMetaModelContext()); + val facetFactoryForHide = new HideForContextFacetViaMethodFactory(getMetaModelContext()); + val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory(getMetaModelContext()); + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - + @SuppressWarnings("unused") class CustomerEx extends Customer { - @SuppressWarnings("unused") - public boolean hideFirstName() { - return true; - } - - @SuppressWarnings("unused") - public String disableFirstName() { - return "disabled"; - } + public boolean hideFirstName() { return true; } + public String disableFirstName() { return "disabled";} } - final Method propertyAccessorMethod = findMethod(Customer.class, "getFirstName"); - final Method propertyHideMethod = findMethod(CustomerEx.class, "hideFirstName"); - final Method propertyDisableMethod = findMethod(CustomerEx.class, "disableFirstName"); - - final ProcessMethodContext processMethodContext = ProcessMethodContext - .forTesting(CustomerEx.class, FeatureType.PROPERTY, - propertyAccessorMethod, methodRemover, facetedMethod); - facetFactory.process(processMethodContext); - facetFactoryForHide.process(processMethodContext); - facetFactoryForDisable.process(processMethodContext); - - final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HideForContextFacetViaMethod); - final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; - assertEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail()); - - final Facet facet2 = facetedMethod.getFacet(DisableForContextFacet.class); - assertNotNull(facet2); - assertTrue(facet2 instanceof DisableForContextFacetViaMethod); - final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet2; - assertEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail()); + final Method propertyHideMethod = findMethodExactOrFail(CustomerEx.class, "hideFirstName"); + final Method propertyDisableMethod = findMethodExactOrFail(CustomerEx.class, "disableFirstName"); + + propertyScenario(CustomerEx.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + facetFactory.process(processMethodContext); + // then + facetFactory.process(processMethodContext); + facetFactoryForHide.process(processMethodContext); + facetFactoryForDisable.process(processMethodContext); + + final Facet facet = facetedMethod.getFacet(HideForContextFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HideForContextFacetViaMethod); + final HideForContextFacetViaMethod hideForContextFacet = (HideForContextFacetViaMethod) facet; + assertMethodEquals(propertyHideMethod, hideForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); + + final Facet facet2 = facetedMethod.getFacet(DisableForContextFacet.class); + assertNotNull(facet2); + assertTrue(facet2 instanceof DisableForContextFacetViaMethod); + final DisableForContextFacetViaMethod disableForContextFacet = (DisableForContextFacetViaMethod) facet2; + assertMethodEquals(propertyDisableMethod, disableForContextFacet.getMethods().getFirstElseFail().asMethodElseFail()); + }); } - - - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/DisabledAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/DisabledAnnotationOnPropertyFacetFactoryTest.java index ac7acd42d11..316f5eb95ef 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/DisabledAnnotationOnPropertyFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/DisabledAnnotationOnPropertyFacetFactoryTest.java @@ -18,7 +18,9 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -27,31 +29,28 @@ import org.apache.causeway.applib.annotation.Editing; import org.apache.causeway.applib.annotation.Property; +import org.apache.causeway.core.metamodel.consent.Consent.VetoReason; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacet; import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacetAbstract; import lombok.val; class DisabledAnnotationOnPropertyFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private PropertyAnnotationFacetFactory facetFactory; - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } - @Override - protected void tearDown() throws Exception { + @AfterEach + protected void tearDown() { facetFactory = null; - super.tearDown(); } private void processEditing( @@ -60,48 +59,49 @@ private void processEditing( facetFactory.processEditing(processMethodContext, propertyIfAny); } - public void testDisabledAnnotationPickedUpOnProperty() { + @Test + void disabledAnnotationPickedUpOnProperty() { class Customer { @Property(editing = Editing.DISABLED) - public int getNumberOfOrders() { - return 0; - } + public int getNumberOfOrders() { return 0; } } - final Method actionMethod = findMethod(Customer.class, "getNumberOfOrders"); - - processEditing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); + propertyScenario(Customer.class, "numberOfOrders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processEditing(facetFactory, processMethodContext); - final Facet facet = facetedMethod.getFacet(DisabledFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DisabledFacetAbstract); + // then + final Facet facet = facetedMethod.getFacet(DisabledFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DisabledFacetAbstract); - final DisabledFacet disabledFacet = (DisabledFacet) facet; - assertThat(disabledFacet.disabledReason(null), is("Always disabled")); + final DisabledFacet disabledFacet = (DisabledFacet) facet; + assertThat(disabledFacet.disabledReason(null).map(VetoReason::string).orElse(null), is("Disabled via @Property annotation, reason not given.")); - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } - public void testDisabledAnnotationWithReason() { + @Test + void disabledAnnotationWithReason() { class Customer { @Property(editing = Editing.DISABLED, editingDisabledReason = "Oh no you don't!") - public int getNumberOfOrders() { - return 0; - } + public int getNumberOfOrders() { return 0;} } - final Method actionMethod = findMethod(Customer.class, "getNumberOfOrders"); + propertyScenario(Customer.class, "numberOfOrders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processEditing(facetFactory, processMethodContext); + // then - processEditing(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, actionMethod, methodRemover, facetedMethod)); - final Facet facet = facetedMethod.getFacet(DisabledFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof DisabledFacetAbstract); - final DisabledFacet disabledFacet = (DisabledFacet) facet; - assertThat(disabledFacet.disabledReason(null), is("Oh no you don't!")); + final Facet facet = facetedMethod.getFacet(DisabledFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof DisabledFacetAbstract); - assertNoMethodsRemoved(); - } + final DisabledFacet disabledFacet = (DisabledFacet) facet; + assertThat(disabledFacet.disabledReason(null).map(VetoReason::string).orElse(null), is("Oh no you don't!")); + assertNoMethodsRemoved(); + }); + } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java index beaf8470480..3b86a2fda8c 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/MandatoryAnnotationFacetFactoryTest.java @@ -18,9 +18,8 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; - import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -28,24 +27,21 @@ import org.apache.causeway.applib.annotation.Optionality; import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet; import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation; import lombok.val; class MandatoryAnnotationFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private PropertyAnnotationFacetFactory facetFactory; - @Override @BeforeEach - public void setUp() throws Exception { - super.setUp(); - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + protected void setUp() { + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } private void processOptional( @@ -54,23 +50,21 @@ private void processOptional( facetFactory.processOptional(processMethodContext, propertyIfAny); } - public void testMandatoryAnnotationPickedUpOnProperty() { + @Test + void mandatoryAnnotationPickedUpOnProperty() { class Customer { @Property(optionality = Optionality.MANDATORY) - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - processOptional(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof MandatoryFacetForPropertyAnnotation); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processOptional(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof MandatoryFacetForPropertyAnnotation); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java index ab41ab31ac3..75aa35e1ce3 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java @@ -18,23 +18,21 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; import java.util.regex.Pattern; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mock; import org.mockito.Mockito; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +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.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.calls; import org.apache.causeway.applib.annotation.Optionality; import org.apache.causeway.applib.annotation.Property; @@ -49,9 +47,9 @@ import org.apache.causeway.core.metamodel.facetapi.Facet; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; import org.apache.causeway.core.metamodel.facetapi.FacetUtil; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryJupiterTestCase; +import org.apache.causeway.core.metamodel.facets.DomainEventFacetAbstract.EventTypeOrigin; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet; import org.apache.causeway.core.metamodel.facets.members.disabled.DisabledFacet; import org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet; @@ -65,13 +63,9 @@ import org.apache.causeway.core.metamodel.facets.properties.property.hidden.HiddenFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.maxlength.MaxLengthFacetForPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromPropertyAnnotation; +import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEvent; import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPropertyAnnotation; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromDefault; -import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromPropertyAnnotation; +import org.apache.causeway.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEvent; import org.apache.causeway.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.snapshot.SnapshotExcludeFacetForPropertyAnnotation; @@ -87,17 +81,9 @@ import lombok.Setter; import lombok.val; -class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJupiterTestCase { +class PropertyAnnotationFacetFactoryTest extends FacetFactoryTestAbstract { PropertyAnnotationFacetFactory facetFactory; - Method propertyMethod; - - @Mock ObjectSpecification mockTypeSpec; - @Mock ObjectSpecification mockReturnTypeSpec; - - void expectRemoveMethod(final Method actionMethod) { - Mockito.verify(mockMethodRemover, calls(1)).removeMethod(actionMethod); - } private static void processModify( final PropertyAnnotationFacetFactory facetFactory, final FacetFactory.ProcessMethodContext processMethodContext) { @@ -156,10 +142,9 @@ private static void processEntityPropertyChangePublishing( @BeforeEach public void setUp() throws Exception { - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } - @Override @AfterEach public void tearDown() throws Exception { facetFactory = null; @@ -168,6 +153,7 @@ public void tearDown() throws Exception { public static class Modify extends PropertyAnnotationFacetFactoryTest { private void addGetterFacet(final FacetHolder holder) { + val mockOnType = Mockito.mock(ObjectSpecification.class); FacetUtil.addFacet(new PropertyOrCollectionAccessorFacetAbstract(mockOnType, holder) { @Override public Object getProperty( @@ -214,40 +200,39 @@ class NamedChangedDomainEvent extends PropertyDomainEvent {} } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - addGetterFacet(facetedMethod); - addSetterFacet(facetedMethod); - addClearFacet(facetedMethod); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processModify(facetFactory, processMethodContext); - - // then - final PropertyDomainEventFacet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation); - final PropertyDomainEventFacetForPropertyAnnotation domainEventFacetDefault = (PropertyDomainEventFacetForPropertyAnnotation) domainEventFacet; - assertThat(domainEventFacetDefault.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); - assertNotNull(setterFacet); - assertTrue(setterFacet instanceof PropertySetterFacetForDomainEventFromPropertyAnnotation, - "unexpected facet: " + setterFacet); - final PropertySetterFacetForDomainEventFromPropertyAnnotation setterFacetImpl = (PropertySetterFacetForDomainEventFromPropertyAnnotation) setterFacet; - assertThat(setterFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); - assertNotNull(clearFacet); - assertTrue(clearFacet instanceof PropertyClearFacetForDomainEventFromPropertyAnnotation); - final PropertyClearFacetForDomainEventFromPropertyAnnotation clearFacetImpl = (PropertyClearFacetForDomainEventFromPropertyAnnotation) clearFacet; - assertThat(clearFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + + addGetterFacet(facetedMethod); + addSetterFacet(facetedMethod); + addClearFacet(facetedMethod); + + // when + processModify(facetFactory, processMethodContext); + + // then + final PropertyDomainEventFacet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof PropertyDomainEventFacet); + final PropertyDomainEventFacet domainEventFacetImpl = domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isAnnotatedMember()); + assertThat(domainEventFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); + assertNotNull(setterFacet); + assertTrue(setterFacet instanceof PropertySetterFacetForDomainEvent, "unexpected facet: " + setterFacet); + final PropertySetterFacetForDomainEvent setterFacetImpl = (PropertySetterFacetForDomainEvent) setterFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, setterFacetImpl.getEventTypeOrigin()); + assertThat(setterFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); + assertNotNull(clearFacet); + assertTrue(clearFacet instanceof PropertyClearFacetForDomainEvent); + final PropertyClearFacetForDomainEvent clearFacetImpl = (PropertyClearFacetForDomainEvent) clearFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, setterFacetImpl.getEventTypeOrigin()); + assertThat(clearFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + }); } @@ -261,40 +246,38 @@ class NamedChangedDomainEvent extends PropertyDomainEvent {} } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - addGetterFacet(facetedMethod); - addSetterFacet(facetedMethod); - addClearFacet(facetedMethod); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processModify(facetFactory, processMethodContext); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation); - final PropertyDomainEventFacetForPropertyAnnotation domainEventFacetImpl = (PropertyDomainEventFacetForPropertyAnnotation) domainEventFacet; - assertThat(domainEventFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); - assertNotNull(setterFacet); - assertTrue(setterFacet instanceof PropertySetterFacetForDomainEventFromPropertyAnnotation, - "unexpected facet: " + setterFacet); - final PropertySetterFacetForDomainEventFromPropertyAnnotation setterFacetImpl = (PropertySetterFacetForDomainEventFromPropertyAnnotation) setterFacet; - assertThat(setterFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); - assertNotNull(clearFacet); - assertTrue(clearFacet instanceof PropertyClearFacetForDomainEventFromPropertyAnnotation); - final PropertyClearFacetForDomainEventFromPropertyAnnotation clearFacetImpl = (PropertyClearFacetForDomainEventFromPropertyAnnotation) clearFacet; - assertThat(clearFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + addGetterFacet(facetedMethod); + addSetterFacet(facetedMethod); + addClearFacet(facetedMethod); + + // when + processModify(facetFactory, processMethodContext); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof PropertyDomainEventFacet); + final PropertyDomainEventFacet domainEventFacetImpl = (PropertyDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isAnnotatedMember()); + assertThat(domainEventFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); + assertNotNull(setterFacet); + assertTrue(setterFacet instanceof PropertySetterFacetForDomainEvent, "unexpected facet: " + setterFacet); + final PropertySetterFacetForDomainEvent setterFacetImpl = (PropertySetterFacetForDomainEvent) setterFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, setterFacetImpl.getEventTypeOrigin()); + assertThat(setterFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); + assertNotNull(clearFacet); + assertTrue(clearFacet instanceof PropertyClearFacetForDomainEvent); + final PropertyClearFacetForDomainEvent clearFacetImpl = (PropertyClearFacetForDomainEvent) clearFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, clearFacetImpl.getEventTypeOrigin()); + assertThat(clearFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + }); } @Test @@ -308,40 +291,38 @@ class NamedChangedDomainEvent extends PropertyDomainEvent { } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - addGetterFacet(facetedMethod); - addSetterFacet(facetedMethod); - addClearFacet(facetedMethod); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processModify(facetFactory, processMethodContext); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof PropertyDomainEventFacetForPropertyAnnotation); - final PropertyDomainEventFacetForPropertyAnnotation domainEventFacetImpl = (PropertyDomainEventFacetForPropertyAnnotation) domainEventFacet; - MatcherAssert.assertThat(domainEventFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); - assertNotNull(setterFacet); - assertTrue(setterFacet instanceof PropertySetterFacetForDomainEventFromPropertyAnnotation, - "unexpected facet: " + setterFacet); - final PropertySetterFacetForDomainEventFromPropertyAnnotation setterFacetImpl = (PropertySetterFacetForDomainEventFromPropertyAnnotation) setterFacet; - assertThat(setterFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); - - // then - final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); - assertNotNull(clearFacet); - assertTrue(clearFacet instanceof PropertyClearFacetForDomainEventFromPropertyAnnotation); - final PropertyClearFacetForDomainEventFromPropertyAnnotation clearFacetImpl = (PropertyClearFacetForDomainEventFromPropertyAnnotation) clearFacet; - assertThat(clearFacetImpl.value(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + addGetterFacet(facetedMethod); + addSetterFacet(facetedMethod); + addClearFacet(facetedMethod); + + // when + processModify(facetFactory, processMethodContext); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof PropertyDomainEventFacet); + final PropertyDomainEventFacet domainEventFacetImpl = (PropertyDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isAnnotatedMember()); + MatcherAssert.assertThat(domainEventFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); + assertNotNull(setterFacet); + assertTrue(setterFacet instanceof PropertySetterFacetForDomainEvent, "unexpected facet: " + setterFacet); + final PropertySetterFacetForDomainEvent setterFacetImpl = (PropertySetterFacetForDomainEvent) setterFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, setterFacetImpl.getEventTypeOrigin()); + assertThat(setterFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + + // then + final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); + assertNotNull(clearFacet); + assertTrue(clearFacet instanceof PropertyClearFacetForDomainEvent); + final PropertyClearFacetForDomainEvent clearFacetImpl = (PropertyClearFacetForDomainEvent) clearFacet; + assertEquals(EventTypeOrigin.ANNOTATED_MEMBER, clearFacetImpl.getEventTypeOrigin()); + assertThat(clearFacetImpl.getEventType(), CausewayMatchers.classEqualTo(Customer.NamedChangedDomainEvent.class)); + }); } @Test @@ -352,43 +333,40 @@ class Customer { } // given - assertTrue(metaModelContext.getConfiguration() + assertTrue(getConfiguration() .getApplib().getAnnotation().getDomainObject().getCreatedLifecycleEvent().isPostForDefault()); - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - addGetterFacet(facetedMethod); - addSetterFacet(facetedMethod); - addClearFacet(facetedMethod); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processModify(facetFactory, processMethodContext); - - // then - final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); - assertNotNull(domainEventFacet); - assertTrue(domainEventFacet instanceof PropertyDomainEventFacetDefault); - final PropertyDomainEventFacetDefault domainEventFacetImpl = (PropertyDomainEventFacetDefault) domainEventFacet; - assertThat(domainEventFacetImpl.value(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); - - // then - final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); - assertNotNull(setterFacet); - assertTrue(setterFacet instanceof PropertySetterFacetForDomainEventFromDefault, - "unexpected facet: " + setterFacet); - final PropertySetterFacetForDomainEventFromDefault setterFacetImpl = (PropertySetterFacetForDomainEventFromDefault) setterFacet; - assertThat(setterFacetImpl.value(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); - - // then - final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); - assertNotNull(clearFacet); - assertTrue(clearFacet instanceof PropertyClearFacetForDomainEventFromDefault); - final PropertyClearFacetForDomainEventFromDefault clearFacetImpl = (PropertyClearFacetForDomainEventFromDefault) clearFacet; - assertThat(clearFacetImpl.value(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + addGetterFacet(facetedMethod); + addSetterFacet(facetedMethod); + addClearFacet(facetedMethod); + + // when + processModify(facetFactory, processMethodContext); + + // then + final Facet domainEventFacet = facetedMethod.getFacet(PropertyDomainEventFacet.class); + assertNotNull(domainEventFacet); + assertTrue(domainEventFacet instanceof PropertyDomainEventFacet); + final PropertyDomainEventFacet domainEventFacetImpl = (PropertyDomainEventFacet) domainEventFacet; + assertTrue(domainEventFacetImpl.getEventTypeOrigin().isDefault()); + assertThat(domainEventFacetImpl.getEventType(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); + + // then + final Facet setterFacet = facetedMethod.getFacet(PropertySetterFacet.class); + assertNotNull(setterFacet); + assertTrue(setterFacet instanceof PropertySetterFacetForDomainEvent, + "unexpected facet: " + setterFacet); + final PropertySetterFacetForDomainEvent setterFacetImpl = (PropertySetterFacetForDomainEvent) setterFacet; + assertThat(setterFacetImpl.getEventType(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); + + // then + final Facet clearFacet = facetedMethod.getFacet(PropertyClearFacet.class); + assertNotNull(clearFacet); + assertTrue(clearFacet instanceof PropertyClearFacetForDomainEvent); + final PropertyClearFacetForDomainEvent clearFacetImpl = (PropertyClearFacetForDomainEvent) clearFacet; + assertThat(clearFacetImpl.getEventType(), CausewayMatchers.classEqualTo(PropertyDomainEvent.Default.class)); + }); } } @@ -405,25 +383,21 @@ class Customer { } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processHidden(facetFactory, processMethodContext); - - // then - final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacet); - assertTrue(hiddenFacet instanceof HiddenFacetForPropertyAnnotation); - final HiddenFacetForPropertyAnnotation hiddenFacetImpl = (HiddenFacetForPropertyAnnotation) hiddenFacet; - assertThat(hiddenFacetImpl.where(), is(Where.REFERENCES_PARENT)); - - final Facet hiddenFacetForProp = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(hiddenFacetForProp); - assertTrue(hiddenFacet == hiddenFacetForProp); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processHidden(facetFactory, processMethodContext); + + // then + final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacet); + assertTrue(hiddenFacet instanceof HiddenFacetForPropertyAnnotation); + final HiddenFacetForPropertyAnnotation hiddenFacetImpl = (HiddenFacetForPropertyAnnotation) hiddenFacet; + assertThat(hiddenFacetImpl.where(), is(Where.REFERENCES_PARENT)); + + final Facet hiddenFacetForProp = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(hiddenFacetForProp); + assertTrue(hiddenFacet == hiddenFacetForProp); + }); } } @@ -437,13 +411,12 @@ public void withAnnotationOnGetter() { class Customer { @Property( editing = org.apache.causeway.applib.annotation.Editing.DISABLED, - editingDisabledReason = "you cannot edit the name property" - ) + editingDisabledReason = "you cannot edit the name property") public String getName() { return null; } public void setName(final String name) {} } - assertDisabledFacetOn(findMethod(Customer.class, "getName"), + assertDisabledFacetOn(Customer.class, "name", "you cannot edit the name property"); } @@ -453,13 +426,12 @@ public void withAnnotationOnField() { class Customer { @Property( editing = org.apache.causeway.applib.annotation.Editing.DISABLED, - editingDisabledReason = "you cannot edit the name property" - ) + editingDisabledReason = "you cannot edit the name property") @Getter @Setter private String name; } - assertDisabledFacetOn(findMethod(Customer.class, "getName"), + assertDisabledFacetOn(Customer.class, "name", "you cannot edit the name property"); } @@ -476,7 +448,7 @@ class Customer { public void setSubscribed(final boolean b) {} } - assertDisabledFacetOn(findMethod(Customer.class, "isSubscribed"), + assertDisabledFacetOn(Customer.class, "subscribed", "you cannot edit the subscribed property"); } @@ -492,7 +464,7 @@ class Customer { private boolean subscribed; } - assertDisabledFacetOn(findMethod(Customer.class, "isSubscribed"), + assertDisabledFacetOn(Customer.class, "subscribed", "you cannot edit the subscribed property"); } @@ -516,31 +488,25 @@ static class PrimitiveBooleanEntity implements PrimitiveBooleanHolder { @Test //FIXME[CAUSEWAY-2963] test fails - no facet is generated public void causeway2963() { - assertDisabledFacetOn(findMethod(PrimitiveBooleanEntity.class, "isReadWriteProperty"), - "b"); + assertDisabledFacetOn(PrimitiveBooleanEntity.class, "readWriteProperty", "b"); } // -- HELPER - private void assertDisabledFacetOn(final Method getter, final String expectedDisabledReason) { + private void assertDisabledFacetOn(final Class declaringClass, final String propertyName, final String expectedDisabledReason) { // given - final Class cls = getter.getDeclaringClass(); - propertyMethod = getter; - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processEditing(facetFactory, processMethodContext); - - // then - val disabledFacet = facetedMethod.getFacet(DisabledFacet.class); - assertNotNull(disabledFacet); - assertTrue(disabledFacet instanceof DisabledFacetForPropertyAnnotation); - val disabledFacet2 = (DisabledFacetForPropertyAnnotation) disabledFacet; - assertThat(disabledFacet.where(), is(Where.EVERYWHERE)); - assertThat(disabledFacet2.disabledReason(null).map(VetoReason::string).orElse(null), is(expectedDisabledReason)); + propertyScenario(declaringClass, propertyName, (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processEditing(facetFactory, processMethodContext); + // then + val disabledFacet = facetedMethod.getFacet(DisabledFacet.class); + assertNotNull(disabledFacet); + assertTrue(disabledFacet instanceof DisabledFacetForPropertyAnnotation); + val disabledFacet2 = (DisabledFacetForPropertyAnnotation) disabledFacet; + assertThat(disabledFacet.where(), is(Where.EVERYWHERE)); + assertThat(disabledFacet2.disabledReason(null).map(VetoReason::string).orElse(null), is(expectedDisabledReason)); + }); } } @@ -551,27 +517,21 @@ public static class MaxLength extends PropertyAnnotationFacetFactoryTest { public void withAnnotation() { class Customer { - @Property( - maxLength = 30 - ) + @Property(maxLength = 30) @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processMaxLength(facetFactory, processMethodContext); - - // then - final MaxLengthFacet maxLengthFacet = facetedMethod.getFacet(MaxLengthFacet.class); - assertNotNull(maxLengthFacet); - assertTrue(maxLengthFacet instanceof MaxLengthFacetForPropertyAnnotation); - assertThat(maxLengthFacet.value(), is(30)); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processMaxLength(facetFactory, processMethodContext); + + // then + final MaxLengthFacet maxLengthFacet = facetedMethod.getFacet(MaxLengthFacet.class); + assertNotNull(maxLengthFacet); + assertTrue(maxLengthFacet instanceof MaxLengthFacetForPropertyAnnotation); + assertThat(maxLengthFacet.value(), is(30)); + }); } } @@ -603,25 +563,21 @@ class Customer { } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processMustSatisfy(facetFactory, processMethodContext); - - // then - final MustSatisfySpecificationFacet mustSatisfySpecificationFacet = facetedMethod.getFacet(MustSatisfySpecificationFacet.class); - assertNotNull(mustSatisfySpecificationFacet); - assertTrue(mustSatisfySpecificationFacet instanceof MustSatisfySpecificationFacetForPropertyAnnotation); - final MustSatisfySpecificationFacetForPropertyAnnotation mustSatisfySpecificationFacetImpl = (MustSatisfySpecificationFacetForPropertyAnnotation) mustSatisfySpecificationFacet; - val specifications = mustSatisfySpecificationFacetImpl.getSpecifications(); - assertThat(specifications.size(), is(2)); - - assertTrue(specifications.getElseFail(0) instanceof NotTooHot); - assertTrue(specifications.getElseFail(1) instanceof NotTooCold); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processMustSatisfy(facetFactory, processMethodContext); + + // then + final MustSatisfySpecificationFacet mustSatisfySpecificationFacet = facetedMethod.getFacet(MustSatisfySpecificationFacet.class); + assertNotNull(mustSatisfySpecificationFacet); + assertTrue(mustSatisfySpecificationFacet instanceof MustSatisfySpecificationFacetForPropertyAnnotation); + final MustSatisfySpecificationFacetForPropertyAnnotation mustSatisfySpecificationFacetImpl = (MustSatisfySpecificationFacetForPropertyAnnotation) mustSatisfySpecificationFacet; + val specifications = mustSatisfySpecificationFacetImpl.getSpecifications(); + assertThat(specifications.size(), is(2)); + + assertTrue(specifications.getElseFail(0) instanceof NotTooHot); + assertTrue(specifications.getElseFail(1) instanceof NotTooCold); + }); } } @@ -637,20 +593,15 @@ class Customer { } // given - val cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processEntityPropertyChangePublishing(facetFactory, processMethodContext); - - // then - val changePolicyFacet = facetedMethod.getFacet(EntityPropertyChangePublishingPolicyFacet.class); - assertNotNull(changePolicyFacet); - assertTrue(changePolicyFacet.isPublishingVetoed()); - assertFalse(changePolicyFacet.isPublishingAllowed()); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processEntityPropertyChangePublishing(facetFactory, processMethodContext); + // then + val changePolicyFacet = facetedMethod.getFacet(EntityPropertyChangePublishingPolicyFacet.class); + assertNotNull(changePolicyFacet); + assertTrue(changePolicyFacet.isPublishingVetoed()); + assertFalse(changePolicyFacet.isPublishingAllowed()); + }); } @Test @@ -662,18 +613,13 @@ class Customer { } // given - val cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processEntityPropertyChangePublishing(facetFactory, processMethodContext); - - // then - val changePolicyFacet = facetedMethod.getFacet(EntityPropertyChangePublishingPolicyFacet.class); - assertNull(changePolicyFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processEntityPropertyChangePublishing(facetFactory, processMethodContext); + // then + val changePolicyFacet = facetedMethod.getFacet(EntityPropertyChangePublishingPolicyFacet.class); + assertNull(changePolicyFacet); + }); } } @@ -689,21 +635,15 @@ class Customer { } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processSnapshot(facetFactory, processMethodContext); - - // then - final SnapshotExcludeFacet snapshotExcludeFacet = facetedMethod.getFacet(SnapshotExcludeFacet.class); - assertNotNull(snapshotExcludeFacet); - assertTrue(snapshotExcludeFacet instanceof SnapshotExcludeFacetForPropertyAnnotation); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processSnapshot(facetFactory, processMethodContext); + // then + final SnapshotExcludeFacet snapshotExcludeFacet = facetedMethod.getFacet(SnapshotExcludeFacet.class); + assertNotNull(snapshotExcludeFacet); + assertTrue(snapshotExcludeFacet instanceof SnapshotExcludeFacetForPropertyAnnotation); + }); } - } public static class Mandatory extends PropertyAnnotationFacetFactoryTest { @@ -712,101 +652,74 @@ public static class Mandatory extends PropertyAnnotationFacetFactoryTest { public void whenOptionalityIsTrue() { class Customer { - @Property( - optionality = Optionality.OPTIONAL - ) + @Property(optionality = Optionality.OPTIONAL) @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processOptional(facetFactory, processMethodContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); - assertNotNull(mandatoryFacet); - assertTrue(mandatoryFacet instanceof MandatoryFacetForPropertyAnnotation.Optional); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processOptional(facetFactory, processMethodContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); + assertNotNull(mandatoryFacet); + assertTrue(mandatoryFacet instanceof MandatoryFacetForPropertyAnnotation.Optional); + }); } @Test public void whenOptionalityIsFalse() { class Customer { - @Property( - optionality = Optionality.MANDATORY - ) + @Property(optionality = Optionality.MANDATORY) @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processOptional(facetFactory, processMethodContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); - assertNotNull(mandatoryFacet); - assertTrue(mandatoryFacet instanceof MandatoryFacetForPropertyAnnotation.Required); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processOptional(facetFactory, processMethodContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); + assertNotNull(mandatoryFacet); + assertTrue(mandatoryFacet instanceof MandatoryFacetForPropertyAnnotation.Required); + }); } @Test public void whenOptionalityIsDefault() { class Customer { - @Property( - optionality = Optionality.DEFAULT - ) + @Property(optionality = Optionality.DEFAULT) @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processOptional(facetFactory, processMethodContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); - assertNull(mandatoryFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processOptional(facetFactory, processMethodContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); + assertNull(mandatoryFacet); + }); } @Test public void whenNone() { class Customer { - @Property( - ) + @Property() @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processOptional(facetFactory, processMethodContext); - - // then - final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); - assertNull(mandatoryFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processOptional(facetFactory, processMethodContext); + // then + final MandatoryFacet mandatoryFacet = facetedMethod.getFacet(MandatoryFacet.class); + assertNull(mandatoryFacet); + }); } } @@ -818,102 +731,78 @@ public void whenHasAnnotation() { class Customer { @Property( regexPattern = "[123].*", - regexPatternFlags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE - ) + regexPatternFlags = Pattern.CASE_INSENSITIVE | Pattern.MULTILINE) @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processRegEx(facetFactory, processMethodContext); - - // then - final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); - assertNotNull(regExFacet); - assertTrue(regExFacet instanceof RegExFacetForPropertyAnnotation); - assertThat(regExFacet.patternFlags(), is(10)); - assertThat(regExFacet.regexp(), is("[123].*")); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + // then + final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); + assertNotNull(regExFacet); + assertTrue(regExFacet instanceof RegExFacetForPropertyAnnotation); + assertThat(regExFacet.patternFlags(), is(10)); + assertThat(regExFacet.regexp(), is("[123].*")); + }); } @Test public void whenNone() { class Customer { - @Property( - ) + @Property() @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processRegEx(facetFactory, processMethodContext); - - // then - final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); - assertNull(regExFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + // then + final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); + assertNull(regExFacet); + }); } @Test public void whenEmptyString() { class Customer { - @Property( - regexPattern = "" - ) + @Property(regexPattern = "") @Getter @Setter private String name; } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processRegEx(facetFactory, processMethodContext); - - // then - final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); - assertNull(regExFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + + // then + final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); + assertNull(regExFacet); + }); } @Test public void whenNotAnnotatedOnStringProperty() { class Customer { - @Property( - regexPattern = "[abc].*" - ) + @Property(regexPattern = "[abc].*") public int getName() {return 0; } @SuppressWarnings("unused") public void setName(final int name) { } } // given - final Class cls = Customer.class; - propertyMethod = findMethod(Customer.class, "getName"); - - // when - val processMethodContext = ProcessMethodContext - .forTesting(cls, null, - propertyMethod, mockMethodRemover, facetedMethod); - processRegEx(facetFactory, processMethodContext); - - // then - final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); - assertNull(regExFacet); + propertyScenario(Customer.class, "name", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + + // then + final RegExFacet regExFacet = facetedMethod.getFacet(RegExFacet.class); + assertNull(regExFacet); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationWithSnapshotOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationWithSnapshotOnPropertyFacetFactoryTest.java index fc242a99584..23364d1cab5 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationWithSnapshotOnPropertyFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyAnnotationWithSnapshotOnPropertyFacetFactoryTest.java @@ -18,7 +18,8 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,23 +27,21 @@ import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.applib.annotation.Snapshot; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.propcoll.memserexcl.SnapshotExcludeFacet; import org.apache.causeway.core.metamodel.facets.properties.property.snapshot.SnapshotExcludeFacetForPropertyAnnotation; import lombok.val; class PropertyAnnotationWithSnapshotOnPropertyFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private PropertyAnnotationFacetFactory facetFactory; - @Override - public void setUp() throws Exception { - super.setUp(); - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } private void processNotPersisted( @@ -51,25 +50,23 @@ private void processNotPersisted( facetFactory.processSnapshot(processMethodContext, propertyIfAny); } - public void testAnnotationPickedUpOnProperty() { + @Test + void annotationPickedUpOnProperty() { class Customer { @Property(snapshot = Snapshot.EXCLUDED) - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processNotPersisted(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(SnapshotExcludeFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof SnapshotExcludeFacetForPropertyAnnotation); - processNotPersisted(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(SnapshotExcludeFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof SnapshotExcludeFacetForPropertyAnnotation); - - assertNoMethodsRemoved(); + assertNoMethodsRemoved(); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java index 8a3efc39568..7c4657c698f 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest.java @@ -18,8 +18,8 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; - +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.lang.Nullable; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -29,9 +29,8 @@ import org.apache.causeway.applib.annotation.Optionality; import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet; import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation; import org.apache.causeway.core.metamodel.facets.properties.property.mandatory.MandatoryFacetInvertedByNullableAnnotationOnProperty; @@ -39,14 +38,13 @@ import lombok.val; class PropertyOptionalityOrNullableAnnotationOnPropertyFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private PropertyAnnotationFacetFactory facetFactory; - @Override - public void setUp() throws Exception { - super.setUp(); - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + @BeforeEach + protected void setUp() { + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } private void processOptional( @@ -55,72 +53,68 @@ private void processOptional( facetFactory.processOptional(processMethodContext, propertyIfAny); } - public void testPropertyAnnotationWithOptionalityPickedUpOnProperty() { + @Test + void propertyAnnotationWithOptionalityPickedUpOnProperty() { class Customer { @Property(optionality = Optionality.OPTIONAL) - public String getFirstName() { - return null; - } + public String getFirstName() { return null;} } - final Method method = findMethod(Customer.class, "getFirstName"); - - processOptional(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof MandatoryFacetForPropertyAnnotation.Optional); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + processOptional(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof MandatoryFacetForPropertyAnnotation.Optional); + }); } - public void testPropertyAnnotationIgnoredForPrimitiveOnProperty() { + @Test + void propertyAnnotationIgnoredForPrimitiveOnProperty() { class Customer { @Property(optionality = Optionality.OPTIONAL) - public int getNumberOfOrders() { - return 0; - } + public int getNumberOfOrders() { return 0;} } - final Method method = findMethod(Customer.class, "getNumberOfOrders"); - - processOptional(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - assertNotNull(facetedMethod.getFacet(MandatoryFacet.class)); + propertyScenario(Customer.class, "numberOfOrders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + processOptional(facetFactory, processMethodContext); + //then + assertNotNull(facetedMethod.getFacet(MandatoryFacet.class)); + }); } - public void testNullableAnnotationPickedUpOnProperty() { + @Test + void nullableAnnotationPickedUpOnProperty() { class Customer { @Nullable - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - processOptional(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof MandatoryFacetInvertedByNullableAnnotationOnProperty); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + processOptional(facetFactory, processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(MandatoryFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof MandatoryFacetInvertedByNullableAnnotationOnProperty); + }); } - public void testNullableAnnotationIgnoredForPrimitiveOnProperty() { + @Test + void nullableAnnotationIgnoredForPrimitiveOnProperty() { class Customer { @Nullable - public int getNumberOfOrders() { - return 0; - } + public int getNumberOfOrders() { return 0; } } - final Method method = findMethod(Customer.class, "getNumberOfOrders"); - - processOptional(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + propertyScenario(Customer.class, "numberOfOrders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + processOptional(facetFactory, processMethodContext); + //then + assertNull(facetedMethod.getFacet(MandatoryFacet.class)); + }); } } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java index 4f2f6dde57b..09130f4782b 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/property/RegExAnnotationOnPropertyFacetFactoryTest.java @@ -18,11 +18,10 @@ */ package org.apache.causeway.core.metamodel.facets.properties.property; -import java.lang.reflect.Method; - import javax.validation.constraints.Pattern; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -31,24 +30,21 @@ import org.apache.causeway.applib.annotation.Property; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.objectvalue.regex.RegExFacet; import org.apache.causeway.core.metamodel.facets.properties.property.regex.RegExFacetForPatternAnnotationOnProperty; import lombok.val; class RegExAnnotationOnPropertyFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { private PropertyAnnotationFacetFactory facetFactory; - @Override @BeforeEach - public void setUp() throws Exception { - super.setUp(); - facetFactory = new PropertyAnnotationFacetFactory(metaModelContext); + protected void setUp() { + facetFactory = new PropertyAnnotationFacetFactory(getMetaModelContext()); } private void processRegEx( @@ -57,42 +53,37 @@ private void processRegEx( facetFactory.processRegEx(processMethodContext, propertyIfAny); } - public void testRegExAnnotationPickedUpOnProperty() { - + @Test + void regExAnnotationPickedUpOnProperty() { class Customer { @Pattern(regexp = "^A.*", flags = { Pattern.Flag.CASE_INSENSITIVE }) - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - processRegEx(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - final Facet facet = facetedMethod.getFacet(RegExFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof RegExFacetForPatternAnnotationOnProperty); - final RegExFacetForPatternAnnotationOnProperty regExFacet = (RegExFacetForPatternAnnotationOnProperty) facet; - assertEquals("^A.*", regExFacet.regexp()); - assertEquals(2, regExFacet.patternFlags()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + // then + final Facet facet = facetedMethod.getFacet(RegExFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof RegExFacetForPatternAnnotationOnProperty); + final RegExFacetForPatternAnnotationOnProperty regExFacet = (RegExFacetForPatternAnnotationOnProperty) facet; + assertEquals("^A.*", regExFacet.regexp()); + assertEquals(2, regExFacet.patternFlags()); + }); } - public void testRegExAnnotationIgnoredForNonStringsProperty() { - + @Test + void regExAnnotationIgnoredForNonStringsProperty() { + @SuppressWarnings("unused") class Customer { - @SuppressWarnings("unused") - public int getNumberOfOrders() { - return 0; - } + public int getNumberOfOrders() { return 0; } } - final Method method = findMethod(Customer.class, "getNumberOfOrders"); - - processRegEx(facetFactory, ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod)); - - assertNull(facetedMethod.getFacet(RegExFacet.class)); + propertyScenario(Customer.class, "numberOfOrders", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + // when + processRegEx(facetFactory, processMethodContext); + // then + assertNull(facetedMethod.getFacet(RegExFacet.class)); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutAnnotationFactoryTest.java index 4b539ce504b..1f2266ea270 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/properties/propertylayout/PropertyLayoutAnnotationFactoryTest.java @@ -18,8 +18,7 @@ */ package org.apache.causeway.core.metamodel.facets.properties.propertylayout; -import java.lang.reflect.Method; - +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -35,9 +34,7 @@ import org.apache.causeway.applib.annotation.PropertyLayout; import org.apache.causeway.applib.annotation.Where; import org.apache.causeway.core.metamodel.facetapi.Facet; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; -import org.apache.causeway.core.metamodel.facets.FacetFactory; -import org.apache.causeway.core.metamodel.facets.FacetFactory.ProcessMethodContext; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.all.hide.HiddenFacet; import org.apache.causeway.core.metamodel.facets.all.i8n.staatic.HasStaticText; import org.apache.causeway.core.metamodel.facets.all.named.MemberNamedFacet; @@ -46,87 +43,69 @@ import lombok.val; class PropertyLayoutAnnotationFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { + + private PropertyLayoutFacetFactory facetFactory; + + @BeforeEach + protected void setUp() { + facetFactory = new PropertyLayoutFacetFactory(getMetaModelContext()); + } @Test - void testPropertyLayoutAnnotation_named() { - val facetFactory = createPropertyLayoutFacetFactory(metaModelContext); + void propertyLayoutAnnotation_named() { class Customer { @PropertyLayout(named = "1st name") - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - // when - final FacetFactory.ProcessMethodContext processMethodContext = - ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod); - - facetFactory.process(processMethodContext); - - // then - val facet = facetedMethod.getFacet(MemberNamedFacet.class); - assertThat(facet, is(notNullValue())); - assertThat(facet, is(instanceOf(NamedFacetForPropertyLayoutAnnotation.class))); - assertThat(((HasStaticText)facet).text(), is(equalTo("1st name"))); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + facetFactory.process(processMethodContext); + //then + val facet = facetedMethod.getFacet(MemberNamedFacet.class); + assertThat(facet, is(notNullValue())); + assertThat(facet, is(instanceOf(NamedFacetForPropertyLayoutAnnotation.class))); + assertThat(((HasStaticText)facet).text(), is(equalTo("1st name"))); + }); } @Test - void testPropertyLayoutAnnotation_hidden() { - final PropertyLayoutFacetFactory facetFactory = createPropertyLayoutFacetFactory(metaModelContext); + void propertyLayoutAnnotation_hidden() { class Customer { @PropertyLayout(hidden = Where.OBJECT_FORMS) - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - final FacetFactory.ProcessMethodContext processMethodContext = - ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod); - - // when - facetFactory.process(processMethodContext); - - // then - final Facet facet = facetedMethod.getFacet(HiddenFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof HiddenFacetForPropertyLayoutAnnotation); - val propLayoutFacetAnnotation = (HiddenFacetForPropertyLayoutAnnotation) facet; - assertEquals(Where.OBJECT_FORMS, propLayoutFacetAnnotation.where()); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + facetFactory.process(processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(HiddenFacet.class); + assertNotNull(facet); + assertTrue(facet instanceof HiddenFacetForPropertyLayoutAnnotation); + val propLayoutFacetAnnotation = (HiddenFacetForPropertyLayoutAnnotation) facet; + assertEquals(Where.OBJECT_FORMS, propLayoutFacetAnnotation.where()); + }); } @Test - void testPropertyLayoutAnnotation_labelPosition() { - final PropertyLayoutFacetFactory facetFactory = createPropertyLayoutFacetFactory(metaModelContext); + void propertyLayoutAnnotation_labelPosition() { class Customer { @PropertyLayout(labelPosition = LabelPosition.LEFT) - public String getFirstName() { - return null; - } + public String getFirstName() { return null; } } - final Method method = findMethod(Customer.class, "getFirstName"); - - final FacetFactory.ProcessMethodContext processMethodContext = - ProcessMethodContext - .forTesting(Customer.class, null, method, methodRemover, facetedMethod); - - // when - facetFactory.process(processMethodContext); - - // then - final Facet facet = facetedMethod.getFacet(LabelAtFacet.class); - assertThat(facet, is(notNullValue())); - assertThat(facet, is(instanceOf(LabelAtFacetForPropertyLayoutAnnotation.class))); - val layoutAnnotation = (LabelAtFacetForPropertyLayoutAnnotation) facet; - assertThat(layoutAnnotation.label(), is(equalTo(LabelPosition.LEFT))); + propertyScenario(Customer.class, "firstName", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter)->{ + //when + facetFactory.process(processMethodContext); + //then + final Facet facet = facetedMethod.getFacet(LabelAtFacet.class); + assertThat(facet, is(notNullValue())); + assertThat(facet, is(instanceOf(LabelAtFacetForPropertyLayoutAnnotation.class))); + val layoutAnnotation = (LabelAtFacetForPropertyLayoutAnnotation) facet; + assertThat(layoutAnnotation.label(), is(equalTo(LabelPosition.LEFT))); + }); } - } diff --git a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactoryTest.java index e11315b2971..ea58eb21cde 100644 --- a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/value/semantics/ValueSemanticsAnnotationFacetFactoryTest.java @@ -29,9 +29,8 @@ import org.apache.causeway.applib.annotation.TimeZoneTranslation; import org.apache.causeway.applib.annotation.ValueSemantics; -import org.apache.causeway.commons.internal._Constants; import org.apache.causeway.core.metamodel.facetapi.FacetHolder; -import org.apache.causeway.core.metamodel.facets.AbstractFacetFactoryTest; +import org.apache.causeway.core.metamodel.facets.FacetFactoryTestAbstract; import org.apache.causeway.core.metamodel.facets.FacetedMethod; import org.apache.causeway.core.metamodel.facets.objectvalue.daterenderedadjust.DateRenderAdjustFacet; import org.apache.causeway.core.metamodel.facets.objectvalue.digits.MaxFractionalDigitsFacet; @@ -44,7 +43,7 @@ @SuppressWarnings("unused") class ValueSemanticsAnnotationFacetFactoryTest -extends AbstractFacetFactoryTest { +extends FacetFactoryTestAbstract { // -- MAX TOTAL DIGITS @@ -54,13 +53,15 @@ class Order { @ValueSemantics(maxTotalDigits = 5) public BigDecimal getCost() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getCost", _Constants.emptyClasses); - // then - assertMaxTotalDigits(facetedMethod, 5); - assertDefaultMinIntegerDigits(facetedMethod); - assertDefaultMaxFractionalDigits(facetedMethod); - assertDefaultMinFractionalDigits(facetedMethod); + propertyScenario(Order.class, "cost", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertMaxTotalDigits(facetedMethod, 5); + assertDefaultMinIntegerDigits(facetedMethod); + assertDefaultMaxFractionalDigits(facetedMethod); + assertDefaultMinFractionalDigits(facetedMethod); + }); } public void testMaxTotalPickedUpOnActionParameter() { @@ -70,13 +71,15 @@ public void updateCost( @ValueSemantics(maxTotalDigits = 5) final BigDecimal cost) { } } - // when - processParams(newFacetFactory(), Order.class, "updateCost", new Class[] { BigDecimal.class }); - // then - assertMaxTotalDigits(facetedMethodParameter, 5); - assertDefaultMinIntegerDigits(facetedMethodParameter); - assertDefaultMaxFractionalDigits(facetedMethodParameter); - assertDefaultMinFractionalDigits(facetedMethodParameter); + parameterScenario(Order.class, "updateCost", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().processParams(processParameterContext); + // then + assertMaxTotalDigits(facetedMethodParameter, 5); + assertDefaultMinIntegerDigits(facetedMethodParameter); + assertDefaultMaxFractionalDigits(facetedMethodParameter); + assertDefaultMinFractionalDigits(facetedMethodParameter); + }); } // -- MIN INTEGER DIGITS @@ -87,13 +90,15 @@ class Order { @ValueSemantics(minIntegerDigits = 5) public BigDecimal getCost() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getCost", _Constants.emptyClasses); - // then - assertDefaultMaxTotalDigits(facetedMethod); - assertMinIntegerDigits(facetedMethod, 5); - assertDefaultMaxFractionalDigits(facetedMethod); - assertDefaultMinFractionalDigits(facetedMethod); + propertyScenario(Order.class, "cost", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDefaultMaxTotalDigits(facetedMethod); + assertMinIntegerDigits(facetedMethod, 5); + assertDefaultMaxFractionalDigits(facetedMethod); + assertDefaultMinFractionalDigits(facetedMethod); + }); } public void testMinIntegerPickedUpOnActionParameter() { @@ -103,13 +108,15 @@ public void updateCost( @ValueSemantics(minIntegerDigits = 5) final BigDecimal cost) { } } - // when - processParams(newFacetFactory(), Order.class, "updateCost", new Class[] { BigDecimal.class }); - // then - assertDefaultMaxTotalDigits(facetedMethodParameter); - assertMinIntegerDigits(facetedMethodParameter, 5); - assertDefaultMaxFractionalDigits(facetedMethodParameter); - assertDefaultMinFractionalDigits(facetedMethodParameter); + parameterScenario(Order.class, "updateCost", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().processParams(processParameterContext); + // then + assertDefaultMaxTotalDigits(facetedMethodParameter); + assertMinIntegerDigits(facetedMethodParameter, 5); + assertDefaultMaxFractionalDigits(facetedMethodParameter); + assertDefaultMinFractionalDigits(facetedMethodParameter); + }); } // -- MAX FRACTIONAL DIGITS @@ -120,13 +127,15 @@ class Order { @ValueSemantics(maxFractionalDigits = 5) public BigDecimal getCost() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getCost", _Constants.emptyClasses); - // then - assertDefaultMaxTotalDigits(facetedMethod); - assertDefaultMinIntegerDigits(facetedMethod); - assertMaxFractionalDigits(facetedMethod, 5); - assertDefaultMinFractionalDigits(facetedMethod); + propertyScenario(Order.class, "cost", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDefaultMaxTotalDigits(facetedMethod); + assertDefaultMinIntegerDigits(facetedMethod); + assertMaxFractionalDigits(facetedMethod, 5); + assertDefaultMinFractionalDigits(facetedMethod); + }); } public void testMaxFracionalPickedUpOnActionParameter() { @@ -136,13 +145,15 @@ public void updateCost( @ValueSemantics(maxFractionalDigits = 5) final BigDecimal cost) { } } - // when - processParams(newFacetFactory(), Order.class, "updateCost", new Class[] { BigDecimal.class }); - // then - assertDefaultMaxTotalDigits(facetedMethodParameter); - assertDefaultMinIntegerDigits(facetedMethodParameter); - assertMaxFractionalDigits(facetedMethodParameter, 5); - assertDefaultMinFractionalDigits(facetedMethodParameter); + parameterScenario(Order.class, "updateCost", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().processParams(processParameterContext); + // then + assertDefaultMaxTotalDigits(facetedMethodParameter); + assertDefaultMinIntegerDigits(facetedMethodParameter); + assertMaxFractionalDigits(facetedMethodParameter, 5); + assertDefaultMinFractionalDigits(facetedMethodParameter); + }); } // -- MIN FRACTIONAL DIGITS @@ -153,13 +164,15 @@ class Order { @ValueSemantics(minFractionalDigits = 5) public BigDecimal getCost() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getCost", _Constants.emptyClasses); - // then - assertDefaultMaxTotalDigits(facetedMethod); - assertDefaultMinIntegerDigits(facetedMethod); - assertDefaultMaxFractionalDigits(facetedMethod); - assertMinFractionalDigits(facetedMethod, 5); + propertyScenario(Order.class, "cost", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDefaultMaxTotalDigits(facetedMethod); + assertDefaultMinIntegerDigits(facetedMethod); + assertDefaultMaxFractionalDigits(facetedMethod); + assertMinFractionalDigits(facetedMethod, 5); + }); } public void testMinFracionalPickedUpOnActionParameter() { @@ -169,13 +182,15 @@ public void updateCost( @ValueSemantics(minFractionalDigits = 5) final BigDecimal cost) { } } - // when - processParams(newFacetFactory(), Order.class, "updateCost", new Class[] { BigDecimal.class }); - // then - assertDefaultMaxTotalDigits(facetedMethodParameter); - assertDefaultMinIntegerDigits(facetedMethodParameter); - assertDefaultMaxFractionalDigits(facetedMethodParameter); - assertMinFractionalDigits(facetedMethodParameter, 5); + parameterScenario(Order.class, "updateCost", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().processParams(processParameterContext); + // then + assertDefaultMaxTotalDigits(facetedMethodParameter); + assertDefaultMinIntegerDigits(facetedMethodParameter); + assertDefaultMaxFractionalDigits(facetedMethodParameter); + assertMinFractionalDigits(facetedMethodParameter, 5); + }); } // -- DIGITS ANNOTATION @@ -186,10 +201,12 @@ class Order { @javax.validation.constraints.Digits(integer=14, fraction=4) public BigDecimal getCost() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getCost", _Constants.emptyClasses); - // then - assertDigitsFacets(facetedMethod, 18, 4); + propertyScenario(Order.class, "cost", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDigitsFacets(facetedMethod, 18, 4); + }); } public void testDigitsAnnotationPickedUpOnActionParameter() { @@ -199,10 +216,12 @@ public void updateCost( @javax.validation.constraints.Digits(integer=14, fraction=4) final BigDecimal cost) { } } - // when - processParams(newFacetFactory(), Order.class, "updateCost", new Class[] { BigDecimal.class }); - // then - assertDigitsFacets(facetedMethodParameter, 18, 4); + parameterScenario(Order.class, "updateCost", 0, (processParameterContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().processParams(processParameterContext); + // then + assertDigitsFacets(facetedMethodParameter, 18, 4); + }); } // -- CONSTRAINT MERGERS @@ -229,25 +248,34 @@ class Order { } - // when - processMethod(newFacetFactory(), Order.class, "maxTotalA", _Constants.emptyClasses); - // then - lowest bound wins - assertMaxTotalDigits(facetedMethod, 18); - // when - processMethod(newFacetFactory(), Order.class, "maxTotalB", _Constants.emptyClasses); - // then - lowest bound wins - assertMaxTotalDigits(facetedMethod, 17); - - // when - processMethod(newFacetFactory(), Order.class, "maxFracA", _Constants.emptyClasses); - // then - lowest bound wins - assertMaxFractionalDigits(facetedMethod, 4); - - // when - processMethod(newFacetFactory(), Order.class, "maxFracB", _Constants.emptyClasses); - // then - lowest bound wins - assertMaxFractionalDigits(facetedMethod, 4); + actionScenario(Order.class, "maxTotalA", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then - lowest bound wins + assertMaxTotalDigits(facetedMethod, 18); + }); + + actionScenario(Order.class, "maxTotalB", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then - lowest bound wins + assertMaxTotalDigits(facetedMethod, 17); + }); + + actionScenario(Order.class, "maxFracA", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then - lowest bound wins + assertMaxFractionalDigits(facetedMethod, 4); + }); + + actionScenario(Order.class, "maxFracB", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then - lowest bound wins + assertMaxFractionalDigits(facetedMethod, 4); + }); } // -- TEMPORAL FORMAT STYLE @@ -258,10 +286,12 @@ class Order { @ValueSemantics(dateRenderAdjustDays = ValueSemantics.AS_DAY_BEFORE) public LocalDateTime getDateTime() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getDateTime", _Constants.emptyClasses); - // then - assertDateRenderAdjustDays(facetedMethod, -1); + propertyScenario(Order.class, "dateTime", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDateRenderAdjustDays(facetedMethod, -1); + }); } public void testTimeZoneTranslationPickedUpOnProperty() { @@ -274,15 +304,18 @@ class Order { public LocalDateTime getDateTimeB() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getDateTimeA", _Constants.emptyClasses); - // then - assertTimeZoneTranslation(facetedMethod, TimeZoneTranslation.NONE); - - // when - processMethod(newFacetFactory(), Order.class, "getDateTimeB", _Constants.emptyClasses); - // then - assertTimeZoneTranslation(facetedMethod, TimeZoneTranslation.TO_LOCAL_TIMEZONE); + propertyScenario(Order.class, "dateTimeA", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertTimeZoneTranslation(facetedMethod, TimeZoneTranslation.NONE); + }); + propertyScenario(Order.class, "dateTimeB", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertTimeZoneTranslation(facetedMethod, TimeZoneTranslation.TO_LOCAL_TIMEZONE); + }); } public void testDateFormatStylePickedUpOnProperty() { @@ -292,9 +325,12 @@ class Order { public LocalDateTime getDateTime() { return null; } } // when - processMethod(newFacetFactory(), Order.class, "getDateTime", _Constants.emptyClasses); - // then - assertDateFormatStyle(facetedMethod, FormatStyle.FULL); + propertyScenario(Order.class, "dateTime", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertDateFormatStyle(facetedMethod, FormatStyle.FULL); + }); } public void testTimeFormatStylePickedUpOnProperty() { @@ -303,16 +339,18 @@ class Order { @ValueSemantics(timeFormatStyle = FormatStyle.FULL) public LocalDateTime getDateTime() { return null; } } - // when - processMethod(newFacetFactory(), Order.class, "getDateTime", _Constants.emptyClasses); - // then - assertTimeFormatStyle(facetedMethod, FormatStyle.FULL); + propertyScenario(Order.class, "dateTime", (processMethodContext, facetHolder, facetedMethod, facetedMethodParameter) -> { + // when + newFacetFactory().process(processMethodContext); + // then + assertTimeFormatStyle(facetedMethod, FormatStyle.FULL); + }); } // -- HELPER ValueSemanticsAnnotationFacetFactory newFacetFactory() { - return new ValueSemanticsAnnotationFacetFactory(metaModelContext); + return new ValueSemanticsAnnotationFacetFactory(getMetaModelContext()); } private void assertDefaultMaxTotalDigits(final FacetHolder facetedMethod) { diff --git a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomainWithPdfJsViewer_IntegTest.dump_facets.approved.xml b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomainWithPdfJsViewer_IntegTest.dump_facets.approved.xml index e7516cfb068..49217be8da1 100644 --- a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomainWithPdfJsViewer_IntegTest.dump_facets.approved.xml +++ b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomainWithPdfJsViewer_IntegTest.dump_facets.approved.xml @@ -108,16 +108,18 @@ - - + + + + - - + - + + @@ -208,16 +210,18 @@ - - + + + + - - + - + + @@ -461,16 +465,18 @@ - - + + + + - - + - + + @@ -617,16 +623,18 @@ - - + + + + - - + - + + @@ -720,16 +728,18 @@ - - + + + + - - + - + + @@ -823,16 +833,18 @@ - - + + + + - - + - + + @@ -1028,16 +1040,18 @@ - - + + + + - - + - + + diff --git a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomain_IntegTest.dump_facets.approved.xml b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomain_IntegTest.dump_facets.approved.xml index ee91db967cd..066719d6e6a 100644 --- a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomain_IntegTest.dump_facets.approved.xml +++ b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_MixinDomain_IntegTest.dump_facets.approved.xml @@ -108,16 +108,18 @@ - - + + + + - - + - + + @@ -201,16 +203,18 @@ - - + + + + - - + - + + @@ -454,16 +458,18 @@ - - + + + + - - + - + + @@ -610,16 +616,18 @@ - - + + + + - - + - + + @@ -713,16 +721,18 @@ - - + + + + - - + - + + @@ -816,16 +826,18 @@ - - + + + + - - + - + + @@ -1021,16 +1033,18 @@ - - + + + + - - + - + + diff --git a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomainWithPdfjsViewer_IntegTest.dump_facets.approved.xml b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomainWithPdfjsViewer_IntegTest.dump_facets.approved.xml index 448433c9546..e40b7175c04 100644 --- a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomainWithPdfjsViewer_IntegTest.dump_facets.approved.xml +++ b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomainWithPdfjsViewer_IntegTest.dump_facets.approved.xml @@ -166,12 +166,13 @@ - - + + + + - @@ -202,16 +203,18 @@ - - + + + + - - + - + + @@ -455,16 +458,18 @@ - - + + + + - - + - + + @@ -611,16 +616,18 @@ - - + + + + - - + - + + @@ -714,16 +721,18 @@ - - + + + + - - + - + + @@ -817,16 +826,18 @@ - - + + + + - - + - + + diff --git a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomain_IntegTest.dump_facets.approved.xml b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomain_IntegTest.dump_facets.approved.xml index f0de323ffdb..77556bcc190 100644 --- a/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomain_IntegTest.dump_facets.approved.xml +++ b/extensions/vw/pdfjs/metamodel/src/test/java/org/apache/causeway/extensions/pdfjs/metamodel/PdfjsViewer_PropDomain_IntegTest.dump_facets.approved.xml @@ -166,12 +166,13 @@ - - + + + + - @@ -195,16 +196,18 @@ - - + + + + - - + - + + @@ -448,16 +451,18 @@ - - + + + + - - + - + + @@ -604,16 +609,18 @@ - - + + + + - - + - + + @@ -707,16 +714,18 @@ - - + + + + - - + - + + @@ -810,16 +819,18 @@ - - + + + + - - + - + + diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml index cad3c8b1851..153fce3c6c6 100644 --- a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml +++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.verify.approved.xml @@ -95,16 +95,18 @@ - - + + + + - - + - + + @@ -189,16 +191,18 @@ - - + + + + - - + - + + @@ -386,16 +390,18 @@ - - + + + + - - + - + + @@ -520,16 +526,18 @@ - - + + + + - - + - + + @@ -618,16 +626,18 @@ - - + + + + - - + - + + @@ -716,16 +726,18 @@ - - + + + + - - + - + + @@ -910,16 +922,18 @@ - - + + + + - - + - + + @@ -1107,16 +1121,18 @@ - - + + + + - - + - + + @@ -1241,16 +1257,18 @@ - - + + + + - - + - + + @@ -1349,16 +1367,18 @@ - - + + + + - - + - + + @@ -1447,16 +1467,18 @@ - - + + + + - - + - + + @@ -1545,16 +1567,18 @@ - - + + + + - - + - + + @@ -1643,16 +1667,18 @@ - - + + + + - - + - + + @@ -1854,11 +1880,12 @@ - - + + + + - @@ -1899,16 +1926,18 @@ - - + + + + - - + - + + @@ -2096,16 +2125,18 @@ - - + + + + - - + - + + @@ -2230,16 +2261,18 @@ - - + + + + - - + - + + @@ -2328,16 +2361,18 @@ - - + + + + - - + - + + @@ -2426,16 +2461,18 @@ - - + + + + - - + - + + @@ -2524,16 +2561,18 @@ - - + + + + - - + - + + @@ -2724,16 +2763,18 @@ - - + + + + - - + - + + @@ -2936,11 +2977,12 @@ - - + + + + - @@ -2981,16 +3023,18 @@ - - + + + + - - + - + + @@ -3178,16 +3222,18 @@ - - + + + + - - + - + + @@ -3312,16 +3358,18 @@ - - + + + + - - + - + + @@ -3410,16 +3458,18 @@ - - + + + + - - + - + + @@ -3508,16 +3558,18 @@ - - + + + + - - + - + + @@ -3606,16 +3658,18 @@ - - + + + + - - + - + + @@ -3812,16 +3866,18 @@ - - + + + + - - + - + + @@ -4030,11 +4086,12 @@ - - + + + + - @@ -4087,16 +4144,18 @@ - - + + + + - - + - + + @@ -4198,16 +4257,18 @@ - - + + + + - - + - + + @@ -4395,16 +4456,18 @@ - - + + + + - - + - + + @@ -4529,16 +4592,18 @@ - - + + + + - - + - + + @@ -4627,16 +4692,18 @@ - - + + + + - - + - + + @@ -4725,16 +4792,18 @@ - - + + + + - - + - + + @@ -4926,11 +4995,12 @@ - - + + + + - @@ -4977,11 +5047,12 @@ - - + + + + - @@ -5028,11 +5099,12 @@ - - + + + + - @@ -5079,11 +5151,12 @@ - - + + + + - @@ -5130,11 +5203,12 @@ - - + + + + - @@ -5181,11 +5255,12 @@ - - + + + + - @@ -5232,11 +5307,12 @@ - - + + + + - @@ -5283,11 +5359,12 @@ - - + + + + - @@ -5334,11 +5411,12 @@ - - + + + + - @@ -5385,11 +5463,12 @@ - - + + + + - @@ -5430,16 +5509,18 @@ - - + + + + - - + - + + @@ -5534,16 +5615,18 @@ - - + + + + - - + - + + @@ -5731,16 +5814,18 @@ - - + + + + - - + - + + @@ -5865,16 +5950,18 @@ - - + + + + - - + - + + @@ -5963,16 +6050,18 @@ - - + + + + - - + - + + @@ -6061,16 +6150,18 @@ - - + + + + - - + - + + @@ -6319,19 +6410,21 @@ - - + + + + - - + - + + + - @@ -6339,12 +6432,13 @@ - - + + + + - @@ -6389,11 +6483,12 @@ - - + + + + - @@ -6438,16 +6533,18 @@ - - + + + + - - + - + + @@ -6635,16 +6732,18 @@ - - + + + + - - + - + + @@ -6769,16 +6868,18 @@ - - + + + + - - + - + + @@ -6867,16 +6968,18 @@ - - + + + + - - + - + + @@ -6965,16 +7068,18 @@ - - + + + + - - + - + + @@ -7063,16 +7168,18 @@ - - + + + + - - + - + + @@ -7266,19 +7373,21 @@ - - + + + + - - + - + + + - @@ -7286,12 +7395,13 @@ - - + + + + - @@ -7315,16 +7425,18 @@ - - + + + + - - + - + + @@ -7512,16 +7624,18 @@ - - + + + + - - + - + + @@ -7646,16 +7760,18 @@ - - + + + + - - + - + + @@ -7744,16 +7860,18 @@ - - + + + + - - + - + + @@ -7842,16 +7960,18 @@ - - + + + + - - + - + + @@ -8082,19 +8202,21 @@ - - + + + + - - + - + + + - @@ -8102,12 +8224,13 @@ - - + + + + - @@ -8131,16 +8254,18 @@ - - + + + + - - + - + + @@ -8328,16 +8453,18 @@ - - + + + + - - + - + + @@ -8462,16 +8589,18 @@ - - + + + + - - + - + + @@ -8560,16 +8689,18 @@ - - + + + + - - + - + + @@ -8658,16 +8789,18 @@ - - + + + + - - + - + + @@ -8916,19 +9049,21 @@ - - + + + + - - + - + + + - @@ -8936,12 +9071,13 @@ - - + + + + - @@ -9004,19 +9140,21 @@ - - + + + + - - + - + + + - @@ -9024,12 +9162,13 @@ - - + + + + - @@ -9074,11 +9213,12 @@ - - + + + + - @@ -9123,16 +9263,18 @@ - - + + + + - - + - + + @@ -9320,16 +9462,18 @@ - - + + + + - - + - + + @@ -9454,16 +9598,18 @@ - - + + + + - - + - + + @@ -9552,16 +9698,18 @@ - - + + + + - - + - + + @@ -9650,16 +9798,18 @@ - - + + + + - - + - + + @@ -9748,16 +9898,18 @@ - - + + + + - - + - + + @@ -9833,16 +9985,18 @@ - - + + + + - - + - + + @@ -10078,12 +10232,13 @@ - - + + + + - @@ -10146,19 +10301,21 @@ - - + + + + - - + - + + + - @@ -10166,12 +10323,13 @@ - - + + + + - @@ -10216,11 +10374,12 @@ - - + + + + - @@ -10265,16 +10424,18 @@ - - + + + + - - + - + + @@ -10462,16 +10623,18 @@ - - + + + + - - + - + + @@ -10596,16 +10759,18 @@ - - + + + + - - + - + + @@ -10694,16 +10859,18 @@ - - + + + + - - + - + + @@ -10792,16 +10959,18 @@ - - + + + + - - + - + + @@ -10890,16 +11059,18 @@ - - + + + + - - + - + + @@ -10975,16 +11146,18 @@ - - + + + + - - + - + + @@ -11060,16 +11233,18 @@ - - + + + + - - + - + + @@ -11271,16 +11446,18 @@ - - + + + + - - + - + + @@ -11338,16 +11515,18 @@ - - + + + + - - + - + + @@ -11535,16 +11714,18 @@ - - + + + + - - + - + + @@ -11669,16 +11850,18 @@ - - + + + + - - + - + + @@ -11767,16 +11950,18 @@ - - + + + + - - + - + + @@ -11865,16 +12050,18 @@ - - + + + + - - + - + + @@ -12064,16 +12251,18 @@ - - + + + + - - + - + + @@ -12131,16 +12320,18 @@ - - + + + + - - + - + + @@ -12328,16 +12519,18 @@ - - + + + + - - + - + + @@ -12462,16 +12655,18 @@ - - + + + + - - + - + + @@ -12560,16 +12755,18 @@ - - + + + + - - + - + + @@ -12658,16 +12855,18 @@ - - + + + + - - + - + + @@ -12857,16 +13056,18 @@ - - + + + + - - + - + + @@ -12924,16 +13125,18 @@ - - + + + + - - + - + + @@ -13121,16 +13324,18 @@ - - + + + + - - + - + + @@ -13255,16 +13460,18 @@ - - + + + + - - + - + + @@ -13353,16 +13560,18 @@ - - + + + + - - + - + + @@ -13451,16 +13660,18 @@ - - + + + + - - + - + + @@ -13720,19 +13931,21 @@ - - + + + + - - + - + + + - @@ -13740,12 +13953,13 @@ - - + + + + - @@ -13764,16 +13978,18 @@ - - + + + + - - + - + + @@ -13892,16 +14108,18 @@ - - + + + + - - + - + + @@ -14020,16 +14238,18 @@ - - + + + + - - + - + + @@ -14122,16 +14342,18 @@ - - + + + + - - + - + + @@ -14241,16 +14463,18 @@ - - + + + + - - + - + + @@ -14360,16 +14584,18 @@ - - + + + + - - + - + + @@ -14477,11 +14703,12 @@ - - + + + + - @@ -14540,16 +14767,18 @@ - - + + + + - - + - + + @@ -14768,16 +14997,18 @@ - - + + + + - - + - + + @@ -14985,16 +15216,18 @@ - - + + + + - - + - + + @@ -15216,16 +15449,18 @@ - - + + + + - - + - + + @@ -15447,16 +15682,18 @@ - - + + + + - - + - + + @@ -15542,16 +15779,18 @@ - - + + + + - - + - + + @@ -15756,16 +15995,18 @@ - - + + + + - - + - + + @@ -15953,16 +16194,18 @@ - - + + + + - - + - + + @@ -16087,16 +16330,18 @@ - - + + + + - - + - + + @@ -16154,16 +16399,18 @@ - - + + + + - - + - + + @@ -16252,16 +16499,18 @@ - - + + + + - - + - + + @@ -16346,16 +16595,18 @@ - - + + + + - - + - + + @@ -16575,16 +16826,18 @@ - - + + + + - - + - + + @@ -16673,16 +16926,18 @@ - - + + + + - - + - + + @@ -16935,19 +17190,21 @@ - - + + + + - - + - + + + - @@ -16955,12 +17212,13 @@ - - + + + + - @@ -17007,11 +17265,12 @@ - - + + + + - @@ -17066,16 +17325,18 @@ - - + + + + - - + - + + @@ -17263,16 +17524,18 @@ - - + + + + - - + - + + @@ -17397,16 +17660,18 @@ - - + + + + - - + - + + @@ -17495,16 +17760,18 @@ - - + + + + - - + - + + @@ -17589,16 +17856,18 @@ - - + + + + - - + - + + @@ -17817,16 +18086,18 @@ - - + + + + - - + - + + @@ -18079,19 +18350,21 @@ - - + + + + - - + - + + + - @@ -18099,12 +18372,13 @@ - - + + + + - @@ -18151,11 +18425,12 @@ - - + + + + - @@ -18210,16 +18485,18 @@ - - + + + + - - + - + + @@ -18407,16 +18684,18 @@ - - + + + + - - + - + + @@ -18541,16 +18820,18 @@ - - + + + + - - + - + + @@ -18639,16 +18920,18 @@ - - + + + + - - + - + + @@ -18737,16 +19020,18 @@ - - + + + + - - + - + + @@ -18965,16 +19250,18 @@ - - + + + + - - + - + + @@ -19227,19 +19514,21 @@ - - + + + + - - + - + + + - @@ -19247,12 +19536,13 @@ - - + + + + - @@ -19299,11 +19589,12 @@ - - + + + + - @@ -19358,16 +19649,18 @@ - - + + + + - - + - + + @@ -19555,16 +19848,18 @@ - - + + + + - - + - + + @@ -19689,16 +19984,18 @@ - - + + + + - - + - + + @@ -19787,16 +20084,18 @@ - - + + + + - - + - + + @@ -19885,16 +20184,18 @@ - - + + + + - - + - + + @@ -20113,16 +20414,18 @@ - - + + + + - - + - + + @@ -20302,16 +20605,18 @@ - - + + + + - - + - + + @@ -20621,16 +20926,18 @@ - - + + + + - - + - + + @@ -20929,16 +21236,18 @@ - - + + + + - - + - + + @@ -21251,16 +21560,18 @@ - - + + + + - - + - + + @@ -21573,16 +21884,18 @@ - - + + + + - - + - + + @@ -21759,16 +22072,18 @@ - - + + + + - - + - + + @@ -22067,16 +22382,18 @@ - - + + + + - - + - + + @@ -22278,16 +22595,18 @@ - - + + + + - - + - + + @@ -22489,16 +22808,18 @@ - - + + + + - - + - + + @@ -22672,16 +22993,18 @@ - - + + + + - - + - + + @@ -22892,16 +23215,18 @@ - - + + + + - - + - + + @@ -23112,16 +23437,18 @@ - - + + + + - - + - + + @@ -23306,16 +23633,18 @@ - - + + + + - - + - + + @@ -23575,16 +23904,18 @@ - - + + + + - - + - + + @@ -23772,16 +24103,18 @@ - - + + + + - - + - + + @@ -23906,16 +24239,18 @@ - - + + + + - - + - + + @@ -24004,16 +24339,18 @@ - - + + + + - - + - + + @@ -24102,16 +24439,18 @@ - - + + + + - - + - + + @@ -24296,16 +24635,18 @@ - - + + + + - - + - + + @@ -24493,16 +24834,18 @@ - - + + + + - - + - + + @@ -24627,16 +24970,18 @@ - - + + + + - - + - + + @@ -24694,16 +25039,18 @@ - - + + + + - - + - + + @@ -24792,16 +25139,18 @@ - - + + + + - - + - + + @@ -24890,16 +25239,18 @@ - - + + + + - - + - + + @@ -25106,19 +25457,21 @@ - - + + + + - - + - + + + - @@ -25126,12 +25479,13 @@ - - + + + + - @@ -25155,16 +25509,18 @@ - - + + + + - - + - + + @@ -25229,16 +25585,18 @@ - - + + + + - - + - + + @@ -25426,16 +25784,18 @@ - - + + + + - - + - + + @@ -25560,16 +25920,18 @@ - - + + + + - - + - + + @@ -25658,16 +26020,18 @@ - - + + + + - - + - + + @@ -25756,16 +26120,18 @@ - - + + + + - - + - + + @@ -25945,16 +26311,18 @@ - - + + + + - - + - + + @@ -26187,19 +26555,21 @@ - - + + + + - - + - + + + - @@ -26207,12 +26577,13 @@ - - + + + + - @@ -26243,11 +26614,12 @@ - - + + + + - @@ -26309,16 +26681,18 @@ - - + + + + - - + - + + @@ -26506,16 +26880,18 @@ - - + + + + - - + - + + @@ -26640,16 +27016,18 @@ - - + + + + - - + - + + @@ -26738,16 +27116,18 @@ - - + + + + - - + - + + @@ -26826,16 +27206,18 @@ - - + + + + - - + - + + @@ -26924,16 +27306,18 @@ - - + + + + - - + - + + @@ -27152,19 +27536,21 @@ - - + + + + - - + - + + + - @@ -27172,12 +27558,13 @@ - - + + + + - @@ -27208,11 +27595,12 @@ - - + + + + - @@ -27260,16 +27648,18 @@ - - + + + + - - + - + + @@ -27457,16 +27847,18 @@ - - + + + + - - + - + + @@ -27591,16 +27983,18 @@ - - + + + + - - + - + + @@ -27689,16 +28083,18 @@ - - + + + + - - + - + + @@ -27763,16 +28159,18 @@ - - + + + + - - + - + + @@ -27861,16 +28259,18 @@ - - + + + + - - + - + +