package com.googlecode.totallylazy;
import com.googlecode.totallylazy.predicates.Predicates;
import org.junit.Test;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.googlecode.totallylazy.Maps.filterKeys;
import static com.googlecode.totallylazy.Maps.filterValues;
import static com.googlecode.totallylazy.Maps.find;
import static com.googlecode.totallylazy.Maps.get;
import static com.googlecode.totallylazy.Maps.map;
import static com.googlecode.totallylazy.Maps.mapKeys;
import static com.googlecode.totallylazy.Maps.mapValues;
import static com.googlecode.totallylazy.Option.none;
import static com.googlecode.totallylazy.Option.some;
import static com.googlecode.totallylazy.Pair.pair;
import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.Sets.set;
import static com.googlecode.totallylazy.Strings.contains;
import static com.googlecode.totallylazy.Strings.toLowerCase;
import static com.googlecode.totallylazy.matchers.IterableMatcher.hasExactly;
import static com.googlecode.totallylazy.numbers.Numbers.add;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
public class MapsTest {
@Test
public void supportsGettingAValueAsAnOption() throws Exception {
assertThat(get(map(pair("Dan", 2)), "Dan"), is(some(2)));
assertThat(get(map(pair("Dan", 2)), "Matt"), is(none(Integer.class)));
}
@Test
public void supportsFindingAValueAsAnOption() throws Exception {
assertThat(find(map(pair("Dan", 2)), contains("a")), is(some(2)));
assertThat(find(map(pair("Dan", 2)), contains("b")), is(none(Integer.class)));
}
@Test
public void supportsFilteringByKey() throws Exception {
assertThat(filterKeys(map(pair("Dan", 2)), contains("a")), is(map(pair("Dan", 2))));
assertThat(filterKeys(map(pair("Dan", 2)), contains("b")), is(Maps.<String, Integer>map()));
}
@Test
public void supportsFilteringByValue() throws Exception {
assertThat(filterValues(map(pair("Dan", 2)), Predicates.is(2)), is(map(pair("Dan", 2))));
assertThat(filterValues(map(pair("Dan", 2)), Predicates.is(3)), is(Maps.<String, Integer>map()));
}
@Test
public void supportsMappingKeys() throws Exception {
assertThat(mapKeys(map(pair("Dan", 2)), toLowerCase()), is(map(pair("dan", 2))));
}
@Test
public void supportsMappingValues() throws Exception {
assertThat(mapValues(map(pair("Dan", 2)), add(2)), is(map(pair("Dan", (Number)4))));
}
@Test
public void maintainsMapEntriesOrder() throws Exception {
Map<String, String> map = map(Pair.pair("name", "Dan"), Pair.pair("tel", "123432"));
assertThat(map.keySet().iterator().next(), is("name"));
}
@Test
public void supportsMultiValuedMapCreation() throws Exception {
Map<String, List<String>> map = Maps.multiMap(Pair.pair("name", "Dan"), Pair.pair("name", "Mat"));
List<String> values = map.entrySet().iterator().next().getValue();
assertThat(values, hasExactly("Dan", "Mat"));
}
@Test
public void supportsConvertingPairsToMapEntries() throws Exception {
Map<String, Integer> map = new AbstractMap<String, Integer>() {
@Override
public Set<Entry<String, Integer>> entrySet() {
return set(Sequences.<Entry<String, Integer>>sequence(pair("dan", 1), pair("matt", 2)));
}
};
assertThat(map, hasEntry("dan", 1));
assertThat(map, hasEntry("matt", 2));
}
@Test
public void supportsConvertingMapEntriesToPairs() throws Exception {
Map<String, Integer> map = map();
map.put("Dan", 2);
assertThat(sequence(Maps.pairs(map)), hasExactly(pair("Dan", 2)));
}
@Test
public void supportsConvertingASequenceOfPairsToAMap() throws Exception {
Map<String, Integer> map = sequence(pair("dan", 1), pair("matt", 2)).fold(Maps.<String, Integer>map(), Maps.<String, Integer>asMap());
assertThat(map, hasEntry("dan", 1));
assertThat(map, hasEntry("matt", 2));
}
@Test
public void supportsConvertingASequenceOfPairToAMultiValuedMap() throws Exception {
Map<String, List<Integer>> map = sequence(pair("dan", 1), pair("dan", 2)).fold(Maps.<String, List<Integer>>map(), Maps.<String, Integer>asMultiValuedMap());
assertThat(map.get("dan"), hasExactly(1, 2));
}
}