/** Integration test */
  @Test
  public void scrollAndHideTheLastRow() throws Exception {
    // Total rows in fixture - 20 (index 0 - 19)
    NatTableFixture natTable =
        new NatTableFixture(
            new Shell(),
            new DummyGridLayerStack() {

              @Override
              protected void init(
                  IUniqueIndexLayer bodyDataLayer,
                  IUniqueIndexLayer columnHeaderDataLayer,
                  IUniqueIndexLayer rowHeaderDataLayer,
                  IUniqueIndexLayer cornerDataLayer) {
                RowHideShowLayer rowHideShowLayer = new RowHideShowLayer(bodyDataLayer);
                super.init(
                    rowHideShowLayer, columnHeaderDataLayer, rowHeaderDataLayer, cornerDataLayer);
              }
            },
            600,
            120);
    LayerListenerFixture natTableListener = new LayerListenerFixture();
    natTable.addLayerListener(natTableListener);

    // Scroll to position 16 in grid/15 in body
    natTable.scrollToRow(16);
    assertEquals(16, natTable.getRowIndexByPosition(1));

    // Hide last row - position 4/index 19
    assertEquals(19, natTable.getRowIndexByPosition(4));
    natTable.doCommand(new RowHideCommand(natTable, 4));

    // Assert event received
    assertNotNull(natTableListener.getReceivedEvent(HideRowPositionsEvent.class));
    HideRowPositionsEvent hideEvent =
        (HideRowPositionsEvent) natTableListener.getReceivedEvent(HideRowPositionsEvent.class);

    // When last row is hidden it is not carrying the following info
    assertEquals(1, hideEvent.getRowPositionRanges().size());

    // View port adjusted origin to move an extra row in
    Range hiddenRange = hideEvent.getRowPositionRanges().iterator().next();
    assertEquals(4, hiddenRange.start);
    assertEquals(5, hiddenRange.end);
  }
  @Test
  public void shouldFireTheCorrectEventOnRowHide() throws Exception {
    NatTable natTable =
        new NatTableFixture(
            new Shell(),
            new DummyGridLayerStack() {

              @Override
              protected void init(
                  IUniqueIndexLayer bodyDataLayer,
                  IUniqueIndexLayer columnHeaderDataLayer,
                  IUniqueIndexLayer rowHeaderDataLayer,
                  IUniqueIndexLayer cornerDataLayer) {
                RowHideShowLayer rowHideShowLayer = new RowHideShowLayer(bodyDataLayer);
                super.init(
                    rowHideShowLayer, columnHeaderDataLayer, rowHeaderDataLayer, cornerDataLayer);
              }
            });
    LayerListenerFixture listener = new LayerListenerFixture();

    natTable.addLayerListener(listener);

    // Grid coordinates
    natTable.doCommand(new RowHideCommand(natTable, 5));

    assertEquals(1, listener.getReceivedEvents().size());
    HideRowPositionsEvent hideEvent = (HideRowPositionsEvent) listener.getReceivedEvents().get(0);

    Range range = hideEvent.getRowPositionRanges().iterator().next();
    assertEquals(5, range.start);
    assertEquals(6, range.end);

    // The range Before hide: 5 -> 6
    // The range After hide: 5 -> 5 (row is not there anymore)
    StructuralDiff rowDiff = hideEvent.getRowDiffs().iterator().next();
    assertEquals(5, rowDiff.getBeforePositionRange().start);
    assertEquals(6, rowDiff.getBeforePositionRange().end);
    assertEquals(5, rowDiff.getAfterPositionRange().start);
    assertEquals(5, rowDiff.getAfterPositionRange().end);
  }