Skip to content

Commit

Permalink
Test all permutations of the input stream
Browse files Browse the repository at this point in the history
  • Loading branch information
tznind committed Oct 11, 2024
1 parent af2ea00 commit 3af5c6a
Showing 1 changed file with 81 additions and 2 deletions.
83 changes: 81 additions & 2 deletions UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs
Original file line number Diff line number Diff line change
@@ -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 ();

Expand Down Expand Up @@ -48,6 +53,80 @@ public void TestInputProcessing ()
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;

Check warning on line 74 in UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

View workflow job for this annotation

GitHub Actions / build_release

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 74 in UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

View workflow job for this annotation

GitHub Actions / build_release

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 74 in UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

View workflow job for this annotation

GitHub Actions / build_and_test_debug (ubuntu-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 74 in UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

View workflow job for this annotation

GitHub Actions / build_and_test_debug (windows-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 74 in UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

View workflow job for this annotation

GitHub Actions / build_and_test_debug (macos-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

// 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);
Expand Down

0 comments on commit 3af5c6a

Please sign in to comment.