package function.builtin;

import static org.junit.Assert.assertEquals;
import static testutil.TestUtilities.evaluateString;

import java.io.*;
import java.text.MessageFormat;

import org.junit.*;

import environment.RuntimeEnvironment;
import function.ArgumentValidator.*;

public class PRINTTest {

    private RuntimeEnvironment environment;
    private ByteArrayOutputStream outputStream;

    public PRINTTest() {
        this.environment = RuntimeEnvironment.getInstance();
    }

    private void assertPrinted(String expected) {
        assertEquals(expected, outputStream.toString());
    }

    @Before
    public void setUp() {
        outputStream = new ByteArrayOutputStream();
        environment.reset();
        environment.setOutput(new PrintStream(outputStream));
    }

    @After
    public void tearDown() {
        environment.reset();
    }

    @Test
    public void printStringWorks() {
        String output = "\"Hello, world!\"";

        evaluateString(MessageFormat.format("(print {0})", output));
        assertPrinted(MessageFormat.format("{0}\n", output));
    }

    @Test
    public void printSymbolWorks() {
        String output = "A";

        evaluateString(MessageFormat.format("(print ''{0})", output));
        assertPrinted(MessageFormat.format("{0}\n", output));
    }

    @Test(expected = TooManyArgumentsException.class)
    public void printWithTooManyArguments() {
        evaluateString("(print '1 '2)");
    }

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

}
