package com.vaadin.tests.components.textarea; import static com.vaadin.tests.components.textarea.TextAreaSizeResetted.TEXTAREAHEIGHT; import static com.vaadin.tests.components.textarea.TextAreaSizeResetted.TEXTAREAWIDTH; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.List; import org.junit.Test; import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.ExpectedCondition; import com.vaadin.testbench.elements.ButtonElement; import com.vaadin.testbench.elements.LabelElement; import com.vaadin.testbench.elements.TextAreaElement; import com.vaadin.testbench.elements.TextFieldElement; import com.vaadin.tests.tb3.MultiBrowserTest; public class TextAreaSizeResettedTest extends MultiBrowserTest { private final int OFFSET = 100; @Override public void setup() throws Exception { super.setup(); openTestURL(); } @Override public List<DesiredCapabilities> getBrowsersToTest() { return getBrowsersExcludingIE(); // IE8-11 don't support CSS resize. } @Test public void textAreaIsNotResizedOnBlur() { resizeAndAssertTextAreaTo(TEXTAREAHEIGHT, OFFSET); getTextArea().sendKeys("foo"); moveFocusOutsideTextArea(); // We can't use a waitUntil to check the text area size here, because it // won't release the focus from // the text area, so we need to do use something else. This workaround // uses a label which is updated to indicate // polling, which should trigger a resize. waitUntilPollingOccurs(); assertThat(getTextAreaHeight(), is(TEXTAREAHEIGHT + OFFSET)); assertThat(getTextAreaWidth(), is(TEXTAREAWIDTH + OFFSET)); waitUntilPollingOccurs(); } private void moveFocusOutsideTextArea() { $(TextFieldElement.class).first().focus(); } private void resizeAndAssertTextAreaTo(int size, int offset) { // Sanity check assertThat(getTextAreaHeight(), is(size)); resizeTextAreaBy(offset); assertThat(getTextAreaHeight(), is(size + offset)); } private void resizeTextAreaBy(int offset) { int resizeHandlerOffset = 10; new Actions(getDriver()) .moveToElement(getTextArea(), TEXTAREAWIDTH - resizeHandlerOffset, TEXTAREAHEIGHT - resizeHandlerOffset) .clickAndHold().moveByOffset(offset, offset).release().build() .perform(); } @Test public void textAreaWidthIsPresevedOnHeightResize() { resizeAndAssertTextAreaTo(TEXTAREAHEIGHT, OFFSET); changeHeightTo(TEXTAREAHEIGHT + OFFSET + OFFSET); assertThat(getTextAreaWidth(), is(TEXTAREAWIDTH + OFFSET)); assertThat(getTextAreaHeight(), is(TEXTAREAHEIGHT + OFFSET + OFFSET)); } private void changeHeightTo(int offset) { $(TextFieldElement.class).first().sendKeys(String.valueOf(offset)); $(ButtonElement.class).first().click(); } private void waitUntilPollingOccurs() { final String timestamp = getPollTimestamp(); waitUntil(new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver input) { return !timestamp.equals(getPollTimestamp()); } }); } private String getPollTimestamp() { return $(LabelElement.class).id("pollIndicator").getText(); } private int getTextAreaHeight() { return getTextAreaSize().getHeight(); } private int getTextAreaWidth() { return getTextAreaSize().getWidth(); } private Dimension getTextAreaSize() { return getTextArea().getSize(); } private TextAreaElement getTextArea() { return $(TextAreaElement.class).first(); } }