package function.builtin; import static org.junit.Assert.assertTrue; import static testutil.TestUtilities.evaluateString; import static testutil.TypeAssertions.*; import java.io.*; import org.junit.*; import environment.RuntimeEnvironment; import error.ErrorManager; import function.ArgumentValidator.*; public class LOADTester { private ByteArrayOutputStream outputStream; private ByteArrayOutputStream errorOutputStream; private RuntimeEnvironment environment; public LOADTester() { this.environment = RuntimeEnvironment.getInstance(); } private void assertWarningMessagePrinted() { assertTrue(outputStream.toByteArray().length > 0); assertTrue(errorOutputStream.toByteArray().length == 0); } private void assertErrorMessagePrinted() { assertTrue(errorOutputStream.toByteArray().length > 0); assertTrue(outputStream.toByteArray().length == 0); } private void assertNothingPrinted() { assertTrue(outputStream.toByteArray().length == 0); assertTrue(outputStream.toByteArray().length == 0); } @Before public void setUp() { outputStream = new ByteArrayOutputStream(); errorOutputStream = new ByteArrayOutputStream(); environment.setOutput(new PrintStream(outputStream)); environment.setErrorOutput(new PrintStream(errorOutputStream)); environment.setErrorManager(new ErrorManager()); environment.setOutputDecorator(s -> s); environment.setWarningOutputDecorator(s -> s); environment.setErrorOutputDecorator(s -> s); } @Test public void loadGoodFile_ReturnsTAndPrintsNothing() { String input = "(load \"test/function/builtin/test-files/load-good.lisp\")"; assertT(evaluateString(input)); assertNothingPrinted(); } @Test public void loadBadFile_ReturnsNilAndPrintsError() { String input = "(load \"test/function/builtin/test-files/load-bad.lisp\")"; assertNil(evaluateString(input)); assertErrorMessagePrinted(); } @Test public void loadNonExistentFile_ReturnsNilAndPrintsError() { String input = "(load \"doesNotExist.lisp\")"; assertNil(evaluateString(input)); assertWarningMessagePrinted(); } @Test(expected = BadArgumentTypeException.class) public void testLoadWithBadArgumentType() { evaluateString("(load '1)"); } @Test(expected = TooManyArgumentsException.class) public void testLoadWithTooManyArguments() { evaluateString("(load \"1\" \"2\")"); } @Test(expected = TooFewArgumentsException.class) public void testLoadWithTooFewArguments() { evaluateString("(load)"); } }