/*
* Copyright 2000-2013 Vaadin Ltd.
*
* Licensed 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 com.vaadin.tests.components.ui;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedCondition;
import com.vaadin.testbench.By;
import com.vaadin.testbench.parallel.Browser;
import com.vaadin.tests.tb3.MultiBrowserTest;
/**
* Test class for issue #13477, where selecting a combobox item that is too long
* would render the ending of an item instead of the beginning, which was
* considered less than informative.
*
* @author Vaadin Ltd
*/
public class ComboboxSelectedItemTextTest extends MultiBrowserTest {
public final String SCREENSHOT_NAME_EDITABLE = "LongComboboxItemSelectedEditable";
public final String SCREENSHOT_NAME_NON_EDITABLE = "LongComboboxItemSelectedNonEditable";
public final int INDEX_EDITABLE_COMBOBOX = 1;
public final int INDEX_NON_EDITABLE_COMBOBOX = 2;
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
// Ignoring Chrome 40 because of a regression. See #16636.
return getBrowserCapabilities(Browser.IE11, Browser.FIREFOX,
Browser.PHANTOMJS);
}
@Test
public void testCombobox() throws IOException {
testCombobox(INDEX_EDITABLE_COMBOBOX, INDEX_NON_EDITABLE_COMBOBOX,
SCREENSHOT_NAME_EDITABLE);
}
@Test
public void testComboboxNonEditable() throws IOException {
testCombobox(INDEX_NON_EDITABLE_COMBOBOX, INDEX_EDITABLE_COMBOBOX,
SCREENSHOT_NAME_NON_EDITABLE);
}
private void testCombobox(int indexToTest, int indexToFocus,
String screenshotIdentifier) throws IOException {
openTestURL();
WebElement comboBox = vaadinElement(
"/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot["
+ indexToTest + "]/VComboBox[0]");
WebElement comboBoxFocus = vaadinElement(
"/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot["
+ indexToFocus + "]/VComboBox[0]");
// Select an element from the first (to test) combobox.
clickElement(
comboBox.findElement(By.className("v-filterselect-button")));
waitForPopup(comboBox);
WebElement comboBoxPopup = vaadinElement(
"/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot["
+ indexToTest + "]/VComboBox[0]#popup");
clickElement(comboBoxPopup.findElements(By.tagName("td")).get(2));
// Select an element from the second (to focus) combobox to remove
// focus from the first combobox
clickElement(comboBoxFocus
.findElement(By.className("v-filterselect-button")));
waitForPopup(comboBoxFocus);
comboBoxPopup = vaadinElement(
"/VVerticalLayout[0]/Slot[2]/VVerticalLayout[0]/Slot["
+ indexToFocus + "]/VComboBox[0]#popup");
clickElement(comboBoxPopup.findElements(By.tagName("td")).get(2));
// click the button of the first combobox. This would reveal the
// unwanted behaviour.
clickElement(
comboBox.findElement(By.className("v-filterselect-button")));
// sadly, screenshot comparison is the only reasonable way to test a
// rendering issue.
compareScreen(screenshotIdentifier);
}
private void waitForPopup(final WebElement comboBox) {
waitUntilNot(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver input) {
return comboBox.findElements(By.vaadin("#popup")).isEmpty();
}
}, 10);
}
}