Search engine bug fix and unit tests
This commit is contained in:
parent
726b36de4d
commit
f55a3ca008
@ -13,7 +13,7 @@
|
||||
<!-- <PublishSingleFile>true</PublishSingleFile> -->
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
|
||||
<Version>4.2.2.1</Version>
|
||||
<Version>4.2.3.1</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -61,11 +61,14 @@ namespace LibationSearchEngine
|
||||
/// </summary>
|
||||
private static string boolPattern_parameterized { get; }
|
||||
= @"
|
||||
### IMPORTANT: 'ignore whitespace' is only partially honored in character sets
|
||||
### - new lines are ok
|
||||
### - ANY leading whitespace is treated like actual matching spaces :(
|
||||
|
||||
### can't begin with colon. incorrect syntax
|
||||
### can't begin with open bracket: this signals the start of a tag
|
||||
(?<! # begin negative lookbehind
|
||||
[ # begin char set
|
||||
: # colon
|
||||
\[ # open bracket, escaped
|
||||
] # end char set
|
||||
[:\[] # char set: colon and open bracket, escaped
|
||||
\s* # optional space
|
||||
) # end negative lookbehind
|
||||
|
||||
@ -73,12 +76,11 @@ namespace LibationSearchEngine
|
||||
({0}) # captured bool search keyword. this is the $1 reference used in regex.Replace
|
||||
\b # word boundary
|
||||
|
||||
### can't end with colon. this signals that the bool's value already exists
|
||||
### can't begin with close bracket: this signals the end of a tag
|
||||
(?! # begin negative lookahead
|
||||
\s* # optional space
|
||||
[ # begin char set
|
||||
: # colon
|
||||
\] # close bracket, escaped
|
||||
] # end char set
|
||||
[:\]] # char set: colon and close bracket, escaped
|
||||
) # end negative lookahead
|
||||
";
|
||||
private static Dictionary<string, Regex> boolRegexDic { get; } = new Dictionary<string, Regex>();
|
||||
|
||||
@ -24,15 +24,54 @@ namespace SearchEngineTests
|
||||
public class FormatSearchQuery
|
||||
{
|
||||
[TestMethod]
|
||||
[DataRow(null, SearchEngine.ALL_QUERY)]
|
||||
[DataRow("", SearchEngine.ALL_QUERY)]
|
||||
[DataRow(" ", SearchEngine.ALL_QUERY)]
|
||||
// null, empty, whitespace -- *:*
|
||||
[DataRow(null, "*:*")]
|
||||
[DataRow("", "*:*")]
|
||||
[DataRow(" ", "*:*")]
|
||||
|
||||
// tag surrounded by spaces
|
||||
[DataRow("[foo]", "tags:foo")]
|
||||
[DataRow(" [foo]", " tags:foo")]
|
||||
[DataRow("[foo] ", "tags:foo ")]
|
||||
[DataRow(" [foo] ", " tags:foo ")]
|
||||
[DataRow("-[foo]", "-tags:foo")]
|
||||
[DataRow(" -[foo]", " -tags:foo")]
|
||||
[DataRow("-[foo] ", "-tags:foo ")]
|
||||
[DataRow(" -[foo] ", " -tags:foo ")]
|
||||
|
||||
// tag case irrelevant
|
||||
[DataRow("[FoO]", "tags:FoO")]
|
||||
|
||||
// bool keyword surrounded by spaces
|
||||
[DataRow("israted", "israted:True")]
|
||||
[DataRow(" israted", " israted:True")]
|
||||
[DataRow("israted ", "israted:True ")]
|
||||
[DataRow(" israted ", " israted:True ")]
|
||||
[DataRow("-israted", "-israted:True")]
|
||||
[DataRow(" -israted", " -israted:True")]
|
||||
[DataRow("-israted ", "-israted:True ")]
|
||||
[DataRow(" -israted ", " -israted:True ")]
|
||||
|
||||
// bool keyword. Append :True
|
||||
[DataRow("israted", "israted:True")]
|
||||
|
||||
// bool keyword with [:bool]. Do not add :True
|
||||
[DataRow("israted:True", "israted:True")]
|
||||
[DataRow("isRated:false", "israted:false")]
|
||||
|
||||
// tag which happens to be a bool keyword >> parse as tag
|
||||
[DataRow("[israted]", "tags:israted")]
|
||||
|
||||
// numbers with "to". TO all caps, numbers [8.2] format
|
||||
[DataRow("1 to 10", "00000001.00 TO 00000010.00")]
|
||||
[DataRow("19990101 to 20001231", "19990101.00 TO 20001231.00")]
|
||||
|
||||
// field to lowercase
|
||||
[DataRow("Author:Doyle", "author:Doyle")]
|
||||
// bool field to lowercase
|
||||
[DataRow("IsRated", "israted:True")]
|
||||
[DataRow("-isRATED", "-israted:True")]
|
||||
|
||||
public void FormattingTest(string input, string output)
|
||||
=> SearchEngine.FormatSearchQuery(input).Should().Be(output);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user