Home | History | Annotate | Download | only in google
      1 /*
      2  * Copyright (C) 2012 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.collect.testing.google;
     18 
     19 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
     20 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
     21 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
     22 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT;
     23 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
     24 import static com.google.common.truth.Truth.assertThat;
     25 
     26 import com.google.common.annotations.GwtCompatible;
     27 import com.google.common.collect.Multimap;
     28 import com.google.common.collect.testing.Helpers;
     29 import com.google.common.collect.testing.features.CollectionSize;
     30 import com.google.common.collect.testing.features.MapFeature;
     31 
     32 import java.util.ArrayList;
     33 import java.util.Arrays;
     34 import java.util.Collection;
     35 import java.util.Collections;
     36 import java.util.List;
     37 
     38 /**
     39  * Tests for {@link Multimap#replaceValues(Object, Iterable)}.
     40  *
     41  * @author Louis Wasserman
     42  */
     43 @GwtCompatible
     44 public class MultimapReplaceValuesTester<K, V>
     45     extends AbstractMultimapTester<K, V, Multimap<K, V>> {
     46 
     47   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE, ALLOWS_NULL_VALUES})
     48   public void testReplaceValuesWithNullValue() {
     49     int size = multimap().size();
     50     K key = sampleKeys().e0;
     51     @SuppressWarnings("unchecked")
     52     List<V> values = Arrays.asList(sampleValues().e0, null, sampleValues().e3);
     53     multimap().replaceValues(key, values);
     54     assertGet(key, values);
     55   }
     56 
     57   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE, ALLOWS_NULL_KEYS})
     58   public void testReplaceValuesWithNullKey() {
     59     int size = multimap().size();
     60     K key = null;
     61     @SuppressWarnings("unchecked")
     62     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
     63     multimap().replaceValues(key, values);
     64     assertGet(key, values);
     65   }
     66 
     67   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
     68   public void testReplaceEmptyValues() {
     69     int size = multimap().size();
     70     K key = sampleKeys().e3;
     71     @SuppressWarnings("unchecked")
     72     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
     73     multimap().replaceValues(key, values);
     74     assertGet(key, values);
     75     assertEquals(size + values.size(), multimap().size());
     76   }
     77 
     78   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
     79   public void testReplaceValuesWithEmpty() {
     80     int size = multimap().size();
     81     K key = sampleKeys().e0;
     82     List<V> oldValues = new ArrayList<V>(multimap().get(key));
     83     @SuppressWarnings("unchecked")
     84     List<V> values = Collections.emptyList();
     85     assertEquals(oldValues, new ArrayList<V>(multimap().replaceValues(key, values)));
     86     assertGet(key);
     87     assertEquals(size - oldValues.size(), multimap().size());
     88   }
     89 
     90   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
     91   public void testReplaceValuesWithDuplicates() {
     92     int size = multimap().size();
     93     K key = sampleKeys().e0;
     94     List<V> oldValues = new ArrayList<V>(multimap().get(key));
     95     List<V> values = Arrays.asList(
     96         sampleValues().e0,
     97         sampleValues().e3,
     98         sampleValues().e0);
     99     assertEquals(oldValues, new ArrayList<V>(multimap().replaceValues(key, values)));
    100     assertEquals(
    101         size - oldValues.size() + multimap().get(key).size(),
    102         multimap().size());
    103     assertTrue(multimap().get(key).containsAll(values));
    104   }
    105 
    106   @CollectionSize.Require(absent = ZERO)
    107   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
    108   public void testReplaceNonEmptyValues() {
    109     List<K> keys = Helpers.copyToList(multimap().keySet());
    110     @SuppressWarnings("unchecked")
    111     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
    112 
    113     for (K k : keys) {
    114       resetContainer();
    115 
    116       int size = multimap().size();
    117       Collection<V> oldKeyValues = Helpers.copyToList(multimap().get(k));
    118       multimap().replaceValues(k, values);
    119       assertGet(k, values);
    120       assertEquals(size + values.size() - oldKeyValues.size(), multimap().size());
    121     }
    122   }
    123 
    124   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
    125   public void testReplaceValuesPropagatesToGet() {
    126     K key = sampleKeys().e0;
    127     Collection<V> getCollection = multimap().get(key);
    128     @SuppressWarnings("unchecked")
    129     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
    130     multimap().replaceValues(key, values);
    131     assertThat(getCollection).has().exactly(
    132         sampleValues().e0, sampleValues().e2, sampleValues().e3);
    133   }
    134 
    135   @MapFeature.Require(absent = SUPPORTS_REMOVE)
    136   @CollectionSize.Require(absent = ZERO)
    137   public void testReplaceValuesRemoveNotSupported() {
    138     List<V> values = Collections.singletonList(sampleValues().e3);
    139     try {
    140       multimap().replaceValues(sampleKeys().e0, values);
    141       fail("Expected UnsupportedOperationException");
    142     } catch (UnsupportedOperationException expected) {
    143       // success
    144     }
    145   }
    146 
    147   @MapFeature.Require(absent = SUPPORTS_PUT)
    148   public void testReplaceValuesPutNotSupported() {
    149     List<V> values = Collections.singletonList(sampleValues().e3);
    150     try {
    151       multimap().replaceValues(sampleKeys().e0, values);
    152       fail("Expected UnsupportedOperationException");
    153     } catch (UnsupportedOperationException expected) {
    154       // success
    155     }
    156   }
    157 }
    158