package function.builtin.math;

import static testutil.TestUtilities.assertSExpressionsMatch;
import static testutil.TestUtilities.evaluateString;
import static testutil.TestUtilities.parseString;

import org.junit.Test;

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

public class DIVIDETest extends SymbolAndFunctionCleaner {

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

        assertSExpressionsMatch(parseString("1"), evaluateString(input));
    }

    @Test
    public void divideWithTwo() {
        String input = "(/ 2)";

        assertSExpressionsMatch(parseString("0"), evaluateString(input));
    }

    @Test
    public void divideTwoNumbers() {
        String input = "(/ 24 3)";

        assertSExpressionsMatch(parseString("8"), evaluateString(input));
    }

    @Test
    public void divideSeveralNumbers() {
        String input = "(/ 256 2 2 8)";

        assertSExpressionsMatch(parseString("8"), evaluateString(input));
    }

    @Test
    public void divideTwoNumbersWithRemainder() {
        String input = "(/ 9 2)";

        assertSExpressionsMatch(parseString("4"), evaluateString(input));
    }

    @Test
    public void divideSeveralNumbersWithRemainder() {
        String input = "(/ 19 2 5)";

        assertSExpressionsMatch(parseString("1"), evaluateString(input));
    }

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

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

}
