/*******************************************************************************
 * Copyright (c) 2013, 2020 Dirk Fauth and others.
 *
 * 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;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.nebula.widgets.nattable.coordinate.Range;
import org.eclipse.nebula.widgets.nattable.data.IColumnAccessor;
import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
import org.eclipse.nebula.widgets.nattable.layer.event.ColumnDeleteEvent;
import org.eclipse.nebula.widgets.nattable.layer.event.ColumnInsertEvent;
import org.junit.Before;
import org.junit.Test;

/**
 * Test class for testing handling of IStructuralChangeEvents in
 * ColumnReorderLayer
 *
 * @author Dirk Fauth
 *
 */
public class ColumnReorderLayerStructuralChangeEventTest {

    List<List<String>> contents;
    private IUniqueIndexLayer underlyingLayer;
    private ColumnReorderLayer columnReorderLayer;

    @Before
    public void setUp() {
        this.contents = new ArrayList<List<String>>();
        this.contents.add(new ArrayList<String>(Arrays.asList("one", "two", "three",
                "four")));
        this.underlyingLayer = new DataLayer(new ListDataProvider<List<String>>(
                this.contents, new IColumnAccessor<List<String>>() {

                    @Override
                    public Object getDataValue(List<String> rowObject,
                            int columnIndex) {
                        return rowObject.get(columnIndex);
                    }

                    @Override
                    public void setDataValue(List<String> rowObject,
                            int columnIndex, Object newValue) {
                        // ignore
                    }

                    @Override
                    public int getColumnCount() {
                        return ColumnReorderLayerStructuralChangeEventTest.this.contents.get(0).size();
                    }
                }));
        this.columnReorderLayer = new ColumnReorderLayer(this.underlyingLayer);
    }

    @Test
    public void testHandleColumnDeleteEvent() {
        // test start order: 0 1 2 3
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // reorder to inverse order: 3 2 1 0
        this.columnReorderLayer.reorderColumnPosition(3, 0);
        this.columnReorderLayer.reorderColumnPosition(3, 1);
        this.columnReorderLayer.reorderColumnPosition(3, 2);
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // delete column position 1 (index 2: value "three")
        this.contents.get(0).remove(2);
        this.underlyingLayer
                .fireLayerEvent(new ColumnDeleteEvent(this.underlyingLayer, 2));

        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(-1, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(2, 0));
    }

    @Test
    public void testHandleLastColumnDeleteEvent() {
        // test start order: 0 1 2 3
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // reorder to inverse order: 3 2 1 0
        this.columnReorderLayer.reorderColumnPosition(3, 0);
        this.columnReorderLayer.reorderColumnPosition(3, 1);
        this.columnReorderLayer.reorderColumnPosition(3, 2);
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // delete last column
        int lastColumnIndex = this.contents.get(0).size() - 1;
        this.contents.get(0).remove(lastColumnIndex);
        this.underlyingLayer.fireLayerEvent(new ColumnDeleteEvent(this.underlyingLayer,
                lastColumnIndex));

        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(-1, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(2, 0));
    }

    @Test
    public void testHandleMultipleColumnDeleteEvent() {
        // test start order: 0 1 2 3
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // reorder to inverse order: 3 2 1 0
        this.columnReorderLayer.reorderColumnPosition(3, 0);
        this.columnReorderLayer.reorderColumnPosition(3, 1);
        this.columnReorderLayer.reorderColumnPosition(3, 2);
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // delete columns in the middle
        this.contents.get(0).remove(1);
        this.contents.get(0).remove(1);
        this.underlyingLayer.fireLayerEvent(new ColumnDeleteEvent(this.underlyingLayer,
                new Range(1, 3)));

        assertEquals(2, this.columnReorderLayer.getColumnCount());
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(-1, this.columnReorderLayer.getColumnIndexByPosition(2));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(1, 0));
    }

    @Test
    public void testHandleColumnAddEvent() {
        // test start order: 0 1 2 3
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // reorder to inverse order: 3 2 1 0
        this.columnReorderLayer.reorderColumnPosition(3, 0);
        this.columnReorderLayer.reorderColumnPosition(3, 1);
        this.columnReorderLayer.reorderColumnPosition(3, 2);
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(3));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(3, 0));

        // add row add index 2
        this.contents.get(0).add(2, "test");
        this.underlyingLayer
                .fireLayerEvent(new ColumnInsertEvent(this.underlyingLayer, 2));

        assertEquals(4, this.columnReorderLayer.getColumnIndexByPosition(0));
        assertEquals(3, this.columnReorderLayer.getColumnIndexByPosition(1));
        assertEquals(2, this.columnReorderLayer.getColumnIndexByPosition(2));
        assertEquals(1, this.columnReorderLayer.getColumnIndexByPosition(3));
        assertEquals(0, this.columnReorderLayer.getColumnIndexByPosition(4));

        assertEquals("four", this.columnReorderLayer.getDataValueByPosition(0, 0));
        assertEquals("three", this.columnReorderLayer.getDataValueByPosition(1, 0));
        assertEquals("test", this.columnReorderLayer.getDataValueByPosition(2, 0));
        assertEquals("two", this.columnReorderLayer.getDataValueByPosition(3, 0));
        assertEquals("one", this.columnReorderLayer.getDataValueByPosition(4, 0));
    }
}
