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

net.thucydides.core.annotations.ManagedWebDriverAnnotatedField Maven / Gradle / Ivy

package net.thucydides.core.annotations;

import ch.lambdaj.function.convert.Converter;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import net.thucydides.core.webdriver.WebDriverFacade;
import org.openqa.selenium.WebDriver;

import java.lang.reflect.Field;
import java.util.List;
import java.util.NoSuchElementException;

import static ch.lambdaj.Lambda.convert;

/**
 * The WebDriver driver is stored as an annotated field in the test classes.
 * 
 * @author johnsmart
 * 
 */
public class ManagedWebDriverAnnotatedField {

    private static final String NO_ANNOTATED_FIELD_ERROR 
                                    = "No WebDriver field annotated with @Managed was found in the test case.";

    private final Field field;

    /**
     * Find the first field in the class annotated with the Managed annotation.
     */
    public static Optional findOptionalAnnotatedField(final Class testClass) {

        try {
            Field annotatedField = Iterables.find(fieldsIn(testClass), withCorrectAnnotations());
            return Optional.of(new ManagedWebDriverAnnotatedField(annotatedField));
        } catch(NoSuchElementException e) {
            return Optional.absent();
        }
    }
    /**
     * Find the first field in the class annotated with the Managed annotation.
     */
    public static ManagedWebDriverAnnotatedField findFirstAnnotatedField(final Class testClass) {

        Optional optionalField = findOptionalAnnotatedField(testClass);
        if (optionalField.isPresent()) {
            return optionalField.get();
        } else {
            throw new InvalidManagedWebDriverFieldException(NO_ANNOTATED_FIELD_ERROR);
        }
    }

    public static List findAnnotatedFields(final Class testClass) {
        List managedFields = ImmutableList.copyOf(Iterables.filter(fieldsIn(testClass), withCorrectAnnotations()));
        return convert(managedFields, toManagedAnnotatedFields());
    }

    private static Converter toManagedAnnotatedFields() {
        return new Converter() {

            @Override
            public ManagedWebDriverAnnotatedField convert(Field field) {
                return new ManagedWebDriverAnnotatedField(field);
            }
        };
    }

    public static boolean hasManagedWebdriverField(final Class testClass) {

        try {
            Iterables.find(fieldsIn(testClass), withCorrectAnnotations());
            return true;
        } catch(NoSuchElementException e) {
            return false;
        }
    }

    private static Predicate withCorrectAnnotations() {
        return new Predicate() {
            public boolean apply(Field field) {
                return isFieldAnnotated(field);
            }
        };
    }

    private static boolean isFieldAnnotated(final Field field) {
        return (fieldIsAnnotatedCorrectly(field) && fieldIsRightType(field));
    }

    private static boolean fieldIsRightType(final Field field) {
        return (WebDriverFacade.class.isAssignableFrom(field.getType()) || 
        		field.getType().isAssignableFrom(WebDriver.class));
    }

    private static boolean fieldIsAnnotatedCorrectly(final Field field) {
        return (field.getAnnotation(Managed.class) != null);
    }

    protected ManagedWebDriverAnnotatedField(final Field field) {
        this.field = field;
    }

    public void setValue(final Object testCase, final WebDriver manageDriver) {
        try {
            field.setAccessible(true);
            field.set(testCase, manageDriver);
        } catch (IllegalAccessException e) {
            throw new InvalidManagedWebDriverFieldException("Could not access or set web driver field: " 
                         + field 
                         + " - is this field public?", e);
        }
    }

    private static ImmutableSet fieldsIn(Class clazz) {
        return ImmutableSet.copyOf(Fields.of(clazz).allFields());
    }

    public boolean isUniqueSession() {
        return field.getAnnotation(Managed.class).uniqueSession();
    }

    public ClearCookiesPolicy getClearCookiesPolicy() {
        return field.getAnnotation(Managed.class).clearCookies();
    }

    public String getDriver() {
        return field.getAnnotation(Managed.class).driver();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy