package org.hamcrest.text;

import org.hamcrest.Matcher;
import org.junit.Test;

import static org.hamcrest.AbstractMatcherTest.*;
import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase;

public final class IsEqualIgnoringCaseTest {

    @Test public void
    copesWithNullsAndUnknownTypes() {
        Matcher<String> matcher = equalToIgnoringCase("irrelevant");
        
        assertNullSafe(matcher);
        assertUnknownTypeSafe(matcher);
    }

    @Test public void
    ignoresCaseOfCharsInString() {
        final Matcher<String> matcher = equalToIgnoringCase("heLLo");
		
        assertMatches(matcher, "HELLO");
        assertMatches(matcher, "hello");
        assertMatches(matcher, "HelLo");
    	assertDoesNotMatch(matcher, "bye");
    }

    @Test public void 
    mismatchesIfAdditionalWhitespaceIsPresent() {
    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
		
    	assertDoesNotMatch(matcher, "hello ");
    	assertDoesNotMatch(matcher, " hello");
    }

    @Test public void 
    mismatchesNull() {
    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
		
    	assertDoesNotMatch(matcher, null);
    }

    @Test(expected=IllegalArgumentException.class) public void
    canOnlyBeConstructedAboutANonNullString() {
        equalToIgnoringCase(null);
    }


    @Test public void
    describesItself() {
    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
        assertDescription("equalToIgnoringCase(\"heLLo\")", matcher);
    }

    @Test public void
    describesAMismatch() {
    	final Matcher<String> matcher = equalToIgnoringCase("heLLo");
    	String expectedMismatchString = "was \"Cheese\"";
        assertMismatchDescription(expectedMismatchString, matcher, "Cheese");
    }
}
