// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.tools;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.HashSet;

import nl.jqno.equalsverifier.EqualsVerifier;
import org.junit.Test;

/**
 * Unit tests of {@link MultiMap} class.
 */
public class MultiMapTest {

    /**
     * Unit test of methods {@link MultiMap#equals} and {@link MultiMap#hashCode}.
     */
    @Test
    public void testEqualsContract() {
        EqualsVerifier.forClass(MultiMap.class).usingGetClass().verify();
    }

    /**
     * Various test of {@link MultiMap}.
     */
    @Test
    public void testMultiMap() {
        final MultiMap<String, String> map = new MultiMap<>();
        assertTrue(map.isEmpty());
        map.put("foo", "bar");
        map.put("foo", "baz");
        map.putVoid("alpha");
        assertEquals(2, map.size());
        assertEquals(new HashSet<>(Arrays.asList("foo", "alpha")), map.keySet());
        assertEquals(new HashSet<>(Arrays.asList("bar", "baz")), map.get("foo"));
        assertEquals(new HashSet<>(), map.get("alpha"));
        assertEquals(null, map.get("beta"));
        assertEquals(new HashSet<>(), map.getValues("alpha"));
        assertEquals(new HashSet<>(), map.getValues("beta"));
        map.put("foo", "baz2");
        map.put("foo", "baz");
        assertEquals(new HashSet<>(Arrays.asList("bar", "baz", "baz2")), map.get("foo"));
        map.remove("foo", "baz");
        assertEquals(new HashSet<>(Arrays.asList("bar", "baz2")), map.get("foo"));
        map.remove("foo");
        assertEquals(null, map.get("foo"));
        assertEquals("(alpha->{})", map.toString());
        map.remove("alpha");
        assertTrue(map.isEmpty());
        map.remove("omega", null);
        assertTrue(map.isEmpty());
        map.clear();
        assertTrue(map.isEmpty());
        map.putAll("foo", Arrays.asList("bar", "baz"));
        assertEquals(new HashSet<>(Arrays.asList("bar", "baz")), map.get("foo"));
    }
}
