예제 #1
0
파일: Terminal.cs 프로젝트: rasmus-z/tv
        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
                                      ));
        }
예제 #2
0
        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());
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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());
        }