/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.commons;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

import java.util.Collections;
import java.util.Locale;

import org.junit.Before;
import org.junit.Test;

/**
 * JUnit tests for {@link MatrixUtility}
 */
public class MatrixUtilityTest {

  private static final Object[] E1 = new Object[]{1L, "a", 30L, null};
  private static final Object[] E2 = new Object[]{2L, "b", 29L, "a"};
  private static final Object[] E3 = new Object[]{3L, "ö", 10L, "z"};
  private static final Object[] E4 = new Object[]{4L, "c", 10L, "ñ"};
  private static final Object[] E5 = new Object[]{5L, "ä", 10L, "ë"};

  private Object[][] m_array = null;

  @Before
  public void setUp() {
    m_array = new Object[][]{E1, E2, E3, E4, E5};
  }

  @Test
  public void testSort() {
    Object[][] data = new Object[][]{
        {"Aac"},
        {"ab"},
        {"äab"},
        {"Äaa"}};
    MatrixUtility.sort(Locale.GERMAN, data, 0);
    assertEquals("Äaa", data[0][0]);
    assertEquals("äab", data[1][0]);
    assertEquals("Aac", data[2][0]);
    assertEquals("ab", data[3][0]);
  }

  @Test
  public void testSortNullMatrix() {
    MatrixUtility.sort(null, 0);
  }

  @Test
  public void testSortEmptyMatrix() {
    MatrixUtility.sort(new Object[0][], 0);
  }

  @Test(expected = ArrayIndexOutOfBoundsException.class)
  public void testSortLowerBounds() {
    MatrixUtility.sort(m_array, -1);
  }

  @Test
  public void testSortUpperBounds() {
    MatrixUtility.sort(m_array, m_array.length);
  }

  @Test
  public void testSortUsingDeChLocale() {
    MatrixUtility.sort(new Locale("de", "CH"), m_array, 1);
    assertArrayEquals(new Object[][]{E1, E5, E2, E4, E3}, m_array);
  }

  @Test
  public void testSortUsingEnUsLocale() {
    MatrixUtility.sort(new Locale("en", "US"), m_array, 1);
    assertArrayEquals(new Object[][]{E1, E5, E2, E4, E3}, m_array);
  }

  @Test
  public void testSortTwoSortColumns() {
    MatrixUtility.sort(new Locale("de", "CH"), m_array, 2, 1);
    assertArrayEquals(new Object[][]{E5, E4, E3, E2, E1}, m_array);
  }

  @Test
  public void testSortNullSortValues() {
    MatrixUtility.sort(m_array, 3);
    assertArrayEquals(new Object[][]{E1, E2, E5, E4, E3}, m_array);
  }

  @Test
  public void testSortSwedish() {
    String[][] data = {
        {"Aa"},
        {"Æ"},
        {"B"},
        {"Ö"},
        {"Ø"},
        {"Z"},
        {"Å"},
        {"Ä"},
        {"Ae"},
        {"A"},
        {"Ü"}};

    MatrixUtility.sort(new Locale("sv", "SE"), data, 0);

    String[][] expected = {
        {"A"},
        {"Aa"},
        {"Ae"},
        {"B"},
        {"Ü"},
        {"Z"},
        {"Å"},
        {"Ä"},
        {"Æ"},
        {"Ö"},
        {"Ø"}};

    assertArrayEquals(expected, data);
  }

  @Test
  public void testSortComparator() {
    MatrixUtility.sortWithComparators(m_array,
        new ArrayComparator.ColumnComparator(2, new ArrayComparator.DefaultObjectComparator(new Locale("de", "CH"))),
        new ArrayComparator.ColumnComparator(1, Collections.reverseOrder(new ArrayComparator.DefaultObjectComparator(new Locale("de", "CH")))));
    assertArrayEquals(new Object[][]{E3, E4, E5, E2, E1}, m_array);
  }

  @Test
  public void testSortComparatorNoVararg() {
    MatrixUtility.sortWithComparators(m_array);
    assertArrayEquals(m_array, m_array);
  }

  @Test
  public void testSortNoVararg() {
    MatrixUtility.sort(m_array);
    assertArrayEquals(m_array, m_array);
  }

}
