From 7051f020b43528d1659e1566634965a685375963 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Tue, 23 Aug 2022 15:48:12 -0400 Subject: [PATCH] Fix RegexExperiment.ViewSampleRegexInDGML test (#74397) * Fix RegexExperiment.ViewSampleRegexInDGML test This stopped working after some recent changes to NonBacktracking. * Update src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs Co-authored-by: Dan Moseley Co-authored-by: Dan Moseley --- .../tests/FunctionalTests/RegexExperiment.cs | 73 ++++++++++--------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs index 2268f6aed6e..01fe7173d19 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexExperiment.cs @@ -90,24 +90,25 @@ public void ViewSampleRegexInDGML() try { /*lang=regex*/ - string pattern = @"abc|cd"; + string pattern = @".*(the|he)"; ViewDGML(pattern, "DFA"); ViewDGML(pattern, "DFA_DotStar", addDotStar: true); + ViewDGML(pattern, "NFA", nfa: true); + ViewDGML(pattern, "NFA_DotStar", nfa: true, addDotStar: true); - ViewDGML(pattern, "NFA", nfa: true, maxStates: 12); - ViewDGML(pattern, "NFA_DotStar", nfa: true, addDotStar: true, maxStates: 12); - - static void ViewDGML(string pattern, string name, bool nfa = false, bool addDotStar = false, bool reverse = false, int maxStates = -1, int maxLabelLength = 20) + static void ViewDGML(string pattern, string name, bool nfa = false, bool addDotStar = false, int maxLabelLength = 20) { var regex = new Regex(pattern, RegexHelpers.RegexOptionNonBacktracking | RegexOptions.Singleline); - if (regex.GetType().GetMethod("SaveDGML", BindingFlags.NonPublic | BindingFlags.Instance) is MethodInfo saveDgml) + if (TryExplore(regex, nfa, addDotStar)) { var sw = new StringWriter(); - saveDgml.Invoke(regex, new object[] { sw, nfa, addDotStar, reverse, maxStates, maxLabelLength }); - string path = Path.Combine(DgmlOutputDirectoryPath, $"{name}.dgml"); - File.WriteAllText(path, sw.ToString()); - Console.WriteLine(path); + if (TrySaveDGML(regex, sw, maxLabelLength)) + { + string path = Path.Combine(DgmlOutputDirectoryPath, $"{name}.dgml"); + File.WriteAllText(path, sw.ToString()); + Console.WriteLine(path); + } } } } @@ -121,45 +122,45 @@ static void ViewDGML(string pattern, string name, bool nfa = false, bool addDotS [InlineData("ann", new string[] { "nna" }, true)] public void TestDGMLGeneration(string pattern, string[] expectedDgmlFragments, bool exploreAsNFA) { - StringWriter sw = new StringWriter(); var re = new Regex(pattern, RegexHelpers.RegexOptionNonBacktracking | RegexOptions.Singleline); if (TryExplore(re, exploreAsNFA)) { + StringWriter sw = new StringWriter(); if (TrySaveDGML(re, sw, maxLabelLength: -1)) - { - string str = sw.ToString(); - Assert.StartsWith("", str); - Assert.Contains("DirectedGraph", str); - foreach (string fragment in expectedDgmlFragments) { - Assert.Contains(fragment, str); + string str = sw.ToString(); + Assert.StartsWith("", str); + Assert.Contains("DirectedGraph", str); + foreach (string fragment in expectedDgmlFragments) + { + Assert.Contains(fragment, str); + } } } - } + } - static bool TryExplore(Regex regex, bool exploreAsNFA) + private static bool TryExplore(Regex regex, bool exploreAsNFA, bool includeDotStarred = true, bool includeReverse = true, bool includeOriginal = true) + { + MethodInfo explore = regex.GetType().GetMethod("Explore", BindingFlags.NonPublic | BindingFlags.Instance); + if (explore is not null) { - MethodInfo saveDgml = regex.GetType().GetMethod("Explore", BindingFlags.NonPublic | BindingFlags.Instance); - if (saveDgml is not null) - { - saveDgml.Invoke(regex, new object[] { true, true, true, !exploreAsNFA, exploreAsNFA}); - return true; - } - - return false; + explore.Invoke(regex, new object[] { includeDotStarred, includeReverse, includeOriginal, !exploreAsNFA, exploreAsNFA }); + return true; } - static bool TrySaveDGML(Regex regex, TextWriter writer, int maxLabelLength) - { - MethodInfo saveDgml = regex.GetType().GetMethod("SaveDGML", BindingFlags.NonPublic | BindingFlags.Instance); - if (saveDgml is not null) - { - saveDgml.Invoke(regex, new object[] { writer, maxLabelLength }); - return true; - } + return false; + } - return false; + private static bool TrySaveDGML(Regex regex, TextWriter writer, int maxLabelLength) + { + MethodInfo saveDgml = regex.GetType().GetMethod("SaveDGML", BindingFlags.NonPublic | BindingFlags.Instance); + if (saveDgml is not null) + { + saveDgml.Invoke(regex, new object[] { writer, maxLabelLength }); + return true; } + + return false; } #region Random input generation tests -- GitLab