All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.novatec.testit.webtester.junit.runner.internal.TestClassPlausibilityChecker Maven / Gradle / Ivy

There is a newer version: 1.2.0
Show newest version
package info.novatec.testit.webtester.junit.runner.internal;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;

import info.novatec.testit.webtester.api.browser.Browser;
import info.novatec.testit.webtester.internal.ReflectionUtils;
import info.novatec.testit.webtester.junit.annotations.ConfigurationValue;
import info.novatec.testit.webtester.junit.annotations.Primary;
import info.novatec.testit.webtester.junit.exceptions.NoManagedBrowserException;
import info.novatec.testit.webtester.junit.exceptions.NoPrimaryBrowserException;
import info.novatec.testit.webtester.junit.exceptions.NoStaticPrimaryBrowserException;
import info.novatec.testit.webtester.junit.exceptions.NoUniquePrimaryBrowserException;
import info.novatec.testit.webtester.junit.exceptions.NotOfInjectableFieldTypeException;


public class TestClassPlausibilityChecker {

    private Set allFields;

    public TestClassPlausibilityChecker(Class testClass) {
        this.allFields = ReflectionUtils.getAllFieldsOfClassHierarchy(testClass);
    }

    public void assertPlausibilityOfTestClass() {

        assertThatNoMoreThenOnePrimaryBrowserIsDeclared();

        List configurationValueFields = getConfigurationValueFields();
        // TODO start page ticket - get all fields
        if (!configurationValueFields.isEmpty()) {
            Field primaryBrowserField = getRequiredPrimaryBrowserInstance();
            assertPlausibilityOfConfigurationValueFields(configurationValueFields, primaryBrowserField);
            // TODO start page ticket - assert plausibility
        }

    }

    private void assertThatNoMoreThenOnePrimaryBrowserIsDeclared() {
        List managedBrowserFields = getManagedBrowserFields();
        List primaryBrowserFields = getPrimaryBrowserFields(managedBrowserFields);
        if (primaryBrowserFields.size() > 1) {
            throw new NoUniquePrimaryBrowserException();
        }
    }

    private void assertPlausibilityOfConfigurationValueFields(List configurationValueFields,
        Field primaryBrowserField) {
        for (Field field : configurationValueFields) {
            assertInjectableTypeForConfigurationValueField(field);
            assertStaticPrimaryBrowserForStaticConfigurationValueField(field, primaryBrowserField);
        }
    }

    /* details */

    private Field getRequiredPrimaryBrowserInstance() {

        List managedBrowserFields = getManagedBrowserFields();
        if (managedBrowserFields.isEmpty()) {
            throw new NoManagedBrowserException();
        }

        Field primaryBrowserField;
        if (managedBrowserFields.size() == 1) {
            primaryBrowserField = managedBrowserFields.get(0);
        } else {
            List primaryBrowserFields = getPrimaryBrowserFields(managedBrowserFields);
            if (primaryBrowserFields.isEmpty()) {
                throw new NoPrimaryBrowserException();
            }
            if (primaryBrowserFields.size() == 1) {
                primaryBrowserField = primaryBrowserFields.get(0);
            } else {
                throw new NoUniquePrimaryBrowserException();
            }
        }

        return primaryBrowserField;

    }

    private List getManagedBrowserFields() {
        List managedBrowserFields = new LinkedList();
        for (Field field : allFields) {
            if (isBrowser(field) && isManaged(field)) {
                managedBrowserFields.add(field);
            }
        }
        return managedBrowserFields;
    }

    private boolean isBrowser(Field field) {
        return Browser.class.isAssignableFrom(field.getType());
    }

    private boolean isManaged(Field field) {
        return field.isAnnotationPresent(Resource.class);
    }

    private List getPrimaryBrowserFields(List managedBrowserFields) {
        List primaryBowserFields = new LinkedList();
        for (Field field : managedBrowserFields) {
            if (field.isAnnotationPresent(Primary.class)) {
                primaryBowserFields.add(field);
            }
        }
        return primaryBowserFields;
    }

    private List getConfigurationValueFields() {
        List configurationValueFields = new LinkedList();
        for (Field field : allFields) {
            if (field.isAnnotationPresent(ConfigurationValue.class)) {
                configurationValueFields.add(field);
            }
        }
        return configurationValueFields;
    }

    private void assertInjectableTypeForConfigurationValueField(Field field) {
        if (!ConfigurationValueInjector.canInjectValue(field)) {
            throw new NotOfInjectableFieldTypeException(field);
        }
    }

    private void assertStaticPrimaryBrowserForStaticConfigurationValueField(Field field, Field primaryBrowserField) {
        if (isStatic(field) && !isStatic(primaryBrowserField)) {
            throw new NoStaticPrimaryBrowserException(
                "the static configuration value field '" + field.getName() + "' needs a static primary browser!");
        }
    }

    private boolean isStatic(Field field) {
        return Modifier.isStatic(field.getModifiers());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy