mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-02 01:03:29 +01:00
Test all permutations of the input stream
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
namespace UnitTests.ConsoleDrivers;
|
||||
public class AnsiResponseParserTests
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestPlatform.Utilities;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace UnitTests.ConsoleDrivers;
|
||||
public class AnsiResponseParserTests (ITestOutputHelper output)
|
||||
{
|
||||
AnsiResponseParser _parser = new AnsiResponseParser ();
|
||||
|
||||
@@ -48,6 +53,80 @@ public class AnsiResponseParserTests
|
||||
Assert.Equal ("\u001b[0c", response);
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Theory]
|
||||
[InlineData ("\x1B[<0;10;20MHello\x1B[0c", "c", "\u001b[0c", "\x1B[<0;10;20MHello")]
|
||||
[InlineData ("\x1B[<1;15;25MWorld\x1B[1c", "c", "\u001b[1c", "\x1B[<1;15;25MWorld")]
|
||||
// Add more test cases here...
|
||||
public void TestInputSequences (string ansiStream, string expectedTerminator, string expectedResponse, string expectedOutput)
|
||||
{
|
||||
var swGenBatches = Stopwatch.StartNew ();
|
||||
int tests = 0;
|
||||
|
||||
var permutations = GetBatchPermutations (ansiStream).ToArray ();
|
||||
|
||||
swGenBatches.Stop ();
|
||||
var swRunTest = Stopwatch.StartNew ();
|
||||
|
||||
foreach (var batchSet in permutations)
|
||||
{
|
||||
string? response = null;
|
||||
|
||||
// Register the expected response with the given terminator
|
||||
_parser.ExpectResponse (expectedTerminator, s => response = s);
|
||||
|
||||
// Process the input
|
||||
StringBuilder actualOutput = new StringBuilder ();
|
||||
|
||||
foreach (var batch in batchSet)
|
||||
{
|
||||
actualOutput.Append (_parser.ProcessInput (batch));
|
||||
}
|
||||
|
||||
// Assert the final output minus the expected response
|
||||
Assert.Equal (expectedOutput, actualOutput.ToString());
|
||||
Assert.Equal (expectedResponse, response);
|
||||
tests++;
|
||||
}
|
||||
|
||||
output.WriteLine ($"Tested {tests} in {swRunTest.ElapsedMilliseconds} ms (gen batches took {swGenBatches.ElapsedMilliseconds} ms)" );
|
||||
}
|
||||
|
||||
public static IEnumerable<string []> GetBatchPermutations (string input)
|
||||
{
|
||||
// Call the recursive method to generate batches
|
||||
return GenerateBatches (input, 0);
|
||||
}
|
||||
|
||||
private static IEnumerable<string []> GenerateBatches (string input, int start)
|
||||
{
|
||||
// If we have reached the end of the string, return an empty list
|
||||
if (start >= input.Length)
|
||||
{
|
||||
yield return new string [0];
|
||||
yield break;
|
||||
}
|
||||
|
||||
// Iterate over the input string to create batches
|
||||
for (int i = start + 1; i <= input.Length; i++)
|
||||
{
|
||||
// Take a batch from 'start' to 'i'
|
||||
string batch = input.Substring (start, i - start);
|
||||
|
||||
// Recursively get batches from the remaining substring
|
||||
foreach (var remainingBatches in GenerateBatches (input, i))
|
||||
{
|
||||
// Combine the current batch with the remaining batches
|
||||
var result = new string [1 + remainingBatches.Length];
|
||||
result [0] = batch;
|
||||
Array.Copy (remainingBatches, 0, result, 1, remainingBatches.Length);
|
||||
yield return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void AssertIgnored (string ansiStream,char expected, ref int i)
|
||||
{
|
||||
var c = NextChar (ansiStream, ref i);
|
||||
|
||||
Reference in New Issue
Block a user