package com.vaadin.tests.server.component.csslayout;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.junit.Test;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
public class AddComponentsTest {
private final Component[] children = new Component[] { new Label("A"),
new Label("B"), new Label("C"), new Label("D") };
@Test
public void moveComponentsBetweenLayouts() {
CssLayout layout1 = new CssLayout();
CssLayout layout2 = new CssLayout();
layout1.addComponent(children[0]);
layout1.addComponent(children[1]);
layout2.addComponent(children[2]);
layout2.addComponent(children[3]);
layout2.addComponent(children[1], 1);
assertOrder(layout1, new int[] { 0 });
assertOrder(layout2, new int[] { 2, 1, 3 });
layout1.addComponent(children[3], 0);
assertOrder(layout1, new int[] { 3, 0 });
assertOrder(layout2, new int[] { 2, 1 });
layout2.addComponent(children[0]);
assertOrder(layout1, new int[] { 3 });
assertOrder(layout2, new int[] { 2, 1, 0 });
layout1.addComponentAsFirst(children[1]);
assertOrder(layout1, new int[] { 1, 3 });
assertOrder(layout2, new int[] { 2, 0 });
}
@Test
public void shuffleChildComponents() {
CssLayout layout = new CssLayout();
for (int i = 0; i < children.length; ++i) {
layout.addComponent(children[i], i);
}
assertOrder(layout, new int[] { 0, 1, 2, 3 });
// Move C from #2 to #1
// Exhibits defect #7668
layout.addComponent(children[2], 1);
assertOrder(layout, new int[] { 0, 2, 1, 3 });
// Move C from #1 to #4 (which becomes #3 when #1 is erased)
layout.addComponent(children[2], 4);
assertOrder(layout, new int[] { 0, 1, 3, 2 });
// Keep everything in place
layout.addComponent(children[1], 1);
assertOrder(layout, new int[] { 0, 1, 3, 2 });
// Move D from #2 to #0
layout.addComponent(children[3], 0);
assertOrder(layout, new int[] { 3, 0, 1, 2 });
// Move A from #1 to end (#4 which becomes #3)
layout.addComponent(children[0]);
assertOrder(layout, new int[] { 3, 1, 2, 0 });
// Keep everything in place
layout.addComponent(children[0]);
assertOrder(layout, new int[] { 3, 1, 2, 0 });
// Move C from #2 to #0
layout.addComponentAsFirst(children[2]);
assertOrder(layout, new int[] { 2, 3, 1, 0 });
// Keep everything in place
layout.addComponentAsFirst(children[2]);
assertOrder(layout, new int[] { 2, 3, 1, 0 });
}
@Test
public void testConstructorWithComponents() {
Layout layout = new CssLayout(children);
assertOrder(layout, new int[] { 0, 1, 2, 3 });
}
@Test
public void testAddComponents() {
CssLayout layout = new CssLayout();
layout.addComponents(children);
assertOrder(layout, new int[] { 0, 1, 2, 3 });
Label extra = new Label("Extra");
layout.addComponents(extra);
assertSame(extra, layout.getComponent(4));
layout.removeAllComponents();
layout.addComponents(children[3], children[2], children[1],
children[0]);
assertOrder(layout, new int[] { 3, 2, 1, 0 });
}
/**
* Asserts that layout has the components in children in the order specified
* by indices.
*/
private void assertOrder(Layout layout, int[] indices) {
Iterator<?> i = layout.getComponentIterator();
try {
for (int index : indices) {
assertSame(children[index], i.next());
}
assertFalse("Too many components in layout", i.hasNext());
} catch (NoSuchElementException e) {
fail("Too few components in layout");
}
}
}