Test all permutations of the input stream

This commit is contained in:
tznind
2024-10-11 20:18:19 +01:00
parent af2ea009c4
commit 3af5c6a4fb

View File

@@ -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);