/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2016 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.util.functional.collect;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections4.comparators.ComparableComparator;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Tests for SortedMap.
*
* As SortedMap is read-only, this class will only test read functionalities.
* It will focus on iterators.
*/
public class SortedMapTest
{
/** Test data set. */
private final Map<Integer, String> dataSet = new HashMap<>();
/** A classic lexicographic-order comparator. */
private final Comparator<String> cmp = new ComparableComparator<>();
/** Initialises `dataSet` Map */
public SortedMapTest()
{
dataSet.put( 0, "zz");
dataSet.put(10, "za");
dataSet.put( 1, "oo");
dataSet.put(11, "oa");
dataSet.put( 2, "jj");
dataSet.put(12, "jk");
dataSet.put( 3, "ee");
dataSet.put(13, "ez");
dataSet.put( 4, "aa");
dataSet.put(14, "az");
}
/** Constructor: If both params are null, must throw an IllegalArgumentException. */
@Test(expectedExceptions=NullPointerException.class)
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public void doubleNullTest()
{
new SortedMap(null, null);
}
/** Constructor: If map param is null, must throw an IllegalArgumentException. */
@Test(expectedExceptions=NullPointerException.class)
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public void nullMapTest()
{
new SortedMap(null, new ComparableComparator<>());
}
/** Constructor: If comparator param is null, must throw an IllegalArgumentException. */
@Test(expectedExceptions=NullPointerException.class)
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public void nullComparatorTest()
{
new SortedMap(Collections.EMPTY_MAP, null);
}
/** Constructor: Empty map param. */
@Test
public void emptyMapTest()
{
SortedMap sorted_map = new SortedMap(Collections.emptyMap(), cmp);
Assert.assertTrue(sorted_map.isEmpty());
Assert.assertEquals(sorted_map.size(), 0);
Assert.assertFalse(sorted_map.keySet().iterator().hasNext());
Assert.assertFalse(sorted_map.values().iterator().hasNext());
Assert.assertFalse(sorted_map.entrySet().iterator().hasNext());
}
/** Tests if maps correctly. */
@Test
public void sortedMapTest()
{
SortedMap<Integer, String> sorted_map = new SortedMap<>(dataSet, cmp);
Assert.assertEquals(sorted_map.size(), dataSet.size());
for (Map.Entry<Integer, String> entry: sorted_map.entrySet())
{
Assert.assertSame(entry.getValue(), dataSet.get(entry.getKey()));
}
Assert.assertTrue(sorted_map.values().containsAll(dataSet.values()));
Assert.assertTrue(dataSet.values().containsAll(sorted_map.values()));
Assert.assertTrue(sorted_map.keySet().containsAll(dataSet.keySet()));
Assert.assertTrue(dataSet.keySet().containsAll(sorted_map.keySet()));
}
/** Tests if map is sorted (keySet). */
@Test
public void sortedKeysTest()
{
SortedMap<Integer, String> sorted_map = new SortedMap<>(dataSet, cmp);
// the map should have been sorted in the lexicographic order.
String prev_val = null;
for (Integer key: sorted_map.keySet())
{
String curr_val = dataSet.get(key);
if (prev_val != null)
{
Assert.assertTrue(curr_val.compareTo(prev_val) >= 0);
}
prev_val = curr_val;
}
}
/** Tests if map is sorted (values). */
@Test
public void sortedValuesTest()
{
SortedMap<Integer, String> sorted_map = new SortedMap<>(dataSet, cmp);
String prev_val = null;
for (String val: sorted_map.values())
{
if (prev_val != null)
{
Assert.assertTrue(val.compareTo(prev_val) >= 0);
}
prev_val = val;
}
}
/** Tests if map is sorted (entries). */
@Test
public void sortedEntriesTest()
{
SortedMap<Integer, String> sorted_map = new SortedMap<>(dataSet, cmp);
String prev_val = null;
for (Map.Entry<Integer, String> entry: sorted_map.entrySet())
{
if (prev_val != null)
{
Assert.assertTrue(entry.getValue().compareTo(prev_val) >= 0);
}
prev_val = entry.getValue();
}
}
}