package com.vaadin.tests.server.component.tabsheet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.Iterator;
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.SelectedTabChangeEvent;
import com.vaadin.ui.TabSheet.SelectedTabChangeListener;
import com.vaadin.ui.TabSheet.Tab;
public class TabSheetTest {
@Test
public void addExistingComponent() {
Component c = new Label("abc");
TabSheet tabSheet = new TabSheet();
tabSheet.addComponent(c);
tabSheet.addComponent(c);
Iterator<Component> iter = tabSheet.getComponentIterator();
assertEquals(c, iter.next());
Assert.assertFalse(iter.hasNext());
assertNotNull(tabSheet.getTab(c));
}
@Test
public void getComponentFromTab() {
Component c = new Label("abc");
TabSheet tabSheet = new TabSheet();
Tab tab = tabSheet.addTab(c);
assertEquals(c, tab.getComponent());
}
@Test
public void addTabWithComponentOnly() {
TabSheet tabSheet = new TabSheet();
Tab tab1 = tabSheet.addTab(new Label("aaa"));
Tab tab2 = tabSheet.addTab(new Label("bbb"));
Tab tab3 = tabSheet.addTab(new Label("ccc"));
// Check right order of tabs
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab2));
assertEquals(2, tabSheet.getTabPosition(tab3));
// Calling addTab with existing component does not move tab
tabSheet.addTab(tab1.getComponent());
// Check right order of tabs
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab2));
assertEquals(2, tabSheet.getTabPosition(tab3));
}
@Test
public void addTabWithComponentAndIndex() {
TabSheet tabSheet = new TabSheet();
Tab tab1 = tabSheet.addTab(new Label("aaa"));
Tab tab2 = tabSheet.addTab(new Label("bbb"));
Tab tab3 = tabSheet.addTab(new Label("ccc"));
Tab tab4 = tabSheet.addTab(new Label("ddd"), 1);
Tab tab5 = tabSheet.addTab(new Label("eee"), 3);
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab4));
assertEquals(2, tabSheet.getTabPosition(tab2));
assertEquals(3, tabSheet.getTabPosition(tab5));
assertEquals(4, tabSheet.getTabPosition(tab3));
// Calling addTab with existing component does not move tab
tabSheet.addTab(tab1.getComponent(), 3);
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab4));
assertEquals(2, tabSheet.getTabPosition(tab2));
assertEquals(3, tabSheet.getTabPosition(tab5));
assertEquals(4, tabSheet.getTabPosition(tab3));
}
@Test
public void addTabWithAllParameters() {
TabSheet tabSheet = new TabSheet();
Tab tab1 = tabSheet.addTab(new Label("aaa"));
Tab tab2 = tabSheet.addTab(new Label("bbb"));
Tab tab3 = tabSheet.addTab(new Label("ccc"));
Tab tab4 = tabSheet.addTab(new Label("ddd"), "ddd", null, 1);
Tab tab5 = tabSheet.addTab(new Label("eee"), "eee", null, 3);
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab4));
assertEquals(2, tabSheet.getTabPosition(tab2));
assertEquals(3, tabSheet.getTabPosition(tab5));
assertEquals(4, tabSheet.getTabPosition(tab3));
// Calling addTab with existing component does not move tab
tabSheet.addTab(tab1.getComponent(), "xxx", null, 3);
assertEquals(0, tabSheet.getTabPosition(tab1));
assertEquals(1, tabSheet.getTabPosition(tab4));
assertEquals(2, tabSheet.getTabPosition(tab2));
assertEquals(3, tabSheet.getTabPosition(tab5));
assertEquals(4, tabSheet.getTabPosition(tab3));
}
@Test
public void getTabByPosition() {
TabSheet tabSheet = new TabSheet();
Tab tab1 = tabSheet.addTab(new Label("aaa"));
Tab tab2 = tabSheet.addTab(new Label("bbb"));
Tab tab3 = tabSheet.addTab(new Label("ccc"));
assertEquals(tab1, tabSheet.getTab(0));
assertEquals(tab2, tabSheet.getTab(1));
assertEquals(tab3, tabSheet.getTab(2));
assertEquals(null, tabSheet.getTab(3));
}
@Test
public void selectTab() {
TabSheet tabSheet = new TabSheet();
Tab tab1 = tabSheet.addTab(new Label("aaa"));
Tab tab2 = tabSheet.addTab(new Label("bbb"));
Tab tab3 = tabSheet.addTab(new Label("ccc"));
Label componentNotInSheet = new Label("ddd");
Tab tabNotInSheet = new TabSheet().addTab(new Label("eee"));
assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
// Select tab by component...
tabSheet.setSelectedTab(tab2.getComponent());
assertEquals(tab2.getComponent(), tabSheet.getSelectedTab());
// by tab instance
tabSheet.setSelectedTab(tab3);
assertEquals(tab3.getComponent(), tabSheet.getSelectedTab());
// by index
tabSheet.setSelectedTab(0);
assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
// Should be no-op...
tabSheet.setSelectedTab(componentNotInSheet);
assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
// this as well
tabSheet.setSelectedTab(tabNotInSheet);
assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
// and this
tabSheet.setSelectedTab(123);
assertEquals(tab1.getComponent(), tabSheet.getSelectedTab());
}
@Test
public void replaceComponent() {
TabSheet tabSheet = new TabSheet();
Label lbl1 = new Label("aaa");
Label lbl2 = new Label("bbb");
Label lbl3 = new Label("ccc");
Label lbl4 = new Label("ddd");
Tab tab1 = tabSheet.addTab(lbl1);
tab1.setCaption("tab1");
tab1.setClosable(true);
Tab tab2 = tabSheet.addTab(lbl2);
tab2.setDescription("description");
tab2.setEnabled(false);
// Replace component not in tabsheet with one already in tabsheet -
// should be no-op
tabSheet.replaceComponent(lbl3, lbl2);
assertEquals(2, tabSheet.getComponentCount());
assertSame(tab1, tabSheet.getTab(lbl1));
assertSame(tab2, tabSheet.getTab(lbl2));
assertNull(tabSheet.getTab(lbl3));
// Replace component not in tabsheet with one not in tabsheet either
// should add lbl4 as last tab
tabSheet.replaceComponent(lbl3, lbl4);
assertEquals(3, tabSheet.getComponentCount());
assertSame(tab1, tabSheet.getTab(lbl1));
assertSame(tab2, tabSheet.getTab(lbl2));
assertEquals(2, tabSheet.getTabPosition(tabSheet.getTab(lbl4)));
// Replace component in tabsheet with another
// should swap places, tab association should stay the same but tabs
// should swap metadata
tabSheet.replaceComponent(lbl1, lbl2);
assertSame(tab1, tabSheet.getTab(lbl1));
assertSame(tab2, tabSheet.getTab(lbl2));
Assert.assertFalse(tab1.isClosable());
Assert.assertTrue(tab2.isClosable());
Assert.assertFalse(tab1.isEnabled());
Assert.assertTrue(tab2.isEnabled());
assertEquals("description", tab1.getDescription());
assertEquals(null, tab2.getDescription());
assertEquals(3, tabSheet.getComponentCount());
assertEquals(1, tabSheet.getTabPosition(tabSheet.getTab(lbl1)));
assertEquals(0, tabSheet.getTabPosition(tabSheet.getTab(lbl2)));
// Replace component in tabsheet with one not in tabsheet
// should create a new tab instance for the new component, old tab
// instance should become unattached
// tab metadata should be copied from old to new
tabSheet.replaceComponent(lbl1, lbl3);
assertEquals(3, tabSheet.getComponentCount());
assertNull(tabSheet.getTab(lbl1));
assertNull(tab1.getComponent());
assertNotNull(tabSheet.getTab(lbl3));
Assert.assertFalse(tabSheet.getTab(lbl3).isEnabled());
assertEquals("description", tab1.getDescription());
assertEquals(1, tabSheet.getTabPosition(tabSheet.getTab(lbl3)));
}
@Test
public void testSelectedTabChangeEvent_whenComponentReplaced() {
// given
final class SelectedTabExpectedComponentListener
implements SelectedTabChangeListener {
private Component actualComponent;
@Override
public void selectedTabChange(SelectedTabChangeEvent event) {
actualComponent = event.getTabSheet().getSelectedTab();
}
public void assertActualComponentIs(Component expectedComponent) {
assertEquals(expectedComponent, actualComponent);
actualComponent = null;
}
}
TabSheet tabSheet = new TabSheet();
final Label lbl1 = new Label("aaa");
final Label lbl2 = new Label("bbb");
final Label lbl3 = new Label("ccc");
final Label lbl4 = new Label("ddd");
tabSheet.addComponent(lbl1);
tabSheet.addComponent(lbl2);
tabSheet.addComponent(lbl3);
tabSheet.setSelectedTab(lbl2);
SelectedTabExpectedComponentListener listener = new SelectedTabExpectedComponentListener();
tabSheet.addSelectedTabChangeListener(listener);
// when selected tab is replaced with new Component
tabSheet.replaceComponent(lbl2, lbl4);
// then
listener.assertActualComponentIs(lbl4);
assertEquals(lbl4, tabSheet.getSelectedTab());
// when not selected tab is replaced with new Component
tabSheet.replaceComponent(lbl1, lbl2);
// then
assertEquals(lbl4, tabSheet.getSelectedTab());
// when not selected tab is replaced with existing Component
tabSheet.replaceComponent(lbl2, lbl3);
// then
assertEquals(lbl4, tabSheet.getSelectedTab());
// when selected tab is replaced with existing Component (locations are
// just swapped)
tabSheet.replaceComponent(lbl4, lbl3);
// then
listener.assertActualComponentIs(lbl3);
assertEquals(lbl3, tabSheet.getSelectedTab());
}
}