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.

TabSheetTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package com.vaadin.tests.server.component.tabsheet;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNotNull;
  5. import static org.junit.Assert.assertNull;
  6. import static org.junit.Assert.assertSame;
  7. import static org.junit.Assert.assertTrue;
  8. import java.util.Iterator;
  9. import java.util.concurrent.atomic.AtomicBoolean;
  10. import java.util.concurrent.atomic.AtomicReference;
  11. import org.junit.Test;
  12. import com.vaadin.shared.ui.tabsheet.TabsheetServerRpc;
  13. import com.vaadin.shared.ui.tabsheet.TabsheetState;
  14. import com.vaadin.ui.Button;
  15. import com.vaadin.ui.Component;
  16. import com.vaadin.ui.ComponentTest;
  17. import com.vaadin.ui.Label;
  18. import com.vaadin.ui.TabSheet;
  19. import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
  20. import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
  21. import com.vaadin.ui.TabSheet.Tab;
  22. public class TabSheetTest {
  23. @Test
  24. public void addExistingComponent() {
  25. Component c = new Label("abc");
  26. TabSheet tabSheet = new TabSheet();
  27. tabSheet.addComponent(c);
  28. tabSheet.addComponent(c);
  29. Iterator<Component> iter = tabSheet.getComponentIterator();
  30. assertEquals(c, iter.next());
  31. assertFalse(iter.hasNext());
  32. assertNotNull(tabSheet.getTab(c));
  33. }
  34. @Test
  35. public void getComponentFromTab() {
  36. Component c = new Label("abc");
  37. TabSheet tabSheet = new TabSheet();
  38. Tab tab = tabSheet.addTab(c);
  39. assertEquals(c, tab.getComponent());
  40. }
  41. @Test
  42. public void addTabWithComponentOnly() {
  43. TabSheet tabSheet = new TabSheet();
  44. Tab tab1 = tabSheet.addTab(new Label("aaa"));
  45. Tab tab2 = tabSheet.addTab(new Label("bbb"));
  46. Tab tab3 = tabSheet.addTab(new Label("ccc"));
  47. // Check right order of tabs
  48. assertEquals(0, tabSheet.getTabPosition(tab1));
  49. assertEquals(1, tabSheet.getTabPosition(tab2));
  50. assertEquals(2, tabSheet.getTabPosition(tab3));
  51. // Calling addTab with existing component does not move tab
  52. tabSheet.addTab(tab1.getComponent());
  53. // Check right order of tabs
  54. assertEquals(0, tabSheet.getTabPosition(tab1));
  55. assertEquals(1, tabSheet.getTabPosition(tab2));
  56. assertEquals(2, tabSheet.getTabPosition(tab3));
  57. }
  58. @Test
  59. public void addTabWithComponentAndIndex() {
  60. TabSheet tabSheet = new TabSheet();
  61. Tab tab1 = tabSheet.addTab(new Label("aaa"));
  62. Tab tab2 = tabSheet.addTab(new Label("bbb"));
  63. Tab tab3 = tabSheet.addTab(new Label("ccc"));
  64. Tab tab4 = tabSheet.addTab(new Label("ddd"), 1);
  65. Tab tab5 = tabSheet.addTab(new Label("eee"), 3);
  66. assertEquals(0, tabSheet.getTabPosition(tab1));
  67. assertEquals(1, tabSheet.getTabPosition(tab4));
  68. assertEquals(2, tabSheet.getTabPosition(tab2));
  69. assertEquals(3, tabSheet.getTabPosition(tab5));
  70. assertEquals(4, tabSheet.getTabPosition(tab3));
  71. // Calling addTab with existing component does not move tab
  72. tabSheet.addTab(tab1.getComponent(), 3);
  73. assertEquals(0, tabSheet.getTabPosition(tab1));
  74. assertEquals(1, tabSheet.getTabPosition(tab4));
  75. assertEquals(2, tabSheet.getTabPosition(tab2));
  76. assertEquals(3, tabSheet.getTabPosition(tab5));
  77. assertEquals(4, tabSheet.getTabPosition(tab3));
  78. }
  79. @Test
  80. public void addTabWithAllParameters() {
  81. TabSheet tabSheet = new TabSheet();
  82. Tab tab1 = tabSheet.addTab(new Label("aaa"));
  83. Tab tab2 = tabSheet.addTab(new Label("bbb"));
  84. Tab tab3 = tabSheet.addTab(new Label("ccc"));
  85. Tab tab4 = tabSheet.addTab(new Label("ddd"), "ddd", null, 1);
  86. Tab tab5 = tabSheet.addTab(new Label("eee"), "eee", null, 3);
  87. assertEquals(0, tabSheet.getTabPosition(tab1));
  88. assertEquals(1, tabSheet.getTabPosition(tab4));
  89. assertEquals(2, tabSheet.getTabPosition(tab2));
  90. assertEquals(3, tabSheet.getTabPosition(tab5));
  91. assertEquals(4, tabSheet.getTabPosition(tab3));
  92. // Calling addTab with existing component does not move tab
  93. tabSheet.addTab(tab1.getComponent(), "xxx", null, 3);
  94. assertEquals(0, tabSheet.getTabPosition(tab1));
  95. assertEquals(1, tabSheet.getTabPosition(tab4));
  96. assertEquals(2, tabSheet.getTabPosition(tab2));
  97. assertEquals(3, tabSheet.getTabPosition(tab5));
  98. assertEquals(4, tabSheet.getTabPosition(tab3));
  99. }
  100. @Test
  101. public void getTabByPosition() {
  102. TabSheet tabSheet = new TabSheet();
  103. Tab tab1 = tabSheet.addTab(new Label("aaa"));
  104. Tab tab2 = tabSheet.addTab(new Label("bbb"));
  105. Tab tab3 = tabSheet.addTab(new Label("ccc"));
  106. assertEquals(tab1, tabSheet.getTab(0));
  107. assertEquals(tab2, tabSheet.getTab(1));
  108. assertEquals(tab3, tabSheet.getTab(2));
  109. assertEquals(null, tabSheet.getTab(3));
  110. }
  111. @Test
  112. public void selectTab() {
  113. TabSheet tabSheet = new TabSheet();
  114. Tab tab1 = tabSheet.addTab(new Label("aaa"));
  115. Tab tab2 = tabSheet.addTab(new Label("bbb"));
  116. Tab tab3 = tabSheet.addTab(new Label("ccc"));
  117. Label componentNotInSheet = new Label("ddd");
  118. Tab tabNotInSheet = new TabSheet().addTab(new Label("eee"));
  119. assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
  120. // Select tab by component...
  121. tabSheet.setSelectedTab(tab2.getComponent());
  122. assertEquals(tab2.getComponent(), tabSheet.getSelectedTab());
  123. // by tab instance
  124. tabSheet.setSelectedTab(tab3);
  125. assertEquals(tab3.getComponent(), tabSheet.getSelectedTab());
  126. // by index
  127. tabSheet.setSelectedTab(0);
  128. assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
  129. // Should be no-op...
  130. tabSheet.setSelectedTab(componentNotInSheet);
  131. assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
  132. // this as well
  133. tabSheet.setSelectedTab(tabNotInSheet);
  134. assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
  135. // and this
  136. tabSheet.setSelectedTab(123);
  137. assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
  138. }
  139. @Test
  140. public void replaceComponent() {
  141. TabSheet tabSheet = new TabSheet();
  142. Label lbl1 = new Label("aaa");
  143. Label lbl2 = new Label("bbb");
  144. Label lbl3 = new Label("ccc");
  145. Label lbl4 = new Label("ddd");
  146. Tab tab1 = tabSheet.addTab(lbl1);
  147. tab1.setCaption("tab1");
  148. tab1.setClosable(true);
  149. Tab tab2 = tabSheet.addTab(lbl2);
  150. tab2.setDescription("description");
  151. tab2.setEnabled(false);
  152. // Replace component not in tabsheet with one already in tabsheet -
  153. // should be no-op
  154. tabSheet.replaceComponent(lbl3, lbl2);
  155. assertEquals(2, tabSheet.getComponentCount());
  156. assertSame(tab1, tabSheet.getTab(lbl1));
  157. assertSame(tab2, tabSheet.getTab(lbl2));
  158. assertNull(tabSheet.getTab(lbl3));
  159. // Replace component not in tabsheet with one not in tabsheet either
  160. // should add lbl4 as last tab
  161. tabSheet.replaceComponent(lbl3, lbl4);
  162. assertEquals(3, tabSheet.getComponentCount());
  163. assertSame(tab1, tabSheet.getTab(lbl1));
  164. assertSame(tab2, tabSheet.getTab(lbl2));
  165. assertEquals(2, tabSheet.getTabPosition(tabSheet.getTab(lbl4)));
  166. // Replace component in tabsheet with another
  167. // should swap places, tab association should stay the same but tabs
  168. // should swap metadata
  169. tabSheet.replaceComponent(lbl1, lbl2);
  170. assertSame(tab1, tabSheet.getTab(lbl1));
  171. assertSame(tab2, tabSheet.getTab(lbl2));
  172. assertFalse(tab1.isClosable());
  173. assertTrue(tab2.isClosable());
  174. assertFalse(tab1.isEnabled());
  175. assertTrue(tab2.isEnabled());
  176. assertEquals("description", tab1.getDescription());
  177. assertEquals(null, tab2.getDescription());
  178. assertEquals(3, tabSheet.getComponentCount());
  179. assertEquals(1, tabSheet.getTabPosition(tabSheet.getTab(lbl1)));
  180. assertEquals(0, tabSheet.getTabPosition(tabSheet.getTab(lbl2)));
  181. // Replace component in tabsheet with one not in tabsheet
  182. // should create a new tab instance for the new component, old tab
  183. // instance should become unattached
  184. // tab metadata should be copied from old to new
  185. tabSheet.replaceComponent(lbl1, lbl3);
  186. assertEquals(3, tabSheet.getComponentCount());
  187. assertNull(tabSheet.getTab(lbl1));
  188. assertNull(tab1.getComponent());
  189. assertNotNull(tabSheet.getTab(lbl3));
  190. assertFalse(tabSheet.getTab(lbl3).isEnabled());
  191. assertEquals("description", tab1.getDescription());
  192. assertEquals(1, tabSheet.getTabPosition(tabSheet.getTab(lbl3)));
  193. }
  194. @Test
  195. public void testSelectedTabChangeEvent_whenComponentReplaced() {
  196. // given
  197. final class SelectedTabExpectedComponentListener
  198. implements SelectedTabChangeListener {
  199. private Component actualComponent;
  200. @Override
  201. public void selectedTabChange(SelectedTabChangeEvent event) {
  202. actualComponent = event.getTabSheet().getSelectedTab();
  203. }
  204. public void assertActualComponentIs(Component expectedComponent) {
  205. assertEquals(expectedComponent, actualComponent);
  206. actualComponent = null;
  207. }
  208. }
  209. TabSheet tabSheet = new TabSheet();
  210. final Label lbl1 = new Label("aaa");
  211. final Label lbl2 = new Label("bbb");
  212. final Label lbl3 = new Label("ccc");
  213. final Label lbl4 = new Label("ddd");
  214. tabSheet.addComponent(lbl1);
  215. tabSheet.addComponent(lbl2);
  216. tabSheet.addComponent(lbl3);
  217. tabSheet.setSelectedTab(lbl2);
  218. SelectedTabExpectedComponentListener listener = new SelectedTabExpectedComponentListener();
  219. tabSheet.addSelectedTabChangeListener(listener);
  220. // when selected tab is replaced with new Component
  221. tabSheet.replaceComponent(lbl2, lbl4);
  222. // then
  223. listener.assertActualComponentIs(lbl4);
  224. assertEquals(lbl4, tabSheet.getSelectedTab());
  225. // when not selected tab is replaced with new Component
  226. tabSheet.replaceComponent(lbl1, lbl2);
  227. // then
  228. assertEquals(lbl4, tabSheet.getSelectedTab());
  229. // when not selected tab is replaced with existing Component
  230. tabSheet.replaceComponent(lbl2, lbl3);
  231. // then
  232. assertEquals(lbl4, tabSheet.getSelectedTab());
  233. // when selected tab is replaced with existing Component (locations are
  234. // just swapped)
  235. tabSheet.replaceComponent(lbl4, lbl3);
  236. // then
  237. listener.assertActualComponentIs(lbl3);
  238. assertEquals(lbl3, tabSheet.getSelectedTab());
  239. }
  240. public static class TestTabsheet extends TabSheet {
  241. public TestTabsheet(Component... components) {
  242. super(components);
  243. }
  244. public String getKey(Component c) {
  245. return keyMapper.key(c);
  246. }
  247. @Override
  248. public TabsheetState getState() {
  249. return super.getState();
  250. }
  251. }
  252. @Test
  253. public void userOriginatedForSelectionEvent() {
  254. AtomicBoolean userOriginated = new AtomicBoolean(false);
  255. AtomicReference<Component> selected = new AtomicReference<>();
  256. Button b1 = new Button("b1");
  257. Button b2 = new Button("b2");
  258. Button b3 = new Button("b3");
  259. Button b4 = new Button("b4");
  260. TestTabsheet tabsheet = new TestTabsheet(b1, b2, b3, b4);
  261. tabsheet.addSelectedTabChangeListener(event -> {
  262. userOriginated.set(event.isUserOriginated());
  263. selected.set(event.getTabSheet().getSelectedTab());
  264. });
  265. tabsheet.setSelectedTab(b2);
  266. assertFalse(userOriginated.get());
  267. assertEquals(b2, selected.get());
  268. TabsheetServerRpc rpc = ComponentTest.getRpcProxy(tabsheet,
  269. TabsheetServerRpc.class);
  270. rpc.setSelected(tabsheet.getKey(b1));
  271. assertTrue(userOriginated.get());
  272. assertEquals(b1, selected.get());
  273. tabsheet.setSelectedTab(tabsheet.getTab(b4));
  274. assertFalse(userOriginated.get());
  275. assertEquals(b4, selected.get());
  276. }
  277. }