@@ -17,6 +17,17 @@ public partial class ExpressionParserTests
17
17
18
18
private readonly ParsingConfig _parsingConfig ;
19
19
20
+ [ Flags ]
21
+ public enum ExampleFlags
22
+ {
23
+ None = 0 ,
24
+ A = 1 ,
25
+ B = 2 ,
26
+ C = 4 ,
27
+ D = 8 ,
28
+ } ;
29
+
30
+
20
31
public ExpressionParserTests ( )
21
32
{
22
33
_dynamicTypeProviderMock = new Mock < IDynamicLinkCustomTypeProvider > ( ) ;
@@ -32,6 +43,126 @@ public ExpressionParserTests()
32
43
} ;
33
44
}
34
45
46
+ [ Fact ]
47
+ public void Parse_BitwiseOperatorOr_On_2EnumFlags ( )
48
+ {
49
+ // Arrange
50
+ var expression = "@0 | @1" ;
51
+ #if NET452
52
+ var expected = "Convert((Convert(A) | Convert(B)))" ;
53
+ #else
54
+ var expected = "Convert((Convert(A, Int32) | Convert(B, Int32)), ExampleFlags)" ;
55
+ #endif
56
+ ParameterExpression [ ] parameters = { ParameterExpressionHelper . CreateParameterExpression ( typeof ( int ) , "x" ) } ;
57
+ var sut = new ExpressionParser ( parameters , expression , new object [ ] { ExampleFlags . A , ExampleFlags . B } , null ) ;
58
+
59
+ // Act
60
+ var parsedExpression = sut . Parse ( null ) . ToString ( ) ;
61
+
62
+ // Assert
63
+ parsedExpression . Should ( ) . Be ( expected ) ;
64
+
65
+ // Arrange
66
+ var query = new [ ] { 0 } . AsQueryable ( ) ;
67
+
68
+ // Act
69
+ var result = query . Select ( expression , ExampleFlags . A , ExampleFlags . B ) . First ( ) ;
70
+
71
+ // Assert
72
+ Assert . IsType < ExampleFlags > ( result ) ;
73
+ Assert . Equal ( ExampleFlags . A | ExampleFlags . B , result ) ;
74
+ }
75
+
76
+ [ Fact ]
77
+ public void Parse_BitwiseOperatorAnd_On_2EnumFlags ( )
78
+ {
79
+ // Arrange
80
+ var expression = "@0 & @1" ;
81
+ #if NET452
82
+ var expected = "Convert((Convert(A) & Convert(B)))" ;
83
+ #else
84
+ var expected = "Convert((Convert(A, Int32) & Convert(B, Int32)), ExampleFlags)" ;
85
+ #endif
86
+ ParameterExpression [ ] parameters = { ParameterExpressionHelper . CreateParameterExpression ( typeof ( int ) , "x" ) } ;
87
+ var sut = new ExpressionParser ( parameters , expression , new object [ ] { ExampleFlags . A , ExampleFlags . B } , null ) ;
88
+
89
+ // Act
90
+ var parsedExpression = sut . Parse ( null ) . ToString ( ) ;
91
+
92
+ // Assert
93
+ parsedExpression . Should ( ) . Be ( expected ) ;
94
+
95
+ // Arrange
96
+ var query = new [ ] { 0 } . AsQueryable ( ) ;
97
+
98
+ // Act
99
+ var result = query . Select ( expression , ExampleFlags . A , ExampleFlags . B ) . First ( ) ;
100
+
101
+ // Assert
102
+ Assert . IsType < ExampleFlags > ( result ) ;
103
+ Assert . Equal ( ExampleFlags . A & ExampleFlags . B , result ) ;
104
+ }
105
+
106
+ [ Fact ]
107
+ public void Parse_BitwiseOperatorOr_On_3EnumFlags ( )
108
+ {
109
+ // Arrange
110
+ var expression = "@0 | @1 | @2" ;
111
+ #if NET452
112
+ var expected = "Convert(((Convert(A) | Convert(B)) | Convert(C)))" ;
113
+ #else
114
+ var expected = "Convert(((Convert(A, Int32) | Convert(B, Int32)) | Convert(C, Int32)), ExampleFlags)" ;
115
+ #endif
116
+ ParameterExpression [ ] parameters = { ParameterExpressionHelper . CreateParameterExpression ( typeof ( int ) , "x" ) } ;
117
+ var sut = new ExpressionParser ( parameters , expression , new object [ ] { ExampleFlags . A , ExampleFlags . B , ExampleFlags . C } , null ) ;
118
+
119
+ // Act
120
+ var parsedExpression = sut . Parse ( null ) . ToString ( ) ;
121
+
122
+ // Assert
123
+ parsedExpression . Should ( ) . Be ( expected ) ;
124
+
125
+ // Arrange
126
+ var query = new [ ] { 0 } . AsQueryable ( ) ;
127
+
128
+ // Act
129
+ var result = query . Select ( expression , ExampleFlags . A , ExampleFlags . B , ExampleFlags . C ) . First ( ) ;
130
+
131
+ // Assert
132
+ Assert . IsType < ExampleFlags > ( result ) ;
133
+ Assert . Equal ( ExampleFlags . A | ExampleFlags . B | ExampleFlags . C , result ) ;
134
+ }
135
+
136
+ [ Fact ]
137
+ public void Parse_BitwiseOperatorAnd_On_3EnumFlags ( )
138
+ {
139
+ // Arrange
140
+ var expression = "@0 & @1 & @2" ;
141
+ #if NET452
142
+ var expected = "Convert(((Convert(A) & Convert(B)) & Convert(C)))" ;
143
+ #else
144
+ var expected = "Convert(((Convert(A, Int32) & Convert(B, Int32)) & Convert(C, Int32)), ExampleFlags)" ;
145
+ #endif
146
+ ParameterExpression [ ] parameters = { ParameterExpressionHelper . CreateParameterExpression ( typeof ( int ) , "x" ) } ;
147
+ var sut = new ExpressionParser ( parameters , expression , new object [ ] { ExampleFlags . A , ExampleFlags . B , ExampleFlags . C } , null ) ;
148
+
149
+ // Act
150
+ var parsedExpression = sut . Parse ( null ) . ToString ( ) ;
151
+
152
+ // Assert
153
+ parsedExpression . Should ( ) . Be ( expected ) ;
154
+
155
+ // Arrange
156
+ var query = new [ ] { 0 } . AsQueryable ( ) ;
157
+
158
+ // Act
159
+ var result = query . Select ( expression , ExampleFlags . A , ExampleFlags . B , ExampleFlags . C ) . First ( ) ;
160
+
161
+ // Assert
162
+ Assert . IsType < ExampleFlags > ( result ) ;
163
+ Assert . Equal ( ExampleFlags . A & ExampleFlags . B & ExampleFlags . C , result ) ;
164
+ }
165
+
35
166
[ Fact ]
36
167
public void Parse_ParseBinaryInteger ( )
37
168
{
0 commit comments