|
1 | | -using WebExpress.WebIndex.Test.Fixture; |
| 1 | +using WebExpress.WebIndex.Test.Document; |
| 2 | +using WebExpress.WebIndex.Test.Fixture; |
| 3 | +using WebExpress.WebIndex.Wql; |
2 | 4 | using Xunit.Abstractions; |
3 | 5 |
|
4 | 6 | namespace WebExpress.WebIndex.Test.WQL |
@@ -198,5 +200,59 @@ public void MultipleWords() |
198 | 200 | Assert.Null(wql.Order); |
199 | 201 | Assert.Null(wql.Partitioning); |
200 | 202 | } |
| 203 | + |
| 204 | + /// <summary> |
| 205 | + /// Verifies that the abstract syntax tree (AST) is generated. |
| 206 | + /// </summary> |
| 207 | + [Fact] |
| 208 | + public void AbstracrSyntaxTree() |
| 209 | + { |
| 210 | + // arrange |
| 211 | + var wql = Fixture.ExecuteWql("text~'Helena'"); |
| 212 | + |
| 213 | + // act |
| 214 | + var ast = wql.AbstractSyntaxTree; |
| 215 | + |
| 216 | + // validation |
| 217 | + Assert.NotNull(ast); |
| 218 | + } |
| 219 | + |
| 220 | + /// <summary> |
| 221 | + /// Performs the incremental lookahead analysis. |
| 222 | + /// </summary> |
| 223 | + [Theory] |
| 224 | + [InlineData("", true, 0, WqlExpressionType.None, WqlExpressionType.Attribute)] |
| 225 | + [InlineData("text", false, 1, WqlExpressionType.Attribute, WqlExpressionType.Operator)] |
| 226 | + [InlineData("text #", false, 2, WqlExpressionType.Operator, WqlExpressionType.Operator)] |
| 227 | + [InlineData("text ~", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 228 | + [InlineData("text ~ (", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 229 | + [InlineData("text ~ )", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 230 | + [InlineData("text ~ and", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 231 | + [InlineData("text ~ or", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 232 | + [InlineData("text ~ &", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 233 | + [InlineData("text ~ ||", false, 2, WqlExpressionType.Operator, WqlExpressionType.Parameter)] |
| 234 | + [InlineData("text ~ '", false, 3, WqlExpressionType.Parameter, WqlExpressionType.Parameter)] |
| 235 | + [InlineData("text ~ \"", false, 3, WqlExpressionType.Parameter, WqlExpressionType.Parameter)] |
| 236 | + [InlineData("text ~ Helena", true, 3, WqlExpressionType.Parameter, WqlExpressionType.LogicalOperator)] |
| 237 | + [InlineData("text ~ 'Helena'", true, 3, WqlExpressionType.Parameter, WqlExpressionType.LogicalOperator)] |
| 238 | + [InlineData("text ~ \"Helena\"", true, 3, WqlExpressionType.Parameter, WqlExpressionType.LogicalOperator)] |
| 239 | + [InlineData("text ~ day(", false, 3, WqlExpressionType.Parameter, WqlExpressionType.LogicalOperator)] |
| 240 | + [InlineData("text ~ day()", true, 3, WqlExpressionType.Parameter, WqlExpressionType.LogicalOperator)] |
| 241 | + [InlineData("text ~ Helena and", false, 4, WqlExpressionType.LogicalOperator, WqlExpressionType.Attribute)] |
| 242 | + public void Analyze(string wql, bool valid, int count, WqlExpressionType type, params WqlExpressionType[] expectedNextTokens) |
| 243 | + { |
| 244 | + // arrange |
| 245 | + var parser = new WqlParser<UnitTestIndexTestDocumentA>(); |
| 246 | + |
| 247 | + // act |
| 248 | + var ila = parser.Analyze(wql); |
| 249 | + |
| 250 | + // validation |
| 251 | + Assert.NotNull(ila); |
| 252 | + Assert.True(ila.IsValidSoFar == valid); |
| 253 | + Assert.Equal(type, ila.LastExpressionType); |
| 254 | + Assert.Equal(count, ila.Items.Count()); |
| 255 | + Assert.Contains(expectedNextTokens, t => ila.ExpectedNextTokens.Contains(t)); |
| 256 | + } |
201 | 257 | } |
202 | 258 | } |
0 commit comments