001// Generated by delombok at Sun Jul 30 17:21:56 UTC 2023
002package de.cuioss.test.jsf.component;
003
004import java.util.List;
005import java.util.stream.Collectors;
006import javax.faces.component.UIComponent;
007import javax.faces.context.FacesContext;
008import org.apache.myfaces.test.el.MockValueExpression;
009import de.cuioss.test.jsf.config.decorator.BeanConfigDecorator;
010import de.cuioss.test.valueobjects.api.TestContract;
011import de.cuioss.test.valueobjects.objects.ParameterizedInstantiator;
012import de.cuioss.test.valueobjects.property.PropertySupport;
013import de.cuioss.tools.logging.CuiLogger;
014
015/**
016 * Tests all given properties according to the given List of
017 * {@link ComponentPropertyMetadata}
018 *
019 * @author Oliver Wolff
020 * @param <T> Rule does not apply to annotations: There is no inheritance
021 */
022public class ValueExpressionPropertyContract<T extends UIComponent> implements TestContract<T> {
023    private static final CuiLogger log = new CuiLogger(ValueExpressionPropertyContract.class);
024    private final ParameterizedInstantiator<T> instantiator;
025    private final List<ComponentPropertyMetadata> filteredMetadata;
026    private final FacesContext facesContext;
027
028    /**
029     * @param instantiator
030     * @param metadatas
031     * @param facesContext
032     */
033    public ValueExpressionPropertyContract(final ParameterizedInstantiator<T> instantiator, final List<ComponentPropertyMetadata> metadatas, final FacesContext facesContext) {
034        this.instantiator = instantiator;
035        filteredMetadata = metadatas.stream().filter(m -> !m.isIgnoreOnValueExpresssion()).collect(Collectors.toList());
036        this.facesContext = facesContext;
037    }
038
039    @Override
040    public void assertContract() {
041        List<String> names = filteredMetadata.stream().map(ComponentPropertyMetadata::getName).collect(Collectors.toList());
042        final var builder = new StringBuilder("Verifying ");
043        builder.append(getClass().getName()).append("\nWith properties: ").append(String.join(" ", names));
044        log.info(builder.toString());
045        checkGetterAndSetterContract();
046    }
047
048    private void checkGetterAndSetterContract() {
049        final List<PropertySupport> supportList = filteredMetadata.stream().map(PropertySupport::new).collect(Collectors.toList());
050        final UIComponent target = getInstantiator().newInstanceMinimal();
051        for (final PropertySupport support : supportList) {
052            var expression = new MockValueExpression(BeanConfigDecorator.checkManagedBeanKey(support.getName()), support.getPropertyMetadata().resolveActualClass());
053            target.setValueExpression(support.getName(), expression);
054            expression.setValue(facesContext.getELContext(), support.generateTestValue());
055            support.assertValueSet(target);
056        }
057    }
058
059    @java.lang.SuppressWarnings("all")
060    @lombok.Generated
061    public ParameterizedInstantiator<T> getInstantiator() {
062        return this.instantiator;
063    }
064}