package org.hamcrest.collection;

import static org.hamcrest.collection.IsMapContainingValue.hasValue;

import org.hamcrest.AbstractMatcherTest;
import org.hamcrest.Matcher;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class IsMapContainingValueTest extends AbstractMatcherTest {

    @Override
    protected Matcher<?> createMatcher() {
        return hasValue("foo");
    }

    public void testHasReadableDescription() {
        assertDescription("map with value \"a\"", hasValue("a"));
    }
    
    public void testDoesNotMatchEmptyMap() {
        Map<String,Integer> map = new HashMap<String,Integer>();
        assertMismatchDescription("map was []", hasValue(1), map);
    }
    
    public void testMatchesSingletonMapContainingValue() {
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("a", 1);
        
        assertMatches("Singleton map", hasValue(1), map);
    }

//    No longer compiles -- SF
//    @SuppressWarnings("unchecked")
//    public void testMatchesSingletonMapContainingValueWithoutGenerics() {
//        Map map = new HashMap();
//        map.put("a", 1);
//
//        assertMatches("Singleton map", hasValue(1), map);
//    }

    public void testMatchesMapContainingValue() {
        Map<String,Integer> map = new TreeMap<String,Integer>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        
        assertMatches("hasValue 1", hasValue(1), map);      
        assertMatches("hasValue 3", hasValue(3), map);      
        assertMismatchDescription("map was [<a=1>, <b=2>, <c=3>]", hasValue(4), map);      
    }
}
