diff options
author | Anna Koskinen <Ansku@users.noreply.github.com> | 2018-10-10 13:26:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-10 13:26:13 +0300 |
commit | 4e5cf07e6c8c94c12ef9d8b274c0c54b5e0fe423 (patch) | |
tree | 7d70edaf71bc254a9bacf88ba6ca8791c290183d /uitest/src | |
parent | 16764a20786326b891b4d2fc80512a61a7c53d3e (diff) | |
download | vaadin-framework-4e5cf07e6c8c94c12ef9d8b274c0c54b5e0fe423.tar.gz vaadin-framework-4e5cf07e6c8c94c12ef9d8b274c0c54b5e0fe423.zip |
Updates to scrolled TabSheet resize logic and Valo right-alignment. (#11133)
- When a TabSheet is scrolled to an end and then resized bigger, more
tabs should appear to the left.
- When a TabSheet is right-aligned in Valo and scrolled to the end, last
tab shouldn't be partially hidden behind the scroller buttons.
- Shouldn't allow attempts to scroll into directions where there is
nothing left to scroll to, even if the current tab isn't fully visible.
Fixes #807
Diffstat (limited to 'uitest/src')
2 files changed, 203 insertions, 0 deletions
diff --git a/uitest/src/main/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResize.java b/uitest/src/main/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResize.java new file mode 100644 index 0000000000..c84ba5e3ef --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResize.java @@ -0,0 +1,48 @@ +package com.vaadin.tests.components.tabsheet; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.TabSheet.Tab; + +/** + * Test class for resizing a scrolled TabSheet. + * + * @author Vaadin Ltd + */ +@Widgetset("com.vaadin.DefaultWidgetSet") +public class ScrolledTabSheetResize extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + TabSheet tabSheet = new TabSheet(); + tabSheet.setSizeFull(); + + for (int i = 0; i < 20; i++) { + String caption = "Tab " + i; + Label label = new Label(caption); + + Tab tab = tabSheet.addTab(label, caption); + tab.setClosable(true); + } + + addComponent(tabSheet); + addComponent(new Button("use reindeer", e -> { + setTheme("reindeer"); + })); + } + + @Override + protected String getTestDescription() { + return "When tabs are scrolled to the end and the TabSheet is made bigger, more tabs should become visible."; + } + + @Override + protected Integer getTicketNumber() { + return 807; + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResizeTest.java b/uitest/src/test/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResizeTest.java new file mode 100644 index 0000000000..f40c07823f --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/tabsheet/ScrolledTabSheetResizeTest.java @@ -0,0 +1,155 @@ +package com.vaadin.tests.components.tabsheet; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.TestBenchElement; +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.testbench.elements.TabSheetElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class ScrolledTabSheetResizeTest extends MultiBrowserTest { + + @Override + public void setup() throws Exception { + super.setup(); + openTestURL(); + } + + @Test + public void testReindeer() throws IOException, InterruptedException { + $(ButtonElement.class).first().click(); + StringBuilder exceptions = new StringBuilder(); + boolean failed = false; + // upper limit is determined by the amount of tabs, + // lower end by limits set by Selenium version + for (int i = 1400; i >= 650; i = i - 50) { + try { + testResize(i); + } catch (Exception e) { + if (failed) { + exceptions.append(" --- "); + } + failed = true; + exceptions.append(i + ": " + e.getMessage()); + } catch (AssertionError e) { + if (failed) { + exceptions.append(" --- "); + } + failed = true; + exceptions.append(i + ": " + e.getMessage()); + } + } + if (failed) { + fail("Combined error report: " + exceptions.toString()); + } + } + + @Test + public void testValo() throws IOException, InterruptedException { + StringBuilder exceptions = new StringBuilder(); + boolean failed = false; + // upper limit is determined by the amount of tabs (wider than for + // reindeer), lower end by limits set by Selenium version + for (int i = 1550; i >= 650; i = i - 50) { + try { + testResize(i); + } catch (Exception e) { + if (failed) { + exceptions.append(" --- "); + } + failed = true; + exceptions.append(i + ": " + e.getMessage()); + } catch (AssertionError e) { + if (failed) { + exceptions.append(" --- "); + } + failed = true; + exceptions.append(i + ": " + e.getMessage()); + } + } + if (failed) { + fail("Combined error report: " + exceptions.toString()); + } + } + + private void testResize(int start) + throws IOException, InterruptedException { + testBench().resizeViewPortTo(start, 600); + + int iterations = 0; + while (scrollRight() && iterations < 50) { + ++iterations; + } + + // FIXME: TabSheet definitely still has issues, + // but it's moving to a better direction. + + // Sometimes the test never realises that scrolling has + // reached the end, but this is not critical as long as + // the other criteria is fulfilled. + // If we decide otherwise, uncomment the following check: + // if (iterations >= 50) { + // fail("scrolling right never reaches the end"); + // } + + // This fails on some specific widths by ~15-20 pixels, likewise + // deemed as non-critical for now so commented out. + // assertNoExtraRoom(start); + + testBench().resizeViewPortTo(start + 150, 600); + + assertNoExtraRoom(start + 150); + } + + private void assertNoExtraRoom(int width) { + TabSheetElement ts = $(TabSheetElement.class).first(); + WebElement scroller = ts + .findElement(By.className("v-tabsheet-scroller")); + List<WebElement> tabs = ts + .findElements(By.className("v-tabsheet-tabitemcell")); + WebElement lastTab = tabs.get(tabs.size() - 1); + + assertEquals("Tab 19", + lastTab.findElement(By.className("v-captiontext")).getText()); + + int tabWidth = lastTab.getSize().width; + int tabRight = lastTab.getLocation().x + tabWidth; + int scrollerLeft = scroller.findElement(By.tagName("button")) + .getLocation().x; + + assertThat("Not scrolled to the end (width: " + width + ")", + scrollerLeft, greaterThan(tabRight)); + // technically this should probably be just greaterThan, + // but one pixel's difference is irrelevant for now + assertThat("Too big gap (width: " + width + ")", tabWidth, + greaterThanOrEqualTo(scrollerLeft - tabRight)); + } + + /* + * Scroll the tabsheet bar to the right. + */ + private boolean scrollRight() throws InterruptedException { + List<WebElement> scrollElements = getDriver() + .findElements(By.className("v-tabsheet-scrollerNext")); + if (!scrollElements.isEmpty()) { + TestBenchElement rightScrollElement = (TestBenchElement) scrollElements + .get(0); + rightScrollElement.click(5, 5); + return true; + } else { + return false; + } + } + +} |