Refactor interpreter tests

This commit is contained in:
Mike Cifelli 2018-08-10 18:39:41 -04:00
parent c2c53e0d0f
commit c08edda548
3 changed files with 44 additions and 46 deletions

View File

@ -77,7 +77,7 @@ class RuntimeEnvironmentTest {
RuntimeEnvironment.terminationFunction = { indicatorSet.add(TERMINATED_SUCCESSFULLY) } RuntimeEnvironment.terminationFunction = { indicatorSet.add(TERMINATED_SUCCESSFULLY) }
RuntimeEnvironment.terminateSuccessfully() RuntimeEnvironment.terminateSuccessfully()
assertThat(indicatorSet.contains(TERMINATED_SUCCESSFULLY)).isTrue() assertThat(indicatorSet).contains(TERMINATED_SUCCESSFULLY)
} }
@Test @Test
@ -85,7 +85,7 @@ class RuntimeEnvironmentTest {
RuntimeEnvironment.errorTerminationFunction = { indicatorSet.add(TERMINATED_EXCEPTIONALLY) } RuntimeEnvironment.errorTerminationFunction = { indicatorSet.add(TERMINATED_EXCEPTIONALLY) }
RuntimeEnvironment.terminateExceptionally() RuntimeEnvironment.terminateExceptionally()
assertThat(indicatorSet.contains(TERMINATED_EXCEPTIONALLY)).isTrue() assertThat(indicatorSet).contains(TERMINATED_EXCEPTIONALLY)
} }
@Test @Test

View File

