package com.vaadin.tests.components.twincolselect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;
import com.vaadin.testbench.elements.TwinColSelectElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
public class TwinColSelectTest extends MultiBrowserTest {
@Before
public void setUp() throws Exception {
openTestURL();
}
@Test
public void initialLoad_containsCorrectItems() {
assertItems(20);
}
@Test
public void initialItems_reduceItemCount_containsCorrectItems() {
selectMenuPath("Component", "Data provider", "Items", "5");
assertItems(5);
}
@Test
public void initialItems_increaseItemCount_containsCorrectItems() {
selectMenuPath("Component", "Data provider", "Items", "100");
assertItems(100);
}
@Test
public void itemsMovedFromLeftToRight() {
selectMenuPath("Component", "Data provider", "Items", "5");
assertItems(5);
selectItems("Item 1", "Item 2", "Item 4");
assertSelected("Item 1", "Item 2", "Item 4");
assertOptionTexts("Item 0", "Item 3");
deselectItems("Item 1", "Item 4");
assertSelected("Item 2");
assertOptionTexts("Item 0", "Item 1", "Item 3", "Item 4");
selectItems("Item 0");
assertSelected("Item 0", "Item 2");
assertOptionTexts("Item 1", "Item 3", "Item 4");
}
@Test
public void clickToSelect() {
selectMenuPath("Component", "Listeners", "Selection listener");
selectItems("Item 4");
Assert.assertEquals("1. Selected: [Item 4]", getLogRow(0));
assertSelected("Item 4");
// the previous item stays selected
selectItems("Item 2");
// Selection order (most recently selected is last)
Assert.assertEquals("2. Selected: [Item 4, Item 2]", getLogRow(0));
assertSelected("Item 2", "Item 4");
deselectItems("Item 4");
Assert.assertEquals("3. Selected: [Item 2]", getLogRow(0));
assertSelected("Item 2");
selectItems("Item 10", "Item 0", "Item 9", "Item 4");
Assert.assertEquals(
"4. Selected: [Item 2, Item 0, Item 4, Item 10, Item 9]",
getLogRow(0));
assertSelected("Item 0", "Item 2", "Item 4", "Item 9", "Item 10");
deselectItems("Item 0", "Item 2", "Item 9");
Assert.assertEquals("5. Selected: [Item 4, Item 10]", getLogRow(0));
assertSelected("Item 4", "Item 10");
}
@Test
public void disabled_clickToSelect() {
selectMenuPath("Component", "State", "Enabled");
List<WebElement> selects = getTwinColSelect()
.findElements(By.tagName("select"));
Assert.assertEquals(2, selects.size());
Assert.assertTrue(selects.stream()
.allMatch(element -> element.getAttribute("disabled") != null));
List<WebElement> buttons = getTwinColSelect()
.findElements(By.className("v-button"));
Assert.assertEquals(2, buttons.size());
buttons.forEach(button -> Assert.assertEquals("v-button v-disabled",
button.getAttribute("className")));
selectMenuPath("Component", "Listeners", "Selection listener");
String lastLogRow = getLogRow(0);
selectItems("Item 4");
Assert.assertEquals(lastLogRow, getLogRow(0));
assertNothingSelected();
selectItems("Item 2");
// Selection order (most recently selected is last)
Assert.assertEquals(lastLogRow, getLogRow(0));
assertNothingSelected();
selectItems("Item 4");
Assert.assertEquals(lastLogRow, getLogRow(0));
assertNothingSelected();
}
@Test
public void clickToSelect_reenable() {
selectMenuPath("Component", "State", "Enabled");
selectMenuPath("Component", "Listeners", "Selection listener");
List<WebElement> selects = getTwinColSelect()
.findElements(By.tagName("select"));
Assert.assertEquals(2, selects.size());
Assert.assertTrue(selects.stream()
.allMatch(element -> element.getAttribute("disabled") != null));
List<WebElement> buttons = getTwinColSelect()
.findElements(By.className("v-button"));
Assert.assertEquals(2, buttons.size());
buttons.forEach(button -> Assert.assertEquals("v-button v-disabled",
button.getAttribute("className")));
selectItems("Item 4");
assertNothingSelected();
selectMenuPath("Component", "State", "Enabled");
assertElementNotPresent(By.className("v-disabled"));
selectItems("Item 5");
Assert.assertEquals("3. Selected: [Item 5]", getLogRow(0));
assertSelected("Item 5");
selectItems("Item 2");
Assert.assertEquals("4. Selected: [Item 5, Item 2]", getLogRow(0));
assertSelected("Item 2", "Item 5");
deselectItems("Item 5");
Assert.assertEquals("5. Selected: [Item 2]", getLogRow(0));
assertSelected("Item 2");
}
@Test
public void itemCaptionGenerator() {
selectMenuPath("Component", "Item Generator", "Item Caption Generator",
"Custom Caption Generator");
assertItems(20, " Caption");
}
@Test
public void nullItemCaptionGenerator() {
selectMenuPath("Component", "Item Generator", "Item Caption Generator",
"Null Caption Generator");
for (String text : getTwinColSelect().getOptions()) {
Assert.assertEquals("", text);
}
}
@Test
public void selectProgramatically() {
selectMenuPath("Component", "Listeners", "Selection listener");
selectMenuPath("Component", "Selection", "Toggle Item 5");
Assert.assertEquals("2. Selected: [Item 5]", getLogRow(0));
assertSelected("Item 5");
selectMenuPath("Component", "Selection", "Toggle Item 1");
// Selection order (most recently selected is last)
Assert.assertEquals("4. Selected: [Item 5, Item 1]", getLogRow(0));
// DOM order
assertSelected("Item 1", "Item 5");
selectMenuPath("Component", "Selection", "Toggle Item 5");
Assert.assertEquals("6. Selected: [Item 1]", getLogRow(0));
assertSelected("Item 1");
selectMenuPath("Component", "Selection",
"Toggle items 0, 1, 5, 10, 25");
// currently non-existing items are added to selection!
Assert.assertEquals(
"8. Selected: [Item 1, Item 0, Item 5, Item 10, Item 25]",
getLogRow(0));
assertSelected("Item 0", "Item 1", "Item 5", "Item 10");
}
private void assertSelected(String... expectedSelection) {
Assert.assertEquals(Arrays.asList(expectedSelection),
getTwinColSelect().getValues());
}
private void assertNothingSelected() {
Assert.assertEquals(0, getTwinColSelect().getValues().size());
}
@Override
protected Class<?> getUIClass() {
return TwinColSelectTestUI.class;
}
protected TwinColSelectElement getTwinColSelect() {
return $(TwinColSelectElement.class).first();
}
protected Select getOptionsElement() {
return new Select(getTwinColSelect().findElement(By.tagName("select")));
}
protected Select getSelectedOptionsElement() {
return new Select(
getTwinColSelect().findElements(By.tagName("select")).get(1));
}
protected WebElement getSelectButton() {
return getTwinColSelect().findElements(By.className("v-button")).get(0);
}
protected WebElement getDeselectButton() {
return getTwinColSelect().findElements(By.className("v-button")).get(1);
}
protected void selectItems(String... items) {
Select options = getOptionsElement();
options.deselectAll();
Stream.of(items).forEach(text -> options.selectByVisibleText(text));
getSelectButton().click();
}
protected void deselectItems(String... items) {
Select options = getSelectedOptionsElement();
options.deselectAll();
Stream.of(items).forEach(text -> options.selectByVisibleText(text));
getDeselectButton().click();
}
protected void assertItems(int count) {
assertItems(count, "");
}
protected void assertItems(int count, String suffix) {
int i = 0;
for (String text : getTwinColSelect().getOptions()) {
assertEquals("Item " + i + suffix, text);
i++;
}
assertEquals("Number of items", count, i);
}
protected void assertItemSuffices(int count) {
int i = 0;
for (String text : getTwinColSelect().getOptions()) {
assertTrue(text.endsWith("Item " + i));
i++;
}
assertEquals("Number of items", count, i);
}
protected void assertOptionTexts(String... items) {
List<String> optionTexts = getOptionsElement().getOptions().stream()
.map(element -> element.getText()).collect(Collectors.toList());
Assert.assertArrayEquals(items, optionTexts.toArray());
}
}