Add net ansi sequences

This commit is contained in:
tznind
2025-03-20 08:13:48 +00:00
committed by Tig
parent 7712bc64b1
commit a9a9b5bb70
5 changed files with 148 additions and 32 deletions

View File

@@ -49,11 +49,10 @@ public class NetInputProcessor : InputProcessor<ConsoleKeyInfo>
private static string FormatConsoleKeyInfoForTestCase (ConsoleKeyInfo input)
{
string charLiteral = input.KeyChar == '\0' ? @"'\0'" : $"'{input.KeyChar}'";
var expectedLiteral = "new Rune('todo')";
return $"new ConsoleKeyInfo({charLiteral}, ConsoleKey.{input.Key}, "
+ $"{input.Modifiers.HasFlag (ConsoleModifiers.Shift).ToString ().ToLower ()}, "
+ $"{input.Modifiers.HasFlag (ConsoleModifiers.Alt).ToString ().ToLower ()}, "
+ $"{input.Modifiers.HasFlag (ConsoleModifiers.Control).ToString ().ToLower ()}), {expectedLiteral}";
+ $"{input.Modifiers.HasFlag (ConsoleModifiers.Control).ToString ().ToLower ()}),";
}
}

View File

@@ -225,29 +225,50 @@ public class GuiTestContext : IDisposable
private GuiTestContext Click (WindowsConsole.ButtonState btn, int screenX, int screenY)
{
// TODO: Support net style ansi escape sequence generation for arrow keys
switch (_driver)
{
case V2TestDriver.V2Win:
_winInput.InputBuffer.Enqueue (
new ()
{
EventType = WindowsConsole.EventType.Mouse,
MouseEvent = new ()
{
ButtonState = btn,
MousePosition = new ((short)screenX, (short)screenY)
}
});
_winInput.InputBuffer.Enqueue (
new ()
{
EventType = WindowsConsole.EventType.Mouse,
MouseEvent = new ()
{
ButtonState = btn,
MousePosition = new ((short)screenX, (short)screenY)
}
});
_winInput.InputBuffer.Enqueue (
new ()
{
EventType = WindowsConsole.EventType.Mouse,
MouseEvent = new ()
{
ButtonState = WindowsConsole.ButtonState.NoButtonPressed,
MousePosition = new ((short)screenX, (short)screenY)
}
});
_winInput.InputBuffer.Enqueue (
new ()
{
EventType = WindowsConsole.EventType.Mouse,
MouseEvent = new ()
{
ButtonState = WindowsConsole.ButtonState.NoButtonPressed,
MousePosition = new ((short)screenX, (short)screenY)
}
});
break;
case V2TestDriver.V2Net:
int netButton = btn switch
{
WindowsConsole.ButtonState.Button1Pressed => 0,
WindowsConsole.ButtonState.Button2Pressed => 1,
WindowsConsole.ButtonState.Button3Pressed => 2,
WindowsConsole.ButtonState.RightmostButtonPressed => 2,
_ => throw new ArgumentOutOfRangeException(nameof(btn))
};
foreach (var k in NetSequences.Click(netButton,screenX,screenY))
{
SendNetKey (k);
}
break;
default:
throw new ArgumentOutOfRangeException ();
}
WaitIteration ();
@@ -260,11 +281,13 @@ public class GuiTestContext : IDisposable
{
case V2TestDriver.V2Win:
SendWindowsKey (ConsoleKeyMapping.VK.DOWN);
WaitIteration ();
break;
case V2TestDriver.V2Net:
// TODO: Support ansi sequence
throw new NotImplementedException ("Coming soon");
foreach (var k in NetSequences.Down)
{
SendNetKey (k);
}
break;
default:
throw new ArgumentOutOfRangeException ();
@@ -277,21 +300,63 @@ public class GuiTestContext : IDisposable
public GuiTestContext Right ()
{
SendWindowsKey (ConsoleKeyMapping.VK.RIGHT);
switch (_driver)
{
case V2TestDriver.V2Win:
SendWindowsKey (ConsoleKeyMapping.VK.RIGHT);
WaitIteration ();
break;
case V2TestDriver.V2Net:
foreach (var k in NetSequences.Right)
{
SendNetKey (k);
}
break;
default:
throw new ArgumentOutOfRangeException ();
}
return this;
}
public GuiTestContext Left ()
{
SendWindowsKey (ConsoleKeyMapping.VK.LEFT);
switch (_driver)
{
case V2TestDriver.V2Win:
SendWindowsKey (ConsoleKeyMapping.VK.LEFT);
WaitIteration ();
break;
case V2TestDriver.V2Net:
foreach (var k in NetSequences.Left)
{
SendNetKey (k);
}
break;
default:
throw new ArgumentOutOfRangeException ();
}
return this;
}
public GuiTestContext Up ()
{
SendWindowsKey (ConsoleKeyMapping.VK.UP);
switch (_driver)
{
case V2TestDriver.V2Win:
SendWindowsKey (ConsoleKeyMapping.VK.UP);
WaitIteration ();
break;
case V2TestDriver.V2Net:
foreach (var k in NetSequences.Up)
{
SendNetKey (k);
}
break;
default:
throw new ArgumentOutOfRangeException ();
}
return this;
}
@@ -354,7 +419,6 @@ public class GuiTestContext : IDisposable
private void SendNetKey (ConsoleKeyInfo consoleKeyInfo)
{
_netInput.InputBuffer.Enqueue (consoleKeyInfo);
WaitIteration ();
}
/// <summary>

View File

@@ -0,0 +1,53 @@
namespace TerminalGuiFluentTesting;
class NetSequences
{
public static ConsoleKeyInfo [] Down = new []
{
new ConsoleKeyInfo('\x1B', ConsoleKey.Enter, false, false, false),
new ConsoleKeyInfo('[', ConsoleKey.None, false, false, false),
new ConsoleKeyInfo('B', ConsoleKey.None, false, false, false),
};
public static ConsoleKeyInfo [] Up = new []
{
new ConsoleKeyInfo('\x1B', ConsoleKey.Enter, false, false, false),
new ConsoleKeyInfo('[', ConsoleKey.None, false, false, false),
new ConsoleKeyInfo('A', ConsoleKey.None, false, false, false),
};
public static ConsoleKeyInfo [] Left = new []
{
new ConsoleKeyInfo('\x1B', ConsoleKey.Enter, false, false, false),
new ConsoleKeyInfo('[', ConsoleKey.None, false, false, false),
new ConsoleKeyInfo('D', ConsoleKey.None, false, false, false),
};
public static ConsoleKeyInfo [] Right = new []
{
new ConsoleKeyInfo('\x1B', ConsoleKey.Enter, false, false, false),
new ConsoleKeyInfo('[', ConsoleKey.None, false, false, false),
new ConsoleKeyInfo('C', ConsoleKey.None, false, false, false),
};
public static IEnumerable<ConsoleKeyInfo> Click (int button, int screenX, int screenY)
{
// Adjust for 1-based coordinates
int adjustedX = screenX + 1;
int adjustedY = screenY + 1;
// Mouse press sequence
var sequence = $"\x1B[<{button};{adjustedX};{adjustedY}M";
foreach (char c in sequence)
{
yield return new ConsoleKeyInfo (c, ConsoleKey.None, false, false, false);
}
// Mouse release sequence
sequence = $"\x1B[<{button};{adjustedX};{adjustedY}m";
foreach (char c in sequence)
{
yield return new ConsoleKeyInfo (c, ConsoleKey.None, false, false, false);
}
}
}

View File

@@ -81,7 +81,7 @@ public class BasicFluentAssertionTests
[Theory]
[InlineData(V2TestDriver.V2Win)]
//[InlineData (V2TestDriver.V2Net)] // TODO
[InlineData (V2TestDriver.V2Net)]
public void ContextMenu_OpenSubmenu (V2TestDriver v2TestDriver)
{
var clicked = false;

View File

@@ -17,7 +17,7 @@
},
"UICatalog --driver v2net": {
"commandName": "Project",
"commandLineArgs": "--driver v2net"
"commandLineArgs": "--driver v2net -dl Trace"
},
"WSL: UICatalog": {
"commandName": "Executable",