@ -20,11 +20,11 @@ class ExitTest : SymbolAndFunctionCleaner() {
private val indicatorSet = mutableSetOf<String>() private val indicatorSet = mutableSetOf<String>()
private fun assertTerminated() { private fun assertTerminated() {
assertThat(indicatorSet.contains(TERMINATED)).isTrue() assertThat(indicatorSet).contains(TERMINATED)
} }
private fun assertNotTerminated() { private fun assertNotTerminated() {
assertThat(indicatorSet.contains(TERMINATED)).isFalse() assertThat(indicatorSet).doesNotContain(TERMINATED)
} }
override fun additionalSetUp() { override fun additionalSetUp() {

View File

@ -2,12 +2,10 @@ package interpreter
import environment.RuntimeEnvironment import environment.RuntimeEnvironment
import interpreter.InteractiveLispInterpreter.Companion.PROMPT import interpreter.InteractiveLispInterpreter.Companion.PROMPT
import org.junit.After import org.assertj.core.api.Assertions.assertThat
import org.junit.Assert.assertEquals import org.junit.jupiter.api.AfterEach
import org.junit.Assert.assertFalse import org.junit.jupiter.api.BeforeEach
import org.junit.Assert.assertTrue import org.junit.jupiter.api.Test
import org.junit.Before
import org.junit.Test
import testutil.TestUtilities.createInputStreamFromString import testutil.TestUtilities.createInputStreamFromString
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.PrintStream import java.io.PrintStream
@ -31,14 +29,14 @@ class LispInterpreterTest {
} }
private fun assertTerminated() { private fun assertTerminated() {
assertTrue(indicatorSet.contains(TERMINATED)) assertThat(indicatorSet).contains(TERMINATED)
} }
private fun assertErrorMessageWritten() { private fun assertErrorMessageWritten() {
assertTrue(errorOutputStream.toByteArray().isNotEmpty()) assertThat(errorOutputStream.toByteArray()).isNotEmpty()
} }
@Before @BeforeEach()
fun setUp() { fun setUp() {
indicatorSet.clear() indicatorSet.clear()
outputStream.reset() outputStream.reset()
@ -47,43 +45,43 @@ class LispInterpreterTest {
LispInterpreterBuilder.reset() LispInterpreterBuilder.reset()
} }
@After @AfterEach()
fun tearDown() { fun tearDown() {
RuntimeEnvironment.reset() RuntimeEnvironment.reset()
LispInterpreterBuilder.reset() LispInterpreterBuilder.reset()
} }
@Test @Test
fun buildInteractiveInterpreter() { fun `build an interactive interpreter`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.setInput(System.`in`, "stdin") LispInterpreterBuilder.setInput(System.`in`, "stdin")
val interpreter = LispInterpreterBuilder.build() val interpreter = LispInterpreterBuilder.build()
assertTrue(interpreter is InteractiveLispInterpreter) assertThat(interpreter is InteractiveLispInterpreter).isTrue()
} }
@Test @Test
fun buildNonInteractiveInterpreter() { fun `build a non interactive interpreter`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.setInput(System.`in`, "stdin") LispInterpreterBuilder.setInput(System.`in`, "stdin")
LispInterpreterBuilder.setNotInteractive() LispInterpreterBuilder.setNotInteractive()
val interpreter = LispInterpreterBuilder.build() val interpreter = LispInterpreterBuilder.build()
assertFalse(interpreter is InteractiveLispInterpreter) assertThat(interpreter is InteractiveLispInterpreter).isFalse()
assertFalse(interpreter is FileLispInterpreter) assertThat(interpreter is FileLispInterpreter).isFalse()
} }
@Test @Test
fun buildFileBasedInterpreter() { fun `build a file based interpreter`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.useFile(FILE) LispInterpreterBuilder.useFile(FILE)
val interpreter = LispInterpreterBuilder.build() val interpreter = LispInterpreterBuilder.build()
assertTrue(interpreter is FileLispInterpreter) assertThat(interpreter is FileLispInterpreter).isTrue()
} }
@Test @Test
fun attemptToBuildInterpreterOnBadFile() { fun `building an interpreter on a bad file terminates correctly`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.useFile("does-not-exist.lisp") LispInterpreterBuilder.useFile("does-not-exist.lisp")
LispInterpreterBuilder.build() LispInterpreterBuilder.build()
@ -93,18 +91,18 @@ class LispInterpreterTest {
} }
@Test @Test
fun makeSureDecoratorsAreInitializedWithDefaults() { fun `the decorators are initialized with the correct defaults`() {
LispInterpreterBuilder.build() LispInterpreterBuilder.build()
assertEquals("", RuntimeEnvironment.decoratePrompt("")) assertThat(RuntimeEnvironment.decoratePrompt("")).isEmpty()
assertEquals("", RuntimeEnvironment.decorateValueOutput("")) assertThat(RuntimeEnvironment.decorateValueOutput("")).isEmpty()
assertEquals("", RuntimeEnvironment.decorateWarningOutput("")) assertThat(RuntimeEnvironment.decorateWarningOutput("")).isEmpty()
assertEquals("", RuntimeEnvironment.decorateErrorOutput("")) assertThat(RuntimeEnvironment.decorateErrorOutput("")).isEmpty()
assertEquals("", RuntimeEnvironment.decorateCriticalOutput("")) assertThat(RuntimeEnvironment.decorateCriticalOutput("")).isEmpty()
} }
@Test @Test
fun makeSureDecoratorsAreSetCorrectly() { fun `the decorators are set correctly`() {
LispInterpreterBuilder.setPromptDecorator { s -> "#$s#" } LispInterpreterBuilder.setPromptDecorator { s -> "#$s#" }
LispInterpreterBuilder.setValueOutputDecorator { s -> "@$s@" } LispInterpreterBuilder.setValueOutputDecorator { s -> "@$s@" }
LispInterpreterBuilder.setWarningOutputDecorator { s -> "%$s%" } LispInterpreterBuilder.setWarningOutputDecorator { s -> "%$s%" }
@ -112,52 +110,52 @@ class LispInterpreterTest {
LispInterpreterBuilder.setCriticalOutputDecorator { s -> "$$s$" } LispInterpreterBuilder.setCriticalOutputDecorator { s -> "$$s$" }
LispInterpreterBuilder.build() LispInterpreterBuilder.build()
assertEquals("#x#", RuntimeEnvironment.decoratePrompt("x")) assertThat(RuntimeEnvironment.decoratePrompt("x")).isEqualTo("#x#")
assertEquals("@x@", RuntimeEnvironment.decorateValueOutput("x")) assertThat(RuntimeEnvironment.decorateValueOutput("x")).isEqualTo("@x@")
assertEquals("%x%", RuntimeEnvironment.decorateWarningOutput("x")) assertThat(RuntimeEnvironment.decorateWarningOutput("x")).isEqualTo("%x%")
assertEquals("*x*", RuntimeEnvironment.decorateErrorOutput("x")) assertThat(RuntimeEnvironment.decorateErrorOutput("x")).isEqualTo("*x*")
assertEquals("\$x$", RuntimeEnvironment.decorateCriticalOutput("x")) assertThat(RuntimeEnvironment.decorateCriticalOutput("x")).isEqualTo("\$x$")
} }
@Test @Test
fun fileBasedInterpreterWorks_PrintsLastValueOnly() { fun `the file based interpreter works and prints the last value only`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.useFile(FILE) LispInterpreterBuilder.useFile(FILE)
LispInterpreterBuilder.build().interpret() LispInterpreterBuilder.build().interpret()
assertEquals("PICKLE\n\n", outputStream.toString()) assertThat(outputStream.toString()).isEqualTo("PICKLE\n\n")
assertEquals("", errorOutputStream.toString()) assertThat(errorOutputStream.toString()).isEmpty()
} }
@Test @Test
fun interactiveInterpreterWorks() { fun `the interactive interpreter works`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.setInput(createInputStreamFromString("'pickle"), "input") LispInterpreterBuilder.setInput(createInputStreamFromString("'pickle"), "input")
LispInterpreterBuilder.build().interpret() LispInterpreterBuilder.build().interpret()
assertEquals("$PROMPT\nPICKLE\n$PROMPT\n", outputStream.toString()) assertThat(outputStream.toString()).isEqualTo("$PROMPT\nPICKLE\n$PROMPT\n")
assertEquals("", errorOutputStream.toString()) assertThat(errorOutputStream.toString()).isEmpty()
} }
@Test @Test
fun interpreterHandlesInputError() { fun `the interpreter handles bad input`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.setNotInteractive() LispInterpreterBuilder.setNotInteractive()
LispInterpreterBuilder.setInput(createInputStreamFromString("['pickle"), "input") LispInterpreterBuilder.setInput(createInputStreamFromString("['pickle"), "input")
LispInterpreterBuilder.build().interpret() LispInterpreterBuilder.build().interpret()
assertEquals("PICKLE\n\n", outputStream.toString()) assertThat(outputStream.toString()).isEqualTo("PICKLE\n\n")
assertEquals("[error] illegal character >>[<< - line 1, column 1\n", errorOutputStream.toString()) assertThat(errorOutputStream.toString()).isEqualTo("[error] illegal character >>[<< - line 1, column 1\n")
} }
@Test @Test
fun interpreterHandlesEvaluationError() { fun `the interpreter handles an evaluation error`() {
setCommonFeatures() setCommonFeatures()
LispInterpreterBuilder.setNotInteractive() LispInterpreterBuilder.setNotInteractive()
LispInterpreterBuilder.setInput(createInputStreamFromString("pickle"), "input") LispInterpreterBuilder.setInput(createInputStreamFromString("pickle"), "input")
LispInterpreterBuilder.build().interpret() LispInterpreterBuilder.build().interpret()
assertEquals("\n", outputStream.toString()) assertThat(outputStream.toString()).isEqualTo("\n")
assertEquals("[error] symbol PICKLE has no value\n", errorOutputStream.toString()) assertThat(errorOutputStream.toString()).isEqualTo("[error] symbol PICKLE has no value\n")
} }
} }