/*
* Author: Alexis Cartier <alexcrt>
* Date : 27 déc. 2014
*/
package com.codepoetics.protonpack;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.codepoetics.protonpack.maps.MapStream;
import org.junit.Before;
import org.junit.Test;
public class MapStreamTest {
private MapStream<String, Integer> mapStream;
@Before
public void setUp() {
mapStream = MapStream.of("John", 1, "Alice", 2);
}
@Test
public void testMapKeys() {
Map<String, Integer> map = mapStream.mapKeys(x -> x.substring(2)).collect();
assertTrue(map.containsKey("hn"));
assertEquals(Integer.valueOf(1), map.get("hn"));
}
@Test
public void testMapValues() {
Map<String, Integer> map = mapStream.mapValues(x -> x + 5).collect();
assertEquals(Integer.valueOf(6), map.get("John"));
}
@Test
public void testMapEntries() {
Map<String, Integer> map = mapStream.mapEntries(x -> x.concat(" Doe"), i -> i%2).collect();
assertEquals(Integer.valueOf(1), map.get("John Doe"));
assertEquals(Integer.valueOf(0), map.get("Alice Doe"));
}
@Test
public void testMapEntriesWithBiFunction() {
List<String> list = mapStream.mapEntries((k, v) -> k + " " + v).collect(toList());
assertThat(list, contains("John 1", "Alice 2"));
}
@Test(expected = IllegalStateException.class)
public void testFailMergeKeys() {
mapStream.mapKeys(x -> Character.isUpperCase(x.charAt(0))).collect();
}
@Test
public void testMergeKeys() {
Map<Boolean, List<Integer>> map = mapStream.mapKeys(x -> Character.isUpperCase(x.charAt(0))).mergeKeys().collect();
assertEquals(Arrays.asList(1, 2), map.get(true));
assertEquals(null, map.get(false));
}
@Test
public void testMergeKeysWithBinaryFunction() {
Map<Boolean, Integer> map = mapStream.mapKeys(x -> Character.isUpperCase(x.charAt(0))).mergeKeys(Integer::sum).collect();
assertEquals(Integer.valueOf(3), map.get(true));
assertEquals(null, map.get(false));
}
@Test
public void testReverseMapping() {
Map<Integer, String> map = mapStream.inverseMapping().collect();
assertEquals("John", map.get(1));
assertEquals("Alice", map.get(2));
map.put(3, "John");
Map<String, Integer> mapReversed = MapStream.of(map).inverseMapping().collect(Integer::sum);
assertEquals(Integer.valueOf(4), mapReversed.get("John"));
assertEquals(Integer.valueOf(2), mapReversed.get("Alice"));
}
}