public Terminal( TerminalOpenEvent terminalOpen = null, ConsoleOutEvent onConsoleOutEvent = null ) { var chr = CharacterParser.Create(); var ansi = new AnsiParserEvents() { Input = (characters) => Debug.Write(new string(characters)) }; _ansiParser = new AnsiParser(events: ansi, utf8: chr.TryParseUtf8); var vt = new VTParserEvents() { EscapeSequence = _ansiParser.OnEscapeSequence, ControlSequence = _ansiParser.OnControlSequenceCommand, Execute = _ansiParser.OnExecute, OsCommand = _ansiParser.OnOsCommand, Print = _ansiParser.OnPrint }; _vtParser = new VTParser(events: vt, utf8: chr.TryParseUtf8, ascii: chr.TryParseAscii); onConsoleOutEvent?.Subscribe(OnConsoleOut); terminalOpen?.Publish(new TerminalOpenEventData( @"C:\windows\system32\cmd.exe", "", null, null )); }
public static void AnsiParser_Print_ConfigureCharSet_ShiftIn_ShiftOut() { const string Case = "Hello 😁 world a "; const string SpecialCase = "H\n┌┌⎺ 😁 ┬⎺⎼┌\r ▒ "; var sb = new StringBuilder(); var ix = 0; var current = Case; var events = new AnsiParserEvents() { Input = (characters) => { sb.Append(new string(characters)); ix = (ix + characters.Length) % Case.Length; } }; var chars = CharacterParser.Create(); var sut = new AnsiParser(events: events, utf8: chars.TryParseUtf8); sut.OnPrint(Case); sut.OnPrint(Case); Assert.Equal(current + current, sb.ToString()); // SET G0 sut.OnEscapeSequence(EscapeCommand.ConfigureSpecialCharSet, new[] { (byte)'(' }); sb.Clear(); ix = 0; current = SpecialCase; sut.OnPrint(Case); sut.OnPrint(Case); Assert.Equal(current + current, sb.ToString()); // Shift sut.OnExecute(ControlCode.ShiftOut); sb.Clear(); ix = 0; current = Case; sut.OnPrint(Case); sut.OnPrint(Case); Assert.Equal(current + current, sb.ToString()); // Reset G0 and Shift sut.OnEscapeSequence(EscapeCommand.ConfigureAsciiCharSet, new[] { (byte)'(' }); sut.OnExecute(ControlCode.ShiftIn); sb.Clear(); ix = 0; current = Case; sut.OnPrint(Case); sut.OnPrint(Case); Assert.Equal(current + current, sb.ToString()); }
public static void AnsiParser_OsCommand_SetWindowTitle() { var dispatched = 0; var events = new AnsiParserEvents { SetTitle = (characters) => { dispatched++; Assert.Equal("Hello 😁 world", new string(characters)); } }; var chars = CharacterParser.Create(); var sut = new AnsiParser(events: events, chars.TryParseUtf8); Osc(sut, OsCommand.SetWindowTitle, "Hello 😁 world"); Osc(sut, OsCommand.SetWindowIconAndTitle, "Hello 😁 world"); Assert.Equal(2, dispatched); }
internal static void AnsiParser_OsCommand_SetClipboard() { const string Case = "Hello 😁 world"; var dispatched = 0; var events = new AnsiParserEvents { SetClipboard = (characters) => { ++dispatched; Assert.Equal(Case, new string(characters)); } }; var chars = CharacterParser.Create(); var sut = new AnsiParser(events: events, utf8: chars.TryParseUtf8); var param = Convert.ToBase64String(Encoding.UTF8.GetBytes(Case)); Osc(sut, OsCommand.SetClipboard, "", param); Assert.Equal(1, dispatched); }
public static void VTParser_Print_UTF8() { const string Case = "Hello 😁 world "; var packet = Encoding.UTF8.GetBytes(Case); var dispatched = 0; var sb = new StringBuilder(); var events = new VTParserEvents { Print = (characters) => { sb.Append(new string(characters)); dispatched = (dispatched + characters.Length) % Case.Length; } }; var chars = CharacterParser.Create(); var parser = new VTParser(events: events, maxParameters: 3, utf8: chars.TryParseUtf8, ascii: chars.TryParseAscii); parser.Process(packet); parser.Process(packet); Assert.Equal(Case + Case, sb.ToString()); }