public void TestMapControlChars() { var map = new WindowsAnsiCharMap(); ConsoleKeyInfo processedKey; // Enter (Ctrl+J) map.ProcessKey(new ConsoleKeyInfo('\x0D', 0, false, false, false)); Assert.AreEqual(true, map.KeyAvailable); processedKey = map.ReadKey(); Assert.AreEqual(processedKey.Key, ConsoleKey.Enter); Assert.AreEqual(processedKey.Modifiers, (ConsoleModifiers)0); Assert.AreEqual(false, map.KeyAvailable); // Ctrl+C map.ProcessKey(new ConsoleKeyInfo('\x03', 0, false, false, false)); processedKey = map.ReadKey(); Assert.AreEqual(processedKey.Key, ConsoleKey.C); Assert.AreEqual(processedKey.Modifiers, ConsoleModifiers.Control); }
public void MapControlChars() { var map = new WindowsAnsiCharMap(); // Enter (Ctrl+J) map.ProcessKey(new ConsoleKeyInfo('\x0D', 0, false, false, false)); Assert.True(map.KeyAvailable); var processedKey = map.ReadKey(); Assert.Equal(ConsoleKey.Enter, processedKey.Key); Assert.Equal((ConsoleModifiers)0, processedKey.Modifiers); Assert.False(map.KeyAvailable); // Ctrl+C map.ProcessKey(new ConsoleKeyInfo('\x03', 0, false, false, false)); processedKey = map.ReadKey(); Assert.Equal(ConsoleKey.C, processedKey.Key); Assert.Equal(ConsoleModifiers.Control, processedKey.Modifiers); }
public void TestAltSequences() { var map = new WindowsAnsiCharMap(1000); ConsoleKeyInfo processedKey; // ^[[ = Alt+[ CheckEscapeInput(map, default(ConsoleKeyInfo), StringToCKI("\x1b["), true); processedKey = map.ReadKey(); Assert.AreEqual('[', processedKey.KeyChar); Assert.AreEqual(ConsoleModifiers.Alt, processedKey.Modifiers); Assert.AreEqual(false, map.KeyAvailable); // ^[j = Alt+j CheckEscapeInput(map, default(ConsoleKeyInfo), StringToCKI("\x1bj"), true); processedKey = map.ReadKey(); Assert.AreEqual('j', processedKey.KeyChar); Assert.AreEqual(ConsoleModifiers.Alt, processedKey.Modifiers); Assert.AreEqual(false, map.KeyAvailable); // ^[X = Alt+X // Currently shift is not set for capitals, so just check the alt // parts to allow that behavior to change without breaking this test. CheckEscapeInput(map, default(ConsoleKeyInfo), StringToCKI("\x1bX"), true); processedKey = map.ReadKey(); Assert.AreEqual('X', processedKey.KeyChar); Assert.AreEqual(ConsoleModifiers.Alt, processedKey.Modifiers & ConsoleModifiers.Alt); Assert.AreEqual(false, map.KeyAvailable); // ^[^A = Alt+Ctrl+A CheckEscapeInput(map, default(ConsoleKeyInfo), StringToCKI("\x1b\x01"), true); processedKey = map.ReadKey(); Assert.AreEqual('\x01', processedKey.KeyChar); Assert.AreEqual(ConsoleModifiers.Alt | ConsoleModifiers.Control, processedKey.Modifiers); Assert.AreEqual(false, map.KeyAvailable); // This is a "tricky" one since ^[O can start a sequence and the second // escape needs to cancel sequence processing, make an Alt+O available, // and after that has been read make Esc available. // ^[O^[ = Alt+O Esc var consoleKeys = StringToCKI("\x1bO\x1b"); foreach (var ck in consoleKeys) { map.ProcessKey(ck); } Assert.AreEqual(true, map.KeyAvailable); processedKey = map.ReadKey(); // Alt+O Assert.AreEqual('O', processedKey.KeyChar); Assert.AreEqual(ConsoleModifiers.Alt, processedKey.Modifiers); // Make the map stop looking for an escape sequence. map.EscapeTimeout = 0; // Esc Assert.AreEqual(true, map.KeyAvailable); Assert.AreEqual('\x1b', map.ReadKey().KeyChar); Assert.AreEqual(false, map.KeyAvailable); map.EscapeTimeout = 1000; // ^[^[ = Esc Esc, not Alt+Esc. consoleKeys = StringToCKI("\x1b\x1b"); foreach (var ck in consoleKeys) { map.ProcessKey(ck); } Assert.AreEqual(true, map.KeyAvailable); map.ReadKey(); map.EscapeTimeout = 0; Assert.AreEqual(true, map.KeyAvailable); map.ReadKey(); }