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> |       <scope>test</scope> | ||||||
|     </dependency> |     </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> |     <dependency> | ||||||
|       <groupId>org.fitnesse</groupId> |       <groupId>org.fitnesse</groupId> | ||||||
|       <artifactId>fitnesse</artifactId> |       <artifactId>fitnesse</artifactId> | ||||||
|       <version>20161106</version> |       <version>20180127</version> | ||||||
|       <scope>test</scope> |       <scope>test</scope> | ||||||
|     </dependency> |     </dependency> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -8,7 +8,9 @@ class TailCallTest { | |||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     fun `tailCall does not support result`() { |     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() } |         assertThrows(UnsupportedOperationException::class.java) { tailCall.result() } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package scanner | package scanner | ||||||
| 
 | 
 | ||||||
| import org.assertj.core.api.Assertions.assertThat | import org.assertj.core.api.Assertions.assertThat | ||||||
| import org.junit.Test | import org.junit.jupiter.api.Test | ||||||
| import testutil.TestUtilities.createInputStreamFromString | import testutil.TestUtilities.createInputStreamFromString | ||||||
| 
 | 
 | ||||||
| class LispScannerTextTest { | 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.PipedInputStream; | ||||||
| import java.io.PipedOutputStream; | import java.io.PipedOutputStream; | ||||||
| 
 | 
 | ||||||
| import static org.hamcrest.Matchers.is; | import static org.assertj.core.api.Assertions.assertThat; | ||||||
| import static org.junit.Assert.assertThat; |  | ||||||
| import static org.junit.Assert.fail; | import static org.junit.Assert.fail; | ||||||
| import static terminal.LispTerminal.END_OF_SEGMENT; | import static terminal.LispTerminal.END_OF_SEGMENT; | ||||||
| 
 | 
 | ||||||
| @ -138,8 +137,8 @@ public class VirtualTerminalInteractor { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void assertCursorPosition(int column, int row) { |     public void assertCursorPosition(int column, int row) { | ||||||
|         assertThat(virtualTerminal.getCursorPosition().getColumn(), is(column)); |         assertThat(virtualTerminal.getCursorPosition().getColumn()).isEqualTo(column); | ||||||
|         assertThat(virtualTerminal.getCursorPosition().getRow(), is(row)); |         assertThat(virtualTerminal.getCursorPosition().getRow()).isEqualTo(row); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void assertScreenText(String... rows) { |     public void assertScreenText(String... rows) { | ||||||
| @ -152,7 +151,7 @@ public class VirtualTerminalInteractor { | |||||||
|         TerminalPosition position = new TerminalPosition(column, row); |         TerminalPosition position = new TerminalPosition(column, row); | ||||||
|         String expected = String.valueOf(character); |         String expected = String.valueOf(character); | ||||||
|         String actual = String.valueOf(virtualTerminal.getCharacter(position).getCharacter()); |         String actual = String.valueOf(virtualTerminal.getCharacter(position).getCharacter()); | ||||||
|         assertThat(actual, is(expected)); |         assertThat(actual).isEqualTo(expected); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void assertInputWritten(String expected) { |     public void assertInputWritten(String expected) { | ||||||
| @ -166,7 +165,7 @@ public class VirtualTerminalInteractor { | |||||||
|         } catch (IOException ignored) { |         } catch (IOException ignored) { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         assertThat(actual, is(expected)); |         assertThat(actual).isEqualTo(expected); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void assertInputStreamClosed() { |     public void assertInputStreamClosed() { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user