// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.collect; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashMultiset; import com.google.common.collect.ImmutableSet; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.testing.google.UnmodifiableCollectionTests; import com.google.common.testing.EqualsTester; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * A test for {@link ImmutableSortedKeyListMultimap}. Started out as a copy of * ImmutableListMultimapTest. */ @RunWith(JUnit4.class) public class ImmutableSortedKeyListMultimapTest { @Test public void builderPutAllIterable() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", Arrays.asList(1, 2, 3)); builder.putAll("bar", Arrays.asList(4, 5)); builder.putAll("foo", Arrays.asList(6, 7)); Multimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder(); assertThat(multimap).hasSize(7); } @Test public void builderPutAllVarargs() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", 1, 2, 3); builder.putAll("bar", 4, 5); builder.putAll("foo", 6, 7); Multimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder(); assertThat(multimap).hasSize(7); } @Test public void builderPutAllMultimap() { Multimap toPut = LinkedListMultimap.create(); toPut.put("foo", 1); toPut.put("bar", 4); toPut.put("foo", 2); toPut.put("foo", 3); Multimap moreToPut = LinkedListMultimap.create(); moreToPut.put("foo", 6); moreToPut.put("bar", 5); moreToPut.put("foo", 7); ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll(toPut); builder.putAll(moreToPut); Multimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder(); assertThat(multimap).hasSize(7); } @Test public void builderPutAllWithDuplicates() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", 1, 2, 3); builder.putAll("bar", 4, 5); builder.putAll("foo", 1, 6, 7); ImmutableSortedKeyListMultimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 1, 6, 7).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder(); assertThat(multimap).hasSize(8); } @Test public void builderPutWithDuplicates() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", 1, 2, 3); builder.putAll("bar", 4, 5); builder.put("foo", 1); ImmutableSortedKeyListMultimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 1).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder(); assertThat(multimap).hasSize(6); } @Test public void builderPutAllMultimapWithDuplicates() { Multimap toPut = LinkedListMultimap.create(); toPut.put("foo", 1); toPut.put("bar", 4); toPut.put("foo", 2); toPut.put("foo", 1); toPut.put("bar", 5); Multimap moreToPut = LinkedListMultimap.create(); moreToPut.put("foo", 6); moreToPut.put("bar", 4); moreToPut.put("foo", 7); moreToPut.put("foo", 2); ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll(toPut); builder.putAll(moreToPut); Multimap multimap = builder.build(); assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 1, 6, 7, 2).inOrder(); assertThat(multimap).valuesForKey("bar").containsExactly(4, 5, 4).inOrder(); assertThat(multimap).hasSize(9); } @Test public void builderPutNullKey() { Multimap toPut = LinkedListMultimap.create(); toPut.put("foo", null); ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); try { builder.put(null, 1); fail(); } catch (NullPointerException expected) {} try { builder.putAll(null, Arrays.asList(1, 2, 3)); fail(); } catch (NullPointerException expected) {} try { builder.putAll(null, 1, 2, 3); fail(); } catch (NullPointerException expected) {} try { builder.putAll(toPut); fail(); } catch (NullPointerException expected) {} } @Test public void builderPutNullValue() { Multimap toPut = LinkedListMultimap.create(); toPut.put(null, 1); ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); try { builder.put("foo", null); fail(); } catch (NullPointerException expected) {} try { builder.putAll("foo", Arrays.asList(1, null, 3)); fail(); } catch (NullPointerException expected) {} try { builder.putAll("foo", 1, null, 3); fail(); } catch (NullPointerException expected) {} try { builder.putAll(toPut); fail(); } catch (NullPointerException expected) {} } @Test public void copyOf() { ListMultimap input = ArrayListMultimap.create(); input.put("foo", 1); input.put("bar", 2); input.put("foo", 3); Multimap multimap = ImmutableSortedKeyListMultimap.copyOf(input); assertThat(input).isEqualTo(multimap); assertThat(multimap).isEqualTo(input); } @Test public void copyOfWithDuplicates() { ListMultimap input = ArrayListMultimap.create(); input.put("foo", 1); input.put("bar", 2); input.put("foo", 3); input.put("foo", 1); Multimap multimap = ImmutableSortedKeyListMultimap.copyOf(input); assertThat(input).isEqualTo(multimap); assertThat(multimap).isEqualTo(input); } @Test public void copyOfEmpty() { ListMultimap input = ArrayListMultimap.create(); Multimap multimap = ImmutableSortedKeyListMultimap.copyOf(input); assertThat(input).isEqualTo(multimap); assertThat(multimap).isEqualTo(input); } @Test public void copyOfImmutableListMultimap() { Multimap multimap = createMultimap(); assertThat(ImmutableSortedKeyListMultimap.copyOf(multimap)).isSameAs(multimap); } @Test public void copyOfNullKey() { ListMultimap input = ArrayListMultimap.create(); input.put(null, 1); try { ImmutableSortedKeyListMultimap.copyOf(input); fail(); } catch (NullPointerException expected) {} } @Test public void copyOfNullValue() { ListMultimap input = ArrayListMultimap.create(); input.putAll("foo", Arrays.asList(1, null, 3)); try { ImmutableSortedKeyListMultimap.copyOf(input); fail(); } catch (NullPointerException expected) {} } @Test public void emptyMultimapReads() { Multimap multimap = ImmutableSortedKeyListMultimap.of(); assertThat(multimap).doesNotContainKey("foo"); assertThat(multimap.containsValue(1)).isFalse(); assertThat(multimap).doesNotContainEntry("foo", 1); assertThat(multimap.entries()).isEmpty(); assertThat(multimap.equals(ArrayListMultimap.create())).isTrue(); assertThat(multimap).valuesForKey("foo").isEqualTo(Collections.emptyList()); assertThat(multimap.hashCode()).isEqualTo(0); assertThat(multimap).isEmpty(); assertThat(multimap.keys()).isEqualTo(HashMultiset.create()); assertThat(multimap).isEmpty(); assertThat(multimap).isEmpty(); assertThat(multimap).isEmpty(); assertThat(multimap.toString()).isEqualTo("{}"); } @Test public void emptyMultimapWrites() { Multimap multimap = ImmutableSortedKeyListMultimap.of(); UnmodifiableCollectionTests.assertMultimapIsUnmodifiable( multimap, "foo", 1); } private Multimap createMultimap() { return ImmutableSortedKeyListMultimap.builder() .put("foo", 1).put("bar", 2).put("foo", 3).build(); } @Test public void multimapReads() { Multimap multimap = createMultimap(); assertThat(multimap).containsKey("foo"); assertThat(multimap).doesNotContainKey("cat"); assertThat(multimap.containsValue(1)).isTrue(); assertThat(multimap.containsValue(5)).isFalse(); assertThat(multimap).containsEntry("foo", 1); assertThat(multimap).doesNotContainEntry("cat", 1); assertThat(multimap).doesNotContainEntry("foo", 5); assertThat(multimap.entries()).isNotEmpty(); assertThat(multimap).hasSize(3); assertThat(multimap).isNotEmpty(); assertThat(multimap.toString()).isEqualTo("{bar=[2], foo=[1, 3]}"); } @Test public void multimapWrites() { Multimap multimap = createMultimap(); UnmodifiableCollectionTests.assertMultimapIsUnmodifiable( multimap, "bar", 2); } @Test public void multimapEquals() { Multimap multimap = createMultimap(); Multimap arrayListMultimap = ArrayListMultimap.create(); arrayListMultimap.putAll("foo", Arrays.asList(1, 3)); arrayListMultimap.put("bar", 2); new EqualsTester() .addEqualityGroup(multimap, createMultimap(), arrayListMultimap, ImmutableSortedKeyListMultimap.builder() .put("bar", 2).put("foo", 1).put("foo", 3).build()) .addEqualityGroup(ImmutableSortedKeyListMultimap.builder() .put("bar", 2).put("foo", 3).put("foo", 1).build()) .addEqualityGroup(ImmutableSortedKeyListMultimap.builder() .put("foo", 2).put("foo", 3).put("foo", 1).build()) .addEqualityGroup(ImmutableSortedKeyListMultimap.builder() .put("bar", 2).put("foo", 3).build()) .testEquals(); } @Test public void asMap() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", Arrays.asList(1, 2, 3)); builder.putAll("bar", Arrays.asList(4, 5)); Map> map = builder.build().asMap(); assertThat(map).containsEntry("foo", Arrays.asList(1, 2, 3)); assertThat(map).containsEntry("bar", Arrays.asList(4, 5)); assertThat(map).hasSize(2); assertThat(map).containsKey("foo"); assertThat(map).containsKey("bar"); assertThat(map).doesNotContainKey("notfoo"); } @Test public void asMapEntries() { ImmutableSortedKeyListMultimap.Builder builder = ImmutableSortedKeyListMultimap.builder(); builder.putAll("foo", Arrays.asList(1, 2, 3)); builder.putAll("bar", Arrays.asList(4, 5)); Set>> set = builder.build().asMap().entrySet(); Set>> other = ImmutableSet.>>builder() .add(new SimpleImmutableEntry>("foo", Arrays.asList(1, 2, 3))) .add(new SimpleImmutableEntry>("bar", Arrays.asList(4, 5))) .build(); assertThat(set).isEqualTo(other); } }