package org.hamcrest.text;

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

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace;

public class IsEqualIgnoringWhiteSpaceTest extends AbstractMatcherTest {

    private final Matcher<String> matcher = equalToIgnoringWhiteSpace("Hello World   how\n are we? ");

    @Override
    protected Matcher<?> createMatcher() {
        return matcher;
    }

    public void testPassesIfWordsAreSameButWhitespaceDiffers() {
        assertThat("Hello World how are we?", matcher);
        assertThat("   Hello World   how are \n\n\twe?", matcher);
    }

    public void testFailsIfTextOtherThanWhitespaceDiffers() {
        assertThat("Hello PLANET how are we?", not(matcher));
        assertThat("Hello World how are we", not(matcher));
    }

    public void testFailsIfWhitespaceIsAddedOrRemovedInMidWord() {
        assertThat("HelloWorld how are we?", not(matcher));
        assertThat("Hello Wo rld how are we?", not(matcher));
    }

    public void testFailsIfMatchingAgainstNull() {
        assertThat(null, not(matcher));
    }

    public void testRequiresNonNullStringToBeConstructed() {
        try {
            new IsEqualIgnoringWhiteSpace(null);
            fail("Expected exception");
        } catch (IllegalArgumentException goodException) {
            // expected!
        }
    }

    public void testHasAReadableDescription() {
        assertDescription("equalToIgnoringWhiteSpace(\"Hello World   how\\n are we? \")",
                        matcher);
    }
}
