-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpressionParserTest.cs
More file actions
120 lines (96 loc) · 3.96 KB
/
ExpressionParserTest.cs
File metadata and controls
120 lines (96 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System.Globalization;
using System.Linq.Expressions;
namespace Ramstack.Parsing;
[TestFixture]
public class ExpressionParserTest
{
private static List<object[]> ExpressionSource =>
GetResource("Expressions.txt");
private static List<object[]> StringConcatSource =>
GetResource("StringConcat.txt");
private static List<object[]> ErrorsSource =>
GetResource("Errors.txt");
private static List<object[]> EvaluatesSource
{
get
{
var list = new List<object[]>();
list.Add(["""version.parse("1.2.3.4")""", Version.Parse("1.2.3.4")]);
list.Add(["""Math.Max(1d, 15)""", 15d]);
list.Add(["""DateTime.Today""", DateTime.Today]);
list.Add(["""sbyte.MinValue""", sbyte.MinValue]);
list.Add(["""-0x80000000""", int.MinValue]);
list.Add([""" 0x80000000""", 0x80000000]);
list.Add(["""-0x8000000000000000""", long.MinValue]);
list.Add([""" 0x8000000000000000""", 0x8000000000000000L]);
list.Add(["""ulong.MaxValue""", ulong.MaxValue]);
list.Add(["""Guid.Empty""", Guid.Empty]);
return list;
}
}
[OneTimeSetUp]
public void Setup()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
}
[Test]
public void ContextTest()
{
var parameter = Expression.Parameter(typeof(UserInfo), "u");
var binder = new ContextAwareBinder(parameter);
var result = ExpressionParser.Parse("name != lastName && name.Length > 0", binder);
Assert.That(result.ToString(), Is.EqualTo("((u.Name != u.LastName) AndAlso (u.Name.Length > 0))"));
}
[TestCaseSource(nameof(EvaluatesSource))]
public void EvaluateExpression(string expression, object result) =>
Assert.That(ExpressionParser.Evaluate(expression), Is.EqualTo(result));
[TestCaseSource(nameof(ErrorsSource))]
public void ParseErrorExpression(string expression, string expected)
{
var result = ExpressionParser.Parse(expression, new DefaultBinder());
Console.WriteLine(result.ToString());
Assert.That(result.Success, Is.False);
Assert.That(result.ToString(), Is.EqualTo(expected));
}
[TestCaseSource(nameof(ExpressionSource))]
public void ParseExpressionTest(string source, string expected)
{
var result = ExpressionParser.Parse(source, new DefaultBinder());
Assert.That(result.ToString(), Is.EqualTo(expected));
}
[TestCaseSource(nameof(StringConcatSource))]
public void StringConcatTest(string source, string expected)
{
var result = ExpressionParser.Parse(source, new DefaultBinder());
Assert.That(result.ToString(), Is.EqualTo(expected));
}
private static List<object[]> GetResource(string resourceName)
{
using var stream = typeof(ExpressionParserTest).Assembly.GetManifestResourceStream($"Ramstack.Parsing.Data.{resourceName}");
using var reader = new StreamReader(stream!);
var result = new List<object[]>();
while (true)
{
string? s;
string? e;
while ((s = reader.ReadLine()) is not null)
if (!string.IsNullOrWhiteSpace(s) && !s.StartsWith('#'))
break;
while ((e = reader.ReadLine()) is not null)
if (!string.IsNullOrWhiteSpace(e) && !e.StartsWith('#'))
break;
if (s is null || e is null)
break;
s = s.Replace(@"\n", "\r\n");
e = e.Replace(@"\n", "\r\n");
result.Add([s, e]);
}
return result;
}
public class UserInfo
{
public string? Name { get; set; }
public string? LastName { get; set; }
}
}