Skip to content

Commit 024466e

Browse files
committed
More validations and tests.
1 parent e45705e commit 024466e

5 files changed

Lines changed: 23 additions & 12 deletions

File tree

src/System.Linq.Dynamic.Core/ExpressionParser.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,17 +1213,9 @@ Expression ParseNew()
12131213
if (_textParser.CurrentToken.Id == TokenId.OpenBracket)
12141214
{
12151215
_textParser.NextToken();
1216-
if (_textParser.CurrentToken.Id != TokenId.CloseBracket)
1217-
{
1218-
throw ParseError(Res.CloseBracketExpected);
1219-
}
1220-
1216+
_textParser.ValidateToken(TokenId.CloseBracket, Res.CloseBracketExpected);
12211217
_textParser.NextToken();
1222-
if (_textParser.CurrentToken.Id != TokenId.OpenCurlyParen)
1223-
{
1224-
throw ParseError(Res.OpenCurlyParenExpected);
1225-
}
1226-
1218+
_textParser.ValidateToken(TokenId.OpenCurlyParen, Res.OpenCurlyParenExpected);
12271219
arrayInitializer = true;
12281220
}
12291221

src/System.Linq.Dynamic.Core/Res.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal static class Res
4242
public const string UnterminatedStringLiteral = "Unterminated string literal";
4343
public const string InvalidCharacter = "Syntax error '{0}'";
4444
public const string DigitExpected = "Digit expected";
45+
public const string HexCharExpected = "Hexadecimal character expected";
4546
public const string SyntaxError = "Syntax error";
4647
public const string TokenExpected = "{0} expected";
4748
public const string ParseExceptionFormat = "{0} (at index {1})";

src/System.Linq.Dynamic.Core/Tokenizer/TextParser.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ public void NextToken()
293293
bool hexInteger = false;
294294
if (_ch == 'X' || _ch == 'x')
295295
{
296+
NextChar();
297+
ValidateHexChar();
296298
do
297299
{
298300
NextChar();
@@ -381,6 +383,11 @@ private void ValidateDigit()
381383
if (!char.IsDigit(_ch)) throw ParseError(_textPos, Res.DigitExpected);
382384
}
383385

386+
private void ValidateHexChar()
387+
{
388+
if (!IsHexChar(_ch)) throw ParseError(_textPos, Res.HexCharExpected);
389+
}
390+
384391
private Exception ParseError(string format, params object[] args)
385392
{
386393
return ParseError(CurrentToken.Pos, format, args);

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public void ExpressionTests_ArrayInitializer()
3030
Assert.Equal(result2.Cast<int>(), list.SelectMany(item => new[] { item + 1, item + 2 }));
3131
Assert.Equal(result3.Cast<long>(), list.SelectMany(item => new long[] { item + 1, (byte)(item + 2), (short)(item + 3) }));
3232
Assert.Equal(result4.SelectMany("it").Cast<int>(), list.SelectMany(item => new[] { new[] { item + 1, item + 2 }, new[] { item + 3, item + 4 } }).SelectMany(item => item));
33+
34+
Assert.Throws<ParseException>(() => list.AsQueryable().SelectMany("new[ {}"));
35+
Assert.Throws<ParseException>(() => list.AsQueryable().SelectMany("new] {}"));
3336
}
3437

3538
[Fact]
@@ -510,6 +513,9 @@ public void ExpressionTests_HexadecimalInteger()
510513
Assert.Equal(values.Select(it => it * 0x1234567890abcdefL), resultL);
511514
Assert.Equal(values.Select(it => it * -0x0ABCDEF987654321L), resultLNeg);
512515
Assert.Equal(values.Select(it => (ulong)it * 0x1000abEFUL), resultUL);
516+
517+
Assert.Throws<ParseException>(() => values.AsQueryable().Where("it < 0x 11a"));
518+
Assert.Throws<ParseException>(() => values.AsQueryable().Where("it < 11a"));
513519
}
514520

515521
[Fact]

test/System.Linq.Dynamic.Core.Tests/TextParserTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public void TextParser_Parse_RealLiteral()
4141
Check.That(textParser.CurrentToken.Id).Equals(TokenId.RealLiteral);
4242
Check.That(textParser.CurrentToken.Pos).Equals(1);
4343
Check.That(textParser.CurrentToken.Text).Equals("1.0E25");
44+
45+
Check.ThatCode(() => new TextParser("1.e25")).Throws<ParseException>();
4446
}
4547

4648
[Fact]
@@ -113,6 +115,8 @@ public void TextParser_Parse_HexadecimalIntegerLiteral()
113115
Check.That(textParser.CurrentToken.Id).Equals(TokenId.IntegerLiteral);
114116
Check.That(textParser.CurrentToken.Pos).Equals(1);
115117
Check.That(textParser.CurrentToken.Text).Equals("0x1234567890AbCdEfL");
118+
119+
Check.ThatCode(() => new TextParser("0xz1234")).Throws<ParseException>();
116120
}
117121

118122
[Fact]
@@ -151,11 +155,12 @@ public void TextParser_Parse_Slash()
151155
Check.That(textParser.CurrentToken.Text).Equals("/");
152156
}
153157

154-
// [Fact]
158+
[Fact]
155159
public void TextParser_Parse_ThrowsException()
156160
{
157161
// Assign + Act + Assert
158-
Check.ThatCode(() => { new TextParser("ಬಾ"); }).Throws<ParseException>();
162+
//Check.ThatCode(() => { new TextParser("ಬಾ"); }).Throws<ParseException>();
163+
Check.ThatCode(() => { new TextParser(";"); }).Throws<ParseException>();
159164
}
160165
}
161166
}

0 commit comments

Comments
 (0)