package org.hamcrest.collection;

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

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

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsMapContaining.hasKey;

public class IsMapContainingKeyTest extends AbstractMatcherTest {

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

    
public void testMatchesSingletonMapContainingKey() {
        
Map<String,Integer> map = new HashMap<String, Integer>();
        
map.put("a", 1);
        

        
assertMatches("Matches single key", hasKey("a"), map);
    
}
    

    
public void testMatchesMapContainingKey() {
        
Map<String,Integer> map = new HashMap<String, Integer>();
        
map.put("a", 1);
        
map.put("b", 2);
        
map.put("c", 3);
        

        
assertMatches("Matches a", hasKey("a"), map);
        
assertMatches("Matches c", hasKey("c"), map);
    
}
    


//
    
No longer compiles
//
    
public void testMatchesMapContainingKeyWithNoGenerics() {
//
        
Map map = new HashMap();
//
        
map.put("a", 1);
//
        
map.put("b", 2);
//
        
map.put("c", 3);
//
//
        
assertMatches("Matches a", hasKey("a"), map);
//
        
assertMatches("Matches c", hasKey("c"), map);
//
    
}

    
public void testMatchesMapContainingKeyWithIntegerKeys() throws Exception {
        
Map<Integer, String> map = new HashMap<Integer, String>();
        
map.put(1, "A");
        
map.put(2, "B");

        
assertThat(map, hasKey(1));
    
}

    
public void testMatchesMapContainingKeyWithNumberKeys() throws Exception {
        
Map<Number, String> map = new HashMap<Number, String>();
        
map.put(1, "A");
        
map.put(2, "B");

        
assertThat(map, hasKey((Number)1));

        
// TODO: work out the correct sprinkling of wildcards to get this to work!
//
        
assertThat(map, hasKey(1));
    
}

    
public void testHasReadableDescription() {
        
assertDescription("map containing [\"a\"->ANYTHING]", hasKey("a"));
    
}
    

    
public void testDoesNotMatchEmptyMap() {
        
assertMismatchDescription("map was []", hasKey("Foo"), new HashMap<String,Integer>());
    
}
    

    
public void testDoesNotMatchMapMissingKey() {
        
Map<String,Integer> map = new TreeMap<String, Integer>();
        
map.put("a", 1);
        
map.put("b", 2);
        
map.put("c", 3);
        

        
assertMismatchDescription("map was [<a=1>, <b=2>, <c=3>]", hasKey("d"), map);
    
}
}