package com.googlecode.totallylazy.collections; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.Option; import com.googlecode.totallylazy.Pair; import com.googlecode.totallylazy.predicates.Predicates; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.functions.TimeReport; import org.junit.Ignore; import org.junit.Test; 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.Strings.contains; import static com.googlecode.totallylazy.collections.PersistentMap.constructors.emptyMap; import static com.googlecode.totallylazy.collections.PersistentMap.constructors.map; import static com.googlecode.totallylazy.matchers.IterableMatcher.hasExactly; import static com.googlecode.totallylazy.matchers.Matchers.is; import static com.googlecode.totallylazy.numbers.Numbers.add; import static com.googlecode.totallylazy.numbers.Numbers.range; import static org.hamcrest.MatcherAssert.assertThat; public class PersistentMapTest { @Test public void canPutAndReturnOldValue() throws Exception { PersistentMap <Integer, String> pairs = map(4, "Four", 5, "Five", 3, "Three", 2, "Two", 6, "Six"); Pair<PersistentMap <Integer, String>, Option<String>> result = PersistentMap.methods.put(pairs, 4, "NewFour"); assertThat(result.first().lookup(4).get(), is("NewFour")); assertThat(result.second().get(), is("Four")); } @Test public void canRemoveAndReturnOldValue() throws Exception { PersistentMap <Integer, String> pairs = map(4, "Four", 5, "Five", 3, "Three", 2, "Two", 6, "Six"); Pair<PersistentMap <Integer, String>, Option<String>> result = PersistentMap.methods.remove(pairs, 4); assertThat(result.first().lookup(4).isEmpty(), is(true)); assertThat(result.second().get(), is("Four")); } @Test public void canCalculateSize() throws Exception { assertThat(map(4, 4, 5, 5, 3, 3, 2, 2, 6, 6).size(), is(5)); } @Test @Ignore("Manual") public void creatingASortedMapFromAnIterableIsFast() throws Exception { //in order - fold / cons Elapsed msecs for 11 runs: Avg:13.460369555555555 Min:8.874518 Max:99.661891 Total:229.67973499999997 //in order - sorted list Elapsed msecs for 11 runs: Avg:11.016874222222222 Min:6.171428 Max:101.041891 Total:206.36518700000005 // shuffle - fold / cons Elapsed msecs for 11 runs: Avg:19.289151888888888 Min:13.316564 Max:113.912953 Total:300.831884 // shuffle - sorted list Elapsed msecs for 11 runs: Avg:15.702062000000002 Min:8.892117 Max:125.818735 Total:276.02941000000004 final Sequence<Integer> integers = range(0, 10000).safeCast(Integer.class).shuffle(); TimeReport time = TimeReport.time(10, () -> { return map(integers.map(asPair())); }); System.out.println(time); } public static Function1<Integer, Pair<Integer, Integer>> asPair() { return integer -> Pair.pair(integer, integer); } @Test public void canRemove() throws Exception { final PersistentMap<Integer, String> map = map(4, "Alex", 1, "Dan", 3, "Stu", 2, "Ray"); assertThat(map.delete(4), hasExactly(pair(1, "Dan"), pair(2, "Ray"), pair(3, "Stu"))); assertThat(map.delete(3), hasExactly(pair(1, "Dan"), pair(2, "Ray"), pair(4, "Alex"))); assertThat(map.delete(2), hasExactly(pair(1, "Dan"), pair(3, "Stu"), pair(4, "Alex"))); assertThat(map.delete(1), hasExactly(pair(2, "Ray"), pair(3, "Stu"), pair(4, "Alex"))); assertThat(map.delete(0), is(map)); } @Test public void canPut() throws Exception { PersistentMap<Integer, String> map = map(1, "Dan").insert(3, "Stu").insert(2, "Ray"); assertThat(map, hasExactly(pair(1, "Dan"), pair(2, "Ray"), pair(3, "Stu"))); } @Test public void canCheckContains() throws Exception { PersistentMap<Integer, String> map = map(1, "Dan", 2, "Ray", 3, "Stu"); assertThat(map.contains(2), is(true)); assertThat(map.contains(4), is(false)); } @Test public void supportsExists() throws Exception { PersistentMap<Integer, String> map = map(1, "Dan", 2, "Ray", 3, "Stu"); assertThat(map.exists(Predicates.is(2)), is(true)); assertThat(map.exists(Predicates.is(4)), is(false)); } @Test public void canCreateATreeFromAnIterable() throws Exception { PersistentMap<Integer, String> map = map(sequence(pair(1, "Dan"), pair(2, "Ray"), pair(3, "Stu"))); assertThat(map.contains(2), is(true)); assertThat(map.contains(4), is(false)); } @Test public void canConvertToPersistentList() throws Exception { PersistentList<Pair<Integer, String>> map = map(2, "Ray", 1, "Dan", 3, "Stu").toPersistentList(); assertThat(map, hasExactly(pair(1, "Dan"), pair(2, "Ray"), pair(3, "Stu"))); } @Test public void canJoin() throws Exception { PersistentMap<Integer, String> map = map(1, "Dan", 2, "Ray").joinTo(map(4, "Matt", 3, "Stu")); assertThat(map, hasExactly(pair(1, "Dan"), pair(2, "Ray"), pair(3, "Stu"), pair(4, "Matt"))); } @Test public void canGet() throws Exception { PersistentMap<Integer, String> map = map(1, "Dan", 2, "Ray", 3, "Stu"); assertThat(map.lookup(2), is(some("Ray"))); assertThat(map.lookup(4), is(none(String.class))); } }