You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TreeGridDetailsManagerTest.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package com.vaadin.tests.components.treegrid;
  2. import static org.hamcrest.Matchers.greaterThanOrEqualTo;
  3. import static org.hamcrest.number.IsCloseTo.closeTo;
  4. import static org.junit.Assert.assertEquals;
  5. import static org.junit.Assert.assertNotNull;
  6. import static org.junit.Assert.assertThat;
  7. import java.util.List;
  8. import org.junit.Test;
  9. import org.openqa.selenium.StaleElementReferenceException;
  10. import org.openqa.selenium.WebDriver;
  11. import org.openqa.selenium.WebElement;
  12. import org.openqa.selenium.support.ui.ExpectedCondition;
  13. import org.openqa.selenium.support.ui.ExpectedConditions;
  14. import com.vaadin.testbench.By;
  15. import com.vaadin.testbench.elements.ButtonElement;
  16. import com.vaadin.testbench.elements.TreeGridElement;
  17. import com.vaadin.tests.tb3.MultiBrowserTest;
  18. public class TreeGridDetailsManagerTest extends MultiBrowserTest {
  19. private static final String CLASSNAME_ERROR = "v-Notification-error";
  20. private static final String CLASSNAME_LABEL = "v-label";
  21. private static final String CLASSNAME_LEAF = "v-treegrid-row-depth-1";
  22. private static final String CLASSNAME_SPACER = "v-treegrid-spacer";
  23. private static final String CLASSNAME_TREEGRID = "v-treegrid";
  24. private static final String EXPAND_ALL = "expandAll";
  25. private static final String COLLAPSE_ALL = "collapseAll";
  26. private static final String SHOW_DETAILS = "showDetails";
  27. private static final String HIDE_DETAILS = "hideDetails";
  28. private static final String ADD_GRID = "addGrid";
  29. private TreeGridElement treeGrid;
  30. private int expectedSpacerHeight = 0;
  31. private int expectedRowHeight = 0;
  32. private ExpectedCondition<Boolean> expectedConditionDetails(final int root,
  33. final int leaf) {
  34. return new ExpectedCondition<Boolean>() {
  35. @Override
  36. public Boolean apply(WebDriver arg0) {
  37. return getSpacer(root, leaf) != null;
  38. }
  39. @Override
  40. public String toString() {
  41. // waiting for...
  42. return String.format(
  43. "Leaf %s/%s details row contents to be found", root,
  44. leaf);
  45. }
  46. };
  47. }
  48. private WebElement getSpacer(final int root, final Integer leaf) {
  49. String text;
  50. if (leaf == null) {
  51. text = "details for Root %s";
  52. } else {
  53. text = "details for Leaf %s/%s";
  54. }
  55. try {
  56. List<WebElement> spacers = treeGrid
  57. .findElements(By.className(CLASSNAME_SPACER));
  58. for (WebElement spacer : spacers) {
  59. List<WebElement> labels = spacer
  60. .findElements(By.className(CLASSNAME_LABEL));
  61. for (WebElement label : labels) {
  62. if (String.format(text, root, leaf)
  63. .equals(label.getText())) {
  64. return spacer;
  65. }
  66. }
  67. }
  68. } catch (StaleElementReferenceException e) {
  69. treeGrid = $(TreeGridElement.class).first();
  70. }
  71. return null;
  72. }
  73. private void ensureExpectedSpacerHeightSet() {
  74. if (expectedSpacerHeight == 0) {
  75. expectedSpacerHeight = treeGrid
  76. .findElement(By.className(CLASSNAME_SPACER)).getSize()
  77. .getHeight();
  78. assertThat((double) expectedSpacerHeight, closeTo(27d, 2d));
  79. }
  80. }
  81. private void assertSpacerCount(int expectedSpacerCount) {
  82. assertEquals("Unexpected amount of spacers.", expectedSpacerCount,
  83. treeGrid.findElements(By.className(CLASSNAME_SPACER)).size());
  84. }
  85. /**
  86. * Asserts that every spacer has the same height.
  87. */
  88. private void assertSpacerHeights() {
  89. List<WebElement> spacers = treeGrid
  90. .findElements(By.className(CLASSNAME_SPACER));
  91. for (WebElement spacer : spacers) {
  92. assertEquals("Unexpected spacer height.", expectedSpacerHeight,
  93. spacer.getSize().getHeight());
  94. }
  95. }
  96. /**
  97. * Asserts that every spacer is at least a row height from the previous one.
  98. * Doesn't check that the spacers are in correct order or rendered properly.
  99. */
  100. private void assertSpacerPositions() {
  101. List<WebElement> spacers = treeGrid
  102. .findElements(By.className(CLASSNAME_SPACER));
  103. WebElement previousSpacer = null;
  104. for (WebElement spacer : spacers) {
  105. if (previousSpacer == null) {
  106. previousSpacer = spacer;
  107. continue;
  108. }
  109. assertThat("Unexpected spacer position.", spacer.getLocation().y,
  110. greaterThanOrEqualTo(previousSpacer.getLocation().y
  111. + expectedSpacerHeight + expectedRowHeight - 1));
  112. previousSpacer = spacer;
  113. }
  114. }
  115. private void assertNoErrors() {
  116. assertEquals("Error notification detected.", 0,
  117. treeGrid.findElements(By.className(CLASSNAME_ERROR)).size());
  118. }
  119. @Test
  120. public void expandAllOpenAllInitialDetails_toggleOne_hideAll() {
  121. openTestURL();
  122. $(ButtonElement.class).id(EXPAND_ALL).click();
  123. $(ButtonElement.class).id(SHOW_DETAILS).click();
  124. $(ButtonElement.class).id(ADD_GRID).click();
  125. waitForElementPresent(By.className(CLASSNAME_TREEGRID));
  126. treeGrid = $(TreeGridElement.class).first();
  127. int spacerCount = 6;
  128. waitUntil(expectedConditionDetails(0, 0));
  129. assertSpacerCount(spacerCount);
  130. ensureExpectedSpacerHeightSet();
  131. assertSpacerPositions();
  132. // toggle one root
  133. treeGrid.collapseWithClick(0);
  134. waitUntil(ExpectedConditions.not(expectedConditionDetails(0, 0)));
  135. assertSpacerCount(spacerCount - 2);
  136. assertSpacerHeights();
  137. assertSpacerPositions();
  138. treeGrid.expandWithClick(0);
  139. waitUntil(expectedConditionDetails(0, 0));
  140. assertSpacerCount(spacerCount);
  141. assertSpacerHeights();
  142. assertSpacerPositions();
  143. // test that repeating the toggle still doesn't change anything
  144. treeGrid.collapseWithClick(0);
  145. waitUntil(ExpectedConditions.not(expectedConditionDetails(0, 0)));
  146. assertSpacerCount(spacerCount - 2);
  147. assertSpacerHeights();
  148. assertSpacerPositions();
  149. treeGrid.expandWithClick(0);
  150. waitUntil(expectedConditionDetails(0, 0));
  151. assertSpacerCount(spacerCount);
  152. assertSpacerHeights();
  153. assertSpacerPositions();
  154. // test that hiding all still won't break things
  155. $(ButtonElement.class).id(HIDE_DETAILS).click();
  156. waitForElementNotPresent(By.className(CLASSNAME_SPACER));
  157. assertNoErrors();
  158. }
  159. @Test
  160. public void expandAllOpenAllInitialDetails_toggleAll() {
  161. openTestURL();
  162. $(ButtonElement.class).id(EXPAND_ALL).click();
  163. $(ButtonElement.class).id(SHOW_DETAILS).click();
  164. $(ButtonElement.class).id(ADD_GRID).click();
  165. waitForElementPresent(By.className(CLASSNAME_TREEGRID));
  166. treeGrid = $(TreeGridElement.class).first();
  167. int spacerCount = 6;
  168. waitUntil(expectedConditionDetails(0, 0));
  169. assertSpacerCount(spacerCount);
  170. ensureExpectedSpacerHeightSet();
  171. assertSpacerPositions();
  172. $(ButtonElement.class).id(COLLAPSE_ALL).click();
  173. waitForElementNotPresent(By.className(CLASSNAME_LEAF));
  174. assertSpacerCount(2);
  175. assertSpacerHeights();
  176. assertSpacerPositions();
  177. $(ButtonElement.class).id(EXPAND_ALL).click();
  178. waitUntil(expectedConditionDetails(0, 0));
  179. assertSpacerCount(spacerCount);
  180. assertSpacerHeights();
  181. assertSpacerPositions();
  182. // test that repeating the toggle still doesn't change anything
  183. $(ButtonElement.class).id(COLLAPSE_ALL).click();
  184. waitForElementNotPresent(By.className(CLASSNAME_LEAF));
  185. assertSpacerCount(2);
  186. assertSpacerHeights();
  187. assertSpacerPositions();
  188. $(ButtonElement.class).id(EXPAND_ALL).click();
  189. waitUntil(expectedConditionDetails(0, 0));
  190. assertSpacerCount(spacerCount);
  191. assertSpacerHeights();
  192. assertSpacerPositions();
  193. assertNoErrors();
  194. }
  195. @Test
  196. public void expandAllOpenNoInitialDetails_showAlmostAll_toggleOneByOne() {
  197. openTestURL();
  198. $(ButtonElement.class).id(EXPAND_ALL).click();
  199. $(ButtonElement.class).id(ADD_GRID).click();
  200. waitForElementPresent(By.className(CLASSNAME_TREEGRID));
  201. treeGrid = $(TreeGridElement.class).first();
  202. // expand almost all rows, leave one out from the hierarchy that is to
  203. // be collapsed
  204. treeGrid.getCell(0, 0).click();
  205. treeGrid.getCell(1, 0).click();
  206. treeGrid.getCell(3, 0).click();
  207. treeGrid.getCell(4, 0).click();
  208. treeGrid.getCell(5, 0).click();
  209. int spacerCount = 5;
  210. waitUntil(expectedConditionDetails(0, 0));
  211. assertSpacerCount(spacerCount);
  212. ensureExpectedSpacerHeightSet();
  213. assertSpacerPositions();
  214. treeGrid.collapseWithClick(0);
  215. waitUntil(ExpectedConditions.not(expectedConditionDetails(0, 0)));
  216. assertSpacerCount(spacerCount - 1);
  217. assertSpacerHeights();
  218. assertSpacerPositions();
  219. treeGrid.expandWithClick(0);
  220. waitUntil(expectedConditionDetails(0, 0));
  221. assertSpacerCount(spacerCount);
  222. assertSpacerHeights();
  223. assertSpacerPositions();
  224. assertNotNull(getSpacer(1, 0));
  225. treeGrid.collapseWithClick(3);
  226. waitUntil(ExpectedConditions.not(expectedConditionDetails(1, 0)));
  227. assertSpacerCount(spacerCount - 2);
  228. assertSpacerHeights();
  229. assertSpacerPositions();
  230. treeGrid.expandWithClick(3);
  231. waitUntil(expectedConditionDetails(1, 0));
  232. assertSpacerCount(spacerCount);
  233. assertSpacerHeights();
  234. assertSpacerPositions();
  235. assertNoErrors();
  236. }
  237. }