/** Tests the copy constructor of a query will copy columns, containers, and joins. */
  public void testCopyConstructorWithListeners() throws Exception {
    QueryImpl query = new QueryImpl(new StubDatabaseMapping());
    Item leftColumn = new TestingStringItem("leftCol");
    Container leftContainer = new TestingItemContainer("leftContainer");
    leftContainer.addItem(leftColumn);
    Item rightColumn = new TestingStringItem("rightCol");
    Container rightContainer = new TestingItemContainer("rightContainer");
    rightContainer.addItem(rightColumn);
    SQLJoin join = new TestingSQLJoin(leftColumn, rightColumn);
    query.addTable(leftContainer);
    query.addTable(rightContainer);
    query.addJoin(join);

    assertTrue(query.getFromTableList().contains(leftContainer));
    assertTrue(query.getFromTableList().contains(rightContainer));
    assertTrue(query.getJoins().contains(join));

    QueryImpl copy = new QueryImpl(query, true);

    assertEquals(2, copy.getFromTableList().size());
    assertEquals(1, copy.getJoins().size());

    final Container copiedContainers1 = copy.getFromTableList().get(0);
    final Container copiedContainers2 = copy.getFromTableList().get(1);
    final SQLJoin copiedJoin = copy.getJoins().iterator().next();

    assertTrue(copy.getJoinMapping().containsKey(copiedContainers1));
    assertTrue(copy.getJoinMapping().containsKey(copiedContainers2));
    assertTrue(copy.getJoinMapping().get(copiedContainers1).containsAll(copy.getJoins()));
    assertTrue(copy.getJoinMapping().get(copiedContainers2).containsAll(copy.getJoins()));
    assertNotSame(copiedContainers1, leftContainer);
    assertNotSame(copiedContainers2, leftContainer);
    assertNotSame(copiedContainers1, rightContainer);
    assertNotSame(copiedContainers2, rightContainer);

    assertEquals(1, ((TestingItemContainer) copiedContainers1).getListeners().size());
    assertTrue(
        ((TestingItemContainer) copiedContainers1)
            .getListeners()
            .contains(copy.getTableChildListener()));
    assertEquals(1, ((TestingItemContainer) copiedContainers2).getListeners().size());
    assertTrue(
        ((TestingItemContainer) copiedContainers2)
            .getListeners()
            .contains(copy.getTableChildListener()));
    assertEquals(1, ((TestingSQLJoin) copiedJoin).getListeners().size());
    assertTrue(((TestingSQLJoin) copiedJoin).getListeners().contains(copy.getJoinChangeListener()));
    for (Item item : copiedContainers1.getItems()) {
      assertEquals(1, ((TestingStringItem) item).getListeners().size());
      assertTrue(((TestingStringItem) item).getListeners().contains(copy.getItemListener()));
    }
    for (Item item : copiedContainers2.getItems()) {
      assertEquals(1, ((TestingStringItem) item).getListeners().size());
      assertTrue(((TestingStringItem) item).getListeners().contains(copy.getItemListener()));
    }
  }