Fix text insertion at the end of the buffer
This commit is contained in:
parent
38710e21bf
commit
fc96894d14
|
@ -13,7 +13,6 @@ class ControlSequenceHandler {
|
||||||
private Command command;
|
private Command command;
|
||||||
|
|
||||||
public ControlSequenceHandler() {
|
public ControlSequenceHandler() {
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
this.inControlSequence = false;
|
this.inControlSequence = false;
|
||||||
this.code = 0;
|
this.code = 0;
|
||||||
this.command = SGR;
|
this.command = SGR;
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class LispTerminal {
|
||||||
private SafePipedOutputStream inputWriter;
|
private SafePipedOutputStream inputWriter;
|
||||||
private SafePipedInputStream outputReader;
|
private SafePipedInputStream outputReader;
|
||||||
private ExecutorService executorService;
|
private ExecutorService executorService;
|
||||||
private ControlSequenceHandler controlSequenceHandler;
|
// private ControlSequenceHandler controlSequenceHandler;
|
||||||
private TerminalSize terminalSize;
|
private TerminalSize terminalSize;
|
||||||
private int originColumn;
|
private int originColumn;
|
||||||
private int originRow;
|
private int originRow;
|
||||||
|
@ -29,12 +29,11 @@ public class LispTerminal {
|
||||||
private boolean isFinished;
|
private boolean isFinished;
|
||||||
|
|
||||||
public LispTerminal(IOSafeTerminal terminal, PipedOutputStream inputWriter, PipedInputStream outputReader) {
|
public LispTerminal(IOSafeTerminal terminal, PipedOutputStream inputWriter, PipedInputStream outputReader) {
|
||||||
// FIXME - add resize handler
|
|
||||||
this.terminal = terminal;
|
this.terminal = terminal;
|
||||||
this.inputWriter = new SafePipedOutputStream(inputWriter);
|
this.inputWriter = new SafePipedOutputStream(inputWriter);
|
||||||
this.outputReader = new SafePipedInputStream(outputReader);
|
this.outputReader = new SafePipedInputStream(outputReader);
|
||||||
this.executorService = Executors.newFixedThreadPool(2);
|
this.executorService = Executors.newFixedThreadPool(2);
|
||||||
this.controlSequenceHandler = new ControlSequenceHandler();
|
// this.controlSequenceHandler = new ControlSequenceHandler();
|
||||||
this.terminalSize = terminal.getTerminalSize();
|
this.terminalSize = terminal.getTerminalSize();
|
||||||
this.originColumn = terminal.getCursorPosition().getColumn();
|
this.originColumn = terminal.getCursorPosition().getColumn();
|
||||||
this.originRow = terminal.getCursorPosition().getRow();
|
this.originRow = terminal.getCursorPosition().getRow();
|
||||||
|
@ -100,22 +99,10 @@ public class LispTerminal {
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void doKey(KeyStroke keyStroke) {
|
private synchronized void doKey(KeyStroke keyStroke) {
|
||||||
KeyType keyType = keyStroke.getKeyType();
|
|
||||||
|
|
||||||
if (keyStroke.isCtrlDown())
|
if (keyStroke.isCtrlDown())
|
||||||
doControlKey(keyStroke);
|
doControlKey(keyStroke);
|
||||||
else if (keyType == KeyType.ArrowLeft)
|
else
|
||||||
moveCursorLeft();
|
doNormalKey(keyStroke);
|
||||||
else if (keyType == KeyType.ArrowRight)
|
|
||||||
moveCursorRight();
|
|
||||||
else if (keyType == KeyType.Enter)
|
|
||||||
doEnter();
|
|
||||||
else if (keyType == KeyType.Backspace)
|
|
||||||
doBackspace();
|
|
||||||
else if (keyType == KeyType.Delete)
|
|
||||||
doDelete();
|
|
||||||
else if (keyType == KeyType.Character)
|
|
||||||
doCharacter(keyStroke);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void doControlKey(KeyStroke keyStroke) {
|
private synchronized void doControlKey(KeyStroke keyStroke) {
|
||||||
|
@ -135,6 +122,23 @@ public class LispTerminal {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void doNormalKey(KeyStroke keyStroke) {
|
||||||
|
KeyType keyType = keyStroke.getKeyType();
|
||||||
|
|
||||||
|
if (keyType == KeyType.ArrowLeft)
|
||||||
|
moveCursorLeft();
|
||||||
|
else if (keyType == KeyType.ArrowRight)
|
||||||
|
moveCursorRight();
|
||||||
|
else if (keyType == KeyType.Enter)
|
||||||
|
doEnter();
|
||||||
|
else if (keyType == KeyType.Backspace)
|
||||||
|
doBackspace();
|
||||||
|
else if (keyType == KeyType.Delete)
|
||||||
|
doDelete();
|
||||||
|
else if (keyType == KeyType.Character)
|
||||||
|
doCharacter(keyStroke.getCharacter());
|
||||||
|
}
|
||||||
|
|
||||||
private synchronized void moveCursorLeft() {
|
private synchronized void moveCursorLeft() {
|
||||||
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
||||||
|
|
||||||
|
@ -154,15 +158,6 @@ public class LispTerminal {
|
||||||
return columnDifference + (totalColumns * rowDifference);
|
return columnDifference + (totalColumns * rowDifference);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized TerminalPosition getLeadingEdge() {
|
|
||||||
int inputLength = inputLine.length();
|
|
||||||
int totalColumns = terminalSize.getColumns();
|
|
||||||
int rowDifference = inputLength / totalColumns;
|
|
||||||
int columnDifference = inputLength % totalColumns;
|
|
||||||
|
|
||||||
return new TerminalPosition(originColumn + columnDifference, originRow + rowDifference);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void retractCursor(TerminalPosition cursorPosition) {
|
private synchronized void retractCursor(TerminalPosition cursorPosition) {
|
||||||
TerminalPosition newPosition = cursorPosition.withRelativeColumn(-1);
|
TerminalPosition newPosition = cursorPosition.withRelativeColumn(-1);
|
||||||
|
|
||||||
|
@ -189,31 +184,31 @@ public class LispTerminal {
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void advanceCursor(TerminalPosition cursorPosition) {
|
private synchronized void advanceCursor(TerminalPosition cursorPosition) {
|
||||||
if (isAtEndOfRow(cursorPosition))
|
if (isEndOfRow(cursorPosition))
|
||||||
moveCursorToNextRow(cursorPosition);
|
moveCursorToNextRow(cursorPosition);
|
||||||
else
|
else
|
||||||
terminal.setCursorPosition(cursorPosition.withRelativeColumn(1));
|
terminal.setCursorPosition(cursorPosition.withRelativeColumn(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized boolean isAtEndOfRow(TerminalPosition cursorPosition) {
|
private synchronized boolean isEndOfRow(TerminalPosition cursorPosition) {
|
||||||
return cursorPosition.getColumn() >= terminalSize.getColumns() - 1;
|
return cursorPosition.getColumn() >= terminalSize.getColumns() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void moveCursorToNextRow(TerminalPosition cursorPosition) {
|
private synchronized void moveCursorToNextRow(TerminalPosition cursorPosition) {
|
||||||
if (isEndOfBuffer())
|
if (isEndOfBuffer(cursorPosition))
|
||||||
createNewRowForCursor();
|
createNewRowForCursor(cursorPosition);
|
||||||
else
|
else
|
||||||
terminal.setCursorPosition(cursorPosition.withColumn(0).withRelativeRow(1));
|
terminal.setCursorPosition(cursorPosition.withColumn(0).withRelativeRow(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isEndOfBuffer() {
|
private synchronized boolean isEndOfBuffer(TerminalPosition cursorPosition) {
|
||||||
return terminal.getCursorPosition().getRow() == terminalSize.getRows() - 1;
|
return cursorPosition.getRow() == terminalSize.getRows() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createNewRowForCursor() {
|
private synchronized void createNewRowForCursor(TerminalPosition cursorPosition) {
|
||||||
TerminalPosition originalPosition = terminal.getCursorPosition();
|
terminal.setCursorPosition(cursorPosition);
|
||||||
terminal.putCharacter('\n');
|
terminal.putCharacter('\n');
|
||||||
terminal.setCursorPosition(originalPosition.withColumn(0));
|
terminal.setCursorPosition(cursorPosition.withColumn(0));
|
||||||
--originRow;
|
--originRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +226,16 @@ public class LispTerminal {
|
||||||
terminal.setCursorPosition(getLeadingEdge());
|
terminal.setCursorPosition(getLeadingEdge());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateOrigin() {
|
private synchronized TerminalPosition getLeadingEdge() {
|
||||||
|
int inputLength = inputLine.length();
|
||||||
|
int totalColumns = terminalSize.getColumns();
|
||||||
|
int rowDifference = inputLength / totalColumns;
|
||||||
|
int columnDifference = inputLength % totalColumns;
|
||||||
|
|
||||||
|
return new TerminalPosition(originColumn + columnDifference, originRow + rowDifference);
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void updateOrigin() {
|
||||||
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
||||||
originColumn = cursorPosition.getColumn();
|
originColumn = cursorPosition.getColumn();
|
||||||
originRow = cursorPosition.getRow();
|
originRow = cursorPosition.getRow();
|
||||||
|
@ -270,28 +274,53 @@ public class LispTerminal {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void doCharacter(KeyStroke keyStroke) {
|
private synchronized void doCharacter(Character character) {
|
||||||
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
||||||
|
|
||||||
if (isPossibleToMoveRight(cursorPosition)) {
|
if (isPossibleToMoveRight(cursorPosition))
|
||||||
String remaining = keyStroke.getCharacter()
|
insertCharacter(character, cursorPosition);
|
||||||
+ inputLine.substring(getDistanceFromOrigin(cursorPosition), inputLine.length());
|
else
|
||||||
inputLine = inputLine.substring(0, getDistanceFromOrigin(cursorPosition)) + remaining;
|
appendCharacter(character, cursorPosition);
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME - must have a way to push remainder on to a new line at the end of the buffer
|
private synchronized void insertCharacter(Character character, TerminalPosition cursorPosition) {
|
||||||
|
if (!isBufferFilled()) {
|
||||||
|
int oldOriginRow = originRow;
|
||||||
|
advanceCursor(getLeadingEdge());
|
||||||
|
|
||||||
|
if (originRow != oldOriginRow) {
|
||||||
|
terminal.setCursorPosition(new TerminalPosition(originColumn, originRow));
|
||||||
|
for (char c : inputLine.toCharArray())
|
||||||
|
terminal.putCharacter(c);
|
||||||
|
cursorPosition = cursorPosition.withRelativeRow(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
terminal.setCursorPosition(cursorPosition);
|
||||||
|
|
||||||
|
int distanceFromOrigin = getDistanceFromOrigin(cursorPosition);
|
||||||
|
String remaining = character + inputLine.substring(distanceFromOrigin, inputLine.length());
|
||||||
|
inputLine = inputLine.substring(0, distanceFromOrigin) + remaining;
|
||||||
|
|
||||||
for (char c : remaining.toCharArray())
|
for (char c : remaining.toCharArray())
|
||||||
terminal.putCharacter(c);
|
terminal.putCharacter(c);
|
||||||
|
|
||||||
advanceCursor(cursorPosition);
|
|
||||||
} else {
|
|
||||||
terminal.putCharacter(keyStroke.getCharacter());
|
|
||||||
inputLine += keyStroke.getCharacter();
|
|
||||||
|
|
||||||
advanceCursor(cursorPosition);
|
advanceCursor(cursorPosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private synchronized boolean isBufferFilled() {
|
||||||
|
int row = getLeadingEdge().getRow();
|
||||||
|
int column = getLeadingEdge().getColumn();
|
||||||
|
|
||||||
|
return (row == terminalSize.getRows() - 1) && (column >= terminalSize.getColumns() - 1) && (originRow <= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void appendCharacter(Character character, TerminalPosition cursorPosition) {
|
||||||
|
terminal.putCharacter(character);
|
||||||
|
inputLine += character;
|
||||||
|
advanceCursor(cursorPosition);
|
||||||
|
}
|
||||||
|
|
||||||
private void takeNap() {
|
private void takeNap() {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1);
|
Thread.sleep(1);
|
||||||
|
@ -326,6 +355,13 @@ public class LispTerminal {
|
||||||
|
|
||||||
private synchronized void printSegment() {
|
private synchronized void printSegment() {
|
||||||
terminal.setCursorVisible(false);
|
terminal.setCursorVisible(false);
|
||||||
|
printSegmentCharacters();
|
||||||
|
terminal.setCursorVisible(true);
|
||||||
|
outputSegment = "";
|
||||||
|
updateOrigin();
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void printSegmentCharacters() {
|
||||||
moveCursorToEndOfInput();
|
moveCursorToEndOfInput();
|
||||||
|
|
||||||
for (char c : outputSegment.toCharArray())
|
for (char c : outputSegment.toCharArray())
|
||||||
|
@ -333,15 +369,12 @@ public class LispTerminal {
|
||||||
|
|
||||||
moveCursorToNextRowIfNecessary();
|
moveCursorToNextRowIfNecessary();
|
||||||
terminal.flush();
|
terminal.flush();
|
||||||
terminal.setCursorVisible(true);
|
|
||||||
outputSegment = "";
|
|
||||||
updateOrigin();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void moveCursorToNextRowIfNecessary() {
|
private synchronized void moveCursorToNextRowIfNecessary() {
|
||||||
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
TerminalPosition cursorPosition = terminal.getCursorPosition();
|
||||||
|
|
||||||
if (isAtEndOfRow(cursorPosition))
|
if (isEndOfRow(cursorPosition))
|
||||||
moveCursorToNextRow(cursorPosition);
|
moveCursorToNextRow(cursorPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,11 +78,13 @@ public class LispTerminalTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setColumns(int columns) {
|
private void setColumns(int columns) {
|
||||||
virtualTerminal.setTerminalSize(new TerminalSize(columns, virtualTerminal.getTerminalSize().getRows()));
|
int rows = virtualTerminal.getTerminalSize().getRows();
|
||||||
|
virtualTerminal.setTerminalSize(new TerminalSize(columns, rows));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setRows(int rows) {
|
private void setRows(int rows) {
|
||||||
virtualTerminal.setTerminalSize(new TerminalSize(virtualTerminal.getTerminalSize().getColumns(), rows));
|
int columns = virtualTerminal.getTerminalSize().getColumns();
|
||||||
|
virtualTerminal.setTerminalSize(new TerminalSize(columns, rows));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertCursorPosition(int column, int row) {
|
private void assertCursorPosition(int column, int row) {
|
||||||
|
@ -92,7 +94,15 @@ public class LispTerminalTest {
|
||||||
|
|
||||||
private void assertCharacterAtPosition(char character, int column, int row) {
|
private void assertCharacterAtPosition(char character, int column, int row) {
|
||||||
TerminalPosition position = new TerminalPosition(column, row);
|
TerminalPosition position = new TerminalPosition(column, row);
|
||||||
assertEquals(String.valueOf(character), String.valueOf(virtualTerminal.getCharacter(position).getCharacter()));
|
String expected = String.valueOf(character);
|
||||||
|
String actual = String.valueOf(virtualTerminal.getCharacter(position).getCharacter());
|
||||||
|
assertEquals(expected, actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertCharacterPositions(char[][] positions) {
|
||||||
|
for (int row = 0; row < positions.length; row++)
|
||||||
|
for (int column = 0; column < positions[row].length; column++)
|
||||||
|
assertCharacterAtPosition(positions[row][column], column, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertInputWritten(String expected) {
|
private void assertInputWritten(String expected) {
|
||||||
|
@ -101,9 +111,8 @@ public class LispTerminalTest {
|
||||||
try {
|
try {
|
||||||
inputWriter.close();
|
inputWriter.close();
|
||||||
|
|
||||||
for (int c = inputReader.read(); c != -1; c = inputReader.read()) {
|
for (int c = inputReader.read(); c != -1; c = inputReader.read())
|
||||||
actual += (char) c;
|
actual += (char) c;
|
||||||
}
|
|
||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
|
|
||||||
assertEquals(expected, actual);
|
assertEquals(expected, actual);
|
||||||
|
@ -116,12 +125,6 @@ public class LispTerminalTest {
|
||||||
} catch (IOException ignored) {}
|
} catch (IOException ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertCharacterPositions(char[][] positions) {
|
|
||||||
for (int row = 0; row < positions.length; row++)
|
|
||||||
for (int column = 0; column < positions[row].length; column++)
|
|
||||||
assertCharacterAtPosition(positions[row][column], column, row);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws IOException {
|
public void setUp() throws IOException {
|
||||||
inputReader = new PipedInputStream();
|
inputReader = new PipedInputStream();
|
||||||
|
@ -211,11 +214,7 @@ public class LispTerminalTest {
|
||||||
enterCharacters("abcd");
|
enterCharacters("abcd");
|
||||||
pressKeyTimes(KeyType.ArrowLeft, 2);
|
pressKeyTimes(KeyType.ArrowLeft, 2);
|
||||||
enterCharacter('x');
|
enterCharacter('x');
|
||||||
assertCharacterAtPosition('a', 0, 0);
|
assertCharacterPositions(new char[][] { { 'a', 'b', 'x', 'c', 'd' } });
|
||||||
assertCharacterAtPosition('b', 1, 0);
|
|
||||||
assertCharacterAtPosition('x', 2, 0);
|
|
||||||
assertCharacterAtPosition('c', 3, 0);
|
|
||||||
assertCharacterAtPosition('d', 4, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -224,11 +223,7 @@ public class LispTerminalTest {
|
||||||
enterCharacters("abcd");
|
enterCharacters("abcd");
|
||||||
pressKeyTimes(KeyType.ArrowLeft, 2);
|
pressKeyTimes(KeyType.ArrowLeft, 2);
|
||||||
enterCharacter('x');
|
enterCharacter('x');
|
||||||
assertCharacterAtPosition('a', 0, 0);
|
assertCharacterPositions(new char[][] { { 'a', 'b', 'x', 'c' }, { 'd', ' ', ' ', ' ' } });
|
||||||
assertCharacterAtPosition('b', 1, 0);
|
|
||||||
assertCharacterAtPosition('x', 2, 0);
|
|
||||||
assertCharacterAtPosition('c', 3, 0);
|
|
||||||
assertCharacterAtPosition('d', 0, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -242,12 +237,7 @@ public class LispTerminalTest {
|
||||||
enterCharacters("12345");
|
enterCharacters("12345");
|
||||||
pressKeyTimes(KeyType.Backspace, 2);
|
pressKeyTimes(KeyType.Backspace, 2);
|
||||||
assertCursorPosition(3, 0);
|
assertCursorPosition(3, 0);
|
||||||
assertCharacterAtPosition('1', 0, 0);
|
assertCharacterPositions(new char[][] { { '1', '2', '3', ' ', ' ', ' ' } });
|
||||||
assertCharacterAtPosition('2', 1, 0);
|
|
||||||
assertCharacterAtPosition('3', 2, 0);
|
|
||||||
assertCharacterAtPosition(' ', 3, 0);
|
|
||||||
assertCharacterAtPosition(' ', 4, 0);
|
|
||||||
assertCharacterAtPosition(' ', 5, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -256,13 +246,7 @@ public class LispTerminalTest {
|
||||||
enterCharacters("1234567");
|
enterCharacters("1234567");
|
||||||
pressKeyTimes(KeyType.Backspace, 5);
|
pressKeyTimes(KeyType.Backspace, 5);
|
||||||
assertCursorPosition(2, 0);
|
assertCursorPosition(2, 0);
|
||||||
assertCharacterAtPosition('1', 0, 0);
|
assertCharacterPositions(new char[][] { { '1', '2', ' ', ' ' }, { ' ', ' ', ' ', ' ' } });
|
||||||
assertCharacterAtPosition('2', 1, 0);
|
|
||||||
assertCharacterAtPosition(' ', 2, 0);
|
|
||||||
assertCharacterAtPosition(' ', 3, 0);
|
|
||||||
assertCharacterAtPosition(' ', 0, 1);
|
|
||||||
assertCharacterAtPosition(' ', 1, 1);
|
|
||||||
assertCharacterAtPosition(' ', 2, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -271,10 +255,7 @@ public class LispTerminalTest {
|
||||||
pressKeyTimes(KeyType.ArrowLeft, 2);
|
pressKeyTimes(KeyType.ArrowLeft, 2);
|
||||||
pressKey(KeyType.Backspace);
|
pressKey(KeyType.Backspace);
|
||||||
assertCursorPosition(2, 0);
|
assertCursorPosition(2, 0);
|
||||||
assertCharacterAtPosition('1', 0, 0);
|
assertCharacterPositions(new char[][] { { '1', '2', '4', '5' } });
|
||||||
assertCharacterAtPosition('2', 1, 0);
|
|
||||||
assertCharacterAtPosition('4', 2, 0);
|
|
||||||
assertCharacterAtPosition('5', 3, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -288,9 +269,7 @@ public class LispTerminalTest {
|
||||||
enterCharacters("del");
|
enterCharacters("del");
|
||||||
pressKey(KeyType.Delete);
|
pressKey(KeyType.Delete);
|
||||||
assertCursorPosition(3, 0);
|
assertCursorPosition(3, 0);
|
||||||
assertCharacterAtPosition('d', 0, 0);
|
assertCharacterPositions(new char[][] { { 'd', 'e', 'l' } });
|
||||||
assertCharacterAtPosition('e', 1, 0);
|
|
||||||
assertCharacterAtPosition('l', 2, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -299,9 +278,7 @@ public class LispTerminalTest {
|
||||||
pressKeyTimes(KeyType.ArrowLeft, 3);
|
pressKeyTimes(KeyType.ArrowLeft, 3);
|
||||||
pressKeyTimes(KeyType.Delete, 3);
|
pressKeyTimes(KeyType.Delete, 3);
|
||||||
assertCursorPosition(0, 0);
|
assertCursorPosition(0, 0);
|
||||||
assertCharacterAtPosition(' ', 0, 0);
|
assertCharacterPositions(new char[][] { { ' ', ' ', ' ' } });
|
||||||
assertCharacterAtPosition(' ', 1, 0);
|
|
||||||
assertCharacterAtPosition(' ', 2, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -311,12 +288,7 @@ public class LispTerminalTest {
|
||||||
pressKeyTimes(KeyType.ArrowLeft, 5);
|
pressKeyTimes(KeyType.ArrowLeft, 5);
|
||||||
pressKey(KeyType.Delete);
|
pressKey(KeyType.Delete);
|
||||||
assertCursorPosition(1, 0);
|
assertCursorPosition(1, 0);
|
||||||
assertCharacterAtPosition('d', 0, 0);
|
assertCharacterPositions(new char[][] { { 'd', 'l', 'e', 't' }, { 'e', ' ' } });
|
||||||
assertCharacterAtPosition('l', 1, 0);
|
|
||||||
assertCharacterAtPosition('e', 2, 0);
|
|
||||||
assertCharacterAtPosition('t', 3, 0);
|
|
||||||
assertCharacterAtPosition('e', 0, 1);
|
|
||||||
assertCharacterAtPosition(' ', 1, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -340,6 +312,32 @@ public class LispTerminalTest {
|
||||||
assertInputWritten("enter\n");
|
assertInputWritten("enter\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enterAfterInsertedText_WritesLineToPipedStream() {
|
||||||
|
enterCharacters("enter");
|
||||||
|
pressKeyTimes(KeyType.ArrowLeft, 2);
|
||||||
|
enterCharacters("||");
|
||||||
|
pressKey(KeyType.Enter);
|
||||||
|
assertInputWritten("ent||er\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enterAfterBackspace_WritesLineToPipedStream() {
|
||||||
|
enterCharacters("enter");
|
||||||
|
pressKeyTimes(KeyType.Backspace, 2);
|
||||||
|
pressKey(KeyType.Enter);
|
||||||
|
assertInputWritten("ent\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enterAfterDelete_WritesLineToPipedStream() {
|
||||||
|
enterCharacters("enter");
|
||||||
|
pressKeyTimes(KeyType.ArrowLeft, 2);
|
||||||
|
pressKeyTimes(KeyType.Delete, 2);
|
||||||
|
pressKey(KeyType.Enter);
|
||||||
|
assertInputWritten("ent\n");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void controlDWorks() {
|
public void controlDWorks() {
|
||||||
enterCharacters("control-d");
|
enterCharacters("control-d");
|
||||||
|
@ -401,16 +399,31 @@ public class LispTerminalTest {
|
||||||
assertCharacterPositions(new char[][] { { '0', '1', '2' }, { '0', '1', ' ' } });
|
assertCharacterPositions(new char[][] { { '0', '1', '2' }, { '0', '1', ' ' } });
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Test
|
@Test
|
||||||
// public void insertingTextPushesInputPastEndOfBuffer() {
|
public void insertingTextPushesInputPastEndOfBuffer() {
|
||||||
// setColumns(3);
|
setColumns(3);
|
||||||
// setRows(3);
|
setRows(4);
|
||||||
// enterCharacters("00011122");
|
pressKey(KeyType.Enter);
|
||||||
// pressKeyTimes(KeyType.ArrowLeft, 4);
|
enterCharacters("00011122");
|
||||||
// enterCharacters("zz");
|
pressKeyTimes(KeyType.ArrowLeft, 4);
|
||||||
// assertCursorPosition(0, 1);
|
assertCursorPosition(1, 2);
|
||||||
// assertCharacterPositions(new char[][] { { '1', 'z', 'z' }, { '1', '1', '2' }, { '2', ' ', ' ' } });
|
enterCharacters("zz");
|
||||||
// }
|
assertCursorPosition(0, 2);
|
||||||
|
assertCharacterPositions(new char[][] { { '0', '0', '0' }, { '1', 'z', 'z' }, { '1', '1', '2' },
|
||||||
|
{ '2', ' ', ' ' } });
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void insertingTextDoesNothingWhenBufferFilled() {
|
||||||
|
setColumns(3);
|
||||||
|
setRows(3);
|
||||||
|
enterCharacters("00011122");
|
||||||
|
pressKeyTimes(KeyType.ArrowLeft, 4);
|
||||||
|
assertCursorPosition(1, 1);
|
||||||
|
enterCharacters("zz");
|
||||||
|
assertCursorPosition(1, 1);
|
||||||
|
assertCharacterPositions(new char[][] { { '0', '0', '0' }, { '1', '1', '1' }, { '2', '2', ' ' } });
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void printedOutputToEndOfRow_MovesCursorToNextRow() {
|
public void printedOutputToEndOfRow_MovesCursorToNextRow() {
|
||||||
|
|
Loading…
Reference in New Issue