package com.vaadin.v7.data.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import com.vaadin.v7.data.Container;
import com.vaadin.v7.data.Container.Indexed.ItemAddEvent;
import com.vaadin.v7.data.Container.Indexed.ItemRemoveEvent;
import com.vaadin.v7.data.Container.ItemSetChangeListener;
import com.vaadin.v7.data.Container.ItemSetChangeNotifier;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.filter.SimpleStringFilter;
public class GeneratedPropertyContainerBasicTest
extends AbstractInMemoryContainerTestBase {
@Test
public void testBasicOperations() {
testBasicContainerOperations(createContainer());
}
private GeneratedPropertyContainer createContainer() {
return new GeneratedPropertyContainer(new IndexedContainer());
}
@Test
public void testFiltering() {
testContainerFiltering(createContainer());
}
@Test
public void testSorting() {
testContainerSorting(createContainer());
}
@Test
public void testSortingAndFiltering() {
testContainerSortingAndFiltering(createContainer());
}
@Test
public void testContainerOrdered() {
testContainerOrdered(createContainer());
}
@Test
public void testContainerIndexed() {
testContainerIndexed(createContainer(), sampleData[2], 2, true,
"newItemId", true);
}
@Test
public void testItemSetChangeListeners() {
GeneratedPropertyContainer container = createContainer();
ItemSetChangeCounter counter = new ItemSetChangeCounter();
container.addListener(counter);
String id1 = "id1";
String id2 = "id2";
String id3 = "id3";
initializeContainer(container);
counter.reset();
container.addItem();
counter.assertOnce();
container.addItem(id1);
counter.assertOnce();
initializeContainer(container);
counter.reset();
container.addItemAt(0);
counter.assertOnce();
container.addItemAt(0, id1);
counter.assertOnce();
container.addItemAt(0, id2);
counter.assertOnce();
container.addItemAt(container.size(), id3);
counter.assertOnce();
// no notification if already in container
container.addItemAt(0, id1);
counter.assertNone();
initializeContainer(container);
counter.reset();
container.addItemAfter(null);
counter.assertOnce();
container.addItemAfter(null, id1);
counter.assertOnce();
container.addItemAfter(id1);
counter.assertOnce();
container.addItemAfter(id1, id2);
counter.assertOnce();
container.addItemAfter(container.firstItemId());
counter.assertOnce();
container.addItemAfter(container.lastItemId());
counter.assertOnce();
container.addItemAfter(container.lastItemId(), id3);
counter.assertOnce();
// no notification if already in container
container.addItemAfter(0, id1);
counter.assertNone();
initializeContainer(container);
counter.reset();
container.removeItem(sampleData[0]);
counter.assertOnce();
initializeContainer(container);
counter.reset();
// no notification for removing a non-existing item
container.removeItem(id1);
counter.assertNone();
initializeContainer(container);
counter.reset();
container.removeAllItems();
counter.assertOnce();
// already empty
container.removeAllItems();
counter.assertNone();
}
@Test
public void testAddRemoveContainerFilter() {
GeneratedPropertyContainer container = createContainer();
ItemSetChangeCounter counter = new ItemSetChangeCounter();
container.addListener(counter);
// simply adding or removing container filters should cause events
// (content changes)
initializeContainer(container);
counter.reset();
SimpleStringFilter filter = new SimpleStringFilter(SIMPLE_NAME, "a",
true, false);
container.addContainerFilter(filter);
counter.assertOnce();
container.removeContainerFilter(filter);
counter.assertOnce();
container.addContainerFilter(
new SimpleStringFilter(SIMPLE_NAME, "a", true, false));
counter.assertOnce();
container.removeAllContainerFilters();
counter.assertOnce();
}
// TODO other tests should check positions after removing filter etc,
// here concentrating on listeners
@Test
public void testItemSetChangeListenersFiltering() {
Container.Indexed container = createContainer();
ItemSetChangeCounter counter = new ItemSetChangeCounter();
((GeneratedPropertyContainer) container).addListener(counter);
counter.reset();
((Container.Filterable) container)
.addContainerFilter(new SimpleStringFilter(FULLY_QUALIFIED_NAME,
"Test", true, false));
// no real change, so no notification required
counter.assertNone();
String id1 = "com.example.Test1";
String id2 = "com.example.Test2";
String id3 = "com.example.Other";
// perform operations while filtering container
Item item;
initializeContainer(container);
counter.reset();
// passes filter
item = container.addItem(id1);
// no event if filtered out
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
counter.assertOnce();
// passes filter but already in the container
item = container.addItem(id1);
counter.assertNone();
initializeContainer(container);
counter.reset();
// passes filter after change
item = container.addItemAt(0, id1);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
counter.assertOnce();
item = container.addItemAt(container.size(), id2);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id2);
counter.assertOnce();
// passes filter but already in the container
item = container.addItemAt(0, id1);
counter.assertNone();
item = container.addItemAt(container.size(), id2);
counter.assertNone();
initializeContainer(container);
counter.reset();
// passes filter
item = container.addItemAfter(null, id1);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
counter.assertOnce();
item = container.addItemAfter(container.lastItemId(), id2);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id2);
counter.assertOnce();
// passes filter but already in the container
item = container.addItemAfter(null, id1);
counter.assertNone();
item = container.addItemAfter(container.lastItemId(), id2);
counter.assertNone();
// does not pass filter
// TODO implement rest
initializeContainer(container);
counter.reset();
item = container.addItemAfter(null, id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
initializeContainer(container);
counter.reset();
item = container.addItemAfter(container.firstItemId(), id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
initializeContainer(container);
counter.reset();
item = container.addItemAfter(container.lastItemId(), id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
initializeContainer(container);
counter.reset();
item = container.addItemAt(0, id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
initializeContainer(container);
counter.reset();
item = container.addItemAt(1, id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
initializeContainer(container);
counter.reset();
item = container.addItemAt(container.size(), id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
// passes filter
initializeContainer(container);
counter.reset();
item = container.addItem(id1);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
counter.assertOnce();
container.removeItem(id1);
counter.assertOnce();
// already removed
container.removeItem(id1);
counter.assertNone();
item = container.addItem(id3);
counter.assertNone();
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
counter.assertNone();
// not visible
container.removeItem(id3);
counter.assertNone();
// remove all
initializeContainer(container);
item = container.addItem(id1);
item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
counter.reset();
container.removeAllItems();
counter.assertOnce();
// no visible items
container.removeAllItems();
counter.assertNone();
}
@Test
public void testItemAdd_idSequence() {
GeneratedPropertyContainer container = createContainer();
Object itemId;
itemId = container.addItem();
assertEquals(Integer.valueOf(1), itemId);
itemId = container.addItem();
assertEquals(Integer.valueOf(2), itemId);
itemId = container.addItemAfter(null);
assertEquals(Integer.valueOf(3), itemId);
itemId = container.addItemAt(2);
assertEquals(Integer.valueOf(4), itemId);
}
@Test
public void testItemAddRemove_idSequence() {
GeneratedPropertyContainer container = createContainer();
Object itemId;
itemId = container.addItem();
assertEquals(Integer.valueOf(1), itemId);
container.removeItem(itemId);
itemId = container.addItem();
assertEquals(
"Id sequence should continue from the previous value even if an item is removed",
Integer.valueOf(2), itemId);
}
@Test
public void testItemAddedEvent() {
GeneratedPropertyContainer container = createContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
EasyMock.replay(addListener);
container.addItem();
EasyMock.verify(addListener);
}
@Test
public void testItemAddedEvent_AddedItem() {
GeneratedPropertyContainer container = createContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);
Object itemId = container.addItem();
assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
}
@Test
public void testItemAddedEvent_IndexOfAddedItem() {
GeneratedPropertyContainer container = createContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
container.addItem();
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);
Object itemId = container.addItemAt(1);
assertEquals(1, capturedEvent.getValue().getFirstIndex());
}
@Test
public void testItemRemovedEvent() {
GeneratedPropertyContainer container = createContainer();
Object itemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
removeListener
.containerItemSetChange(EasyMock.isA(ItemRemoveEvent.class));
EasyMock.replay(removeListener);
container.removeItem(itemId);
EasyMock.verify(removeListener);
}
@Test
public void testItemRemovedEvent_RemovedItem() {
GeneratedPropertyContainer container = createContainer();
Object itemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
removeListener);
EasyMock.replay(removeListener);
container.removeItem(itemId);
assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
}
@Test
public void testItemRemovedEvent_indexOfRemovedItem() {
GeneratedPropertyContainer container = createContainer();
container.addItem();
Object secondItemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
removeListener);
EasyMock.replay(removeListener);
container.removeItem(secondItemId);
assertEquals(1, capturedEvent.getValue().getFirstIndex());
}
@Test
public void testItemRemovedEvent_amountOfRemovedItems() {
GeneratedPropertyContainer container = createContainer();
container.addItem();
container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
removeListener);
EasyMock.replay(removeListener);
container.removeAllItems();
assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
}
private Capture<ItemAddEvent> captureAddEvent(
ItemSetChangeListener addListener) {
Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}
private Capture<ItemRemoveEvent> captureRemoveEvent(
ItemSetChangeListener removeListener) {
Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}
private ItemSetChangeListener createListenerMockFor(
ItemSetChangeNotifier container) {
ItemSetChangeListener listener = EasyMock
.createNiceMock(ItemSetChangeListener.class);
container.addItemSetChangeListener(listener);
return listener;
}
// Ticket 8028
@Test
public void testGetItemIdsRangeIndexOutOfBounds() {
GeneratedPropertyContainer ic = createContainer();
try {
ic.getItemIds(-1, 10);
fail("Container returned items starting from index -1, something very wrong here!");
} catch (IndexOutOfBoundsException e) {
// This is expected...
} catch (Exception e) {
// Should not happen!
fail("Container threw unspecified exception when fetching a range of items and the range started from -1");
}
}
// Ticket 8028
@Test
public void testGetItemIdsRangeIndexOutOfBounds2() {
GeneratedPropertyContainer ic = createContainer();
ic.addItem(new Object());
try {
ic.getItemIds(2, 1);
fail("Container returned items starting from index -1, something very wrong here!");
} catch (IndexOutOfBoundsException e) {
// This is expected...
} catch (Exception e) {
// Should not happen!
fail("Container threw unspecified exception when fetching a out of bounds range of items");
}
}
// Ticket 8028
@Test
public void testGetItemIdsRangeZeroRange() {
GeneratedPropertyContainer ic = createContainer();
ic.addItem(new Object());
try {
List<Object> itemIds = (List<Object>) ic.getItemIds(1, 0);
assertTrue(
"Container returned actual values when asking for 0 items...",
itemIds.isEmpty());
} catch (Exception e) {
// Should not happen!
fail("Container threw unspecified exception when fetching 0 items...");
}
}
// Ticket 8028
@Test
public void testGetItemIdsRangeNegativeRange() {
GeneratedPropertyContainer ic = createContainer();
ic.addItem(new Object());
try {
List<Object> itemIds = (List<Object>) ic.getItemIds(1, -1);
assertTrue(
"Container returned actual values when asking for -1 items...",
itemIds.isEmpty());
} catch (IllegalArgumentException e) {
// this is expected
} catch (Exception e) {
// Should not happen!
fail("Container threw unspecified exception when fetching -1 items...");
}
}
// Ticket 8028
@Test
public void testGetItemIdsRangeIndexOutOfBoundsDueToSizeChange() {
GeneratedPropertyContainer ic = createContainer();
ic.addItem(new Object());
Assert.assertEquals(
"Container returned too many items when the range was >> container size",
1, ic.getItemIds(0, 10).size());
}
// Ticket 8028
@Test
public void testGetItemIdsRangeBaseCase() {
GeneratedPropertyContainer ic = createContainer();
String object1 = new String("Obj1");
String object2 = new String("Obj2");
String object3 = new String("Obj3");
String object4 = new String("Obj4");
String object5 = new String("Obj5");
ic.addItem(object1);
ic.addItem(object2);
ic.addItem(object3);
ic.addItem(object4);
ic.addItem(object5);
try {
List<Object> itemIds = (List<Object>) ic.getItemIds(1, 2);
assertTrue(itemIds.contains(object2));
assertTrue(itemIds.contains(object3));
assertEquals(2, itemIds.size());
} catch (Exception e) {
// Should not happen!
fail("Container threw exception when fetching a range of items ");
}
}
// test getting non-existing property (#10445)
@Test
public void testNonExistingProperty() {
Container ic = createContainer();
String object1 = new String("Obj1");
ic.addItem(object1);
assertNull(ic.getContainerProperty(object1, "xyz"));
}
// test getting null property id (#10445)
@Test
public void testNullPropertyId() {
Container ic = createContainer();
String object1 = new String("Obj1");
ic.addItem(object1);
assertNull(ic.getContainerProperty(object1, null));
}
@Override
protected void initializeContainer(Container container) {
if (container instanceof GeneratedPropertyContainer) {
super.initializeContainer(((GeneratedPropertyContainer) container)
.getWrappedContainer());
} else {
super.initializeContainer(container);
}
}
}