@Test
    public void completeRowOnlyRemovedWhenShapeHasStoppedMoving() {
        testee = new Board(30, 10) {
            @Override
            public void addNewShape(Shape shape) {
                super.addNewShape(new Square());
            }
        };
        testee.addNewShapeAtRandom();
        moveSidewaysThenToBottom(-4);
        moveSidewaysThenToBottom(-4);
        moveSidewaysThenToBottom(-2);
        moveSidewaysThenToBottom(-2);
        moveSidewaysThenToBottom(2);
        moveSidewaysThenToBottom(2);
        moveSidewaysThenToBottom(4);
        moveSidewaysThenToBottom(4);
        for (int i = 0; i < 23; i++) {
            testee.tick();
        }
        assertRowPopulation(26, true);
        testee.tick();
        assertRowPopulation(26, true);
        assertRowPopulation(27, true);
        testee.tick();
        assertRowPopulation(27, true);
        assertRowPopulation(28, true);
        testee.tick();
        assertRowPopulation(28, true);
        assertRowPopulation(29, true);
        testee.tick();
        assertRowPopulation(26, false);
        assertRowPopulation(27, false);
        for (Cell cell : testee.getBoardCells()) {
            if (cell.row == 28 || cell.row == 29) {
                if (cell.column == 4 || cell.column == 5) {
                    assertFalse("bottom cell not empty as expected: " + populatedCells(), cell.isPopulated());
                } else {
                    assertTrue("bottom cell not populated as expected: " + populatedCells(), cell.isPopulated());
                }
            }
        }
    }