package com.termux.terminal; /** "\033[" is the Control Sequence Introducer char sequence (CSI). */ public class ControlSequenceIntroducerTest extends TerminalTestCase { /** CSI Ps P Scroll down Ps lines (default = 1) (SD). */ public void testCsiT() { withTerminalSized(4, 6).enterString("1\r\n2\r\n3\r\nhi\033[2Tyo\r\nA\r\nB").assertLinesAre(" ", " ", "1 ", "2 yo", "A ", "Bi "); // Default value (1): withTerminalSized(4, 6).enterString("1\r\n2\r\n3\r\nhi\033[Tyo\r\nA\r\nB").assertLinesAre(" ", "1 ", "2 ", "3 yo", "Ai ", "B "); } /** CSI Ps S Scroll up Ps lines (default = 1) (SU). */ public void testCsiS() { // The behaviour here is a bit inconsistent between terminals - this is how the OS X Terminal.app does it: withTerminalSized(3, 4).enterString("1\r\n2\r\n3\r\nhi\033[2Sy").assertLinesAre("3 ", "hi ", " ", " y"); // Default value (1): withTerminalSized(3, 4).enterString("1\r\n2\r\n3\r\nhi\033[Sy").assertLinesAre("2 ", "3 ", "hi ", " y"); } /** CSI Ps X Erase Ps Character(s) (default = 1) (ECH). */ public void testCsiX() { // See https://code.google.com/p/chromium/issues/detail?id=212712 where test was extraced from. withTerminalSized(13, 2).enterString("abcdefghijkl\b\b\b\b\b\033[X").assertLinesAre("abcdefg ijkl ", " "); withTerminalSized(13, 2).enterString("abcdefghijkl\b\b\b\b\b\033[1X").assertLinesAre("abcdefg ijkl ", " "); withTerminalSized(13, 2).enterString("abcdefghijkl\b\b\b\b\b\033[2X").assertLinesAre("abcdefg jkl ", " "); withTerminalSized(13, 2).enterString("abcdefghijkl\b\b\b\b\b\033[20X").assertLinesAre("abcdefg ", " "); } /** CSI Pm m Set SGR parameter(s) from semicolon-separated list Pm. */ public void testCsiSGRParameters() { // Set more parameters (19) than supported (16). Additional parameters should be silently consumed. withTerminalSized(3, 2).enterString("\033[0;38;2;255;255;255;48;2;0;0;0;1;2;3;4;5;7;8;9mabc").assertLinesAre("abc", " "); } /** CSI Ps b Repeat the preceding graphic character Ps times (REP). */ public void testRepeat() { withTerminalSized(3, 2).enterString("a\033[b").assertLinesAre("aa ", " "); withTerminalSized(3, 2).enterString("a\033[2b").assertLinesAre("aaa", " "); // When no char has been output we ignore REP: withTerminalSized(3, 2).enterString("\033[b").assertLinesAre(" ", " "); // This shows that REP outputs the last emitted code point and not the one relative to the // current cursor position: withTerminalSized(5, 2).enterString("abcde\033[2G\033[2b\n").assertLinesAre("aeede", " "); } /** CSI 3 J Clear scrollback (xterm, libvte; non-standard). */ public void testCsi3J() { withTerminalSized(3, 2).enterString("a\r\nb\r\nc\r\nd"); assertEquals("a\nb\nc\nd", mTerminal.getScreen().getTranscriptText()); enterString("\033[3J"); assertEquals("c\nd", mTerminal.getScreen().getTranscriptText()); withTerminalSized(3, 2).enterString("Lorem_ipsum"); assertEquals("Lorem_ipsum", mTerminal.getScreen().getTranscriptText()); enterString("\033[3J"); assertEquals("ipsum", mTerminal.getScreen().getTranscriptText()); withTerminalSized(3, 2).enterString("w\r\nx\r\ny\r\nz\033[?1049h\033[3J\033[?1049l"); assertEquals("y\nz", mTerminal.getScreen().getTranscriptText()); } }