package io.termd.core.readline;
import io.termd.core.util.Vector;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
*/
public class LineBufferTest {
@Test
public void testInsertAfter() {
LineBuffer buffer = new LineBuffer();
assertEquals("", buffer.toString());
assertEquals(0, buffer.getCursor());
assertEquals(0, buffer.getSize());
buffer.insert('a');
assertEquals("a", buffer.toString());
assertEquals(1, buffer.getCursor());
assertEquals(1, buffer.getSize());
buffer.insert('b');
assertEquals("ab", buffer.toString());
assertEquals(2, buffer.getCursor());
assertEquals(2, buffer.getSize());
}
@Test
public void testInsertArrayAfter() {
LineBuffer buffer = new LineBuffer();
assertEquals("", buffer.toString());
assertEquals(0, buffer.getCursor());
assertEquals(0, buffer.getSize());
buffer.insert('a', 'b');
assertEquals("ab", buffer.toString());
assertEquals(2, buffer.getCursor());
assertEquals(2, buffer.getSize());
buffer.insert('c', 'd');
assertEquals("abcd", buffer.toString());
assertEquals(4, buffer.getCursor());
assertEquals(4, buffer.getSize());
}
@Test
public void testMoveCursor() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
assertEquals(-1, buffer.moveCursor(-1));
assertEquals(3, buffer.getCursor());
assertEquals(-2, buffer.moveCursor(-2));
assertEquals(1, buffer.getCursor());
assertEquals(-1, buffer.moveCursor(-2));
assertEquals(0, buffer.getCursor());
assertEquals(1, buffer.moveCursor(1));
assertEquals(1, buffer.getCursor());
assertEquals(2, buffer.moveCursor(2));
assertEquals(3, buffer.getCursor());
assertEquals(1, buffer.moveCursor(2));
assertEquals(4, buffer.getCursor());
}
@Test
public void testSetCursor() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(4);
assertEquals(4, buffer.getCursor());
buffer.setCursor(2);
assertEquals(2, buffer.getCursor());
buffer.setCursor(-1);
assertEquals(0, buffer.getCursor());
buffer.setCursor(1);
assertEquals(1, buffer.getCursor());
buffer.setCursor(0);
assertEquals(0, buffer.getCursor());
buffer.setCursor(5);
assertEquals(4, buffer.getCursor());
}
@Test
public void setSize() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
buffer.setSize(3);
assertEquals(3, buffer.getSize());
assertEquals(2, buffer.getCursor());
buffer.setSize(1);
assertEquals(1, buffer.getSize());
assertEquals(1, buffer.getCursor());
}
@Test
public void testInsert() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'c');
buffer.setCursor(1);
buffer.insert('b');
assertEquals("abc", buffer.toString());
assertEquals(2, buffer.getCursor());
assertEquals(3, buffer.getSize());
}
@Test
public void testInsertArray() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'd');
buffer.setCursor(1);
buffer.insert('b', 'c');
assertEquals("abcd", buffer.toString());
assertEquals(3, buffer.getCursor());
assertEquals(4, buffer.getSize());
}
@Test
public void deleteAt1() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(1, buffer.delete(-1));
assertEquals(3, buffer.getSize());
assertEquals(1, buffer.getCursor());
assertEquals("acd", buffer.toString());
}
@Test
public void deleteAt2() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(2, buffer.delete(-2));
assertEquals(2, buffer.getSize());
assertEquals(0, buffer.getCursor());
assertEquals("cd", buffer.toString());
}
@Test
public void deleteAt3() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(2, buffer.delete(-3));
assertEquals(2, buffer.getSize());
assertEquals(0, buffer.getCursor());
assertEquals("cd", buffer.toString());
}
@Test
public void deleteAt4() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(1, buffer.delete(1));
assertEquals(3, buffer.getSize());
assertEquals(2, buffer.getCursor());
assertEquals("abd", buffer.toString());
}
@Test
public void deleteAt5() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(2, buffer.delete(2));
assertEquals(2, buffer.getSize());
assertEquals(2, buffer.getCursor());
assertEquals("ab", buffer.toString());
}
@Test
public void deleteAt6() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c', 'd');
buffer.setCursor(2);
assertEquals(2, buffer.delete(3));
assertEquals(2, buffer.getSize());
assertEquals(2, buffer.getCursor());
assertEquals("ab", buffer.toString());
}
@Test
public void testCursorPosition() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', 'c');
assertEquals(new Vector(3, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(3));
assertEquals(new Vector(1, 1), buffer.getCursorPosition(2));
assertEquals(new Vector(0, 3), buffer.getCursorPosition(1));
}
@Test
public void testCursorPositionWithNewLine() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b', '\n', 'c');
assertEquals(new Vector(1, 1), buffer.getCursorPosition(4));
assertEquals(new Vector(1, 1), buffer.getCursorPosition(3));
assertEquals(new Vector(1, 2), buffer.getCursorPosition(2));
assertEquals(new Vector(0, 4), buffer.getCursorPosition(1));
}
// @Test
public void testCursorPositionWithCR() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', '\r', 'b', 'c');
assertEquals(new Vector(2, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(2, 0), buffer.getCursorPosition(3));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(2));
assertEquals(new Vector(0, 3), buffer.getCursorPosition(1));
}
// @Test
public void testCursorControlChar() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', '\t', 'c');
assertEquals(new Vector(2, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(2, 0), buffer.getCursorPosition(3));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(2));
assertEquals(new Vector(0, 2), buffer.getCursorPosition(1));
}
// @Test
public void testCursorInvisibleChar() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', '\0', 'c');
assertEquals(new Vector(2, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(2, 0), buffer.getCursorPosition(3));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(2));
assertEquals(new Vector(0, 2), buffer.getCursorPosition(1));
}
// @Test
public void testCursorPositionWithMultiCell1() {
LineBuffer buffer = new LineBuffer();
buffer.insert('한', 'b');
assertEquals(new Vector(3, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(3));
assertEquals(new Vector(1, 1), buffer.getCursorPosition(2));
try {
buffer.getCursorPosition(1);
fail();
} catch (UnsupportedOperationException ignore) {
}
}
// @Test
public void testCursorPositionWithMultiCell2() {
LineBuffer buffer = new LineBuffer();
buffer.insert('a', '한');
assertEquals(new Vector(3, 0), buffer.getCursorPosition(4));
assertEquals(new Vector(0, 1), buffer.getCursorPosition(3));
assertEquals(new Vector(0, 2), buffer.getCursorPosition(2));
try {
buffer.getCursorPosition(1);
fail();
} catch (UnsupportedOperationException ignore) {
}
}
@Test
public void testUpdate1() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
buffer.insert('a');
LineBuffer to = new LineBuffer();
to.insert('a');
buffer.update(to, screen, 40);
screen.assertEmpty();
}
@Test
public void testUpdate2() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
buffer.insert('a');
LineBuffer to = new LineBuffer();
to.insert('b');
buffer.update(to, screen, 40);
screen.assertCodePoints("\rb").assertEmpty();
}
@Test
public void testUpdate3() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
buffer.insert('a', 'b');
LineBuffer to = new LineBuffer();
to.insert('a', 'c');
buffer.update(to, screen, 40);
screen.assertCodePoints("\bc").assertEmpty();
}
@Test
public void testUpdate4() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
LineBuffer to = new LineBuffer();
to.insert('a');
buffer.update(to, screen, 40);
screen.assertCodePoints("a").assertEmpty();
}
@Test
public void testUpdate5() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
buffer.insert('a');
LineBuffer to = new LineBuffer();
buffer.update(to, screen, 40);
screen.assertCodePoints("\r\033[K").assertEmpty();
}
@Test
public void testUpdate6() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
LineBuffer to = new LineBuffer();
to.insert('a', '\n', 'b');
buffer.update(to, screen, 40);
screen.assertCodePoints("a\nb").assertEmpty();
}
@Test
public void testUpdate7() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
buffer.insert('a', '\n', 'b');
LineBuffer to = new LineBuffer();
to.insert('d');
buffer.update(to, screen, 40);
screen.assertCodePoints("\r\033[1Ad\r\033[1B\033[K\033[1C\033[1A").assertEmpty();
}
@Test
public void testUpdate8() {
TestTerminal screen = new TestTerminal();
LineBuffer buffer = new LineBuffer();
LineBuffer to = new LineBuffer();
to.insert('a', 'b', 'c', 'd', 'e');
buffer.update(to, screen, 2);
screen.assertCodePoints("abcde").assertEmpty();
}
}