/*******************************************************************************
 * Copyright (c) 2019, 2020 Dirk Fauth.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.group.performance;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.nebula.widgets.nattable.data.ExtendedReflectiveColumnPropertyAccessor;
import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
import org.eclipse.nebula.widgets.nattable.dataset.person.ExtendedPersonWithAddress;
import org.eclipse.nebula.widgets.nattable.dataset.person.PersonService;
import org.eclipse.nebula.widgets.nattable.grid.command.ClientAreaResizeCommand;
import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer;
import org.eclipse.nebula.widgets.nattable.group.RowGroupUtils;
import org.eclipse.nebula.widgets.nattable.group.performance.GroupModel.Group;
import org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.reorder.ColumnReorderLayer;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer.MoveDirectionEnum;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.junit.Before;
import org.junit.Test;

public class RowGroupUtilsTest {

    RowGroupHeaderLayer rowGroupHeaderLayer;
    SelectionLayer selectionLayer;
    GridLayer gridLayer;

    @Before
    public void setup() {
        String[] propertyNames = {
                "firstName", "lastName", "gender", "married",
                "address.street", "address.housenumber", "address.postalCode", "address.city",
                "age", "birthday", "money",
                "description", "favouriteFood", "favouriteDrinks" };

        // mapping from property to label, needed for column header labels
        Map<String, String> propertyToLabelMap = new HashMap<>();
        propertyToLabelMap.put("firstName", "Firstname");
        propertyToLabelMap.put("lastName", "Lastname");
        propertyToLabelMap.put("gender", "Gender");
        propertyToLabelMap.put("married", "Married");
        propertyToLabelMap.put("address.street", "Street");
        propertyToLabelMap.put("address.housenumber", "Housenumber");
        propertyToLabelMap.put("address.postalCode", "Postalcode");
        propertyToLabelMap.put("address.city", "City");
        propertyToLabelMap.put("age", "Age");
        propertyToLabelMap.put("birthday", "Birthday");
        propertyToLabelMap.put("money", "Money");
        propertyToLabelMap.put("description", "Description");
        propertyToLabelMap.put("favouriteFood", "Food");
        propertyToLabelMap.put("favouriteDrinks", "Drinks");

        IColumnPropertyAccessor<ExtendedPersonWithAddress> columnPropertyAccessor =
                new ExtendedReflectiveColumnPropertyAccessor<>(propertyNames);

        IDataProvider bodyDataProvider =
                new ListDataProvider<>(
                        PersonService.getExtendedPersonsWithAddress(14),
                        columnPropertyAccessor);
        DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
        ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(bodyDataLayer);
        ColumnHideShowLayer columnHideShowLayer = new ColumnHideShowLayer(columnReorderLayer);
        ColumnGroupExpandCollapseLayer columnGroupExpandCollapseLayer = new ColumnGroupExpandCollapseLayer(columnHideShowLayer);
        this.selectionLayer = new SelectionLayer(columnGroupExpandCollapseLayer);
        ViewportLayer viewportLayer = new ViewportLayer(this.selectionLayer);

        // build the column header layer
        IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames, propertyToLabelMap);
        DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
        ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, this.selectionLayer);

        // build the row header layer
        IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(bodyDataProvider);
        DataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(rowHeaderDataProvider);
        ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, viewportLayer, this.selectionLayer);
        this.rowGroupHeaderLayer = new RowGroupHeaderLayer(rowHeaderLayer, this.selectionLayer);

        // configure the column groups
        this.rowGroupHeaderLayer.addGroup("Person", 0, 4);
        this.rowGroupHeaderLayer.addGroup("Address", 4, 4);
        this.rowGroupHeaderLayer.addGroup("Facts", 8, 3);
        this.rowGroupHeaderLayer.addGroup("Personal", 11, 3);

        // build the corner layer
        IDataProvider cornerDataProvider = new DefaultCornerDataProvider(columnHeaderDataProvider, rowHeaderDataProvider);
        DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
        ILayer cornerLayer = new CornerLayer(cornerDataLayer, this.rowGroupHeaderLayer, columnHeaderLayer);

        // build the grid layer
        this.gridLayer = new GridLayer(viewportLayer, columnHeaderLayer, this.rowGroupHeaderLayer, cornerLayer);

        // configure the visible area, needed for tests in scrolled state
        this.gridLayer.setClientAreaProvider(new IClientAreaProvider() {

            @Override
            public Rectangle getClientArea() {
                // 10 rows + column header should be visible
                return new Rectangle(0, 0, 1010, 120);
            }

        });
        this.gridLayer.doCommand(new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));

        assertEquals(1, this.rowGroupHeaderLayer.getLevelCount());
    }

    @Test
    public void shouldTestInSameGroup() {
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 1));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 2));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 3));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 0));

        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 4, 5));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 4, 6));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 4, 7));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 4, 4));

        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 8, 8));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 8, 9));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 8, 10));

        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 11, 11));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 11, 12));
        assertTrue(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 11, 13));

        assertFalse(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 4));
        assertFalse(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 0, 7));
        assertFalse(RowGroupUtils.isInTheSameGroup(this.rowGroupHeaderLayer, 0, 4, 8));
    }

    @Test
    public void shouldTestIsReorderValidWithoutUnbreakable() {
        // increase the client area to show all rows
        this.gridLayer.setClientAreaProvider(new IClientAreaProvider() {

            @Override
            public Rectangle getClientArea() {
                return new Rectangle(0, 0, 1600, 250);
            }

        });
        this.gridLayer.doCommand(new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));

        // in same group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 4, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 4, true));
        // to other group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 6, true));
        // to start of first group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 8, 0, true));
        // to end of last group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 13, false));
    }

    @Test
    public void shouldTestIsReorderValidWithUnbreakableFromNonGroupedRight() {
        // increase the client area to show all rows
        this.gridLayer.setClientAreaProvider(new IClientAreaProvider() {

            @Override
            public Rectangle getClientArea() {
                return new Rectangle(0, 0, 1600, 250);
            }

        });
        this.gridLayer.doCommand(new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));

        // remove first group
        this.rowGroupHeaderLayer.removeGroup(0);

        // set all remaining groups unbreakable
        this.rowGroupHeaderLayer.setGroupUnbreakable(4, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(8, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(11, true);

        // reorder outside group valid
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 4, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 3, 4, true));
        // in same group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 6, 7, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 7, 4, true));
        // in same group where adjacent group is also unbreakable
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 8, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 10, 8, true));
        // to any other group
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 3, 5, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 6, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 1, 9, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 2, 13, true));
        // to start of table
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 3, 0, true));
        // to end of last group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 0, 13, false));
        // between unbreakable groups
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 3, 8, true));
    }

    @Test
    public void shouldTestIsReorderValidWithUnbreakableFromNonGroupedLeft() {
        // increase the client area to show all rows
        this.gridLayer.setClientAreaProvider(new IClientAreaProvider() {

            @Override
            public Rectangle getClientArea() {
                return new Rectangle(0, 0, 1600, 250);
            }

        });
        this.gridLayer.doCommand(new ClientAreaResizeCommand(new Shell(Display.getDefault(), SWT.V_SCROLL | SWT.H_SCROLL)));

        // remove first group
        this.rowGroupHeaderLayer.removeGroup(11);

        // set all remaining groups unbreakable
        this.rowGroupHeaderLayer.setGroupUnbreakable(0, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(4, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(8, true);

        // between unbreakable groups
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 12, 8, true));
        // to start of table
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 13, 0, true));
    }

    @Test
    public void shouldTestIsReorderValidFromUnbreakable() {
        // remove first group
        this.rowGroupHeaderLayer.removeGroup(0);

        // set second and third group unbreakable
        this.rowGroupHeaderLayer.setGroupUnbreakable(4, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(8, true);
        this.rowGroupHeaderLayer.setGroupUnbreakable(11, true);

        // in same group
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 6, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 5, 6, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 7, 6, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 8, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 7, 4, true));
        assertTrue(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 10, 8, true));
        // to other group
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 5, 9, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 8, 5, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 9, 4, true));
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 11, 8, true));
        // to start of first group
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 0, true));
        // to end of last group
        assertFalse(RowGroupUtils.isReorderValid(this.rowGroupHeaderLayer, 4, 13, false));
    }

    @Test
    public void shouldTestIsBetweenTwoGroups() {
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 0, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 1, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 2, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 3, true, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 4, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 5, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 6, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 7, true, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 8, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 9, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 10, true, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 11, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 12, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 13, true, MoveDirectionEnum.LEFT));

        // move right reorderToLeftEdge
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 0, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 1, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 2, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 3, true, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 4, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 5, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 6, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 7, true, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 8, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 9, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 10, true, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 11, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 12, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 13, true, MoveDirectionEnum.RIGHT));

        // move left reorderToRightEdge
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 0, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 1, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 2, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 3, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 4, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 5, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 6, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 7, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 8, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 9, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 10, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 11, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 12, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 13, false, MoveDirectionEnum.LEFT));

        // move right reorderToRightEdge
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 0, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 1, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 2, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 3, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 4, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 5, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 6, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 7, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 8, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 9, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 10, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 11, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 12, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 0, 13, false, MoveDirectionEnum.RIGHT));
    }

    @Test
    public void shouldTestIsBetweenTwoGroupsOnLevel() {
        // add a second level
        this.rowGroupHeaderLayer.addGroupingLevel();
        // group spans Address and Facts
        this.rowGroupHeaderLayer.addGroup(1, "Test", 4, 7);

        // tests on level 0
        // additional level should not change the results
        shouldTestIsBetweenTwoGroups();

        // tests on level 1
        // note that if check on deeper level is false, it also needs to be
        // false on the upper level

        // move left reorderToLeftEdge
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 0, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 1, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 2, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 3, true, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 4, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 5, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 6, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 7, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 8, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 9, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 10, true, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 11, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 12, true, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 13, true, MoveDirectionEnum.LEFT));

        // move right reorderToLeftEdge
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 0, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 1, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 2, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 3, true, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 4, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 5, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 6, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 7, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 8, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 9, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 10, true, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 11, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 12, true, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 13, true, MoveDirectionEnum.RIGHT));

        // move left reorderToRightEdge
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 0, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 1, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 2, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 3, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 4, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 5, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 6, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 7, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 8, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 9, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 10, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 11, false, MoveDirectionEnum.LEFT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 12, false, MoveDirectionEnum.LEFT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 13, false, MoveDirectionEnum.LEFT));

        // move right reorderToRightEdge
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 0, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 1, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 2, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 3, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 4, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 5, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 6, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 7, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 8, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 9, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 10, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 11, false, MoveDirectionEnum.RIGHT));
        assertFalse(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 12, false, MoveDirectionEnum.RIGHT));
        assertTrue(RowGroupUtils.isBetweenTwoGroups(this.rowGroupHeaderLayer, 1, 13, false, MoveDirectionEnum.RIGHT));

        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 0, true, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 4, true, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 11, true, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 13, false, MoveDirectionEnum.RIGHT));
        //
        // assertFalse(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 8, true, MoveDirectionEnum.LEFT));
        // assertFalse(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 5, true, MoveDirectionEnum.LEFT));

        // TODO remove group on level 0
        // no group on level 1 at this positions
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 0, false, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 2, true, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 12, true, MoveDirectionEnum.LEFT));
        // assertTrue(RowGroupUtils.isBetweenTwoGroups(this.columnGroupHeaderLayer,
        // 1, 13, true, MoveDirectionEnum.RIGHT));
    }

    @Test
    public void shouldTestIsGroupReordered() {
        Group group = this.rowGroupHeaderLayer.getGroupByPosition(0);

        // test all group positions
        assertTrue(RowGroupUtils.isGroupReordered(group, new int[] { 0, 1, 2, 3 }));

        // test less group positions
        assertFalse(RowGroupUtils.isGroupReordered(group, new int[] { 1, 2, 3 }));

        // test more group positions
        assertTrue(RowGroupUtils.isGroupReordered(group, new int[] { 0, 1, 2, 3, 4, 5 }));
    }
}
