// test getting non-existing property (#10445)
 @Test
 public void testNonExistingProperty() {
   IndexedContainer ic = new IndexedContainer();
   String object1 = new String("Obj1");
   ic.addItem(object1);
   assertNull(ic.getContainerProperty(object1, "xyz"));
 }
 // test getting null property id (#10445)
 @Test
 public void testNullPropertyId() {
   IndexedContainer ic = new IndexedContainer();
   String object1 = new String("Obj1");
   ic.addItem(object1);
   assertNull(ic.getContainerProperty(object1, null));
 }
  /*
   * Overridden to provide filtering for root & children items.
   *
   * (non-Javadoc)
   *
   * @see com.vaadin.data.util.IndexedContainer#updateContainerFiltering()
   */
  @Override
  protected boolean doFilterContainer(boolean hasFilters) {
    if (!hasFilters) {
      // All filters removed
      filteredRoots = null;
      filteredChildren = null;
      filteredParent = null;

      return super.doFilterContainer(hasFilters);
    }

    // Reset data structures
    filteredRoots = new LinkedList<>();
    filteredChildren = new HashMap<>();
    filteredParent = new HashMap<>();

    if (includeParentsWhenFiltering) {
      // Filter so that parents for items that match the filter are also
      // included
      HashSet<Object> includedItems = new HashSet<>();
      for (Object rootId : roots) {
        if (filterIncludingParents(rootId, includedItems)) {
          filteredRoots.add(rootId);
          addFilteredChildrenRecursively(rootId, includedItems);
        }
      }
      // includedItemIds now contains all the item ids that should be
      // included. Filter IndexedContainer based on this
      filterOverride = includedItems;
      super.doFilterContainer(hasFilters);
      filterOverride = null;

      return true;
    } else {
      // Filter by including all items that pass the filter and make items
      // with no parent new root items

      // Filter IndexedContainer first so getItemIds return the items that
      // match
      super.doFilterContainer(hasFilters);

      LinkedHashSet<Object> filteredItemIds = new LinkedHashSet<>(getItemIds());

      for (Object itemId : filteredItemIds) {
        Object itemParent = parent.get(itemId);
        if (itemParent == null || !filteredItemIds.contains(itemParent)) {
          // Parent is not included or this was a root, in both cases
          // this should be a filtered root
          filteredRoots.add(itemId);
        } else {
          // Parent is included. Add this to the children list (create
          // it first if necessary)
          addFilteredChild(itemParent, itemId);
        }
      }

      return true;
    }
  }
  // Ticket 8028
  @Test
  public void testGetItemIdsRangeZeroRange() {
    IndexedContainer ic = new IndexedContainer();
    ic.addItem(new Object());
    List<Object> itemIds = ic.getItemIds(1, 0);

    assertTrue("Container returned actual values when asking for 0 items...", itemIds.isEmpty());
  }
  // Ticket 8028
  @Test(expected = IllegalArgumentException.class)
  public void testGetItemIdsRangeNegativeRange() {
    IndexedContainer ic = new IndexedContainer();
    ic.addItem(new Object());
    List<Object> itemIds = ic.getItemIds(1, -1);

    assertTrue("Container returned actual values when asking for -1 items...", itemIds.isEmpty());
  }
 // Ticket 8028
 @Test
 public void testGetItemIdsRangeIndexOutOfBoundsDueToSizeChange() {
   IndexedContainer ic = new IndexedContainer();
   ic.addItem(new Object());
   Assert.assertEquals(
       "Container returned too many items when the range was >> container size",
       1,
       ic.getItemIds(0, 10).size());
 }
  @Test
  public void testItemAddedEvent() {
    IndexedContainer container = new IndexedContainer();
    ItemSetChangeListener addListener = createListenerMockFor(container);
    addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
    EasyMock.replay(addListener);

    container.addItem();

    EasyMock.verify(addListener);
  }
  @Test
  public void testItemAddedEvent_AddedItem() {
    IndexedContainer container = new IndexedContainer();
    ItemSetChangeListener addListener = createListenerMockFor(container);
    Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
    EasyMock.replay(addListener);

    Object itemId = container.addItem();

    assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
  }
  @Test
  public void testItemRemovedEvent() {
    IndexedContainer container = new IndexedContainer();
    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 testAddItemAtPerformance() {
   Collection<Long> times = new ArrayList<Long>();
   for (int j = 0; j < REPEATS; ++j) {
     IndexedContainer c = new IndexedContainer();
     long start = System.currentTimeMillis();
     for (int i = 0; i < ITEMS; i++) {
       c.addItemAt(0);
     }
     times.add(System.currentTimeMillis() - start);
   }
   checkMedian(ITEMS, times, "IndexedContainer.addItemAt()", ADD_ITEM_AT_FAIL_THRESHOLD);
 }
  @Test
  public void testItemRemovedEvent_indexOfRemovedItem() {
    IndexedContainer container = new IndexedContainer();
    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() {
    IndexedContainer container = new IndexedContainer();
    container.addItem();
    container.addItem();
    ItemSetChangeListener removeListener = createListenerMockFor(container);
    Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
    EasyMock.replay(removeListener);

    container.removeAllItems();

    assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
  }
  @Test
  public void testItemAddRemove_idSequence() {
    IndexedContainer container = new IndexedContainer();
    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);
  }
 @Override
 protected void fireItemSetChange(com.vaadin.v7.data.Container.ItemSetChangeEvent event) {
   if (contentsChangeEventsOn()) {
     super.fireItemSetChange(event);
   } else {
     contentsChangedEventPending = true;
   }
 }
  @Test
  public void testItemAdd_idSequence() {
    IndexedContainer container = new IndexedContainer();
    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);
  }
  /*
   * (non-Javadoc)
   *
   * @see com.vaadin.data.util.IndexedContainer#doSort()
   */
  @Override
  protected void doSort() {
    super.doSort();

    Collections.sort(roots, getItemSorter());
    for (LinkedList<Object> childList : children.values()) {
      Collections.sort(childList, getItemSorter());
    }
  }
 @Test
 public void testAddItemAfterLastPerformance() {
   // TODO running with less items because slow otherwise
   Collection<Long> times = new ArrayList<Long>();
   for (int j = 0; j < REPEATS; ++j) {
     IndexedContainer c = new IndexedContainer();
     c.addItem();
     long start = System.currentTimeMillis();
     for (int i = 0; i < ITEMS / 3; i++) {
       c.addItemAfter(c.lastItemId());
     }
     times.add(System.currentTimeMillis() - start);
   }
   checkMedian(
       ITEMS / 3,
       times,
       "IndexedContainer.addItemAfter(lastId)",
       ADD_ITEM_AFTER_LAST_FAIL_THRESHOLD);
 }
  // Ticket 8028
  @Test
  public void testGetItemIdsRangeBaseCase() {
    IndexedContainer ic = new IndexedContainer();
    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);

    List<Object> itemIds = ic.getItemIds(1, 2);

    assertTrue(itemIds.contains(object2));
    assertTrue(itemIds.contains(object3));
    assertEquals(2, itemIds.size());
  }
  @Test
  public void testAddRemoveContainerFilter() {
    IndexedContainer container = new IndexedContainer();
    ItemSetChangeCounter counter = new ItemSetChangeCounter();
    container.addListener(counter);

    // simply adding or removing container filters should cause events
    // (content changes)

    initializeContainer(container);
    counter.reset();
    container.addContainerFilter(SIMPLE_NAME, "a", true, false);
    counter.assertOnce();
    container.removeContainerFilters(SIMPLE_NAME);
    counter.assertOnce();
    container.addContainerFilter(SIMPLE_NAME, "a", true, false);
    counter.assertOnce();
    container.removeAllContainerFilters();
    counter.assertOnce();
  }
  @Test
  public void testItemSetChangeListeners() {
    IndexedContainer container = new IndexedContainer();
    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();
  }
  // TODO other tests should check positions after removing filter etc,
  // here concentrating on listeners
  @Test
  public void testItemSetChangeListenersFiltering() {
    IndexedContainer container = new IndexedContainer();
    ItemSetChangeCounter counter = new ItemSetChangeCounter();
    container.addListener(counter);

    counter.reset();
    container.addContainerFilter(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();
  }
 // Ticket 8028
 @Test(expected = IndexOutOfBoundsException.class)
 public void testGetItemIdsRangeIndexOutOfBounds2() {
   IndexedContainer ic = new IndexedContainer();
   ic.addItem(new Object());
   ic.getItemIds(2, 1);
 }
 // Ticket 8028
 @Test(expected = IndexOutOfBoundsException.class)
 public void testGetItemIdsRangeIndexOutOfBounds() {
   IndexedContainer ic = new IndexedContainer();
   ic.getItemIds(-1, 10);
 }
 private ItemSetChangeListener createListenerMockFor(IndexedContainer container) {
   ItemSetChangeListener listener = EasyMock.createNiceMock(ItemSetChangeListener.class);
   container.addItemSetChangeListener(listener);
   return listener;
 }