@@ -17,6 +17,17 @@ public partial class ExpressionParserTests
1717
1818 private readonly ParsingConfig _parsingConfig ;
1919
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+
2031 public ExpressionParserTests ( )
2132 {
2233 _dynamicTypeProviderMock = new Mock < IDynamicLinkCustomTypeProvider > ( ) ;
@@ -32,6 +43,126 @@ public ExpressionParserTests()
3243 } ;
3344 }
3445
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+
35166 [ Fact ]
36167 public void Parse_ParseBinaryInteger ( )
37168 {
0 commit comments