org.richfaces.tests.metamer.ftest.richSelect.TestSelect.java Source code

Java tutorial

Introduction

Here is the source code for org.richfaces.tests.metamer.ftest.richSelect.TestSelect.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2010-2016, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.richfaces.tests.metamer.ftest.richSelect;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import javax.faces.event.PhaseId;

import org.jboss.arquillian.graphene.Graphene;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.richfaces.fragment.common.Event;
import org.richfaces.fragment.common.ScrollingType;
import org.richfaces.fragment.common.Utils;
import org.richfaces.fragment.select.RichFacesSelect;
import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest;
import org.richfaces.tests.metamer.ftest.BasicAttributes;
import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes;
import org.richfaces.tests.metamer.ftest.extension.configurator.templates.annotation.Templates;
import org.richfaces.tests.metamer.ftest.webdriver.Attributes;
import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

/**
 * Test case for page faces/components/richSelect/simple.xhtml.
 *
 * @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
 * @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
 */
public class TestSelect extends AbstractWebDriverTest {

    private static final String TESTSIZE = "300px";

    private final Attributes<SelectAttributes> selectAttributes = getAttributes();

    @FindBy(css = "div[id$=selectItem10]")
    private WebElement item10;
    @FindBy(css = "div.rf-sel-lst-scrl")
    private WebElement listElement;
    @FindBy(css = "div.rf-sel-lst-cord")
    private WebElement listRoot;
    @FindBy(css = "span[id$=output]")
    private WebElement output;
    @FindBy(css = "div[id$=select]")
    private RichFacesSelect select;

    private final Action selectHawaiiGuardedAction = new Action() {
        @Override
        public void perform() {
            Graphene.guardAjax(select.openSelect()).select(10);
        }
    };
    private final Action selectHawaiiWithKeyboardGuardedAction = new Action() {
        @Override
        public void perform() {
            select.advanced().setScrollingType(ScrollingType.BY_KEYS);
            Graphene.guardAjax(select.openSelect()).select(10);
        }
    };

    @BeforeMethod
    public void closeSelectPopupIfVisible() {
        if (select.advanced().isPopupPresent()) {
            // focus somewhere else
            blur(WaitRequestType.NONE);
            // wait for popup to close
            select.advanced().waitUntilSuggestionsAreNotVisible().perform();
        }
    }

    @Override
    public String getComponentTestPagePath() {
        return "richSelect/simple.xhtml";
    }

    @Test(groups = "smoke")
    @CoversAttributes("clientFilterFunction")
    public void testClientFilterFunction() {
        selectAttributes.set(SelectAttributes.clientFilterFunction, "filterValuesByLength");
        select.type("4");// get all states with 4 letters
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 3);
        assertEquals(suggestions.get(0).getText(), "Iowa");
        assertEquals(suggestions.get(1).getText(), "Ohio");
        assertEquals(suggestions.get(2).getText(), "Utah");

