Convert more test code to kotlin
This commit is contained in:
parent
99f9ecbad3
commit
e6e3965485
|
@ -1,37 +0,0 @@
|
||||||
package terminal;
|
|
||||||
|
|
||||||
import com.googlecode.lanterna.TerminalSize;
|
|
||||||
import com.googlecode.lanterna.terminal.Terminal;
|
|
||||||
import com.googlecode.lanterna.terminal.virtual.VirtualTerminalListener;
|
|
||||||
|
|
||||||
public class FlushListener implements VirtualTerminalListener {
|
|
||||||
|
|
||||||
private int flushCount;
|
|
||||||
|
|
||||||
public FlushListener() {
|
|
||||||
this.flushCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized int getFlushCount() {
|
|
||||||
return flushCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void reduceFlushCount(int reduction) {
|
|
||||||
flushCount -= reduction;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResized(Terminal terminal, TerminalSize newSize) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void onFlush() {
|
|
||||||
flushCount++;
|
|
||||||
notify();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBell() {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClose() {}
|
|
||||||
}
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package terminal
|
||||||
|
|
||||||
|
import com.googlecode.lanterna.TerminalSize
|
||||||
|
import com.googlecode.lanterna.terminal.Terminal
|
||||||
|
import com.googlecode.lanterna.terminal.virtual.VirtualTerminalListener
|
||||||
|
|
||||||
|
class FlushListener : VirtualTerminalListener {
|
||||||
|
|
||||||
|
val lock = Object()
|
||||||
|
|
||||||
|
var flushCount = 0
|
||||||
|
get () = synchronized(lock) { field }
|
||||||
|
private set
|
||||||
|
|
||||||
|
fun reduceFlushCount(reduction: Int) {
|
||||||
|
synchronized(lock) {
|
||||||
|
flushCount -= reduction
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFlush() {
|
||||||
|
synchronized(lock) {
|
||||||
|
flushCount++
|
||||||
|
lock.notify()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResized(terminal: Terminal, newSize: TerminalSize) {}
|
||||||
|
override fun onBell() {}
|
||||||
|
override fun onClose() {}
|
||||||
|
}
|
|
@ -1,178 +0,0 @@
|
||||||
package terminal;
|
|
||||||
|
|
||||||
import com.googlecode.lanterna.TerminalPosition;
|
|
||||||
import com.googlecode.lanterna.TerminalSize;
|
|
||||||
import com.googlecode.lanterna.input.KeyStroke;
|
|
||||||
import com.googlecode.lanterna.input.KeyType;
|
|
||||||
import com.googlecode.lanterna.terminal.virtual.DefaultVirtualTerminal;
|
|
||||||
import com.googlecode.lanterna.terminal.virtual.VirtualTerminal;
|
|
||||||
import stream.LispIOException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.PipedInputStream;
|
|
||||||
import java.io.PipedOutputStream;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
import static terminal.LispTerminal.END_OF_SEGMENT;
|
|
||||||
|
|
||||||
public class VirtualTerminalInteractor {
|
|
||||||
|
|
||||||
private PipedOutputStream inputWriter;
|
|
||||||
private PipedInputStream inputReader;
|
|
||||||
private PipedOutputStream outputWriter;
|
|
||||||
private PipedInputStream outputReader;
|
|
||||||
private VirtualTerminal virtualTerminal;
|
|
||||||
private FlushListener flushListener;
|
|
||||||
private LispTerminal lispTerminal;
|
|
||||||
private TerminalConfiguration configuration;
|
|
||||||
|
|
||||||
public VirtualTerminalInteractor() {
|
|
||||||
this.inputWriter = new PipedOutputStream();
|
|
||||||
this.inputReader = new PipedInputStream();
|
|
||||||
this.outputWriter = new PipedOutputStream();
|
|
||||||
this.outputReader = new PipedInputStream();
|
|
||||||
this.virtualTerminal = new DefaultVirtualTerminal();
|
|
||||||
this.flushListener = new FlushListener();
|
|
||||||
this.virtualTerminal.addVirtualTerminalListener(flushListener);
|
|
||||||
this.lispTerminal = new LispTerminal(createTerminalConfiguration());
|
|
||||||
}
|
|
||||||
|
|
||||||
private TerminalConfiguration createTerminalConfiguration() {
|
|
||||||
configuration = new TerminalConfiguration();
|
|
||||||
configuration.setInputPair(inputWriter, inputReader);
|
|
||||||
configuration.setOutputPair(outputWriter, outputReader);
|
|
||||||
configuration.setTerminal(virtualTerminal);
|
|
||||||
|
|
||||||
return configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TerminalConfiguration getConfiguration() {
|
|
||||||
return configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start() {
|
|
||||||
lispTerminal.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop() {
|
|
||||||
try {
|
|
||||||
lispTerminal.stop();
|
|
||||||
outputWriter.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new LispIOException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void pressKey(KeyType keyType) {
|
|
||||||
virtualTerminal.addInput(new KeyStroke(keyType));
|
|
||||||
waitForFlushes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void pressKeyTimes(KeyType keyType, int times) {
|
|
||||||
for (int i = times; i > 0; i--)
|
|
||||||
virtualTerminal.addInput(new KeyStroke(keyType));
|
|
||||||
|
|
||||||
waitForFlushes(times);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void pressControlKey(KeyType keyType) {
|
|
||||||
virtualTerminal.addInput(new KeyStroke(keyType, true, false));
|
|
||||||
waitForFlushes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enterCharacter(char character) {
|
|
||||||
virtualTerminal.addInput(new KeyStroke(character, false, false));
|
|
||||||
waitForFlushes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enterControlCharacter(char character) {
|
|
||||||
virtualTerminal.addInput(new KeyStroke(character, true, false));
|
|
||||||
waitForFlushes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enterCharacters(String characters) {
|
|
||||||
for (char c : characters.toCharArray())
|
|
||||||
virtualTerminal.addInput(new KeyStroke(c, false, false));
|
|
||||||
|
|
||||||
waitForFlushes(characters.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void produceOutput(String output) {
|
|
||||||
try {
|
|
||||||
for (char c : output.toCharArray())
|
|
||||||
outputWriter.write(c);
|
|
||||||
|
|
||||||
outputWriter.write(END_OF_SEGMENT);
|
|
||||||
outputWriter.flush();
|
|
||||||
waitForFlushes(1);
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void waitForFlushes(int flushCount) {
|
|
||||||
try {
|
|
||||||
synchronized (flushListener) {
|
|
||||||
while (flushListener.getFlushCount() < flushCount)
|
|
||||||
flushListener.wait();
|
|
||||||
|
|
||||||
flushListener.reduceFlushCount(flushCount);
|
|
||||||
}
|
|
||||||
} catch (InterruptedException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void waitForPrompt() {
|
|
||||||
waitForFlushes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setColumns(int columns) {
|
|
||||||
int rows = virtualTerminal.getTerminalSize().getRows();
|
|
||||||
virtualTerminal.setTerminalSize(new TerminalSize(columns, rows));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRows(int rows) {
|
|
||||||
int columns = virtualTerminal.getTerminalSize().getColumns();
|
|
||||||
virtualTerminal.setTerminalSize(new TerminalSize(columns, rows));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertCursorPosition(int column, int row) {
|
|
||||||
assertThat(virtualTerminal.getCursorPosition().getColumn()).isEqualTo(column);
|
|
||||||
assertThat(virtualTerminal.getCursorPosition().getRow()).isEqualTo(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertScreenText(String... rows) {
|
|
||||||
for (int row = 0; row < rows.length; row++)
|
|
||||||
for (int column = 0; column < rows[row].length(); column++)
|
|
||||||
assertCharacterAtPosition(rows[row].charAt(column), column, row);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertCharacterAtPosition(char character, int column, int row) {
|
|
||||||
TerminalPosition position = new TerminalPosition(column, row);
|
|
||||||
String expected = String.valueOf(character);
|
|
||||||
String actual = String.valueOf(virtualTerminal.getCharacter(position).getCharacter());
|
|
||||||
assertThat(actual).isEqualTo(expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertInputWritten(String expected) {
|
|
||||||
String actual = "";
|
|
||||||
|
|
||||||
try {
|
|
||||||
inputWriter.close();
|
|
||||||
|
|
||||||
for (int c = inputReader.read(); c != -1; c = inputReader.read())
|
|
||||||
actual += (char) c;
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
assertThat(actual).isEqualTo(expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void assertInputStreamClosed() {
|
|
||||||
try {
|
|
||||||
inputWriter.write(0);
|
|
||||||
fail("input stream not closed");
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
package terminal
|
||||||
|
|
||||||
|
import com.googlecode.lanterna.TerminalPosition
|
||||||
|
import com.googlecode.lanterna.TerminalSize
|
||||||
|
import com.googlecode.lanterna.input.KeyStroke
|
||||||
|
import com.googlecode.lanterna.input.KeyType
|
||||||
|
import com.googlecode.lanterna.terminal.virtual.DefaultVirtualTerminal
|
||||||
|
import com.googlecode.lanterna.terminal.virtual.VirtualTerminal
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.Assert.fail
|
||||||
|
import terminal.LispTerminal.END_OF_SEGMENT
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.PipedInputStream
|
||||||
|
import java.io.PipedOutputStream
|
||||||
|
|
||||||
|
class VirtualTerminalInteractor {
|
||||||
|
|
||||||
|
private val inputWriter = PipedOutputStream()
|
||||||
|
private val inputReader = PipedInputStream()
|
||||||
|
private val outputWriter = PipedOutputStream()
|
||||||
|
private val outputReader = PipedInputStream()
|
||||||
|
private val flushListener = FlushListener()
|
||||||
|
|
||||||
|
private val virtualTerminal: VirtualTerminal = DefaultVirtualTerminal().apply {
|
||||||
|
addVirtualTerminalListener(flushListener)
|
||||||
|
}
|
||||||
|
|
||||||
|
val configuration = TerminalConfiguration().also {
|
||||||
|
it.setInputPair(inputWriter, inputReader)
|
||||||
|
it.setOutputPair(outputWriter, outputReader)
|
||||||
|
it.terminal = virtualTerminal
|
||||||
|
}
|
||||||
|
|
||||||
|
private val lispTerminal = LispTerminal(configuration)
|
||||||
|
|
||||||
|
fun start() {
|
||||||
|
lispTerminal.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop() {
|
||||||
|
lispTerminal.stop()
|
||||||
|
outputWriter.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pressKey(keyType: KeyType) {
|
||||||
|
virtualTerminal.addInput(KeyStroke(keyType))
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pressKeyTimes(keyType: KeyType, times: Int) {
|
||||||
|
for (i in times downTo 1)
|
||||||
|
virtualTerminal.addInput(KeyStroke(keyType))
|
||||||
|
|
||||||
|
waitForFlushes(times)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun pressControlKey(keyType: KeyType) {
|
||||||
|
virtualTerminal.addInput(KeyStroke(keyType, true, false))
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun enterCharacter(character: Char) {
|
||||||
|
virtualTerminal.addInput(KeyStroke(character, false, false))
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun enterControlCharacter(character: Char) {
|
||||||
|
virtualTerminal.addInput(KeyStroke(character, true, false))
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun enterCharacters(characters: String) {
|
||||||
|
for (c in characters.toCharArray())
|
||||||
|
virtualTerminal.addInput(KeyStroke(c, false, false))
|
||||||
|
|
||||||
|
waitForFlushes(characters.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun produceOutput(output: String) {
|
||||||
|
for (c in output.toCharArray())
|
||||||
|
outputWriter.write(c.toInt())
|
||||||
|
|
||||||
|
outputWriter.write(END_OF_SEGMENT.toInt())
|
||||||
|
outputWriter.flush()
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun waitForFlushes(flushCount: Int) {
|
||||||
|
synchronized(flushListener.lock) {
|
||||||
|
while (flushListener.flushCount < flushCount)
|
||||||
|
flushListener.lock.wait()
|
||||||
|
|
||||||
|
flushListener.reduceFlushCount(flushCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun waitForPrompt() {
|
||||||
|
waitForFlushes(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setColumns(columns: Int) {
|
||||||
|
val rows = virtualTerminal.terminalSize.rows
|
||||||
|
virtualTerminal.terminalSize = TerminalSize(columns, rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setRows(rows: Int) {
|
||||||
|
val columns = virtualTerminal.terminalSize.columns
|
||||||
|
virtualTerminal.terminalSize = TerminalSize(columns, rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assertCursorPosition(column: Int, row: Int) {
|
||||||
|
assertThat(virtualTerminal.cursorPosition.column).isEqualTo(column)
|
||||||
|
assertThat(virtualTerminal.cursorPosition.row).isEqualTo(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assertScreenText(vararg rows: String) {
|
||||||
|
for (row in rows.indices)
|
||||||
|
for (column in 0 until rows[row].length)
|
||||||
|
assertCharacterAtPosition(rows[row][column], column, row)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertCharacterAtPosition(character: Char, column: Int, row: Int) {
|
||||||
|
val position = TerminalPosition(column, row)
|
||||||
|
val expected = character.toString()
|
||||||
|
val actual = virtualTerminal.getCharacter(position).character.toString()
|
||||||
|
assertThat(actual).isEqualTo(expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assertInputWritten(expected: String) {
|
||||||
|
var actual = ""
|
||||||
|
|
||||||
|
inputWriter.close()
|
||||||
|
|
||||||
|
var c = inputReader.read()
|
||||||
|
while (c != -1) {
|
||||||
|
actual += c.toChar()
|
||||||
|
c = inputReader.read()
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(actual).isEqualTo(expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun assertInputStreamClosed() {
|
||||||
|
try {
|
||||||
|
inputWriter.write(0)
|
||||||
|
fail("input stream not closed")
|
||||||
|
} catch (ignored: IOException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue