Convert more tests to kotlin
This commit is contained in:
		
							parent
							
								
									065d2136ed
								
							
						
					
					
						commit
						99f9ecbad3
					
				
							
								
								
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								pom.xml
									
									
									
									
									
								
							| @ -201,18 +201,10 @@ | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
| 
 | ||||
|     <!-- TODO - remove when test cases all converted to junit 5 and assertj--> | ||||
|     <dependency> | ||||
|       <groupId>org.hamcrest</groupId> | ||||
|       <artifactId>hamcrest-all</artifactId> | ||||
|       <version>1.3</version> | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
| 
 | ||||
|     <dependency> | ||||
|       <groupId>org.fitnesse</groupId> | ||||
|       <artifactId>fitnesse</artifactId> | ||||
|       <version>20161106</version> | ||||
|       <version>20180127</version> | ||||
|       <scope>test</scope> | ||||
|     </dependency> | ||||
| 
 | ||||
|  | ||||
| @ -8,7 +8,9 @@ class TailCallTest { | ||||
| 
 | ||||
|     @Test | ||||
|     fun `tailCall does not support result`() { | ||||
|         val tailCall = object : TailCall<Nothing?> { override fun apply() = done(null) } | ||||
|         val tailCall = object : TailCall<Nothing?> { | ||||
|             override fun apply() = done(null) | ||||
|         } | ||||
| 
 | ||||
|         assertThrows(UnsupportedOperationException::class.java) { tailCall.result() } | ||||
|     } | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| package scanner | ||||
| 
 | ||||
| import org.assertj.core.api.Assertions.assertThat | ||||
| import org.junit.Test | ||||
| import org.junit.jupiter.api.Test | ||||
| import testutil.TestUtilities.createInputStreamFromString | ||||
| 
 | ||||
| class LispScannerTextTest { | ||||
|  | ||||
| @ -1,134 +0,0 @@ | ||||
| package terminal; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import stream.SafeInputStream; | ||||
| import terminal.ControlSequence.NullControlSequence; | ||||
| import testutil.TestUtilities; | ||||
| import util.Characters; | ||||
| 
 | ||||
| import static org.hamcrest.Matchers.instanceOf; | ||||
| import static org.hamcrest.Matchers.is; | ||||
| import static org.junit.Assert.assertThat; | ||||
| import static terminal.ControlSequenceHandler.isEscape; | ||||
| import static terminal.SelectGraphicRendition.GREEN; | ||||
| import static terminal.SelectGraphicRendition.PURPLE; | ||||
| import static terminal.SelectGraphicRendition.RED; | ||||
| import static terminal.SelectGraphicRendition.RESET; | ||||
| import static terminal.SelectGraphicRendition.YELLOW; | ||||
| 
 | ||||
| public class ControlSequenceHandlerTest { | ||||
| 
 | ||||
|     private ControlSequenceHandler handler; | ||||
| 
 | ||||
|     private Object readRemaining(SafeInputStream input) { | ||||
|         String remaining = ""; | ||||
| 
 | ||||
|         for (int c = input.read(); c != Characters.EOF; c = input.read()) | ||||
|             remaining += (char) c; | ||||
| 
 | ||||
|         return remaining; | ||||
|     } | ||||
| 
 | ||||
|     private SafeInputStream createSafeInputStream(String data) { | ||||
|         return new SafeInputStream(TestUtilities.INSTANCE.createInputStreamFromString(data)); | ||||
|     } | ||||
| 
 | ||||
|     @Before | ||||
|     public void setUp() { | ||||
|         handler = new ControlSequenceHandler(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void isEscapeDetectsNonEscapeCharacter() { | ||||
|         assertThat(isEscape('x'), is(false)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void isEscapeDetectsEscapeCharacter() { | ||||
|         assertThat(isEscape('\u001b'), is(true)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void correctlyParsesControlSequence_LeavesRestOfStreamIntact() { | ||||
|         SafeInputStream input = createSafeInputStream("[32mdata"); | ||||
|         handler.parse(input); | ||||
|         assertThat(readRemaining(input), is("data")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void unterminatedControlSequence_OnlyConsumesFirstNonSequenceCharacter() { | ||||
|         SafeInputStream input = createSafeInputStream("[32data"); | ||||
|         handler.parse(input); | ||||
|         assertThat(readRemaining(input), is("ata")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void malformedControlSequence_OnlyConsumesOneCharacter() { | ||||
|         SafeInputStream input = createSafeInputStream("32mdata"); | ||||
|         handler.parse(input); | ||||
|         assertThat(readRemaining(input), is("2mdata")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_EOF() { | ||||
|         SafeInputStream input = createSafeInputStream(""); | ||||
|         assertThat(handler.parse(input), instanceOf(NullControlSequence.class)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_EOF_AfterFirstCharacter() { | ||||
|         SafeInputStream input = createSafeInputStream("["); | ||||
|         assertThat(handler.parse(input), instanceOf(NullControlSequence.class)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_UnterminatedControlSequence() { | ||||
|         SafeInputStream input = createSafeInputStream("[data"); | ||||
|         assertThat(handler.parse(input), instanceOf(NullControlSequence.class)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_MalformedControlSequence() { | ||||
|         SafeInputStream input = createSafeInputStream("32mdata"); | ||||
|         assertThat(handler.parse(input), instanceOf(NullControlSequence.class)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_SGR_Reset() { | ||||
|         SafeInputStream input = createSafeInputStream("[0m"); | ||||
|         assertThat(handler.parse(input), is(RESET)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_SGR_Red() { | ||||
|         SafeInputStream input = createSafeInputStream("[31m"); | ||||
|         assertThat(handler.parse(input), is(RED)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_SGR_Green() { | ||||
|         SafeInputStream input = createSafeInputStream("[32m"); | ||||
|         assertThat(handler.parse(input), is(GREEN)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_SGR_Yellow() { | ||||
|         SafeInputStream input = createSafeInputStream("[33m"); | ||||
|         assertThat(handler.parse(input), is(YELLOW)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parsedControlSequenceIsCorrectType_SGR_Purple() { | ||||
|         SafeInputStream input = createSafeInputStream("[35m"); | ||||
|         assertThat(handler.parse(input), is(PURPLE)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void parseMultipleControlSequences() { | ||||
|         SafeInputStream input = createSafeInputStream("[35m[32m[0m"); | ||||
|         assertThat(handler.parse(input), is(PURPLE)); | ||||
|         assertThat(handler.parse(input), is(GREEN)); | ||||
|         assertThat(handler.parse(input), is(RESET)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										133
									
								
								src/test/kotlin/terminal/ControlSequenceHandlerTest.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/test/kotlin/terminal/ControlSequenceHandlerTest.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | ||||
| package terminal | ||||
| 
 | ||||
| import org.assertj.core.api.Assertions.assertThat | ||||
| import org.junit.jupiter.api.BeforeEach | ||||
| import org.junit.jupiter.api.Test | ||||
| import stream.SafeInputStream | ||||
| import terminal.ControlSequence.NullControlSequence | ||||
| import terminal.ControlSequenceHandler.Companion.isEscape | ||||
| import terminal.SelectGraphicRendition.GREEN | ||||
| import terminal.SelectGraphicRendition.PURPLE | ||||
| import terminal.SelectGraphicRendition.RED | ||||
| import terminal.SelectGraphicRendition.RESET | ||||
| import terminal.SelectGraphicRendition.YELLOW | ||||
| import testutil.TestUtilities | ||||
| import util.Characters.EOF | ||||
| 
 | ||||
| class ControlSequenceHandlerTest { | ||||
| 
 | ||||
|     private lateinit var handler: ControlSequenceHandler | ||||
| 
 | ||||
|     private fun readRemaining(input: SafeInputStream): Any { | ||||
|         var remaining = "" | ||||
|         var c = input.read() | ||||
| 
 | ||||
|         while (c != EOF) { | ||||
|             remaining += c.toChar() | ||||
|             c = input.read() | ||||
|         } | ||||
| 
 | ||||
|         return remaining | ||||
|     } | ||||
| 
 | ||||
|     private fun createSafeInputStream(data: String) = | ||||
|         SafeInputStream(TestUtilities.createInputStreamFromString(data)) | ||||
| 
 | ||||
|     @BeforeEach | ||||
|     fun setUp() { | ||||
|         handler = ControlSequenceHandler() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun isEscapeDetectsNonEscapeCharacter() { | ||||
|         assertThat(isEscape('x')).isFalse() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun isEscapeDetectsEscapeCharacter() { | ||||
|         assertThat(isEscape('\u001b')).isTrue() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun correctlyParsesControlSequence_LeavesRestOfStreamIntact() { | ||||
|         val input = createSafeInputStream("[32mdata") | ||||
|         handler.parse(input) | ||||
|         assertThat(readRemaining(input)).isEqualTo("data") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun unterminatedControlSequence_OnlyConsumesFirstNonSequenceCharacter() { | ||||
|         val input = createSafeInputStream("[32data") | ||||
|         handler.parse(input) | ||||
|         assertThat(readRemaining(input)).isEqualTo("ata") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun malformedControlSequence_OnlyConsumesOneCharacter() { | ||||
|         val input = createSafeInputStream("32mdata") | ||||
|         handler.parse(input) | ||||
|         assertThat(readRemaining(input)).isEqualTo("2mdata") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_EOF() { | ||||
|         val input = createSafeInputStream("") | ||||
|         assertThat(handler.parse(input)).isInstanceOf(NullControlSequence::class.java) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_EOF_AfterFirstCharacter() { | ||||
|         val input = createSafeInputStream("[") | ||||
|         assertThat(handler.parse(input)).isInstanceOf(NullControlSequence::class.java) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_UnterminatedControlSequence() { | ||||
|         val input = createSafeInputStream("[data") | ||||
|         assertThat(handler.parse(input)).isInstanceOf(NullControlSequence::class.java) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_MalformedControlSequence() { | ||||
|         val input = createSafeInputStream("32mdata") | ||||
|         assertThat(handler.parse(input)).isInstanceOf(NullControlSequence::class.java) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_SGR_Reset() { | ||||
|         val input = createSafeInputStream("[0m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(RESET) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_SGR_Red() { | ||||
|         val input = createSafeInputStream("[31m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(RED) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_SGR_Green() { | ||||
|         val input = createSafeInputStream("[32m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(GREEN) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_SGR_Yellow() { | ||||
|         val input = createSafeInputStream("[33m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(YELLOW) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parsedControlSequenceIsCorrectType_SGR_Purple() { | ||||
|         val input = createSafeInputStream("[35m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(PURPLE) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun parseMultipleControlSequences() { | ||||
|         val input = createSafeInputStream("[35m[32m[0m") | ||||
|         assertThat(handler.parse(input)).isEqualTo(PURPLE) | ||||
|         assertThat(handler.parse(input)).isEqualTo(GREEN) | ||||
|         assertThat(handler.parse(input)).isEqualTo(RESET) | ||||
|     } | ||||
| } | ||||
| @ -1,101 +0,0 @@ | ||||
| package terminal; | ||||
| 
 | ||||
| import com.googlecode.lanterna.TextColor; | ||||
| import com.googlecode.lanterna.terminal.virtual.DefaultVirtualTerminal; | ||||
| import com.googlecode.lanterna.terminal.virtual.VirtualTerminal; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import terminal.ControlSequence.NullControlSequence; | ||||
| 
 | ||||
| import java.util.HashSet; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import static org.hamcrest.Matchers.contains; | ||||
| import static org.hamcrest.Matchers.empty; | ||||
| import static org.hamcrest.Matchers.isEmptyString; | ||||
| import static org.junit.Assert.assertThat; | ||||
| import static terminal.SelectGraphicRendition.GREEN; | ||||
| import static terminal.SelectGraphicRendition.PURPLE; | ||||
| import static terminal.SelectGraphicRendition.RED; | ||||
| import static terminal.SelectGraphicRendition.RESET; | ||||
| import static terminal.SelectGraphicRendition.YELLOW; | ||||
| 
 | ||||
| public class ControlSequenceTest { | ||||
| 
 | ||||
|     private Set<String> indicatorSet; | ||||
| 
 | ||||
|     private VirtualTerminal createTerminalWithIndicators() { | ||||
|         return new DefaultVirtualTerminal() { | ||||
| 
 | ||||
|             @Override | ||||
|             public void resetColorAndSGR() { | ||||
|                 indicatorSet.add("RESET"); | ||||
|             } | ||||
| 
 | ||||
|             @Override | ||||
|             public void setForegroundColor(TextColor color) { | ||||
|                 indicatorSet.add(color.toString()); | ||||
|             } | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     @Before | ||||
|     public void setUp() { | ||||
|         indicatorSet = new HashSet<>(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void nullControlSequenceDoesNothing() { | ||||
|         ControlSequence nullControlSequence = new NullControlSequence(); | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         nullControlSequence.applyTo(terminal); | ||||
|         assertThat(indicatorSet, empty()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequenceUpdatesTerminal_SGR_Reset() { | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         RESET.applyTo(terminal); | ||||
|         assertThat(indicatorSet, contains("RESET")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequenceUpdatesTerminal_SGR_Red() { | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         RED.applyTo(terminal); | ||||
|         assertThat(indicatorSet, contains("RED")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequenceUpdatesTerminal_SGR_Green() { | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         GREEN.applyTo(terminal); | ||||
|         assertThat(indicatorSet, contains("GREEN")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequenceUpdatesTerminal_SGR_Yellow() { | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         YELLOW.applyTo(terminal); | ||||
|         assertThat(indicatorSet, contains("YELLOW")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequenceUpdatesTerminal_SGR_Purple() { | ||||
|         VirtualTerminal terminal = createTerminalWithIndicators(); | ||||
|         PURPLE.applyTo(terminal); | ||||
|         assertThat(indicatorSet, contains("MAGENTA")); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void nullControlSequenceHasCorrectCode() { | ||||
|         ControlSequence nullControlSequence = new NullControlSequence(); | ||||
|         assertThat(nullControlSequence.getCode(), isEmptyString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void SelectGraphicRenditionEnumCoverage() { | ||||
|         for (SelectGraphicRendition sgr : SelectGraphicRendition.values()) | ||||
|             SelectGraphicRendition.valueOf(sgr.toString()); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										87
									
								
								src/test/kotlin/terminal/ControlSequenceTest.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/test/kotlin/terminal/ControlSequenceTest.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| package terminal | ||||
| 
 | ||||
| import com.googlecode.lanterna.TextColor | ||||
| import com.googlecode.lanterna.terminal.virtual.DefaultVirtualTerminal | ||||
| import com.googlecode.lanterna.terminal.virtual.VirtualTerminal | ||||
| import org.assertj.core.api.Assertions.assertThat | ||||
| import org.junit.jupiter.api.BeforeEach | ||||
| import org.junit.jupiter.api.Test | ||||
| import terminal.ControlSequence.NullControlSequence | ||||
| import terminal.SelectGraphicRendition.GREEN | ||||
| import terminal.SelectGraphicRendition.PURPLE | ||||
| import terminal.SelectGraphicRendition.RED | ||||
| import terminal.SelectGraphicRendition.RESET | ||||
| import terminal.SelectGraphicRendition.YELLOW | ||||
| import java.util.HashSet | ||||
| 
 | ||||
| class ControlSequenceTest { | ||||
| 
 | ||||
|     private lateinit var indicatorSet: MutableSet<String> | ||||
| 
 | ||||
|     private fun createTerminalWithIndicators(): VirtualTerminal { | ||||
|         return object : DefaultVirtualTerminal() { | ||||
| 
 | ||||
|             override fun resetColorAndSGR() { | ||||
|                 indicatorSet.add("RESET") | ||||
|             } | ||||
| 
 | ||||
|             override fun setForegroundColor(color: TextColor) { | ||||
|                 indicatorSet.add(color.toString()) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @BeforeEach | ||||
|     fun setUp() { | ||||
|         indicatorSet = HashSet() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun nullControlSequenceDoesNothing() { | ||||
|         val nullControlSequence = NullControlSequence() | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         nullControlSequence.applyTo(terminal) | ||||
|         assertThat(indicatorSet).isEmpty() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequenceUpdatesTerminal_SGR_Reset() { | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         RESET.applyTo(terminal) | ||||
|         assertThat(indicatorSet).contains("RESET") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequenceUpdatesTerminal_SGR_Red() { | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         RED.applyTo(terminal) | ||||
|         assertThat(indicatorSet).contains("RED") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequenceUpdatesTerminal_SGR_Green() { | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         GREEN.applyTo(terminal) | ||||
|         assertThat(indicatorSet).contains("GREEN") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequenceUpdatesTerminal_SGR_Yellow() { | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         YELLOW.applyTo(terminal) | ||||
|         assertThat(indicatorSet).contains("YELLOW") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequenceUpdatesTerminal_SGR_Purple() { | ||||
|         val terminal = createTerminalWithIndicators() | ||||
|         PURPLE.applyTo(terminal) | ||||
|         assertThat(indicatorSet).contains("MAGENTA") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun nullControlSequenceHasCorrectCode() { | ||||
|         val nullControlSequence = NullControlSequence() | ||||
|         assertThat(nullControlSequence.code).isEmpty() | ||||
|     } | ||||
| } | ||||
| @ -1,494 +0,0 @@ | ||||
| package terminal; | ||||
| 
 | ||||
| import org.junit.After; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import static com.googlecode.lanterna.input.KeyType.ArrowDown; | ||||
| import static com.googlecode.lanterna.input.KeyType.ArrowLeft; | ||||
| import static com.googlecode.lanterna.input.KeyType.ArrowRight; | ||||
| import static com.googlecode.lanterna.input.KeyType.ArrowUp; | ||||
| import static com.googlecode.lanterna.input.KeyType.Backspace; | ||||
| import static com.googlecode.lanterna.input.KeyType.Delete; | ||||
| import static com.googlecode.lanterna.input.KeyType.Enter; | ||||
| import static com.googlecode.lanterna.input.KeyType.Escape; | ||||
| import static terminal.LispTerminal.END_OF_SEGMENT; | ||||
| 
 | ||||
| public class LispTerminalTest { | ||||
| 
 | ||||
|     private VirtualTerminalInteractor terminal; | ||||
| 
 | ||||
|     @Before | ||||
|     public void setUp() { | ||||
|         terminal = new VirtualTerminalInteractor(); | ||||
|         terminal.start(); | ||||
|     } | ||||
| 
 | ||||
|     @After | ||||
|     public void tearDown() { | ||||
|         terminal.stop(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void leftArrowDoesNotMovePastOrigin() { | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void leftArrowWorksAfterEnteringCharacters() { | ||||
|         terminal.enterCharacters("abc"); | ||||
|         terminal.assertCursorPosition(3, 0); | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(1, 0); | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void leftArrowWorksAcrossRows() { | ||||
|         terminal.setColumns(5); | ||||
|         terminal.enterCharacters("123451"); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.assertCursorPosition(4, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void rightArrowDoesNotMovePastEndOfInput() { | ||||
|         terminal.pressKey(ArrowRight); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void rightArrowWorksAfterMovingLeft() { | ||||
|         terminal.enterCharacters("12"); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.pressKey(ArrowLeft); | ||||
|         terminal.assertCursorPosition(1, 0); | ||||
|         terminal.pressKey(ArrowRight); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.pressKey(ArrowRight); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void rightArrowWorksAcrossRow() { | ||||
|         terminal.setColumns(5); | ||||
|         terminal.enterCharacters("123451"); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.assertCursorPosition(3, 0); | ||||
|         terminal.pressKeyTimes(ArrowRight, 3); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void characterKeyIsEchoed() { | ||||
|         terminal.enterCharacter('a'); | ||||
|         terminal.assertCursorPosition(1, 0); | ||||
|         terminal.assertScreenText("a"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void characterIsInserted() { | ||||
|         terminal.enterCharacters("abcd"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.enterCharacter('x'); | ||||
|         terminal.assertScreenText("abxcd"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void characterIsInserted_PushesInputToNextRow() { | ||||
|         terminal.setColumns(4); | ||||
|         terminal.enterCharacters("abcd"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.enterCharacter('x'); | ||||
|         terminal.assertScreenText("abxc", "d   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void backspaceDoesNothingAtOrigin() { | ||||
|         terminal.pressKey(Backspace); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void backspaceWorksAfterInput() { | ||||
|         terminal.enterCharacters("12345"); | ||||
|         terminal.pressKeyTimes(Backspace, 2); | ||||
|         terminal.assertCursorPosition(3, 0); | ||||
|         terminal.assertScreenText("123   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void backspaceWorksAcrossRow() { | ||||
|         terminal.setColumns(4); | ||||
|         terminal.enterCharacters("1234567"); | ||||
|         terminal.pressKeyTimes(Backspace, 5); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.assertScreenText("12  ", "    "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void backspaceWorksInMiddleOfInput() { | ||||
|         terminal.enterCharacters("12345"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.pressKey(Backspace); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.assertScreenText("1245"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void deleteDoesNothingAtOrigin() { | ||||
|         terminal.pressKey(Delete); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void deleteDoesNothingAtEndOfInput() { | ||||
|         terminal.enterCharacters("del"); | ||||
|         terminal.pressKey(Delete); | ||||
|         terminal.assertCursorPosition(3, 0); | ||||
|         terminal.assertScreenText("del"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void deleteWorksAtStartOfInput() { | ||||
|         terminal.enterCharacters("del"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.pressKeyTimes(Delete, 3); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertScreenText("   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void deleteWorksAcrossRow() { | ||||
|         terminal.setColumns(4); | ||||
|         terminal.enterCharacters("delete"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 5); | ||||
|         terminal.pressKey(Delete); | ||||
|         terminal.assertCursorPosition(1, 0); | ||||
|         terminal.assertScreenText("dlet", "e   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterMovesToNextLine() { | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertCursorPosition(0, 1); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterWritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertInputWritten("enter\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterPressedInMiddleOfInput_WritesEntireLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertInputWritten("enter\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterAfterInsertedText_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.enterCharacters("||"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertInputWritten("ent||er\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterAfterBackspace_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter"); | ||||
|         terminal.pressKeyTimes(Backspace, 2); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertInputWritten("ent\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterAfterDelete_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.pressKeyTimes(Delete, 2); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.assertInputWritten("ent\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlDWorks() { | ||||
|         terminal.enterCharacters("control-d"); | ||||
|         terminal.enterControlCharacter('d'); | ||||
|         terminal.assertInputStreamClosed(); | ||||
|         terminal.assertInputWritten("control-d\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlDWorksInMiddleOfInput() { | ||||
|         terminal.enterCharacters("control-d"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2); | ||||
|         terminal.enterControlCharacter('d'); | ||||
|         terminal.assertInputStreamClosed(); | ||||
|         terminal.assertInputWritten("control-d\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void escapeDoesNothing() { | ||||
|         terminal.pressKey(Escape); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertInputWritten(""); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlQDoesNothing() { | ||||
|         terminal.enterControlCharacter('q'); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertInputWritten(""); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlEnterDoesNothing() { | ||||
|         terminal.pressControlKey(Enter); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertInputWritten(""); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputIsWritten() { | ||||
|         terminal.produceOutput("output"); | ||||
|         terminal.assertCursorPosition(6, 0); | ||||
|         terminal.assertScreenText("output"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void endOfSegmentCharacterIsNotPrinted() { | ||||
|         terminal.produceOutput("> " + END_OF_SEGMENT); | ||||
|         terminal.assertCursorPosition(2, 0); | ||||
|         terminal.assertScreenText(">  "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void enterTextPastLastLineOfBuffer() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(2); | ||||
|         terminal.enterCharacters("01201201"); | ||||
|         terminal.assertCursorPosition(2, 1); | ||||
|         terminal.assertScreenText("012", "01 "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void insertingTextPushesInputPastEndOfBuffer() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(4); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("00011122"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 4); | ||||
|         terminal.assertCursorPosition(1, 2); | ||||
|         terminal.enterCharacters("zz"); | ||||
|         terminal.assertCursorPosition(0, 2); | ||||
|         terminal.assertScreenText("000", "1zz", "112", "2  "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void insertingTextDoesNothingWhenBufferFilled() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(3); | ||||
|         terminal.enterCharacters("00011122"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 4); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|         terminal.enterCharacters("zz"); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|         terminal.assertScreenText("000", "111", "22 "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void appendingTextDoesNothingWhenBufferFilled() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(3); | ||||
|         terminal.enterCharacters("000111222333444"); | ||||
|         terminal.assertCursorPosition(2, 2); | ||||
|         terminal.assertScreenText("000", "111", "22 "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void printedOutputToEndOfRow_MovesCursorToNextRow() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(0, 1); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void printedOutputToEndOfBuffer_MovesCursorToNewRow() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(2); | ||||
|         terminal.produceOutput("output"); | ||||
|         terminal.assertCursorPosition(0, 1); | ||||
|         terminal.assertScreenText("put", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputDoesNotOverwriteInput_AndRedisplaysInput() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.enterCharacters("0123"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(2, 3); | ||||
|         terminal.assertScreenText("012", "3ou", "t01", "23 ", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputEndsOnSecondToLastColumn_MovesToNewRow() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.enterCharacters("01234"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(2, 4); | ||||
|         terminal.assertScreenText("012", "34o", "ut ", "012", "34 "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputEndsOnLastColumn_MovesToNewRow() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.enterCharacters("012345"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(0, 5); | ||||
|         terminal.assertScreenText("012", "345", "out", "012", "345", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputRedisplaysInputAtEndOfBuffer() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.setRows(4); | ||||
|         terminal.enterCharacters("01234"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(2, 3); | ||||
|         terminal.assertScreenText("34o", "ut ", "012"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void outputDoesNotOverwriteInput_AfterEnter() { | ||||
|         terminal.setColumns(3); | ||||
|         terminal.enterCharacters("01201201"); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 5); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.produceOutput("out"); | ||||
|         terminal.assertCursorPosition(0, 4); | ||||
|         terminal.assertScreenText("012", "012", "01 ", "out", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void resizeIsHandledGracefully() { | ||||
|         terminal.enterCharacters("resize"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("test"); | ||||
|         terminal.setColumns(3); | ||||
|         terminal.assertCursorPosition(1, 1); | ||||
|         terminal.assertScreenText("tes", "t  "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void backspaceWorksAfterResize() { | ||||
|         terminal.enterCharacters("resize"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("test"); | ||||
|         terminal.setColumns(3); | ||||
|         terminal.pressKeyTimes(Backspace, 20); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertScreenText("   ", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void deleteWorksAfterResize() { | ||||
|         terminal.enterCharacters("resize"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("test"); | ||||
|         terminal.setColumns(3); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 20); | ||||
|         terminal.pressKeyTimes(Delete, 20); | ||||
|         terminal.pressKeyTimes(ArrowRight, 20); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|         terminal.assertScreenText("   ", "   "); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void controlSequencesAreNotPrinted() { | ||||
|         terminal.produceOutput("\u001B[32mcontrol\u001B[0mseq"); | ||||
|         terminal.assertScreenText("controlseq"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void upArrowWorks() { | ||||
|         terminal.enterCharacters("(one)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(two)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.pressKey(ArrowUp); | ||||
|         terminal.assertScreenText("(one)", "(two)", "(two)"); | ||||
|         terminal.assertCursorPosition(5, 2); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void upArrowErasesCurrentLine() { | ||||
|         terminal.enterCharacters("(one)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(two)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(three)"); | ||||
|         terminal.pressKey(ArrowUp); | ||||
|         terminal.assertScreenText("(one)", "(two)", "(two)     "); | ||||
|         terminal.assertCursorPosition(5, 2); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void upArrowStopsAtFirstLine() { | ||||
|         terminal.enterCharacters("(one)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(two)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.pressKeyTimes(ArrowUp, 5); | ||||
|         terminal.assertScreenText("(one)", "(two)", "(one)"); | ||||
|         terminal.assertCursorPosition(5, 2); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void originIsUpdatedWhenPreviousLineMovesPastEndOfBuffer() { | ||||
|         terminal.setRows(3); | ||||
|         terminal.setColumns(3); | ||||
|         terminal.enterCharacters("12345"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.pressKey(ArrowUp); | ||||
|         terminal.assertScreenText("45 ", "123", "45 "); | ||||
|         terminal.pressKeyTimes(ArrowLeft, 10); | ||||
|         terminal.assertCursorPosition(0, 1); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void downArrowWorks() { | ||||
|         terminal.enterCharacters("(one)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(two)"); | ||||
|         terminal.pressKey(Enter); | ||||
|         terminal.enterCharacters("(three)"); | ||||
|         terminal.pressKey(ArrowUp); | ||||
|         terminal.pressKey(ArrowDown); | ||||
|         terminal.assertScreenText("(one)", "(two)", "(three)"); | ||||
|         terminal.assertCursorPosition(7, 2); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void downArrowStopsAtLastLine() { | ||||
|         terminal.pressKeyTimes(ArrowDown, 5); | ||||
|         terminal.assertScreenText(" "); | ||||
|         terminal.assertCursorPosition(0, 0); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										493
									
								
								src/test/kotlin/terminal/LispTerminalTest.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										493
									
								
								src/test/kotlin/terminal/LispTerminalTest.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,493 @@ | ||||
| package terminal | ||||
| 
 | ||||
| import com.googlecode.lanterna.input.KeyType.ArrowDown | ||||
| import com.googlecode.lanterna.input.KeyType.ArrowLeft | ||||
| import com.googlecode.lanterna.input.KeyType.ArrowRight | ||||
| import com.googlecode.lanterna.input.KeyType.ArrowUp | ||||
| import com.googlecode.lanterna.input.KeyType.Backspace | ||||
| import com.googlecode.lanterna.input.KeyType.Delete | ||||
| import com.googlecode.lanterna.input.KeyType.Enter | ||||
| import com.googlecode.lanterna.input.KeyType.Escape | ||||
| import org.junit.jupiter.api.AfterEach | ||||
| import org.junit.jupiter.api.BeforeEach | ||||
| import org.junit.jupiter.api.Test | ||||
| import terminal.LispTerminal.END_OF_SEGMENT | ||||
| 
 | ||||
| class LispTerminalTest { | ||||
| 
 | ||||
|     private lateinit var terminal: VirtualTerminalInteractor | ||||
| 
 | ||||
|     @BeforeEach | ||||
|     fun setUp() { | ||||
|         terminal = VirtualTerminalInteractor() | ||||
|         terminal.start() | ||||
|     } | ||||
| 
 | ||||
|     @AfterEach | ||||
|     fun tearDown() { | ||||
|         terminal.stop() | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun leftArrowDoesNotMovePastOrigin() { | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun leftArrowWorksAfterEnteringCharacters() { | ||||
|         terminal.enterCharacters("abc") | ||||
|         terminal.assertCursorPosition(3, 0) | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(1, 0) | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun leftArrowWorksAcrossRows() { | ||||
|         terminal.setColumns(5) | ||||
|         terminal.enterCharacters("123451") | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.assertCursorPosition(4, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun rightArrowDoesNotMovePastEndOfInput() { | ||||
|         terminal.pressKey(ArrowRight) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun rightArrowWorksAfterMovingLeft() { | ||||
|         terminal.enterCharacters("12") | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.pressKey(ArrowLeft) | ||||
|         terminal.assertCursorPosition(1, 0) | ||||
|         terminal.pressKey(ArrowRight) | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.pressKey(ArrowRight) | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun rightArrowWorksAcrossRow() { | ||||
|         terminal.setColumns(5) | ||||
|         terminal.enterCharacters("123451") | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.assertCursorPosition(3, 0) | ||||
|         terminal.pressKeyTimes(ArrowRight, 3) | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun characterKeyIsEchoed() { | ||||
|         terminal.enterCharacter('a') | ||||
|         terminal.assertCursorPosition(1, 0) | ||||
|         terminal.assertScreenText("a") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun characterIsInserted() { | ||||
|         terminal.enterCharacters("abcd") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.enterCharacter('x') | ||||
|         terminal.assertScreenText("abxcd") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun characterIsInserted_PushesInputToNextRow() { | ||||
|         terminal.setColumns(4) | ||||
|         terminal.enterCharacters("abcd") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.enterCharacter('x') | ||||
|         terminal.assertScreenText("abxc", "d   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun backspaceDoesNothingAtOrigin() { | ||||
|         terminal.pressKey(Backspace) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun backspaceWorksAfterInput() { | ||||
|         terminal.enterCharacters("12345") | ||||
|         terminal.pressKeyTimes(Backspace, 2) | ||||
|         terminal.assertCursorPosition(3, 0) | ||||
|         terminal.assertScreenText("123   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun backspaceWorksAcrossRow() { | ||||
|         terminal.setColumns(4) | ||||
|         terminal.enterCharacters("1234567") | ||||
|         terminal.pressKeyTimes(Backspace, 5) | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.assertScreenText("12  ", "    ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun backspaceWorksInMiddleOfInput() { | ||||
|         terminal.enterCharacters("12345") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.pressKey(Backspace) | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.assertScreenText("1245") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun deleteDoesNothingAtOrigin() { | ||||
|         terminal.pressKey(Delete) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun deleteDoesNothingAtEndOfInput() { | ||||
|         terminal.enterCharacters("del") | ||||
|         terminal.pressKey(Delete) | ||||
|         terminal.assertCursorPosition(3, 0) | ||||
|         terminal.assertScreenText("del") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun deleteWorksAtStartOfInput() { | ||||
|         terminal.enterCharacters("del") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.pressKeyTimes(Delete, 3) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertScreenText("   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun deleteWorksAcrossRow() { | ||||
|         terminal.setColumns(4) | ||||
|         terminal.enterCharacters("delete") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 5) | ||||
|         terminal.pressKey(Delete) | ||||
|         terminal.assertCursorPosition(1, 0) | ||||
|         terminal.assertScreenText("dlet", "e   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterMovesToNextLine() { | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertCursorPosition(0, 1) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterWritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertInputWritten("enter\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterPressedInMiddleOfInput_WritesEntireLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertInputWritten("enter\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterAfterInsertedText_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.enterCharacters("||") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertInputWritten("ent||er\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterAfterBackspace_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter") | ||||
|         terminal.pressKeyTimes(Backspace, 2) | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertInputWritten("ent\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterAfterDelete_WritesLineToPipedStream() { | ||||
|         terminal.enterCharacters("enter") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.pressKeyTimes(Delete, 2) | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.assertInputWritten("ent\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlDWorks() { | ||||
|         terminal.enterCharacters("control-d") | ||||
|         terminal.enterControlCharacter('d') | ||||
|         terminal.assertInputStreamClosed() | ||||
|         terminal.assertInputWritten("control-d\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlDWorksInMiddleOfInput() { | ||||
|         terminal.enterCharacters("control-d") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 2) | ||||
|         terminal.enterControlCharacter('d') | ||||
|         terminal.assertInputStreamClosed() | ||||
|         terminal.assertInputWritten("control-d\n") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun escapeDoesNothing() { | ||||
|         terminal.pressKey(Escape) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertInputWritten("") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlQDoesNothing() { | ||||
|         terminal.enterControlCharacter('q') | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertInputWritten("") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlEnterDoesNothing() { | ||||
|         terminal.pressControlKey(Enter) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertInputWritten("") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputIsWritten() { | ||||
|         terminal.produceOutput("output") | ||||
|         terminal.assertCursorPosition(6, 0) | ||||
|         terminal.assertScreenText("output") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun endOfSegmentCharacterIsNotPrinted() { | ||||
|         terminal.produceOutput("> $END_OF_SEGMENT") | ||||
|         terminal.assertCursorPosition(2, 0) | ||||
|         terminal.assertScreenText(">  ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun enterTextPastLastLineOfBuffer() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(2) | ||||
|         terminal.enterCharacters("01201201") | ||||
|         terminal.assertCursorPosition(2, 1) | ||||
|         terminal.assertScreenText("012", "01 ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun insertingTextPushesInputPastEndOfBuffer() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(4) | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("00011122") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 4) | ||||
|         terminal.assertCursorPosition(1, 2) | ||||
|         terminal.enterCharacters("zz") | ||||
|         terminal.assertCursorPosition(0, 2) | ||||
|         terminal.assertScreenText("000", "1zz", "112", "2  ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun insertingTextDoesNothingWhenBufferFilled() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(3) | ||||
|         terminal.enterCharacters("00011122") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 4) | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|         terminal.enterCharacters("zz") | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|         terminal.assertScreenText("000", "111", "22 ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun appendingTextDoesNothingWhenBufferFilled() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(3) | ||||
|         terminal.enterCharacters("000111222333444") | ||||
|         terminal.assertCursorPosition(2, 2) | ||||
|         terminal.assertScreenText("000", "111", "22 ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun printedOutputToEndOfRow_MovesCursorToNextRow() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(0, 1) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun printedOutputToEndOfBuffer_MovesCursorToNewRow() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(2) | ||||
|         terminal.produceOutput("output") | ||||
|         terminal.assertCursorPosition(0, 1) | ||||
|         terminal.assertScreenText("put", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputDoesNotOverwriteInput_AndRedisplaysInput() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.enterCharacters("0123") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(2, 3) | ||||
|         terminal.assertScreenText("012", "3ou", "t01", "23 ", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputEndsOnSecondToLastColumn_MovesToNewRow() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.enterCharacters("01234") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(2, 4) | ||||
|         terminal.assertScreenText("012", "34o", "ut ", "012", "34 ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputEndsOnLastColumn_MovesToNewRow() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.enterCharacters("012345") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(0, 5) | ||||
|         terminal.assertScreenText("012", "345", "out", "012", "345", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputRedisplaysInputAtEndOfBuffer() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.setRows(4) | ||||
|         terminal.enterCharacters("01234") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 3) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(2, 3) | ||||
|         terminal.assertScreenText("34o", "ut ", "012") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun outputDoesNotOverwriteInput_AfterEnter() { | ||||
|         terminal.setColumns(3) | ||||
|         terminal.enterCharacters("01201201") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 5) | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.produceOutput("out") | ||||
|         terminal.assertCursorPosition(0, 4) | ||||
|         terminal.assertScreenText("012", "012", "01 ", "out", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun resizeIsHandledGracefully() { | ||||
|         terminal.enterCharacters("resize") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("test") | ||||
|         terminal.setColumns(3) | ||||
|         terminal.assertCursorPosition(1, 1) | ||||
|         terminal.assertScreenText("tes", "t  ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun backspaceWorksAfterResize() { | ||||
|         terminal.enterCharacters("resize") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("test") | ||||
|         terminal.setColumns(3) | ||||
|         terminal.pressKeyTimes(Backspace, 20) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertScreenText("   ", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun deleteWorksAfterResize() { | ||||
|         terminal.enterCharacters("resize") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("test") | ||||
|         terminal.setColumns(3) | ||||
|         terminal.pressKeyTimes(ArrowLeft, 20) | ||||
|         terminal.pressKeyTimes(Delete, 20) | ||||
|         terminal.pressKeyTimes(ArrowRight, 20) | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|         terminal.assertScreenText("   ", "   ") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun controlSequencesAreNotPrinted() { | ||||
|         terminal.produceOutput("\u001B[32mcontrol\u001B[0mseq") | ||||
|         terminal.assertScreenText("controlseq") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun upArrowWorks() { | ||||
|         terminal.enterCharacters("(one)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(two)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.pressKey(ArrowUp) | ||||
|         terminal.assertScreenText("(one)", "(two)", "(two)") | ||||
|         terminal.assertCursorPosition(5, 2) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun upArrowErasesCurrentLine() { | ||||
|         terminal.enterCharacters("(one)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(two)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(three)") | ||||
|         terminal.pressKey(ArrowUp) | ||||
|         terminal.assertScreenText("(one)", "(two)", "(two)     ") | ||||
|         terminal.assertCursorPosition(5, 2) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun upArrowStopsAtFirstLine() { | ||||
|         terminal.enterCharacters("(one)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(two)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.pressKeyTimes(ArrowUp, 5) | ||||
|         terminal.assertScreenText("(one)", "(two)", "(one)") | ||||
|         terminal.assertCursorPosition(5, 2) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun originIsUpdatedWhenPreviousLineMovesPastEndOfBuffer() { | ||||
|         terminal.setRows(3) | ||||
|         terminal.setColumns(3) | ||||
|         terminal.enterCharacters("12345") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.pressKey(ArrowUp) | ||||
|         terminal.assertScreenText("45 ", "123", "45 ") | ||||
|         terminal.pressKeyTimes(ArrowLeft, 10) | ||||
|         terminal.assertCursorPosition(0, 1) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun downArrowWorks() { | ||||
|         terminal.enterCharacters("(one)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(two)") | ||||
|         terminal.pressKey(Enter) | ||||
|         terminal.enterCharacters("(three)") | ||||
|         terminal.pressKey(ArrowUp) | ||||
|         terminal.pressKey(ArrowDown) | ||||
|         terminal.assertScreenText("(one)", "(two)", "(three)") | ||||
|         terminal.assertCursorPosition(7, 2) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun downArrowStopsAtLastLine() { | ||||
|         terminal.pressKeyTimes(ArrowDown, 5) | ||||
|         terminal.assertScreenText(" ") | ||||
|         terminal.assertCursorPosition(0, 0) | ||||
|     } | ||||
| } | ||||
| @ -12,8 +12,7 @@ import java.io.IOException; | ||||
| import java.io.PipedInputStream; | ||||
| import java.io.PipedOutputStream; | ||||
| 
 | ||||
| import static org.hamcrest.Matchers.is; | ||||
| import static org.junit.Assert.assertThat; | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| import static org.junit.Assert.fail; | ||||
| import static terminal.LispTerminal.END_OF_SEGMENT; | ||||
| 
 | ||||
| @ -138,8 +137,8 @@ public class VirtualTerminalInteractor { | ||||
|     } | ||||
| 
 | ||||
|     public void assertCursorPosition(int column, int row) { | ||||
|         assertThat(virtualTerminal.getCursorPosition().getColumn(), is(column)); | ||||
|         assertThat(virtualTerminal.getCursorPosition().getRow(), is(row)); | ||||
|         assertThat(virtualTerminal.getCursorPosition().getColumn()).isEqualTo(column); | ||||
|         assertThat(virtualTerminal.getCursorPosition().getRow()).isEqualTo(row); | ||||
|     } | ||||
| 
 | ||||
|     public void assertScreenText(String... rows) { | ||||
| @ -152,7 +151,7 @@ public class VirtualTerminalInteractor { | ||||
|         TerminalPosition position = new TerminalPosition(column, row); | ||||
|         String expected = String.valueOf(character); | ||||
|         String actual = String.valueOf(virtualTerminal.getCharacter(position).getCharacter()); | ||||
|         assertThat(actual, is(expected)); | ||||
|         assertThat(actual).isEqualTo(expected); | ||||
|     } | ||||
| 
 | ||||
|     public void assertInputWritten(String expected) { | ||||
| @ -166,7 +165,7 @@ public class VirtualTerminalInteractor { | ||||
|         } catch (IOException ignored) { | ||||
|         } | ||||
| 
 | ||||
|         assertThat(actual, is(expected)); | ||||
|         assertThat(actual).isEqualTo(expected); | ||||
|     } | ||||
| 
 | ||||
|     public void assertInputStreamClosed() { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user