        select.type("5");// get all states with 5 letters
        suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 3);
        assertEquals(suggestions.get(0).getText(), "Idaho");
        assertEquals(suggestions.get(1).getText(), "Maine");
        assertEquals(suggestions.get(2).getText(), "Texas");
    }

    @Test
    @CoversAttributes("defaultLabel")
    @Templates("plain")
    public void testDefaultLabel() {
        selectAttributes.set(SelectAttributes.defaultLabel, "new label");
        assertEquals(select.advanced().getInput().getStringValue(), "new label", "Default label should change");

        selectAttributes.set(SelectAttributes.defaultLabel, "");
        assertPresent(select.advanced().getInput().advanced().getInputElement(),
                "Input should be present on the page.");
        select.advanced().waitUntilSuggestionsAreNotVisible().perform();
        assertEquals(select.advanced().getInput().getStringValue(), "", "Default label should change");
    }

    @Test
    @CoversAttributes("disabled")
    public void testDisabled() {
        selectAttributes.set(SelectAttributes.disabled, Boolean.TRUE);
        assertPresent(select.advanced().getInput().advanced().getInputElement(),
                "Input should be present on the page.");
        select.advanced().waitUntilSuggestionsAreNotVisible().perform();
        try {
            select.openSelect();
        } catch (TimeoutException ex) {
            return;
        }
        Assert.fail("Select should be disabled.");
    }

    @Test(groups = "smoke")
    @CoversAttributes("enableManualInput")
    @IssueTracking(value = { "https://issues.jboss.org/browse/RF-9663", "https://issues.jboss.org/browse/RF-9855" })
    public void testEnableManualInput() {
        selectAttributes.set(SelectAttributes.enableManualInput, Boolean.FALSE);
        String readonly = select.advanced().getInput().advanced().getInputElement().getAttribute("readonly");
        assertTrue("readonly".equals(readonly) || "true".equals(readonly), "Input should be read-only");

        select.advanced().setOpenByInputClick(true);
        select.openSelect();
        select.advanced().waitUntilSuggestionsAreVisible().perform();
        selectHawaiiGuardedAction.perform();
        assertTrue(item10.getAttribute("class").contains("rf-sel-sel"));
        assertEquals(output.getText(), "Hawaii");
    }

    @Test
    @CoversAttributes("enableManualInput")
    @Templates(value = "plain")
    public void testEnableManualInputListContent() {
        selectAttributes.set(SelectAttributes.enableManualInput, Boolean.TRUE);
        //These list will be test add more records, if you wanted tests another selection
        List<SelectSettings> valuesToSelect = new ArrayList<TestSelect.SelectSettings>();
        valuesToSelect.add(new SelectSettings(3, 3, 4, "a", "Arkansas"));
        valuesToSelect.add(new SelectSettings(1, 5, 3, "c", "Colorado"));
        valuesToSelect.add(new SelectSettings(0, 9, 1, "g", "Georgia"));
        Graphene.guardAjax(select.openSelect());
        //count number of row which are suggested in the beginning
        int numberOfSuggestionInTheBegining = select.advanced().getSuggestionsElements().size();
        for (SelectSettings value : valuesToSelect) {
            //Filter list
            select.type(value.getFirstChar());
            //Count number of suggestion after first char
            List<WebElement> suggestions = select.advanced().getSuggestionsElements();
            assertEquals(suggestions.size(), value.numberOfSuggestionAfterFirstChar,
                    "Count of filtered options ('" + value.getFirstChar() + "')");
            //Choose value
            Graphene.guardAjax(select.openSelect()).select(value.getPossitionInFilteredList());
            assertEquals(output.getText(), value.getName());
            Graphene.guardAjax(select.openSelect());
            //Count number of suggested element after select
            int numberOfSuggestionAfterSelect = select.advanced().getSuggestionsElements().size();
            //it should match with number of elements before suggestion
            assertEquals(numberOfSuggestionAfterSelect, numberOfSuggestionInTheBegining);
            //Verify if selected elements in properly tagged by css class
            assertTrue(suggestions.get(value.getPosstionInFullList()).getAttribute("class").contains("rf-sel-sel"),
                    "The " + value.getPosstionInFullList() + " item should contain class for selected");
        }
    }

    @Test(groups = "smoke")
    @IssueTracking("https://issues.jboss.org/browse/RF-11320")
    public void testFiltering() {
        select.type("a");
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 4, "Count of filtered options ('a')");
        String[] selectOptions = { "Alabama", "Alaska", "Arizona", "Arkansas" };
        for (int i = 0; i < selectOptions.length; i++) {
            assertEquals(suggestions.get(i).getText(), selectOptions[i]);
        }
        Graphene.guardAjax(select.openSelect()).select(3);
        assertEquals(output.getText(), "Arkansas");
        getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, "value changed: null -> Arkansas");
    }

    @Test
    @CoversAttributes("immediate")
    public void testImmediate() {
        selectAttributes.set(SelectAttributes.immediate, Boolean.TRUE);
        selectHawaiiGuardedAction.perform();
        getMetamerPage().assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES,
                PhaseId.PROCESS_VALIDATIONS, PhaseId.UPDATE_MODEL_VALUES, PhaseId.INVOKE_APPLICATION,
                PhaseId.RENDER_RESPONSE);
        getMetamerPage().assertListener(PhaseId.APPLY_REQUEST_VALUES, "value changed: -> Hawaii");
    }

    @Test
    @Templates(value = "plain")
    public void testInit() {
        assertEquals(select.advanced().getInput().getStringValue(), "Click here to edit", "Default label");
        assertPresent(select.advanced().getInput().advanced().getInputElement(),
                "Input should be present on the page.");
        assertPresent(select.advanced().getShowButtonElement(), "Show button should be present on the page.");
        select.advanced().waitUntilSuggestionsAreNotVisible().perform();
    }

    @Test
    @CoversAttributes("itemClass")
    @Templates(value = "plain")
    public void testItemClass() {
        final String value = "metamer-ftest-class";
        selectAttributes.set(SelectAttributes.itemClass, value);
        select.openSelect();
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 50);
        for (WebElement webElement : suggestions) {
            assertTrue(webElement.getAttribute("class").contains(value));
        }
    }

    @Test
    @CoversAttributes("listClass")
    @IssueTracking("https://issues.jboss.org/browse/RF-9735")
    @Templates(value = "plain")
    public void testListClass() {
        testStyleClass(listRoot, BasicAttributes.listClass);
    }

    @Test
    @CoversAttributes("listHeight")
    @IssueTracking("https://issues.jboss.org/browse/RF-9737")
    @Templates(value = "plain")
    public void testListHeight() {
        selectAttributes.set(SelectAttributes.listHeight, TESTSIZE);
        select.openSelect();
        assertEquals(listElement.getCssValue("height"), TESTSIZE, "Height of list did not change");

        selectAttributes.set(SelectAttributes.listHeight, "");
        select.openSelect();
        assertEquals(listElement.getCssValue("height"), "100px", "Height of list did not change");
    }

    @Test
    @CoversAttributes("listWidth")
    @IssueTracking("https://issues.jboss.org/browse/RF-9737")
    @Templates(value = "plain")
    public void testListWidth() {
        int tolerance = 20;
        int testedValue = 300;
        int defaultValue = 200;

        selectAttributes.set(SelectAttributes.listWidth, TESTSIZE);
        select.openSelect();
        assertEquals(Integer.valueOf(listElement.getCssValue("width").replace("px", "")), testedValue, tolerance);

        selectAttributes.set(SelectAttributes.listWidth, "");
        select.openSelect();
        assertEquals(Integer.valueOf(listElement.getCssValue("width").replace("px", "")), defaultValue, tolerance);
    }

    @Test
    @CoversAttributes("maxListHeight")
    @Templates(value = "plain")
    public void testMaxListHeight() {
        selectAttributes.set(SelectAttributes.maxListHeight, TESTSIZE);
        select.openSelect();
        assertEquals(listElement.getCssValue("max-height"), TESTSIZE, "Height of list did not change");

        selectAttributes.set(SelectAttributes.maxListHeight, "");
        select.openSelect();
        assertEquals(listElement.getCssValue("max-height"), "100px", "Height of list did not change");
    }

    @Test
    @CoversAttributes("minListHeight")
    @Templates(value = "plain")
    public void testMinListHeight() {
        selectAttributes.set(SelectAttributes.minListHeight, TESTSIZE);
        select.openSelect();
        assertEquals(listElement.getCssValue("min-height"), TESTSIZE, "Height of list did not change");

        selectAttributes.set(SelectAttributes.minListHeight, "");
        select.openSelect();
        assertEquals(listElement.getCssValue("min-height"), "20px", "Height of list did not change");
    }

    @Test
    @CoversAttributes("onblur")
    public void testOnblur() {
        testFireEvent("blur", new Action() {
            @Override
            public void perform() {
                Graphene.guardAjax(select.openSelect()).select(0);
            }
        });
    }

    @Test
    @CoversAttributes("onchange")
    public void testOnchange() {
        testFireEvent("change", selectHawaiiGuardedAction);
    }

    @Test
    @CoversAttributes("onclick")
    @Templates(value = "plain")
    public void testOnclick() {
        testFireEvent(Event.CLICK, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("ondblclick")
    @Templates(value = "plain")
    public void testOndblclick() {
        testFireEvent(Event.DBLCLICK, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onfocus")
    @Templates(value = "plain")
    public void testOnfocus() {
        testFireEvent(selectAttributes, SelectAttributes.onfocus,
                new Actions(driver).click(select.advanced().getInput().advanced().getInputElement()).build());
    }

    @Test
    @CoversAttributes("onkeydown")
    @Templates(value = "plain")
    public void testOnkeydown() {
        testFireEvent(Event.KEYDOWN, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onkeypress")
    @Templates(value = "plain")
    public void testOnkeypress() {
        testFireEvent(Event.KEYPRESS, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onkeyup")
    @Templates(value = "plain")
    public void testOnkeyup() {
        testFireEvent(Event.KEYUP, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onlistclick")
    @Templates(value = "plain")
    public void testOnlistclick() {
        testFireEvent("listclick", selectHawaiiGuardedAction);
    }

    @Test
    @CoversAttributes("onlistdblclick")
    @Templates(value = "plain")
    public void testOnlistdblclick() {
        testFireEvent("listdblclick", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                Utils.triggerJQ(executor, "dblclick", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlisthide")
    public void testOnlisthide() {
        testFireEvent("listhide", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                getMetamerPage().getRequestTimeElement().click();
                select.advanced().waitUntilSuggestionsAreNotVisible().perform();
            }
        });
    }

    @Test
    @CoversAttributes("onlistkeydown")
    @Templates(value = "plain")
    public void testOnlistkeydown() {
        testFireEvent("listkeydown", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                Utils.triggerJQ(executor, "keydown", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistkeypress")
    @Templates(value = "plain")
    public void testOnlistkeypress() {
        testFireEvent("listkeypress", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                Utils.triggerJQ(executor, "keypress", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistkeyup")
    @Templates(value = "plain")
    public void testOnlistkeyup() {
        testFireEvent("listkeyup", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                Utils.triggerJQ(executor, "keyup", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistmousedown")
    @Templates(value = "plain")
    public void testOnlistmousedown() {
        testFireEvent("listmousedown", new Action() {
            @Override
            public void perform() {
                Utils.triggerJQ(executor, "mousedown", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistmousemove")
    @Templates(value = "plain")
    public void testOnlistmousemove() {
        testFireEvent("listmousemove", new Action() {
            @Override
            public void perform() {
                Utils.triggerJQ(executor, "mousemove", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistmouseout")
    @Templates(value = "plain")
    public void testOnlistmouseout() {
        testFireEvent("listmouseout", new Action() {
            @Override
            public void perform() {
                Utils.triggerJQ(executor, "mouseout", listElement);
            }
        });
    }

    @Test
    @CoversAttributes("onlistmouseover")
    @Templates(value = "plain")
    public void testOnlistmouseover() {
        testFireEvent("listmouseover", new Action() {
            @Override
            public void perform() {
                select.openSelect();
                new Actions(driver).moveToElement(listElement)
                        .moveToElement(getMetamerPage().getRequestTimeElement()).perform();
            }
        });
    }

    @Test
    @CoversAttributes("onlistmouseup")
    @Templates(value = "plain")
    public void testOnlistmouseup() {
        testFireEvent("listmouseup", selectHawaiiGuardedAction);
    }

    @Test
    @CoversAttributes("onlistshow")
    public void testOnlistshow() {
        testFireEvent("listshow", new Action() {
            @Override
            public void perform() {
                select.openSelect();
            }
        });
    }

    @Test
    @CoversAttributes("onmousedown")
    @Templates(value = "plain")
    public void testOnmousedown() {
        testFireEvent(Event.MOUSEDOWN, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onmousemove")
    @Templates(value = "plain")
    public void testOnmousemove() {
        testFireEvent(Event.MOUSEMOVE, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onmouseout")
    @Templates(value = "plain")
    public void testOnmouseout() {
        testFireEvent(Event.MOUSEOUT, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onmouseover")
    @Templates(value = "plain")
    public void testOnmouseover() {
        testFireEvent(Event.MOUSEOVER, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onmouseup")
    @Templates(value = "plain")
    public void testOnmouseup() {
        testFireEvent(Event.MOUSEUP, select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @CoversAttributes("onselectitem")
    public void testOnselectitem() {
        testFireEvent("selectitem", selectHawaiiGuardedAction);
    }

    @Test
    @CoversAttributes("rendered")
    @Templates(value = "plain")
    public void testRendered() {
        selectAttributes.set(SelectAttributes.rendered, Boolean.FALSE);
        assertNotPresent(select.advanced().getRootElement(),
                "Component should not be rendered when rendered=false.");
    }

    @Test
    @CoversAttributes("selectFirst")
    @IssueTracking("https://issues.jboss.org/browse/RF-11320")
    public void testSelectFirst() {
        selectAttributes.set(SelectAttributes.selectFirst, Boolean.TRUE);

        select.type("a");
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 4, "Count of filtered options ('a')");
        String[] selectOptions = { "Alabama", "Alaska", "Arizona", "Arkansas" };
        for (int i = 0; i < selectOptions.length; i++) {
            assertEquals(suggestions.get(i).getText(), selectOptions[i]);
        }
        assertTrue(suggestions.get(0).getAttribute("class").contains("rf-sel-sel"),
                "First item should contain class for selected item.");
        new Actions(driver).sendKeys(Keys.RETURN).perform();

        String previousTime = getMetamerPage().getRequestTimeElement().getText();
        Utils.triggerJQ(executor, "blur", select.advanced().getInput().advanced().getInputElement());
        Graphene.waitModel().until().element(getMetamerPage().getRequestTimeElement()).text().not()
                .equalTo(previousTime);
        assertEquals(output.getText(), "Alabama", "Output should be Alabama");
    }

    @Test
    @CoversAttributes("selectItemClass")
    @Templates(value = "plain")
    public void testSelectItemClass() {
        selectAttributes.set(SelectAttributes.selectItemClass, "metamer-ftest-class");

        Graphene.guardAjax(select.openSelect()).select(0);
        select.openSelect();
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        // to assert selectItemClass we need to mouse over the element
        new Actions(driver).moveToElement(suggestions.get(0)).build().perform();
        assertTrue(suggestions.get(0).getAttribute("class").contains("metamer-ftest-class"),
                "Selected item should contain set class");
        for (int i = 1; i < suggestions.size(); i++) {
            assertFalse(suggestions.get(i).getAttribute("class").contains("metamer-ftest-class"),
                    "Not selected item should not contain set class");
        }
    }

    @Test
    @IssueTracking("https://issues.jboss.org/browse/RF-14259")
    public void testSelectTypeDelete_errorStyleClassWillBeRemoved() {
        selectAttributes.set(SelectAttributes.enableManualInput, Boolean.TRUE);
        WebElement spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has not the error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // open select and select the first option
        Graphene.guardAjax(select.openSelect()).select(0);
        assertEquals(output.getText(), "Alabama", "Output should be Alabama");

        // type 'a'
        select.advanced().getInput().sendKeys("a");
        // the input has the error styleClass
        assertTrue(spanElement.getAttribute("class").contains("rf-sel-fld-err"));
        // no suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 0);

        // remove the last character
        select.advanced().getInput().sendKeys(Keys.BACK_SPACE);
        // the input has not the error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));
        // all suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 50);

        // select the second suggestion
        Graphene.guardAjax(select.openSelect()).select(1);
        assertEquals(output.getText(), "Alaska", "Output should be Alaska");
        // the input has not the error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));
    }

    @Test
    public void testSelectWithKeyboard() {
        selectHawaiiWithKeyboardGuardedAction.perform();
        assertTrue(item10.getAttribute("class").contains("rf-sel-sel"),
                "Selected item should contain class for selected option.");
        assertEquals(output.getText(), "Hawaii");
        getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, "value changed: null -> Hawaii");
    }

    @Test
    public void testSelectWithMouse() {
        Graphene.guardAjax(select.openSelect()).select(10);
        assertTrue(item10.getAttribute("class").contains("rf-sel-sel"),
                "Selected item should contain class for selected option.");
        assertEquals(output.getText(), "Hawaii");
        getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, "value changed: null -> Hawaii");
    }

    @Test
    @CoversAttributes("showButton")
    public void testShowButton() {
        selectAttributes.set(SelectAttributes.showButton, Boolean.FALSE);
        assertNotVisible(select.advanced().getShowButtonElement(), "Show button should not be visible.");

        selectAttributes.set(SelectAttributes.showButton, Boolean.TRUE);
        assertVisible(select.advanced().getShowButtonElement(), "Show button should be visible.");
    }

    @Test
    @CoversAttributes("showButton")
    public void testShowButtonClick() {
        selectAttributes.set(SelectAttributes.showButton, Boolean.TRUE);
        assertVisible(select.advanced().getShowButtonElement(), "Show button should be visible.");
        select.advanced().setOpenByInputClick(false);
        select.openSelect();
        List<WebElement> suggestions = select.advanced().getSuggestionsElements();
        assertEquals(suggestions.size(), 50, "There should be 50 options.");

        String[] selectOptions = { "Alabama", "Hawaii", "Massachusetts", "New Mexico", "South Dakota" };
        for (int i = 0; i < suggestions.size(); i += 10) {
            assertEquals(suggestions.get(i).getText(), selectOptions[i / 10], "Select option nr. " + i);
        }
        selectHawaiiGuardedAction.perform();
        assertEquals(output.getText(), "Hawaii");
    }

    @Test
    @CoversAttributes("style")
    @Templates(value = "plain")
    public void testStyle() {
        testStyle(select.advanced().getRootElement());
    }

    @Test
    @CoversAttributes("styleClass")
    @Templates(value = "plain")
    public void testStyleClass() {
        testStyleClass(select.advanced().getRootElement());
    }

    @Test
    @CoversAttributes("style")
    @IssueTracking("https://issues.jboss.org/browse/RF-10782")
    @Templates(value = "plain")
    public void testStyleWidth() {
        setAttribute("style", "width: 700px");
        assertEquals(select.advanced().getRootElement().getCssValue("width"), "700px");
    }

    @Test
    @CoversAttributes("tabindex")
    @Templates(value = "plain")
    public void testTabindex() {
        testHTMLAttribute(select.advanced().getInput().advanced().getInputElement(), selectAttributes,
                SelectAttributes.tabindex, "100");
    }

    @Test
    @CoversAttributes("title")
    @Templates(value = "plain")
    public void testTitle() {
        testTitle(select.advanced().getInput().advanced().getInputElement());
    }

    @Test
    @IssueTracking("https://issues.jboss.org/browse/RF-14254")
    public void testTypingUnknownWillNotShowSuggestions() {
        selectAttributes.set(SelectAttributes.enableManualInput, Boolean.TRUE);
        WebElement spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has not error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // type 'q' (unknown)
        select.type("q");
        // no suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 0);
        spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has error styleClass
        assertTrue(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // delete
        select.advanced().getInput().sendKeys(Keys.BACK_SPACE);
        // all suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 50);
        spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has not error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // type 'q' (unknown)
        select.type("q");
        // no suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 0);
        spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has error styleClass
        assertTrue(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // type 'a'
        select.type("a");
        // 4 suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 4);
        spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has not error styleClass
        assertFalse(spanElement.getAttribute("class").contains("rf-sel-fld-err"));

        // type 'aq' (unknown)
        select.type("aq");
        // no suggestions will be available
        assertEquals(select.advanced().getSuggestionsElements().size(), 0);
        spanElement = select.advanced().getRootElement().findElement(By.tagName("span"));
        // the input has not error styleClass
        assertTrue(spanElement.getAttribute("class").contains("rf-sel-fld-err"));
    }

    @Test
    @CoversAttributes("value")
    @Templates("plain")
    public void testValue() {
        selectAttributes.set(SelectAttributes.value, "North Carolina");
        assertEquals(select.advanced().getInput().getStringValue(), "North Carolina",
                "Input should contain selected value.");
    }

    @Test
    @CoversAttributes("valueChangeListener")
    public void testValueChangeListener() {
        selectHawaiiGuardedAction.perform();
        getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, "value changed: null -> Hawaii");
        getMetamerPage().assertPhases(PhaseId.ANY_PHASE);
    }

    class SelectSettings {

        private final int possitionInFilteredList;
        private final int posstionInFullList;
        private int numberOfSuggestionAfterFirstChar;
        private final String firstChar;
        private final String name;

        public SelectSettings(int possitionInFilteredList, int posstionInFullList,
                int numberOfSuggestionAfterFirstChar, String firstChar, String name) {
            this.possitionInFilteredList = possitionInFilteredList;
            this.posstionInFullList = posstionInFullList;
            this.numberOfSuggestionAfterFirstChar = numberOfSuggestionAfterFirstChar;
            this.firstChar = firstChar;
            this.name = name;
        }

        public int getPossitionInFilteredList() {
            return possitionInFilteredList;
        }

        public int getPosstionInFullList() {
            return posstionInFullList;
        }

        public int getNumberOfSuggestionAfterFirstChar() {
            return numberOfSuggestionAfterFirstChar;
        }

        public String getFirstChar() {
            return firstChar;
        }

        public String getName() {
            return name;
        }
    }
}