From 9b3653a49a743d90cc2291c3c833ff21e4a51aa0 Mon Sep 17 00:00:00 2001 From: GMIKE Date: Mon, 24 Oct 2022 03:59:39 +0400 Subject: [PATCH] Update packages, remove unused code, fix some tests, empty entity on parse null or empty string --- ...ateMachine.StructuralSearch.Sandbox.csproj | 4 +- .../ConfigurationFile/FullConfig.yml | 6 +- .../ConfigurationFile/If.yml | 2 +- .../ConfigurationFile/ShortConfig.yml | 6 +- .../ConfigurationFileTests.cs | 51 +++--- .../ExamplesInput/Common.cs | 10 +- .../ExamplesInput/Common2.cs | 4 +- .../ExamplesInput/NullUnionOperator.cs | 22 +-- .../ExamplesInput/TernaryOperator.cs | 22 +-- .../ExamplesOutput/NullUnionOperator.cs | 34 ---- .../ExamplesOutput/NullUnionOperator.txt | 22 +++ .../ExamplesOutput/TernaryOperator.txt | 18 +-- .../FindRuleParserTests.cs | 132 ++++++++-------- .../AssignmentNullUnionOperator.txt | 2 +- .../FindTemplate/NullUnionOperator.txt | 2 +- .../FindTemplate/TernaryOperator.txt | 2 +- .../FindTemplateParserTests.cs | 85 +++++----- .../ParameterParserTests.cs | 24 +-- .../PlaceholderParserTests.cs | 77 ++++------ .../ReplaceRuleParserTests.cs | 72 +++++---- .../ReplaceTemplateTests.cs | 145 +++++++++--------- ...StateMachine.StructuralSearch.Tests.csproj | 9 +- .../Source/AssignmentNullUnionOperator.txt | 2 +- .../Source/NullUnionOperator.txt | 2 +- .../Source/TernaryOperator.txt | 2 +- .../StructurSearchParserTests.cs | 142 +++++------------ .../Configurations/Configuration.cs | 12 +- .../Configurations/ConfigurationFile.cs | 13 +- .../Constant.cs | 2 +- .../Extensions/ParserExtensions.cs | 2 +- .../FindParser.cs | 2 + .../Helper/EnumerableHelper.cs | 5 +- .../Helper/YmlHelper.cs | 4 +- .../IFindParser.cs | 11 +- .../Parsers/DebugParser.cs | 2 +- .../Parsers/LookaheadParser.cs | 26 ---- .../Parsers/Parsers.cs | 5 - .../Parsers/PlaceholderParser.cs | 20 ++- .../Rules/FindRule/EmptyRule.cs | 18 +++ .../Rules/ReplaceRule/IReplaceRule.cs | 21 +++ .../Rules/ReplaceRule/ReplaceRule.cs | 7 +- ...SimpleStateMachine.StructuralSearch.csproj | 4 +- .../StructuralSearch/FindRulesParser.cs | 6 +- .../StructuralSearch/FindTemplateParser.cs | 51 +----- .../StructuralSearch/ReplaceRuleParser.cs | 6 +- .../StructuralSearch/ReplaceTemplateParser.cs | 8 +- .../StructuralSearch/StructuralSearch.cs | 11 +- .../StructuralSearchParser.cs | 10 +- .../ReplaceTemplate/IReplaceBuilder.cs | 13 +- .../ReplaceTemplate/PlaceholderReplace.cs | 1 - .../ReplaceTemplate/ReplaceBuilder.cs | 2 + 51 files changed, 524 insertions(+), 637 deletions(-) delete mode 100644 src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.cs create mode 100644 src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.txt delete mode 100644 src/SimpleStateMachine.StructuralSearch/Parsers/LookaheadParser.cs create mode 100644 src/SimpleStateMachine.StructuralSearch/Rules/FindRule/EmptyRule.cs create mode 100644 src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/IReplaceRule.cs diff --git a/src/SimpleStateMachine.StructuralSearch.Sandbox/SimpleStateMachine.StructuralSearch.Sandbox.csproj b/src/SimpleStateMachine.StructuralSearch.Sandbox/SimpleStateMachine.StructuralSearch.Sandbox.csproj index 1b0a13d..64c3f6e 100644 --- a/src/SimpleStateMachine.StructuralSearch.Sandbox/SimpleStateMachine.StructuralSearch.Sandbox.csproj +++ b/src/SimpleStateMachine.StructuralSearch.Sandbox/SimpleStateMachine.StructuralSearch.Sandbox.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/FullConfig.yml b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/FullConfig.yml index 21dc313..1031fc6 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/FullConfig.yml +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/FullConfig.yml @@ -1,7 +1,7 @@ Configurations: # AssignmentNullUnionOperator - FindTemplate: |- - if($var$ $sign$ null) + if ($var$ $sign$ null) { $var$ = $value$; } @@ -14,7 +14,7 @@ # NullUnionOperator - FindTemplate: |- - if($value$ $sign$ null) + if ($value$ $sign$ null) $var$ = $value2$; else $var$ = $value1$; @@ -29,7 +29,7 @@ # TernaryOperator - FindTemplate: |- - if($condition$) + if ($condition$) return $value1$; else return $value2$; diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/If.yml b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/If.yml index 0de08f3..4edf084 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/If.yml +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/If.yml @@ -1,5 +1,5 @@ Configurations: - - FindTemplate: if($var1$ == $var2$) + - FindTemplate: if ($var1$ == $var2$) FindRules: - $var1$ Is Var - $var2$ is Var diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/ShortConfig.yml b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/ShortConfig.yml index ad1671e..61ad05b 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/ShortConfig.yml +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFile/ShortConfig.yml @@ -1,7 +1,7 @@ Configurations: # AssignmentNullUnionOperator - FindTemplate: |- - if($var$ $sign$ null) + if ($var$ $sign$ null) { $var$ = $value$; } @@ -13,7 +13,7 @@ # NullUnionOperator - FindTemplate: |- - if($value$ $sign$ null) + if ($value$ $sign$ null) $var$ = $value2$; else $var$ = $value1$; @@ -28,7 +28,7 @@ # TernaryOperator - FindTemplate: |- - if($condition$) + if ($condition$) return $value1$; else return $value2$; diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFileTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFileTests.cs index 4f4b747..8a0010e 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFileTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ConfigurationFileTests.cs @@ -4,36 +4,35 @@ using SimpleStateMachine.StructuralSearch.Tests.Mock; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class ConfigurationFileParserTests { - public class ConfigurationFileParserTests + [Theory] + [InlineData("ConfigurationFile/ShortConfig.yml")] + [InlineData("ConfigurationFile/FullConfig.yml")] + public static void ConfigurationFileParsingShouldBeSuccess(string filePath) { - [Theory] - [InlineData("ConfigurationFile/ShortConfig.yml")] - [InlineData("ConfigurationFile/FullConfig.yml")] - public void ConfigurationFileParsingShouldBeSuccess(string filePath) - { - var cfg = YmlHelper.Parse(filePath); - var mock = Mock(); - Assert.Equal(mock, cfg); - } + var cfg = YmlHelper.Parse(filePath); + var mock = Mock(); + Assert.Equal(mock, cfg); + } - private ConfigurationFile Mock() - { - var names = new[] { "AssignmentNullUnionOperator", "NullUnionOperator", "TernaryOperator"}; - - var configurationFile = new ConfigurationFile - { - Configurations = new List() - }; - - foreach (var name in names) - { - var config = ConfigurationMock.GetConfigurationFromFiles(name); - configurationFile.Configurations.Add(config); - } + private static ConfigurationFile Mock() + { + var names = new[] { "AssignmentNullUnionOperator", "NullUnionOperator", "TernaryOperator"}; + + var configurationFile = new ConfigurationFile + ( + configurations: new List() + ); - return configurationFile; + foreach (var name in names) + { + var config = ConfigurationMock.GetConfigurationFromFiles(name); + configurationFile.Configurations.Add(config); } + + return configurationFile; } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common.cs index a05456c..c1f4ab3 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common.cs @@ -6,29 +6,29 @@ public int Method1() { var temp = 5; - if(temp == 6) + if (temp == 6) return 7; else return 8; } - public void Method2() + public static void Method2() { int? result; int? temp1 = 5; int? temp2 = 5; - if(temp1 is null) + if (temp1 is null) result = temp2; else result = temp1; } - public void Method3() + public static void Method3() { int result; int? temp1 = 5; int? temp2 = 5; - if(temp1 is null) + if (temp1 is null) result = temp2.Value; else result = temp1.Value; diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common2.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common2.cs index 813da5c..558cda3 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common2.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/Common2.cs @@ -9,7 +9,7 @@ public int Method1() return temp == 6 ? 7 : 8; } - public void Method2() + public static void Method2() { int? result; int? temp1 = 5; @@ -17,7 +17,7 @@ public void Method2() result = temp1 ?? temp2; } - public void Method3() + public static void Method3() { int result; int? temp1 = 5; diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/NullUnionOperator.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/NullUnionOperator.cs index b9607aa..4264dcb 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/NullUnionOperator.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/NullUnionOperator.cs @@ -1,40 +1,28 @@ -namespace SimpleStateMachine.StructuralSearch.Tests.ExamplesInput; +namespace SimpleStateMachine.StructuralSearch.Tests.Examples; public class NullUnionOperator { - public void Test1() + public static void Test1() { int? result; int? temp1 = 5; int? temp2 = 5; - if(temp1 is null) + if (temp1 is null) result = temp2; else result = temp1; } - public void Test2() + public static void Test2() { int? result; int? temp1 = 6; int? temp2 = 7; - if(temp1 is not null) + if (temp1 is not null) result = temp2; else result = temp1; } - - public int Test3() - { - int? temp3 = 5; - - if(temp3 is null) - return 7; - else if (temp3 == 8) - return 9; - else - return 10; - } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/TernaryOperator.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/TernaryOperator.cs index 7ee333a..176ec0a 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/TernaryOperator.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/TernaryOperator.cs @@ -1,4 +1,4 @@ -namespace SimpleStateMachine.StructuralSearch.Tests.ExamplesInput +namespace SimpleStateMachine.StructuralSearch.Tests.Examples { public class TernaryOperator { @@ -6,7 +6,7 @@ public int Test1() { var temp = 1; - if(temp == 2) + if (temp == 2) return 3; else return 4; @@ -16,7 +16,7 @@ public int Test2() { var temp = 5; - if(temp == 6) + if (temp == 6) return 7; else return 8; @@ -26,25 +26,13 @@ public int Test3() { var temp2 = 1; - if(temp2 == 2) + if (temp2 == 2) return 3; else return 4; } - public int Test4() - { - var temp3 = 5; - - if(temp3 == 6) - return 7; - else if (temp3 == 8) - return 9; - else - return 10; - } - - public void Test5() + public static void Test5() { } diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.cs deleted file mode 100644 index 7f32c29..0000000 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace SimpleStateMachine.StructuralSearch.Tests.ExamplesOutput; - -public class NullUnionOperator -{ - public void Test1() - { - int? result; - int? temp1 = 5; - int? temp2 = 5; - - result = temp1 ?? temp2; - } - - public void Test2() - { - - int? result; - int? temp1 = 6; - int? temp2 = 7; - result = temp2 ?? temp1; - } - - public int Test3() - { - int? temp3 = 5; - - if(temp3 is null) - return 7; - else if (temp3 == 8) - return 9; - else - return 10; - } -} \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.txt new file mode 100644 index 0000000..500370f --- /dev/null +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/NullUnionOperator.txt @@ -0,0 +1,22 @@ +namespace SimpleStateMachine.StructuralSearch.Tests.Examples; + +public class NullUnionOperator +{ + public static void Test1() + { + int? result; + int? temp1 = 5; + int? temp2 = 5; + + result = temp1 ?? temp2; + } + + public static void Test2() + { + + int? result; + int? temp1 = 6; + int? temp2 = 7; + result = temp2 ?? temp1; + } +} \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/TernaryOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/TernaryOperator.txt index 769b318..eacfe83 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/TernaryOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ExamplesOutput/TernaryOperator.txt @@ -1,6 +1,4 @@ -using System; - -namespace SimpleStateMachine.StructuralSearch.Tests.ExamplesInput +namespace SimpleStateMachine.StructuralSearch.Tests.Examples { public class TernaryOperator { @@ -25,19 +23,7 @@ namespace SimpleStateMachine.StructuralSearch.Tests.ExamplesInput return temp2 == 2? 3 : 4; } - public int Test4() - { - var temp3 = 5; - - if(temp3 == 6) - return 7; - else if (temp3 == 8) - return 9; - else - return 10; - } - - public void Test5() + public static void Test5() { } diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/FindRuleParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/FindRuleParserTests.cs index d03aad3..01b9b68 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/FindRuleParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/FindRuleParserTests.cs @@ -3,75 +3,75 @@ using Pidgin; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class FindRuleParserTests { - public class FindRuleParserTests + [Theory] + [InlineData("$var$ equals $var$")] + [InlineData("$var$ equals \"\\$\"")] + [InlineData("Not $var$ equals $var$.Lenght")] + [InlineData("Not $var$ equals $var$.offset.Start")] + [InlineData("$var$ equals $var$.Lenght and Not $var$ StartsWith \"123\"")] + [InlineData("Not $var$ equals $var$.Lenght and $var$ StartsWith \"123\"")] + [InlineData("$var$ equals $var$.Lenght and Not $var$ StartsWith \"\\\"Test\"")] + [InlineData("$var$ Contains $var$.Lenght")] + [InlineData("not $var$ Contains \"123\"")] + [InlineData("$var1$.Lenght Contains $var2$.Lenght")] + [InlineData("$var$ Contains \"123\"")] + [InlineData("$var$ StartsWith $var$.Lenght")] + [InlineData("$var$.Lenght Equals $var$.Lenght")] + [InlineData("$var$ StartsWith \"123\"")] + [InlineData("$var$ EndsWith $var$.Lenght")] + [InlineData("$var$ EndsWith \"123\"")] + [InlineData("$var$ Is Int")] + [InlineData("$var$ Is DateTime")] + [InlineData("$var$ equals $var1$ or $var2$ equals $var1$")] + [InlineData("$var$ match \"[a-b]+\"")] + public static void FindRuleExprParsingShouldBeSuccess(string ruleStr) { - [Theory] - [InlineData("$var$ equals $var$")] - [InlineData("$var$ equals \"\\$\"")] - [InlineData("Not $var$ equals $var$.Lenght")] - [InlineData("Not $var$ equals $var$.offset.Start")] - [InlineData("$var$ equals $var$.Lenght and Not $var$ StartsWith \"123\"")] - [InlineData("Not $var$ equals $var$.Lenght and $var$ StartsWith \"123\"")] - [InlineData("$var$ equals $var$.Lenght and Not $var$ StartsWith \"\\\"Test\"")] - [InlineData("$var$ Contains $var$.Lenght")] - [InlineData("$var1$.Lenght Contains $var2$.Lenght")] - [InlineData("$var$ Contains \"123\"")] - [InlineData("$var$ StartsWith $var$.Lenght")] - [InlineData("$var$.Lenght Equals $var$.Lenght")] - [InlineData("$var$ StartsWith \"123\"")] - [InlineData("$var$ EndsWith $var$.Lenght")] - [InlineData("$var$ EndsWith \"123\"")] - // [InlineData("$var$ Match $var$.Lenght")] - [InlineData("$var$ Is Int")] - [InlineData("$var$ Is DateTime")] - [InlineData("$var$ equals $var1$ or $var2$ equals $var1$")] - [InlineData("$var$ match \"[a-b]+\"")] - public void FindRuleExprParsingShouldBeSuccess(string ruleStr) - { - var rule = FindRuleParser.Expr.ParseOrThrow(ruleStr); - var _ruleStr = rule.ToString()?.ToLower(); - Assert.NotNull(rule); - Assert.Equal(_ruleStr, ruleStr.ToLower()); - } + var rule = FindRuleParser.Expr.ParseOrThrow(ruleStr); + var _ruleStr = rule.ToString()?.ToLower(); + Assert.NotNull(rule); + Assert.Equal(_ruleStr, ruleStr.ToLower()); + } - [Theory] - [InlineData(0, "$var$ In \"Is\", \"==\", \"!=\", \"is not\"", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(1, "$var$ In (\"Is\", \"==\", \"!=\", \"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(2, "$var$ In \"Is\",\"==\",\"!=\",\"is not\"", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(3, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(4, "$var$ In(\"Is\",\"==\",\"!=\",\"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(5, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(6, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(7, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(8, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(9, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(10, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(11, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(12, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(13, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - [InlineData(14, "Not ($var$ equals $var$.Lenght and $var$ StartsWith \"123\")", "Not $var$ equals $var$.Lenght and $var$ StartsWith \"123\"")] - [InlineData(15, "Not ($var$ equals $var$.Lenght)", "Not $var$ equals $var$.Lenght")] - [InlineData(16, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] - public void FindRuleExprParsingShouldBeEqualsCustomResult(int number, string ruleStr, string customResult) - { - var rule = FindRuleParser.Expr.ParseOrThrow(ruleStr); - var _ruleStr = rule.ToString()?.ToLower(); - Assert.NotNull(rule); - Assert.Equal(_ruleStr, customResult.ToLower()); - } - [Theory] - [InlineData("FindRule/NullUnionOperator.txt", "$sign$ In \"is\",\"==\",\"!=\",\"is not\"", "$value$ In $value1$,$value2$")] - [InlineData("FindRule/AssignmentNullUnionOperator.txt", "$sign$ In \"is\",\"==\",\"!=\",\"is not\"")] - public void FindRuleParsingFromFileShouldBeSuccess(string filePath, params string[] customResult) - { - var ruleStr = File.ReadAllText(filePath); - var rules = ruleStr.Split(Constant.LineFeed) - .Select(StructuralSearch.ParseFindRule); - var rulesAsStr = rules.Select(x => x.ToString()).ToArray(); + [Theory] + [InlineData(0, "$var$ In \"Is\", \"==\", \"!=\", \"is not\"", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(1, "$var$ In (\"Is\", \"==\", \"!=\", \"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(2, "$var$ In \"Is\",\"==\",\"!=\",\"is not\"", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(3, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(4, "$var$ In(\"Is\",\"==\",\"!=\",\"is not\")", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(5, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(6, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(7, "$var$ In ( \"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(8, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(9, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(10, "$var$ In (\"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(11, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" ) ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(12, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(13, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\") ", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + [InlineData(14, "Not ($var$ equals $var$.Lenght and $var$ StartsWith \"123\")", "Not $var$ equals $var$.Lenght and $var$ StartsWith \"123\"")] + [InlineData(15, "Not ($var$ equals $var$.Lenght)", "Not $var$ equals $var$.Lenght")] + [InlineData(16, "$var$ In( \"Is\",\"==\",\"!=\",\"is not\" )", "$var$ In \"Is\",\"==\",\"!=\",\"is not\"")] + public static void FindRuleExprParsingShouldBeEqualsCustomResult(int number, string ruleStr, string customResult) + { + var rule = FindRuleParser.Expr.ParseOrThrow(ruleStr); + var ruleAsStr = rule.ToString()?.ToLower(); + Assert.NotNull(rule); + Assert.Equal(ruleAsStr, customResult.ToLower()); + } + + [Theory] + [InlineData("FindRule/NullUnionOperator.txt", "$sign$ In \"is\",\"==\",\"!=\",\"is not\"", "$value$ In $value1$,$value2$")] + [InlineData("FindRule/AssignmentNullUnionOperator.txt", "$sign$ In \"is\",\"==\",\"!=\",\"is not\"")] + public static void FindRuleParsingFromFileShouldBeSuccess(string filePath, params string[] customResult) + { + var ruleStr = File.ReadAllText(filePath); + var rules = ruleStr.Split(Constant.LineFeed) + .Select(StructuralSearch.ParseFindRule); + var rulesAsStr = rules.Select(x => x.ToString()).ToArray(); - Assert.True(customResult.SequenceEqual(rulesAsStr)); - } + Assert.True(customResult.SequenceEqual(rulesAsStr)); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/AssignmentNullUnionOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/AssignmentNullUnionOperator.txt index 5451914..8bdab63 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/AssignmentNullUnionOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/AssignmentNullUnionOperator.txt @@ -1,4 +1,4 @@ -if($var$ $sign$ null) +if ($var$ $sign$ null) { $var$ = $value$; } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/NullUnionOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/NullUnionOperator.txt index 38d96cb..04906bb 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/NullUnionOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/NullUnionOperator.txt @@ -1,4 +1,4 @@ -if($value$ $sign$ null) +if ($value$ $sign$ null) $var$ = $value2$; else $var$ = $value1$; \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/TernaryOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/TernaryOperator.txt index 808476d..d0aae65 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/TernaryOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplate/TernaryOperator.txt @@ -1,4 +1,4 @@ -if($condition$) +if ($condition$) return $value1$; else return $value2$; \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateParserTests.cs index e1a6e9b..36d1d4a 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateParserTests.cs @@ -3,56 +3,55 @@ using Pidgin; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class FindTemplateTests { - public class FindTemplateTests + [Theory] + [InlineData("FindTemplate/NullUnionOperator.txt")] + [InlineData("FindTemplate/AssignmentNullUnionOperator.txt")] + [InlineData("FindTemplate/NestedParenthesised.txt")] + [InlineData("FindTemplate/TernaryOperator.txt")] + public static void FindTemplateFromFileParsingShouldBeSuccess(string templatePath) { - [Theory] - [InlineData("FindTemplate/NullUnionOperator.txt")] - [InlineData("FindTemplate/AssignmentNullUnionOperator.txt")] - [InlineData("FindTemplate/NestedParenthesised.txt")] - [InlineData("FindTemplate/TernaryOperator.txt")] - public void FindTemplateFromFileParsingShouldBeSuccess(string templatePath) - { - var findTemplate = File.ReadAllText(templatePath); - var template = StructuralSearch.ParseFindTemplate(findTemplate); + var findTemplate = File.ReadAllText(templatePath); + var template = StructuralSearch.ParseFindTemplate(findTemplate); - Assert.NotNull(template); - } + Assert.NotNull(template); + } - [Theory] - [InlineData("FindTemplate/NullUnionOperator.txt", "Source/NullUnionOperator.txt")] - [InlineData("FindTemplate/AssignmentNullUnionOperator.txt", "Source/AssignmentNullUnionOperator.txt")] - [InlineData("FindTemplate/NestedParenthesised.txt", "Source/NestedParenthesised.txt")] - [InlineData("FindTemplate/TernaryOperator.txt", "Source/TernaryOperator.txt")] - public void SourceParsingBeFindTemplateShouldBeSuccess(string templatePath, string sourcePath) - { - var findTemplate = File.ReadAllText(templatePath); - var source = File.ReadAllText(sourcePath); - var input = Input.String(source); - var findParser = StructuralSearch.ParseFindTemplate(findTemplate); - IParsingContext parsingContext = new ParsingContext(input); - var matches = findParser.Parse(ref parsingContext); - Assert.Single(matches); + [Theory] + [InlineData("FindTemplate/NullUnionOperator.txt", "Source/NullUnionOperator.txt")] + [InlineData("FindTemplate/AssignmentNullUnionOperator.txt", "Source/AssignmentNullUnionOperator.txt")] + [InlineData("FindTemplate/NestedParenthesised.txt", "Source/NestedParenthesised.txt")] + [InlineData("FindTemplate/TernaryOperator.txt", "Source/TernaryOperator.txt")] + public static void SourceParsingBeFindTemplateShouldBeSuccess(string templatePath, string sourcePath) + { + var findTemplate = File.ReadAllText(templatePath); + var source = File.ReadAllText(sourcePath); + var input = Input.String(source); + var findParser = StructuralSearch.ParseFindTemplate(findTemplate); + IParsingContext parsingContext = new ParsingContext(input); + var matches = findParser.Parse(ref parsingContext); + Assert.Single(matches); - var match = matches.First(); + var match = matches.First(); - Assert.NotNull(findParser); - Assert.Equal(match.Match.Lenght, source.Length); - } + Assert.NotNull(findParser); + Assert.Equal(match.Match.Lenght, source.Length); + } - [Theory] - [InlineData("( $var$")] - public void FindTemplateParsingShouldBeFail(string templateStr) - { - Assert.Throws(() => StructuralSearch.ParseFindTemplate(templateStr)); - } + [Theory] + [InlineData("( $var$")] + public static void FindTemplateParsingShouldBeFail(string templateStr) + { + Assert.Throws(() => StructuralSearch.ParseFindTemplate(templateStr)); + } - [Theory] - [InlineData("( $var$ )")] - public void FindTemplateParsingShouldBeSuccess(string templateStr) - { - var template = StructuralSearch.ParseFindTemplate(templateStr); - } + [Theory] + [InlineData("( $var$ )")] + public static void FindTemplateParsingShouldBeSuccess(string templateStr) + { + var template = StructuralSearch.ParseFindTemplate(templateStr); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ParameterParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ParameterParserTests.cs index fccc50e..e7a0a38 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ParameterParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ParameterParserTests.cs @@ -3,7 +3,7 @@ namespace SimpleStateMachine.StructuralSearch.Tests; -public class ParameterParserTests +public static class ParameterParserTests { [Theory] [InlineData("\\\"132\\\"")] @@ -14,18 +14,18 @@ public class ParameterParserTests [InlineData(" ")] [InlineData("( )")] [InlineData("( )( )")] - public void StringParameterParsingShouldBeSuccess(string str) + public static void StringParameterParsingShouldBeSuccess(string str) { var parameter = ParametersParser.StringParameter.ParseOrThrow(str); - var parameterStr = parameter.ToString().ToLower(); - Assert.Equal(parameterStr.ToLower(), str.ToLower()); + var parameterStr = parameter.ToString()?.ToLower(); + Assert.Equal(parameterStr?.ToLower(), str.ToLower()); } [Theory] [InlineData("\"132\"")] [InlineData("( ")] [InlineData("( )(")] - public void StringParameterParsingShouldBeFail(string str) + public static void StringParameterParsingShouldBeFail(string str) { Assert.Throws(() => { @@ -42,16 +42,16 @@ public void StringParameterParsingShouldBeFail(string str) [InlineData("\"123$var1$.Lenght456\"")] [InlineData("\" \\\"132\\\" \"")] [InlineData("\" \"")] - public void StringFormatParameterParsingShouldBeSuccess(string str) + public static void StringFormatParameterParsingShouldBeSuccess(string str) { var parameter = ParametersParser.StringFormatParameter.ParseOrThrow(str); - var parameterStr = parameter.ToString().ToLower(); - Assert.Equal(parameterStr.ToLower(), str.ToLower()); + var parameterStr = parameter.ToString()?.ToLower(); + Assert.Equal(parameterStr?.ToLower(), str.ToLower()); } [Theory] [InlineData("\\\"132\\\"")] - public void StringFormatParameterParsingShouldBeFail(string str) + public static void StringFormatParameterParsingShouldBeFail(string str) { Assert.Throws(() => ParametersParser.StringFormatParameter.ParseOrThrow(str)); } @@ -64,11 +64,11 @@ public void StringFormatParameterParsingShouldBeFail(string str) [InlineData("$var$.RemoveSubStr(\"123\")")] [InlineData("$var$.Lenght.RemoveSubStr(\"123\")")] [InlineData("$var$.Lenght.Trim.RemoveSubStr(\"123\")")] - public void ParameterParsingShouldBeSuccess(string str) + public static void ParameterParsingShouldBeSuccess(string str) { var parameter = ParametersParser.Parameter.ParseOrThrow(str); - var parameterStr = parameter.ToString().ToLower(); - Assert.Equal(parameterStr.ToLower(), str.ToLower()); + var parameterStr = parameter.ToString()?.ToLower(); + Assert.Equal(parameterStr?.ToLower(), str.ToLower()); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/PlaceholderParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/PlaceholderParserTests.cs index 85441fe..019e215 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/PlaceholderParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/PlaceholderParserTests.cs @@ -2,55 +2,42 @@ using Pidgin; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class PlaceholderParserTests { - public class PlaceholderParserTests + [Theory] + [InlineData("($test$)", "(value )", "value ")] + [InlineData("($test$ )", "(value )", "value")] + [InlineData("($test$)", "(value (test))", "value (test)")] + [InlineData("($test$)", "(value (test) )", "value (test) ")] + public static void TemplateParsingShouldBeSuccess(string template, string source, string result) { - [Fact] - public void FindTemplateShouldBeNotEmpty() - { - Assert.Throws(() => StructuralSearch.ParseFindTemplate(string.Empty)); - } - - [Theory] - [InlineData("($test$)", "(value )", "value ")] - [InlineData("($test$ )", "(value )", "value")] - [InlineData("($test$)", "(value (test))", "value (test)")] - [InlineData("($test$)", "(value (test) )", "value (test) ")] - public void TemplateParsingShouldBeSuccess(string template, string source, string result) - { - var input = Input.String(source); - IParsingContext parsingContext = new ParsingContext(input); - var templateParser = StructuralSearch.ParseFindTemplate(template); - var matches = templateParser.Parse(ref parsingContext); + var input = Input.String(source); + IParsingContext parsingContext = new ParsingContext(input); + var templateParser = StructuralSearch.ParseFindTemplate(template); + var matches = templateParser.Parse(ref parsingContext); - Assert.Single(matches); - var match = matches.First(); - Assert.Single(match.Placeholders); - var placeholder = match.Placeholders.First(); - - Assert.Equal(placeholder.Value.Value, result); - } - - [Theory] - [InlineData("$var$;", "test;;", "test")] - [InlineData("$var$;.", "test;;;.", "test;;")] - public void TemplateParsingShouldBeSuccess2(string template, string source, params string[] values) - { - var input = Input.String(source); - IParsingContext parsingContext = new ParsingContext(input); - var templateParser = StructuralSearch.ParseFindTemplate(template); - var matches = templateParser.Parse(ref parsingContext); - Assert.Single(matches); - var match = matches.First(); - Assert.Equal(match.Placeholders.Count, values.Length); + Assert.Single(matches); + var match = matches.First(); + Assert.Single(match.Placeholders); + var placeholder = match.Placeholders.First(); - Assert.Equal(match.Placeholders.Select(x=> x.Value.Value), values); + Assert.Equal(placeholder.Value.Value, result); + } - // var templateStr = File.ReadAllText(templatePath); - // var template = StructuralSearch.ParseTemplate(templateStr); - // - // Assert.NotNull(template); - } + [Theory] + [InlineData("$var$;", "test;;", "test")] + [InlineData("$var$;.", "test;;;.", "test;;")] + public static void TemplateParsingShouldBeSuccess2(string template, string source, params string[] values) + { + var input = Input.String(source); + IParsingContext parsingContext = new ParsingContext(input); + var templateParser = StructuralSearch.ParseFindTemplate(template); + var matches = templateParser.Parse(ref parsingContext); + Assert.Single(matches); + var match = matches.First(); + Assert.Equal(match.Placeholders.Count, values.Length); + Assert.Equal(match.Placeholders.Select(x=> x.Value.Value), values); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceRuleParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceRuleParserTests.cs index f8a95b0..8a04377 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceRuleParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceRuleParserTests.cs @@ -1,46 +1,44 @@ using Pidgin; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class ReplaceRuleParserTests { - public class ReplaceRuleParserTests + [Theory] + [InlineData("$var1$ equals $var2$ then $var1$ => \"test $var3$\"")] + [InlineData("$var1$ equals \"\\$\" then $var1$ => \"\\$\",$var2$ => \"132\"")] + [InlineData("_ then $var1$ => \"test $var3$.Lenght\"")] + [InlineData("_ then $var1$ => \"\\$\",$var2$ => \"132\"")] + [InlineData("Not $var1$ equals $var$.Lenght then $var1$ => $var$.Lenght")] + [InlineData("Not $var1$ equals $var$.offset.Start then $var1$ => $var$.offset.Start")] + [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim")] + [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim,$var2$ => $var$.offset.Start.Trim")] + [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"\\\"Test\" then $var1$ => $var$.offset.Start.ToUpper")] + public static void ReplaceRuleParsingShouldBeSuccess(string replaceRule) { - [Theory] - [InlineData("$var1$ equals $var2$ then $var1$ => \"test $var3$\"")] - [InlineData("$var1$ equals \"\\$\" then $var1$ => \"\\$\",$var2$ => \"132\"")] - [InlineData("_ then $var1$ => \"test $var3$.Lenght\"")] - [InlineData("_ then $var1$ => \"\\$\",$var2$ => \"132\"")] - [InlineData("Not $var1$ equals $var$.Lenght then $var1$ => $var$.Lenght")] - [InlineData("Not $var1$ equals $var$.offset.Start then $var1$ => $var$.offset.Start")] - [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim")] - [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"123\" then $var1$ => $var$.offset.Start.Trim,$var2$ => $var$.offset.Start.Trim")] - [InlineData("$var1$ equals $var$.Lenght and Not $var1$ StartsWith \"\\\"Test\" then $var1$ => $var$.offset.Start.ToUpper")] - public void ReplaceRuleParsingShouldBeSuccess(string replaceRule) - { - var rule = StructuralSearch.ParseReplaceRule(replaceRule); - var ruleStr = rule.ToString().ToLower(); - Assert.NotNull(rule); - Assert.Equal(ruleStr, replaceRule.ToLower()); - } - - [Theory] - [InlineData("($var1$ equals $var2$) then $var1$ => \"test $var3$\"", "$var1$ equals $var2$ then $var1$ => \"test $var3$\"")] - public void ReplaceRuleShouldBeEqualsString(string replaceRule, string customResult) - { - var rule = StructuralSearch.ParseReplaceRule(replaceRule); - var ruleStr = rule.ToString().ToLower(); - Assert.NotNull(rule); - Assert.Equal(ruleStr, customResult.ToLower()); - } + var rule = StructuralSearch.ParseReplaceRule(replaceRule); + var ruleStr = rule.ToString().ToLower(); + Assert.NotNull(rule); + Assert.Equal(ruleStr, replaceRule.ToLower()); + } - [Theory] - [InlineData("$var1$ equals $var2$ then $var1$ => (\"test $var3$\"")] - [InlineData("($var1$ equals $var2$ then $var1$ => \"test $var3$\"")] - [InlineData("$var1$ equals $var2$ then ($var1$) => \"test $var3$\"")] - public void ReplaceRuleParsingShouldBeFail(string replaceRuleStr) - { - Assert.Throws(() => StructuralSearch.ParseReplaceRule(replaceRuleStr)); - } + [Theory] + [InlineData("($var1$ equals $var2$) then $var1$ => \"test $var3$\"", "$var1$ equals $var2$ then $var1$ => \"test $var3$\"")] + public static void ReplaceRuleShouldBeEqualsString(string replaceRule, string customResult) + { + var rule = StructuralSearch.ParseReplaceRule(replaceRule); + var ruleStr = rule.ToString().ToLower(); + Assert.NotNull(rule); + Assert.Equal(ruleStr, customResult.ToLower()); + } + [Theory] + [InlineData("$var1$ equals $var2$ then $var1$ => (\"test $var3$\"")] + [InlineData("($var1$ equals $var2$ then $var1$ => \"test $var3$\"")] + [InlineData("$var1$ equals $var2$ then ($var1$) => \"test $var3$\"")] + public static void ReplaceRuleParsingShouldBeFail(string replaceRuleStr) + { + Assert.Throws(() => StructuralSearch.ParseReplaceRule(replaceRuleStr)); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceTemplateTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceTemplateTests.cs index dd5151f..42ef7a1 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceTemplateTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/ReplaceTemplateTests.cs @@ -3,88 +3,87 @@ using Pidgin; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class ReplaceTemplateTests { - public class ReplaceTemplateTests + [Theory] + [InlineData("ReplaceTemplate/NullUnionOperator.txt", 6)] + [InlineData("ReplaceTemplate/AssignmentNullUnionOperator.txt", 4)] + [InlineData("ReplaceTemplate/TernaryOperator.txt", 7)] + public static void ReplaceTemplateParsingShouldHaveStepCount(string templatePath, int stepsCount) { - [Theory] - [InlineData("ReplaceTemplate/NullUnionOperator.txt", 6)] - [InlineData("ReplaceTemplate/AssignmentNullUnionOperator.txt", 4)] - [InlineData("ReplaceTemplate/TernaryOperator.txt", 7)] - public void ReplaceTemplateParsingShouldHaveStepCount(string templatePath, int stepsCount) - { - var replaceTemplate = File.ReadAllText(templatePath); - var replaceBuilder = StructuralSearch.ParseReplaceTemplate(replaceTemplate); - var result = replaceBuilder.Build(ParsingContext.Empty); + var replaceTemplate = File.ReadAllText(templatePath); + var replaceBuilder = StructuralSearch.ParseReplaceTemplate(replaceTemplate); + var result = replaceBuilder.Build(ParsingContext.Empty); - Assert.NotNull(replaceTemplate); - Assert.Equal(replaceBuilder.Steps.Count(), stepsCount); - } + Assert.NotNull(replaceTemplate); + Assert.Equal(replaceBuilder.Steps.Count(), stepsCount); + } - [Theory] - [InlineData("ReplaceTemplate/NullUnionOperator.txt", "ReplaceResult/NullUnionOperator.txt", - new[] { "var", "sign", "value1", "value2"}, - new[] { "temp", "is", "var1", "var2"})] - [InlineData("ReplaceTemplate/AssignmentNullUnionOperator.txt", "ReplaceResult/AssignmentNullUnionOperator.txt", - new[] { "var", "value" }, - new[] { "temp", "12" })] - [InlineData("ReplaceTemplate/TernaryOperator.txt", "ReplaceResult/TernaryOperator.txt", - new[] { "condition", "value1", "value2" }, - new[] { "temp == 125", "12", "15" })] - public void ReplaceBuildShouldBeSuccess(string templatePath, string resultPath, string[] keys, string[] values) - { - var replaceTemplate = File.ReadAllText(templatePath); - var replaceResult = File.ReadAllText(resultPath); - var replaceBuilder = StructuralSearch.ParseReplaceTemplate(replaceTemplate); + [Theory] + [InlineData("ReplaceTemplate/NullUnionOperator.txt", "ReplaceResult/NullUnionOperator.txt", + new[] { "var", "sign", "value1", "value2"}, + new[] { "temp", "is", "var1", "var2"})] + [InlineData("ReplaceTemplate/AssignmentNullUnionOperator.txt", "ReplaceResult/AssignmentNullUnionOperator.txt", + new[] { "var", "value" }, + new[] { "temp", "12" })] + [InlineData("ReplaceTemplate/TernaryOperator.txt", "ReplaceResult/TernaryOperator.txt", + new[] { "condition", "value1", "value2" }, + new[] { "temp == 125", "12", "15" })] + public static void ReplaceBuildShouldBeSuccess(string templatePath, string resultPath, string[] keys, string[] values) + { + var replaceTemplate = File.ReadAllText(templatePath); + var replaceResult = File.ReadAllText(resultPath); + var replaceBuilder = StructuralSearch.ParseReplaceTemplate(replaceTemplate); - var parsingContext = new ParsingContext(Input.Empty); - for (int i = 0; i < keys.Length; i++) - { - parsingContext.AddPlaceholder(Placeholder.CreateEmpty(parsingContext, keys[i], values[i])); - } + var parsingContext = new ParsingContext(Input.Empty); + for (int i = 0; i < keys.Length; i++) + { + parsingContext.AddPlaceholder(Placeholder.CreateEmpty(parsingContext, keys[i], values[i])); + } - var result = replaceBuilder.Build(parsingContext); + var result = replaceBuilder.Build(parsingContext); - Assert.NotNull(replaceTemplate); - Assert.NotNull(replaceResult); - Assert.Equal(replaceResult, result); - } + Assert.NotNull(replaceTemplate); + Assert.NotNull(replaceResult); + Assert.Equal(replaceResult, result); + } - // TODO validation parenthesis for parameters + // TODO validation parenthesis for parameters - [Theory] - [InlineData(0, "test $var1$.Lenght")] - [InlineData(1, "(test) $var1$.Lenght")] - [InlineData(2, "test ($var1$.Lenght)")] - [InlineData(3, "(test $var1$.Lenght)")] - [InlineData(4, "test ")] - [InlineData(5, "($var1$.Lenght)")] - [InlineData(6, " ($var1$.Lenght)")] - [InlineData(7, " ( )")] - [InlineData(8, "test ( )")] - [InlineData(9, " (test $var1$.Lenght)")] - [InlineData(10, "(test) ($var1$.Lenght)")] - [InlineData(11, "((test) $var1$.Lenght)")] - [InlineData(12, "(test ($var1$.Lenght))")] - [InlineData(13, "((test) ($var1$.Lenght))")] - [InlineData(14, "()")] - [InlineData(15, "(test ($var1$.Lenght) test2)")] - public void ReplaceTemplateParsingShouldBeSuccess(int number, string templateStr) - { - var replaceBuilder = StructuralSearch.ParseReplaceTemplate(templateStr); - var replaceStr = replaceBuilder.ToString().ToLower(); - Assert.Equal(replaceStr, templateStr.ToLower()); - } + [Theory] + [InlineData(0, "test $var1$.Lenght")] + [InlineData(1, "(test) $var1$.Lenght")] + [InlineData(2, "test ($var1$.Lenght)")] + [InlineData(3, "(test $var1$.Lenght)")] + [InlineData(4, "test ")] + [InlineData(5, "($var1$.Lenght)")] + [InlineData(6, " ($var1$.Lenght)")] + [InlineData(7, " ( )")] + [InlineData(8, "test ( )")] + [InlineData(9, " (test $var1$.Lenght)")] + [InlineData(10, "(test) ($var1$.Lenght)")] + [InlineData(11, "((test) $var1$.Lenght)")] + [InlineData(12, "(test ($var1$.Lenght))")] + [InlineData(13, "((test) ($var1$.Lenght))")] + [InlineData(14, "()")] + [InlineData(15, "(test ($var1$.Lenght) test2)")] + public static void ReplaceTemplateParsingShouldBeSuccess(int number, string templateStr) + { + var replaceBuilder = StructuralSearch.ParseReplaceTemplate(templateStr); + var replaceStr = replaceBuilder.ToString()?.ToLower(); + Assert.Equal(replaceStr, templateStr.ToLower()); + } - [Theory] - [InlineData("(test $var1$.Lenght")] - [InlineData("test ($var1$.Lenght")] - [InlineData("test $var1$.Lenght)")] - [InlineData(" ( ")] - [InlineData("test ( ")] - public void ReplaceTemplateParsingShouldBeFail(string templateStr) - { - Assert.Throws(() => StructuralSearch.ParseReplaceTemplate(templateStr)); - } + [Theory] + [InlineData("(test $var1$.Lenght")] + [InlineData("test ($var1$.Lenght")] + [InlineData("test $var1$.Lenght)")] + [InlineData(" ( ")] + [InlineData("test ( ")] + public static void ReplaceTemplateParsingShouldBeFail(string templateStr) + { + Assert.Throws(() => StructuralSearch.ParseReplaceTemplate(templateStr)); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/SimpleStateMachine.StructuralSearch.Tests.csproj b/src/SimpleStateMachine.StructuralSearch.Tests/SimpleStateMachine.StructuralSearch.Tests.csproj index c1d25e0..20d0b43 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/SimpleStateMachine.StructuralSearch.Tests.csproj +++ b/src/SimpleStateMachine.StructuralSearch.Tests/SimpleStateMachine.StructuralSearch.Tests.csproj @@ -5,12 +5,13 @@ enable false 10 + enable - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -25,7 +26,7 @@ - + Always diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/Source/AssignmentNullUnionOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/Source/AssignmentNullUnionOperator.txt index 6d83033..66dda22 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/Source/AssignmentNullUnionOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/Source/AssignmentNullUnionOperator.txt @@ -1,4 +1,4 @@ -if(temp == null) +if (temp == null) { temp = 12; } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/Source/NullUnionOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/Source/NullUnionOperator.txt index df34cb0..17cedab 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/Source/NullUnionOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/Source/NullUnionOperator.txt @@ -1,4 +1,4 @@ -if(var1 is null) +if (var1 is null) temp = var2; else temp = var1; \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/Source/TernaryOperator.txt b/src/SimpleStateMachine.StructuralSearch.Tests/Source/TernaryOperator.txt index a6fa515..feffe9a 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/Source/TernaryOperator.txt +++ b/src/SimpleStateMachine.StructuralSearch.Tests/Source/TernaryOperator.txt @@ -1,4 +1,4 @@ -if(temp == 125) +if (temp == 125) return 12; else return 15; \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch.Tests/StructurSearchParserTests.cs b/src/SimpleStateMachine.StructuralSearch.Tests/StructurSearchParserTests.cs index 0fc0a77..d767d11 100644 --- a/src/SimpleStateMachine.StructuralSearch.Tests/StructurSearchParserTests.cs +++ b/src/SimpleStateMachine.StructuralSearch.Tests/StructurSearchParserTests.cs @@ -1,115 +1,55 @@ -using System; -using System.IO; +using System.IO; using System.Linq; -using SimpleStateMachine.StructuralSearch.Configurations; -using SimpleStateMachine.StructuralSearch.Helper; using SimpleStateMachine.StructuralSearch.Tests.Mock; using Xunit; -namespace SimpleStateMachine.StructuralSearch.Tests +namespace SimpleStateMachine.StructuralSearch.Tests; + +public static class StructuralSearchParserTests { - public class StructuralSearchParserTests + [Theory] + [InlineData("NullUnionOperator", "ExamplesInput/NullUnionOperator.cs", 2)] + [InlineData("TernaryOperator", "ExamplesInput/TernaryOperator.cs", 3)] + public static void StructuralSearchShouldBeSuccess(string exampleName, string exampleFilePath, int matchesCount) { - [Theory] - // [InlineData("AssignmentNullUnionOperator")] - [InlineData("NullUnionOperator", "ExamplesInput/NullUnionOperator.cs", 2)] - [InlineData("TernaryOperator", "ExamplesInput/TernaryOperator.cs", 3)] - public static void StructuralSearchShouldBeSuccess(string exampleName, string exampleFilePath, int matchesCount) - { - var config = ConfigurationMock.GetConfigurationFromFiles(exampleName); - var parser = new StructuralSearchParser(config); + var config = ConfigurationMock.GetConfigurationFromFiles(exampleName); + var parser = new StructuralSearchParser(config); - var fileInfo = new FileInfo(exampleFilePath); - var input = Input.File(fileInfo); - IParsingContext context = new ParsingContext(input); + var fileInfo = new FileInfo(exampleFilePath); + var input = Input.File(fileInfo); + IParsingContext context = new ParsingContext(input); - var matches = parser.Parse(ref context); - Assert.Equal(matches.Count(), matchesCount); - } + var matches = parser.Parse(ref context); + Assert.Equal(matches.Count(), matchesCount); + } - [Theory] - // [InlineData("AssignmentNullUnionOperator")] - [InlineData("NullUnionOperator", 2)] - [InlineData("TernaryOperator", 3)] - public static void StructuralSearchShouldBe(string exampleName, int matchesCount) - { - var startTime = System.Diagnostics.Stopwatch.StartNew(); - var config = ConfigurationMock.GetConfigurationFromFiles(exampleName); - var inputFilePath = Path.Combine($"ExamplesInput/{exampleName}.cs"); - var resultFilePath = Path.Combine($"ExamplesOutput/{exampleName}.txt"); - var outputFilePath = Path.Combine($"{exampleName}.cs"); - - var parser = new StructuralSearchParser(config); - - var inputFileInfo = new FileInfo(inputFilePath); - var input = Input.File(inputFileInfo); - IParsingContext context = new ParsingContext(input); - var matches = parser.Parse(ref context); - matches = parser.ApplyFindRule(ref context, matches); - matches = parser.ApplyReplaceRule(ref context, matches); - var replaceMatches = parser.GetReplaceMatches(ref context, matches); - var outputFileInfo = new FileInfo(outputFilePath); - var output = Output.File(outputFileInfo); - output.Replace(input, replaceMatches); - startTime.Stop(); - var resultTime = startTime.Elapsed; + [Theory] + [InlineData("NullUnionOperator", 2)] + [InlineData("TernaryOperator", 3)] + public static void StructuralSearchShouldBe(string exampleName, int matchesCount) + { + var config = ConfigurationMock.GetConfigurationFromFiles(exampleName); + var directory = Directory.GetCurrentDirectory(); + var inputFilePath = Path.Combine(directory, $"ExamplesInput/{exampleName}.cs"); + var resultFilePath = Path.Combine(directory, $"ExamplesOutput/{exampleName}.txt"); + var outputFilePath = Path.Combine(directory, $"{exampleName}.cs"); - // Assert.Equal(matches.Count(), matchesCount); - // - // var resultStr = File.ReadAllText(resultFilePath); - // var outputStr = File.ReadAllText(outputFilePath); - // Assert.Equal(resultStr, outputStr); - } - - [Theory] - [InlineData("ConfigurationFile/if.yml")] - public static void StructuralSearchFromConfig(string configPath) - { - var config = YmlHelper.Parse(configPath).Configurations.First(); - var inputFileInfo = new FileInfo("ExamplesInput/Test.txt"); + var parser = new StructuralSearchParser(config); - int count = 100; - long result = 0; - for (int i = 0; i < count; i++) - { - var res = Test(config, inputFileInfo); - Console.WriteLine(res); - result += res; - } - var t = result/count; - Console.WriteLine($"SR: {t}"); - } - - private static long Test(Configuration config, FileInfo inputFileInfo) - { - var startTime = System.Diagnostics.Stopwatch.StartNew(); - var input = Input.File(inputFileInfo); - var parser = new StructuralSearchParser(config); + var inputFileInfo = new FileInfo(inputFilePath); + var input = Input.File(inputFileInfo); + IParsingContext context = new ParsingContext(input); + var matches = parser.Parse(ref context); + matches = parser.ApplyFindRule(ref context, matches); + matches = parser.ApplyReplaceRule(ref context, matches); + var replaceMatches = parser.GetReplaceMatches(ref context, matches); + var outputFileInfo = new FileInfo(outputFilePath); + var output = Output.File(outputFileInfo); + output.Replace(input, replaceMatches); - IParsingContext context = new ParsingContext(input); - var matches = parser.Parse(ref context); - matches = parser.ApplyFindRule(ref context, matches); - matches = parser.ApplyReplaceRule(ref context, matches); - var replaceMatches = parser.GetReplaceMatches(ref context, matches); - startTime.Stop(); - var resultTime = startTime.Elapsed; - return resultTime.Ticks; - } - - // private static long Test(Configuration config, FileInfo inputFileInfo) - // { - // var startTime = System.Diagnostics.Stopwatch.StartNew(); - // var input = Input.File(inputFileInfo); - // var parser = new StructuralSearchParser(config); - // - // IParsingContext context = new ParsingContext(input); - // var matches = parser.Parse(ref context); - // matches = parser.ApplyFindRule(ref context, matches); - // matches = parser.ApplyReplaceRule(ref context, matches); - // var replaceMatches = parser.GetReplaceMatches(ref context, matches); - // startTime.Stop(); - // var resultTime = startTime.Elapsed; - // return resultTime.Ticks; - // } + Assert.Equal(matches.Count(), matchesCount); + var resultStr = File.ReadAllText(resultFilePath); + var outputStr = File.ReadAllText(outputFilePath); + Assert.Equal(resultStr, outputStr); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Configurations/Configuration.cs b/src/SimpleStateMachine.StructuralSearch/Configurations/Configuration.cs index 192d9bf..fb9c754 100644 --- a/src/SimpleStateMachine.StructuralSearch/Configurations/Configuration.cs +++ b/src/SimpleStateMachine.StructuralSearch/Configurations/Configuration.cs @@ -6,17 +6,17 @@ namespace SimpleStateMachine.StructuralSearch.Configurations { public class Configuration : IEquatable { - public string FindTemplate { get; init; } + public string? FindTemplate { get; init; } public List? FindRules { get; init; } - public string ReplaceTemplate { get; init; } + public string? ReplaceTemplate { get; init; } public List? ReplaceRules { get; init; } public bool Equals(Configuration? other) { - var findTemplateEquals = FindTemplate == other.FindTemplate; - var findRulesEquals = EnumerableHelper.SequenceNullableEqual(FindRules, other.FindRules); - var replaceTemplateEquals = ReplaceTemplate == other.ReplaceTemplate; - var replaceRulesEquals = EnumerableHelper.SequenceNullableEqual(ReplaceRules, other.ReplaceRules); + var findTemplateEquals = FindTemplate == other?.FindTemplate; + var findRulesEquals = EnumerableHelper.SequenceNullableEqual(FindRules, other?.FindRules); + var replaceTemplateEquals = ReplaceTemplate == other?.ReplaceTemplate; + var replaceRulesEquals = EnumerableHelper.SequenceNullableEqual(ReplaceRules, other?.ReplaceRules); return findTemplateEquals && findRulesEquals && replaceTemplateEquals && replaceRulesEquals; } diff --git a/src/SimpleStateMachine.StructuralSearch/Configurations/ConfigurationFile.cs b/src/SimpleStateMachine.StructuralSearch/Configurations/ConfigurationFile.cs index b64512c..c599235 100644 --- a/src/SimpleStateMachine.StructuralSearch/Configurations/ConfigurationFile.cs +++ b/src/SimpleStateMachine.StructuralSearch/Configurations/ConfigurationFile.cs @@ -6,11 +6,22 @@ namespace SimpleStateMachine.StructuralSearch.Configurations { public class ConfigurationFile: IEquatable { + // Use for deserialization + public ConfigurationFile() + { + Configurations = new List(); + } + + public ConfigurationFile(List configurations) + { + Configurations = configurations; + } + public List Configurations { get; init; } public bool Equals(ConfigurationFile? other) { - return Configurations.SequenceEqual(other.Configurations); + return other?.Configurations != null && Configurations.SequenceEqual(other.Configurations); } public override bool Equals(object? obj) diff --git a/src/SimpleStateMachine.StructuralSearch/Constant.cs b/src/SimpleStateMachine.StructuralSearch/Constant.cs index ad7334f..5a9dbba 100644 --- a/src/SimpleStateMachine.StructuralSearch/Constant.cs +++ b/src/SimpleStateMachine.StructuralSearch/Constant.cs @@ -95,7 +95,7 @@ public static partial class Constant /// /// Char: '=' /// - private const char Equals = '='; + private new const char Equals = '='; /// /// Char: '>' diff --git a/src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs b/src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs index c99137a..f63889b 100644 --- a/src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs +++ b/src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs @@ -35,7 +35,7 @@ public static Parser> UntilNot(this Parser< public static bool TryParse(this Parser parser, string value, out string? result) { - if(parser is null) + if (parser is null) throw new ArgumentNullException(nameof(parser)); var res = parser.Parse(value); diff --git a/src/SimpleStateMachine.StructuralSearch/FindParser.cs b/src/SimpleStateMachine.StructuralSearch/FindParser.cs index af066c5..62eb6d4 100644 --- a/src/SimpleStateMachine.StructuralSearch/FindParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/FindParser.cs @@ -8,6 +8,8 @@ namespace SimpleStateMachine.StructuralSearch { public class FindParser : IFindParser { + public static readonly IFindParser Empty = new EmptyFindParser(); + private SeriesParser Parser { get; } public FindParser(SeriesParser parser) { diff --git a/src/SimpleStateMachine.StructuralSearch/Helper/EnumerableHelper.cs b/src/SimpleStateMachine.StructuralSearch/Helper/EnumerableHelper.cs index 1de3b69..88ebfc5 100644 --- a/src/SimpleStateMachine.StructuralSearch/Helper/EnumerableHelper.cs +++ b/src/SimpleStateMachine.StructuralSearch/Helper/EnumerableHelper.cs @@ -9,8 +9,11 @@ public static bool SequenceNullableEqual(IEnumerable? first, I { if (first is null && second is null) return true; + + if (first is null || second is null) + return false; - return Enumerable.SequenceEqual(first, second); + return first.SequenceEqual(second); } } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Helper/YmlHelper.cs b/src/SimpleStateMachine.StructuralSearch/Helper/YmlHelper.cs index 14e6369..e89e53c 100644 --- a/src/SimpleStateMachine.StructuralSearch/Helper/YmlHelper.cs +++ b/src/SimpleStateMachine.StructuralSearch/Helper/YmlHelper.cs @@ -9,12 +9,12 @@ public static class YmlHelper { public static ConfigurationFile Parse(string filePath) { - var yml = File.ReadAllText(filePath); + var textReader = File.OpenText(filePath); var deserializer = new DeserializerBuilder() .WithNamingConvention(PascalCaseNamingConvention.Instance) .Build(); - var cfg = deserializer.Deserialize(yml); + var cfg = deserializer.Deserialize(textReader); return cfg; } } diff --git a/src/SimpleStateMachine.StructuralSearch/IFindParser.cs b/src/SimpleStateMachine.StructuralSearch/IFindParser.cs index 4396976..bbd858c 100644 --- a/src/SimpleStateMachine.StructuralSearch/IFindParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/IFindParser.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace SimpleStateMachine.StructuralSearch { @@ -6,4 +7,12 @@ public interface IFindParser { IEnumerable Parse(ref IParsingContext context); } + + public class EmptyFindParser: IFindParser + { + public IEnumerable Parse(ref IParsingContext context) + { + return Array.Empty(); + } + } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Parsers/DebugParser.cs b/src/SimpleStateMachine.StructuralSearch/Parsers/DebugParser.cs index 7c4ff59..a25c590 100644 --- a/src/SimpleStateMachine.StructuralSearch/Parsers/DebugParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/Parsers/DebugParser.cs @@ -2,7 +2,7 @@ namespace SimpleStateMachine.StructuralSearch { - public class DebugParser: Parser + public class DebugParser : Parser { private readonly Parser _parser; public DebugParser(Parser parser) diff --git a/src/SimpleStateMachine.StructuralSearch/Parsers/LookaheadParser.cs b/src/SimpleStateMachine.StructuralSearch/Parsers/LookaheadParser.cs deleted file mode 100644 index 40910ab..0000000 --- a/src/SimpleStateMachine.StructuralSearch/Parsers/LookaheadParser.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Pidgin; - -namespace SimpleStateMachine.StructuralSearch -{ - internal sealed class LookaheadParser : Parser - { - private readonly Parser _parser; - - public LookaheadParser(Parser parser) - { - this._parser = parser; - } - - public override bool TryParse(ref ParseState state, ref PooledList> expecteds, out T result) - { - state.PushBookmark(); - if (this._parser.TryParse(ref state, ref expecteds, out result)) - { - state.Rewind(); - return true; - } - state.PopBookmark(); - return false; - } - } -} \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Parsers/Parsers.cs b/src/SimpleStateMachine.StructuralSearch/Parsers/Parsers.cs index 7c89093..1b436ce 100644 --- a/src/SimpleStateMachine.StructuralSearch/Parsers/Parsers.cs +++ b/src/SimpleStateMachine.StructuralSearch/Parsers/Parsers.cs @@ -110,11 +110,6 @@ public static Parser EnumValue(TEnum value, bool ignoreCase return Parsers.String(value.ToString(), ignoreCase).AsEnum(ignoreCase); } - public static Parser Lookahead(Parser parser) => - parser != null ? (Parser) - new LookaheadParser(parser) - : throw new ArgumentNullException(nameof (parser)); - public static Parser> Match(Parser parser) { return Map((oldPos, oldOffset, result, newPos, newOffset) => diff --git a/src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs b/src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs index b128523..d4aaee7 100644 --- a/src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs @@ -19,29 +19,33 @@ public PlaceholderParser(string name) public override Parser BuildParser(Func?> next, Func?> nextNext) { - var _next = next(); - var _nextNext = nextNext(); + var nextParser = next(); + var nextNextParser = nextNext(); + if (nextParser is null) + return EmptyParser.AlwaysNotCorrectString; + Parser lookahead; - if (_nextNext is not null) + if (nextNextParser is not null) { - lookahead = Parsers.Lookahead(_next.Then(_nextNext, (s1, s2) => + + lookahead = Parser.Lookahead(nextParser.Then(nextNextParser, (s1, s2) => { OnLookahead = () => new List> { - new(_next, s1, s1.Length), - new(_nextNext, s2, s2.Length), + new(nextParser, s1, s1.Length), + new(nextNextParser, s2, s2.Length), }; return Unit.Value; }).Try()); } else { - lookahead = Parsers.Lookahead(_next.Select(s => + lookahead = Parser.Lookahead(nextParser.Select(s => { OnLookahead = () => new List> { - new(_next, s, s.Length) + new(nextParser, s, s.Length) }; return Unit.Value; }).Try()); diff --git a/src/SimpleStateMachine.StructuralSearch/Rules/FindRule/EmptyRule.cs b/src/SimpleStateMachine.StructuralSearch/Rules/FindRule/EmptyRule.cs new file mode 100644 index 0000000..00ebcbf --- /dev/null +++ b/src/SimpleStateMachine.StructuralSearch/Rules/FindRule/EmptyRule.cs @@ -0,0 +1,18 @@ +namespace SimpleStateMachine.StructuralSearch.Rules; + +public class EmptyRule: IRule +{ + public bool Execute() + { + return true; + + } + public void SetContext(ref IParsingContext context) + { + } +} + +public static class Rule +{ + public static readonly IRule Empty = new EmptyRule(); +} \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/IReplaceRule.cs b/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/IReplaceRule.cs new file mode 100644 index 0000000..216b18e --- /dev/null +++ b/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/IReplaceRule.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using SimpleStateMachine.StructuralSearch.Rules; + +namespace SimpleStateMachine.StructuralSearch; + +public interface IReplaceRule : IContextDependent +{ + IEnumerable Rules { get; } + IRule ConditionRule { get; } +} + +public class EmptyReplaceRule : IReplaceRule +{ + public IEnumerable Rules { get; } = Array.Empty(); + public IRule ConditionRule => Rule.Empty; + + public void SetContext(ref IParsingContext context) + { + } +} \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/ReplaceRule.cs b/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/ReplaceRule.cs index 9582410..56e1929 100644 --- a/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/ReplaceRule.cs +++ b/src/SimpleStateMachine.StructuralSearch/Rules/ReplaceRule/ReplaceRule.cs @@ -3,12 +3,13 @@ namespace SimpleStateMachine.StructuralSearch { - public class ReplaceRule: IContextDependent + public class ReplaceRule : IReplaceRule { - public readonly IRule ConditionRule; + public static readonly IReplaceRule Empty = new EmptyReplaceRule(); public IEnumerable Rules { get; } - + public IRule ConditionRule { get; } + public ReplaceRule(IRule conditionRule, IEnumerable rules) { ConditionRule = conditionRule; diff --git a/src/SimpleStateMachine.StructuralSearch/SimpleStateMachine.StructuralSearch.csproj b/src/SimpleStateMachine.StructuralSearch/SimpleStateMachine.StructuralSearch.csproj index c80f09b..5786197 100644 --- a/src/SimpleStateMachine.StructuralSearch/SimpleStateMachine.StructuralSearch.csproj +++ b/src/SimpleStateMachine.StructuralSearch/SimpleStateMachine.StructuralSearch.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindRulesParser.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindRulesParser.cs index 1653bd3..174bc4a 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindRulesParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindRulesParser.cs @@ -75,9 +75,11 @@ internal static readonly Parser> Not ) ); - internal static IRule ParseTemplate(string str) + internal static IRule ParseTemplate(string? str) { - return Expr.Before(CommonParser.EOF).ParseOrThrow(str); + return string.IsNullOrEmpty(str) + ? Rule.Empty + : Expr.Before(CommonParser.EOF).ParseOrThrow(str); } } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindTemplateParser.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindTemplateParser.cs index 98c298c..5a6911d 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindTemplateParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/FindTemplateParser.cs @@ -53,54 +53,11 @@ static FindTemplateParser() private static readonly Parser SeriesParser; - internal static IFindParser ParseTemplate(string str) + internal static IFindParser ParseTemplate(string? str) { - return SeriesParser.Select(parser => new FindParser(parser)).ParseOrThrow(str); + return string.IsNullOrEmpty(str) + ? FindParser.Empty + : SeriesParser.Select(parser => new FindParser(parser)).ParseOrThrow(str); } - - - - - // static FindTemplateParser() - // { - // Parenthesised = Parsers.BetweenOneOfChars(ParserToParser.StringcMatch, - // Parser.Rec(() => Term.Or(Empty)), - // Constant.AllParenthesised); - // - // Term = Parser.OneOf(Parenthesised, Token) - // .AtLeastOnce(); - // - // - // TemplateParser = Term; - // } - - - // internal static readonly Parser> Empty = - // ParserToParser.ResultAsMatch(CommonParser.Empty); - // - // internal static readonly Parser> AnyString = - // ParserToParser.ResultAsMatch(CommonParser.AnyString).Try(); - // - // internal static readonly Parser> WhiteSpaces = - // ParserToParser.ResultAsMatch(CommonParser.WhiteSpaces).Try(); - // - // internal static readonly Parser> Placeholder = - // CommonTemplateParser.Placeholder - // .Select(name => new PlaceholderParser(name)) - // .Cast>(); - // - // internal static readonly Parser> Token = - // Parser.OneOf(AnyString, Placeholder, WhiteSpaces); - // - // internal static readonly Parser> Term; - // - // internal static readonly Parser> Parenthesised; - // - // private static readonly Parser> TemplateParser; - // - // internal static Parser ParseTemplate(string str) - // { - // return TemplateParser.ParseOrThrow(str); - // } } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceRuleParser.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceRuleParser.cs index 27b9261..bb72c15 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceRuleParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceRuleParser.cs @@ -32,9 +32,11 @@ public static class ReplaceRuleParser .Try() .TrimStart(); - internal static ReplaceRule ParseTemplate(string str) + internal static IReplaceRule ParseTemplate(string? str) { - return ReplaceRule.Before(CommonParser.EOF).ParseOrThrow(str); + return string.IsNullOrEmpty(str) + ? SimpleStateMachine.StructuralSearch.ReplaceRule.Empty + : ReplaceRule.Before(CommonParser.EOF).ParseOrThrow(str); } } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceTemplateParser.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceTemplateParser.cs index 3be7771..858e7e2 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceTemplateParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/ReplaceTemplateParser.cs @@ -8,7 +8,7 @@ namespace SimpleStateMachine.StructuralSearch { - internal class ReplaceTemplateParser + internal static class ReplaceTemplateParser { static ReplaceTemplateParser() { @@ -47,9 +47,11 @@ static ReplaceTemplateParser() public static readonly Parser> ParenthesisedParameters; public static readonly Parser> Parameters; - internal static IReplaceBuilder ParseTemplate(string str) + internal static IReplaceBuilder ParseTemplate(string? str) { - return Parameters + return string.IsNullOrEmpty(str) + ? ReplaceBuilder.Empty + : Parameters .Select(steps => new ReplaceBuilder(steps)) .ParseOrThrow(str); } diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/StructuralSearch.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/StructuralSearch.cs index 4b38916..22101cb 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearch/StructuralSearch.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearch/StructuralSearch.cs @@ -1,20 +1,21 @@ -using SimpleStateMachine.StructuralSearch.ReplaceTemplate; +using System.Diagnostics.CodeAnalysis; +using SimpleStateMachine.StructuralSearch.ReplaceTemplate; using SimpleStateMachine.StructuralSearch.Rules; namespace SimpleStateMachine.StructuralSearch { public static class StructuralSearch { - public static IFindParser ParseFindTemplate(string template) + public static IFindParser ParseFindTemplate(string? template) => FindTemplateParser.ParseTemplate(template); - public static IReplaceBuilder ParseReplaceTemplate(string template) + public static IReplaceBuilder ParseReplaceTemplate(string? template) => ReplaceTemplateParser.ParseTemplate(template); - public static IRule ParseFindRule(string template) + public static IRule ParseFindRule(string? template) => FindRuleParser.ParseTemplate(template); - public static ReplaceRule ParseReplaceRule(string template) + public static IReplaceRule ParseReplaceRule(string? template) => ReplaceRuleParser.ParseTemplate(template); } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/StructuralSearchParser.cs b/src/SimpleStateMachine.StructuralSearch/StructuralSearchParser.cs index d6bf563..9de570b 100644 --- a/src/SimpleStateMachine.StructuralSearch/StructuralSearchParser.cs +++ b/src/SimpleStateMachine.StructuralSearch/StructuralSearchParser.cs @@ -1,5 +1,6 @@  using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using SimpleStateMachine.StructuralSearch.Configurations; using SimpleStateMachine.StructuralSearch.Extensions; @@ -13,7 +14,7 @@ public class StructuralSearchParser private readonly IFindParser _findParser; private readonly IReadOnlyList _findRules; private readonly IReplaceBuilder _replaceBuilder; - private readonly IReadOnlyList _replaceRules; + private readonly IReadOnlyList _replaceRules; public StructuralSearchParser(Configuration configuration) { @@ -23,8 +24,7 @@ public StructuralSearchParser(Configuration configuration) .EmptyIfNull() .Select(StructuralSearch.ParseFindRule).ToList(); - if(!string.IsNullOrEmpty(configuration.ReplaceTemplate)) - _replaceBuilder = StructuralSearch.ParseReplaceTemplate(configuration.ReplaceTemplate); + _replaceBuilder = StructuralSearch.ParseReplaceTemplate(configuration.ReplaceTemplate); _replaceRules = configuration.ReplaceRules .EmptyIfNull() @@ -117,7 +117,7 @@ private void SetFindRulesContext(ref IParsingContext context) { foreach (var findRule in _findRules) { - if(findRule is IContextDependent contextDependent) + if (findRule is IContextDependent contextDependent) contextDependent.SetContext(ref context); } } @@ -126,7 +126,7 @@ private void SetReplaceRulesContext(ref IParsingContext context) { foreach (var replaceRule in _replaceRules) { - if(replaceRule is IContextDependent contextDependent) + if (replaceRule is IContextDependent contextDependent) contextDependent.SetContext(ref context); } } diff --git a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/IReplaceBuilder.cs b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/IReplaceBuilder.cs index 0a9fc50..03e3b13 100644 --- a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/IReplaceBuilder.cs +++ b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/IReplaceBuilder.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using SimpleStateMachine.StructuralSearch.Rules; namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate @@ -8,4 +9,14 @@ public interface IReplaceBuilder IEnumerable Steps { get; } string Build(IParsingContext context); } + + public class EmptyReplaceBuilder: IReplaceBuilder + { + public IEnumerable Steps { get; } = Array.Empty(); + + public string Build(IParsingContext context) + { + return string.Empty; + } + } } \ No newline at end of file diff --git a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/PlaceholderReplace.cs b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/PlaceholderReplace.cs index e1a0b3f..4746e19 100644 --- a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/PlaceholderReplace.cs +++ b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/PlaceholderReplace.cs @@ -3,7 +3,6 @@ public class PlaceholderReplace : IReplaceStep, IContextDependent { private IParsingContext _context; - private readonly string _name; public PlaceholderReplace(string name) diff --git a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/ReplaceBuilder.cs b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/ReplaceBuilder.cs index 4ebe621..4519916 100644 --- a/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/ReplaceBuilder.cs +++ b/src/SimpleStateMachine.StructuralSearch/Templates/ReplaceTemplate/ReplaceBuilder.cs @@ -6,6 +6,8 @@ namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate { public class ReplaceBuilder : IReplaceBuilder { + public static readonly IReplaceBuilder Empty = new EmptyReplaceBuilder(); + public IEnumerable Steps { get; } public ReplaceBuilder(IEnumerable steps)