package function.builtin.predicate;

import static testutil.TestUtilities.evaluateString;
import static testutil.TypeAssertions.assertNil;
import static testutil.TypeAssertions.assertT;

import org.junit.Test;

import function.ArgumentValidator.BadArgumentTypeException;
import function.ArgumentValidator.TooFewArgumentsException;
import testutil.SymbolAndFunctionCleaner;

public class NUMERIC_EQUALTest extends SymbolAndFunctionCleaner {

    @Test
    public void numericEqualWithOneNumber() {
        String input = "(= 1)";

        assertT(evaluateString(input));
    }

    @Test
    public void numericEqualWithEqualNumbers() {
        String input = "(= 1 1)";

        assertT(evaluateString(input));
    }

    @Test
    public void numericEqualWithNonEqualNumbers() {
        String input = "(= 1 2)";

        assertNil(evaluateString(input));
    }

    @Test
    public void numericEqualWithManyEqualNumbers() {
        String input = "(= 4 4 4 4 4 4 4 4 4 4)";

        assertT(evaluateString(input));
    }

    @Test
    public void numericEqualWithManyNonEqualNumbers() {
        String input = "(= 4 4 4 4 5 4 4 4 4 4)";

        assertNil(evaluateString(input));
    }

    @Test(expected = BadArgumentTypeException.class)
    public void numericEqualWithNonNumbers() {
        evaluateString("(= 'x 'x)");
    }

    @Test(expected = TooFewArgumentsException.class)
    public void numericEqualWithTooFewArguments() {
        evaluateString("(=)");
    }

}
