### Question:
FunctionListMap implements DisposableMap<K, V> { @Override public void putAll(Map<? extends K, ? extends V> m) { m.forEach(this::checkKeyValueAgreement); m.forEach(this::putNoAgreementCheck); } FunctionListMap(EventList<V> source, FunctionList.Function<V, K> keyFunction); @Override void dispose(); @Override int size(); @Override boolean isEmpty(); @Override boolean containsKey(Object key); @Override boolean containsValue(Object value); @Override V get(Object key); @Override V put(K key, V value); @Override void putAll(Map<? extends K, ? extends V> m); @Override void clear(); @Override V remove(Object key); @Override Collection<V> values(); @Override Set<K> keySet(); @Override Set<Entry<K, V>> entrySet(); @Override void forEach(BiConsumer<? super K, ? super V> action); @Override boolean equals(Object o); @Override int hashCode();  }### Answer:
@Test public void testPutAll() { final EventList<String> source = new BasicEventList<>(); final Map<String, String> eventMap = GlazedLists.syncEventListToMap(source, new FirstLetterFunction()); Map<String, String> values = new HashMap<>(); assertTrue(eventMap.values().isEmpty()); values.put("J", "James"); eventMap.putAll(values); assertEquals(1, eventMap.size()); assertEquals("James", eventMap.get("J")); values.clear(); values.put("J", "Jesse"); values.put("K", "Katie"); values.put("W", "Wilson"); eventMap.putAll(values); assertEquals(3, eventMap.size()); assertEquals("Jesse", eventMap.get("J")); assertEquals("Katie", eventMap.get("K")); assertEquals("Wilson", eventMap.get("W")); try { values.clear(); values.put("Z", "Ashford"); eventMap.putAll(values); fail("failed to receive IllegalArgumentException when using a key and value that do not agree"); } catch (IllegalArgumentException iae) { } }