// Path: src/main/java/net/kimleo/rec/common/collection/LinkedMultiHashMap.java
// public class LinkedMultiHashMap<K, V> implements MultiMap<K, V> {
// 
//     private final Map<K, Collection<V>> map = new LinkedHashMap<>();
// 
//     @Override
//     public int size() {
//         int sum = 0;
//         for (Collection<V> vs : map.values()) {
//             if (vs != null) {
//                 sum += vs.size();
//             }
//         }
//         return sum;
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return map.isEmpty();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         return map.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         for (Collection<V> vs : map.values()) {
//             if (vs != null && vs.contains(value))
//                 return true;
//         }
//         return false;
//     }
// 
//     @Override
//     public Collection<V> get(Object key) {
//         return map.get(key);
//     }
// 
//     @Override
//     public Collection<V> put(K key, Collection<V> value) {
//         if (map.containsKey(key)) {
//             map.get(key).addAll(value);
//         } else {
//             map.put(key, value);
//         }
//         return value;
//     }
// 
//     @Override
//     public Collection<V> remove(Object key) {
//         return map.remove(key);
//     }
// 
//     @Override
//     public void putAll(Map<? extends K, ? extends Collection<V>> m) {
//         for (K key : m.keySet()) {
//             if (map.containsKey(key)) {
//                 map.get(key).addAll(m.get(key));
//             } else {
//                 map.put(key, m.get(key));
//             }
//         }
//     }
// 
//     @Override
//     public void clear() {
//         map.clear();
//     }
// 
//     @Override
//     public Set<K> keySet() {
//         return map.keySet();
//     }
// 
//     @Override
//     public Collection<Collection<V>> values() {
//         return map.values();
//     }
// 
//     @Override
//     public Set<Entry<K, Collection<V>>> entrySet() {
//         return map.entrySet();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         return o instanceof LinkedMultiHashMap && map.equals(((LinkedMultiHashMap) o).map);
//     }
// 
//     @Override
//     public int hashCode() {
//         return map.hashCode();
//     }
// 
//     @Override
//     public int keyCount() {
//         return map.size();
//     }
// 
//     @Override
//     public int valueCount() {
//         return size();
//     }
// 
//     @Override
//     public V put1(K key, V value) {
//         if (map.containsKey(key)) {
//             map.get(key).add(value);
//         } else {
//             Set<V> vs = new HashSet<>();
//             vs.add(value);
//             map.put(key, vs);
//         }
//         return value;
//     }
// 
//     public static <V, U> MultiMap<V, U> from(Stream<V> collection, Function<V, U> transform) {
//         LinkedMultiHashMap<V, U> multiMap = new LinkedMultiHashMap<>();
//         collection.forEach(item -> multiMap.put1(item, transform.apply(item)));
// 
//         return multiMap;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/common/collection/MultiMap.java
// public interface MultiMap<K, V> extends Map<K, Collection<V>> {
//     int keyCount();
// 
//     int valueCount();
// 
//     V put1(K key, V value);
// }


import net.kimleo.rec.common.collection.LinkedMultiHashMap;
import net.kimleo.rec.common.collection.MultiMap;
import org.junit.Test;
import java.util.Arrays;
import java.util.stream.Stream;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertTrue;
package net.kimleo.rec.v2;




public class LinkedMultiHashMapTest {
    @Test
    public void shouldBuildAMapSuccessfully() throws Exception {
// Path: src/main/java/net/kimleo/rec/common/collection/LinkedMultiHashMap.java
// public class LinkedMultiHashMap<K, V> implements MultiMap<K, V> {
// 
//     private final Map<K, Collection<V>> map = new LinkedHashMap<>();
// 
//     @Override
//     public int size() {
//         int sum = 0;
//         for (Collection<V> vs : map.values()) {
//             if (vs != null) {
//                 sum += vs.size();
//             }
//         }
//         return sum;
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return map.isEmpty();
//     }
// 
//     @Override
//     public boolean containsKey(Object key) {
//         return map.containsKey(key);
//     }
// 
//     @Override
//     public boolean containsValue(Object value) {
//         for (Collection<V> vs : map.values()) {
//             if (vs != null && vs.contains(value))
//                 return true;
//         }
//         return false;
//     }
// 
//     @Override
//     public Collection<V> get(Object key) {
//         return map.get(key);
//     }
// 
//     @Override
//     public Collection<V> put(K key, Collection<V> value) {
//         if (map.containsKey(key)) {
//             map.get(key).addAll(value);
//         } else {
//             map.put(key, value);
//         }
//         return value;
//     }
// 
//     @Override
//     public Collection<V> remove(Object key) {
//         return map.remove(key);
//     }
// 
//     @Override
//     public void putAll(Map<? extends K, ? extends Collection<V>> m) {
//         for (K key : m.keySet()) {
//             if (map.containsKey(key)) {
//                 map.get(key).addAll(m.get(key));
//             } else {
//                 map.put(key, m.get(key));
//             }
//         }
//     }
// 
//     @Override
//     public void clear() {
//         map.clear();
//     }
// 
//     @Override
//     public Set<K> keySet() {
//         return map.keySet();
//     }
// 
//     @Override
//     public Collection<Collection<V>> values() {
//         return map.values();
//     }
// 
//     @Override
//     public Set<Entry<K, Collection<V>>> entrySet() {
//         return map.entrySet();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         return o instanceof LinkedMultiHashMap && map.equals(((LinkedMultiHashMap) o).map);
//     }
// 
//     @Override
//     public int hashCode() {
//         return map.hashCode();
//     }
// 
//     @Override
//     public int keyCount() {
//         return map.size();
//     }
// 
//     @Override
//     public int valueCount() {
//         return size();
//     }
// 
//     @Override
//     public V put1(K key, V value) {
//         if (map.containsKey(key)) {
//             map.get(key).add(value);
//         } else {
//             Set<V> vs = new HashSet<>();
//             vs.add(value);
//             map.put(key, vs);
//         }
//         return value;
//     }
// 
//     public static <V, U> MultiMap<V, U> from(Stream<V> collection, Function<V, U> transform) {
//         LinkedMultiHashMap<V, U> multiMap = new LinkedMultiHashMap<>();
//         collection.forEach(item -> multiMap.put1(item, transform.apply(item)));
// 
//         return multiMap;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/common/collection/MultiMap.java
// public interface MultiMap<K, V> extends Map<K, Collection<V>> {
//     int keyCount();
// 
//     int valueCount();
// 
//     V put1(K key, V value);
// }


// Path: src/test/java/net/kimleo/rec/v2/LinkedMultiHashMapTest.java
import net.kimleo.rec.common.collection.LinkedMultiHashMap;
import net.kimleo.rec.common.collection.MultiMap;
import org.junit.Test;
import java.util.Arrays;
import java.util.stream.Stream;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertTrue;

package net.kimleo.rec.v2;




public class LinkedMultiHashMapTest {
    @Test
    public void shouldBuildAMapSuccessfully() throws Exception {
        MultiMap<Integer, Integer> map = LinkedMultiHashMap.from(Stream.of(1, 1, 1, 2, 2, 2, 3, 3, 3), x -> x);