Browse Source

Add UnexpectedResponseHandler

tznind 9 months ago
parent
commit
7fafa456da

+ 17 - 7
Terminal.Gui/ConsoleDrivers/AnsiResponseParser/AnsiResponseParser.cs

@@ -200,7 +200,17 @@ internal abstract class AnsiResponseParserBase : IAnsiResponseParser
             State = AnsiResponseParserState.Normal;
 
             // Maybe swallow anyway if user has custom delegate
-            return ShouldReleaseUnexpectedResponse ();
+            var swallow =  ShouldSwallowUnexpectedResponse ();
+
+            if (swallow)
+            {
+                heldContent.ClearHeld ();
+                // Do not send back to input stream
+                return false;
+            }
+
+            // Do release back to input stream
+            return true;
         }
 
         return false; // Continue accumulating
@@ -217,7 +227,7 @@ internal abstract class AnsiResponseParserBase : IAnsiResponseParser
     /// Based on <see cref="_knownTerminators"/></remarks>
     /// </summary>
     /// <returns></returns>
-    protected abstract bool ShouldReleaseUnexpectedResponse ();
+    protected abstract bool ShouldSwallowUnexpectedResponse ();
 
     private bool MatchResponse (string cur, List<AnsiResponseExpectation> collection, bool invokeCallback, bool removeExpectation)
     {
@@ -289,7 +299,7 @@ internal class AnsiResponseParser<T> : AnsiResponseParserBase
 
 
     /// <inheritdoc cref="AnsiResponseParser.UnknownResponseHandler"/>
-    public Func<IEnumerable<Tuple<char, T>>, bool> UnknownResponseHandler { get; set; } = (_) => false;
+    public Func<IEnumerable<Tuple<char, T>>, bool> UnexpectedResponseHandler { get; set; } = (_) => false;
 
 
     public IEnumerable<Tuple<char, T>> ProcessInput (params Tuple<char, T> [] input)
@@ -340,9 +350,9 @@ internal class AnsiResponseParser<T> : AnsiResponseParserBase
     }
 
     /// <inheritdoc />
-    protected override bool ShouldReleaseUnexpectedResponse ()
+    protected override bool ShouldSwallowUnexpectedResponse ()
     {
-        return !UnknownResponseHandler.Invoke (HeldToEnumerable ());
+        return UnexpectedResponseHandler.Invoke (HeldToEnumerable ());
     }
 }
 
@@ -385,8 +395,8 @@ internal class AnsiResponseParser : AnsiResponseParserBase
     }
 
     /// <inheritdoc />
-    protected override bool ShouldReleaseUnexpectedResponse ()
+    protected override bool ShouldSwallowUnexpectedResponse ()
     {
-        return !UnknownResponseHandler.Invoke (heldContent.ToString () ?? string.Empty);
+        return UnknownResponseHandler.Invoke (heldContent.HeldToString ());
     }
 }

+ 42 - 1
UnitTests/ConsoleDrivers/AnsiResponseParserTests.cs

@@ -421,7 +421,7 @@ public class AnsiResponseParserTests (ITestOutputHelper output)
         int i = 0;
 
         // Swallow all unknown escape codes
-        _parser1.UnknownResponseHandler = _ => true;
+        _parser1.UnexpectedResponseHandler = _ => true;
         _parser2.UnknownResponseHandler = _ => true;
 
 
@@ -439,6 +439,47 @@ public class AnsiResponseParserTests (ITestOutputHelper output)
                         29);
     }
 
+    [Fact]
+    public void UnknownResponses_ParameterShouldMatch ()
+    {
+        int i = 0;
+
+        // Track unknown responses passed to the UnexpectedResponseHandler
+        var unknownResponses = new List<string> ();
+
+        // Set up the UnexpectedResponseHandler to log each unknown response
+        _parser1.UnexpectedResponseHandler = r1 =>
+                                          {
+                                              unknownResponses.Add (BatchToString (r1));
+                                              return true; // Return true to swallow unknown responses
+                                          };
+
+        _parser2.UnknownResponseHandler = r2 =>
+                                          {
+                                              // parsers should be agreeing on what these responses are!
+                                              Assert.Equal(unknownResponses.Last(),r2);
+                                              return true; // Return true to swallow unknown responses
+                                          };
+
+        // Input with known and unknown responses
+        AssertReleased (
+                        "Just te\u001b[<0;0;0M\u001b[3c\u001b[2c\u001b[4cst",
+                        "Just test");
+
+        // Expected unknown responses (ANSI sequences that are unknown)
+        var expectedUnknownResponses = new List<string>
+        {
+            "\u001b[<0;0;0M",
+            "\u001b[3c",
+            "\u001b[2c",
+            "\u001b[4c"
+        };
+
+        // Assert that the UnexpectedResponseHandler was called with the correct unknown responses
+        Assert.Equal (expectedUnknownResponses.Count, unknownResponses.Count);
+        Assert.Equal (expectedUnknownResponses, unknownResponses);
+    }
+
     private Tuple<char, int> [] StringToBatch (string batch)
     {
         return batch.Select ((k) => Tuple.Create (k, tIndex++)).ToArray ();