/*******************************************************************************
 * 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.reorder.event;

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

import java.util.Collection;
import java.util.Iterator;

import org.eclipse.nebula.widgets.nattable.coordinate.Range;
import org.eclipse.nebula.widgets.nattable.layer.event.StructuralDiff;
import org.eclipse.nebula.widgets.nattable.layer.event.StructuralDiff.DiffTypeEnum;
import org.eclipse.nebula.widgets.nattable.test.fixture.layer.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;
import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
import org.eclipse.swt.graphics.Rectangle;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MultiRowReorderEventDiffTest {

    private RowReorderEvent event;
    private DataLayerFixture dataLayer;
    private ViewportLayer viewportLayer;

    @Before
    public void before() {
        this.dataLayer = new DataLayerFixture(20, 20, 100, 40);
        this.viewportLayer = new ViewportLayer(this.dataLayer);
        this.viewportLayer.setClientAreaProvider(new IClientAreaProvider() {

            @Override
            public Rectangle getClientArea() {
                return new Rectangle(0, 0, 800, 400);
            }

        });
        this.viewportLayer.setOriginX(this.viewportLayer.getStartXOfColumnPosition(2));
        this.viewportLayer.setOriginY(this.viewportLayer.getStartYOfRowPosition(2));
    }

    @After
    public void after() {
        assertFalse(this.event.isHorizontalStructureChanged());

        assertTrue(this.event.isVerticalStructureChanged());
        assertNull(this.event.getColumnDiffs());
    }

    /**
     * - - - + before: 0 1 2 3 4 5 6 7 8 after: 0 1 5 6 2 3 4 7 8 - + + +
     */
    @Test
    public void testReorderRightRowDiffs() {
        this.event = new RowReorderEvent(
                this.dataLayer,
                new int[] { 2, 3, 4 },
                new int[] { 2, 3, 4 },
                7,
                7,
                true);

        Collection<StructuralDiff> rowDiffs = this.event.getRowDiffs();
        assertNotNull(rowDiffs);
        assertEquals(2, rowDiffs.size());
        Iterator<StructuralDiff> iterator = rowDiffs.iterator();
        assertEquals(new StructuralDiff(DiffTypeEnum.DELETE, new Range(2, 5), new Range(2, 2)), iterator.next());
        assertEquals(new StructuralDiff(DiffTypeEnum.ADD, new Range(7, 7), new Range(4, 7)), iterator.next());
    }

    /**
     * - - - + before: 0 1 2 3 4 5 6 7 8 after: 0 1 5 6 2 3 4 7 8 - + + +
     */
    @Test
    public void testReorderRightConvertToLocal() {
        this.event = new RowReorderEvent(
                this.dataLayer,
                new int[] { 2, 3, 4 },
                new int[] { 2, 3, 4 },
                7,
                7,
                true);
        this.event.convertToLocal(this.viewportLayer);

        Collection<StructuralDiff> rowDiffs = this.event.getRowDiffs();
        assertNotNull(rowDiffs);
        assertEquals(2, rowDiffs.size());
        Iterator<StructuralDiff> iterator = rowDiffs.iterator();
        assertEquals(new StructuralDiff(DiffTypeEnum.DELETE, new Range(0, 3), new Range(0, 0)), iterator.next());
        assertEquals(new StructuralDiff(DiffTypeEnum.ADD, new Range(5, 5), new Range(2, 5)), iterator.next());
    }

    /**
     * + - - - before: 0 1 2 3 4 5 6 7 8 9 10 after: 0 1 7 8 9 2 3 4 5 6 10 + +
     * + -
     */
    @Test
    public void testReorderLeftRowDiffs() {
        this.event = new RowReorderEvent(
                this.dataLayer,
                new int[] { 7, 8, 9 },
                new int[] { 7, 8, 9 },
                2,
                2,
                true);

        Collection<StructuralDiff> rowDiffs = this.event.getRowDiffs();
        assertNotNull(rowDiffs);
        assertEquals(2, rowDiffs.size());
        Iterator<StructuralDiff> iterator = rowDiffs.iterator();
        assertEquals(new StructuralDiff(DiffTypeEnum.DELETE, new Range(7, 10), new Range(10, 10)), iterator.next());
        assertEquals(new StructuralDiff(DiffTypeEnum.ADD, new Range(2, 2), new Range(2, 5)), iterator.next());
    }

    /**
     * + - - - before: 0 1 2 3 4 5 6 7 8 9 10 after: 0 1 7 8 9 2 3 4 5 6 10 + +
     * + -
     */
    @Test
    public void testReorderLeftConvertToLocal() {
        this.event = new RowReorderEvent(
                this.dataLayer,
                new int[] { 7, 8, 9 },
                new int[] { 7, 8, 9 },
                2,
                2,
                true);
        this.event.convertToLocal(this.viewportLayer);

        Collection<StructuralDiff> rowDiffs = this.event.getRowDiffs();
        assertNotNull(rowDiffs);
        assertEquals(2, rowDiffs.size());
        Iterator<StructuralDiff> iterator = rowDiffs.iterator();
        assertEquals(new StructuralDiff(DiffTypeEnum.DELETE, new Range(5, 8), new Range(8, 8)), iterator.next());
        assertEquals(new StructuralDiff(DiffTypeEnum.ADD, new Range(0, 0), new Range(0, 3)), iterator.next());
    }

}
