2 // ExpressionTest_LessThanOrEqual.cs
5 // Jb Evain (jbevain@novell.com)
7 // (C) 2008 Novell, Inc. (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Reflection
;
32 using System
.Linq
.Expressions
;
33 using NUnit
.Framework
;
35 namespace MonoTests
.System
.Linq
.Expressions
38 public class ExpressionTest_LessThanOrEqual
41 [ExpectedException (typeof (ArgumentNullException
))]
42 public void Arg1Null ()
44 Expression
.LessThanOrEqual (null, Expression
.Constant (1));
48 [ExpectedException (typeof (ArgumentNullException
))]
49 public void Arg2Null ()
51 Expression
.LessThanOrEqual (Expression
.Constant (1), null);
55 [ExpectedException (typeof (InvalidOperationException
))]
56 public void NoOperatorClass ()
58 Expression
.LessThanOrEqual (Expression
.Constant (new NoOpClass ()), Expression
.Constant (new NoOpClass ()));
64 var expr
= Expression
.LessThanOrEqual (Expression
.Constant (2.0), Expression
.Constant (1.0));
65 Assert
.AreEqual (ExpressionType
.LessThanOrEqual
, expr
.NodeType
);
66 Assert
.AreEqual (typeof (bool), expr
.Type
);
67 Assert
.IsNull (expr
.Method
);
68 Assert
.AreEqual ("(2 <= 1)", expr
.ToString ());
72 public void Integer ()
74 var expr
= Expression
.LessThanOrEqual (Expression
.Constant (2), Expression
.Constant (1));
75 Assert
.AreEqual (ExpressionType
.LessThanOrEqual
, expr
.NodeType
);
76 Assert
.AreEqual (typeof (bool), expr
.Type
);
77 Assert
.IsNull (expr
.Method
);
78 Assert
.AreEqual ("(2 <= 1)", expr
.ToString ());
82 [ExpectedException (typeof (InvalidOperationException
))]
83 public void MismatchedTypes ()
85 Expression
.LessThanOrEqual (Expression
.Constant (new OpClass ()), Expression
.Constant (true));
89 [ExpectedException (typeof (InvalidOperationException
))]
90 public void Boolean ()
92 Expression
.LessThanOrEqual (Expression
.Constant (true), Expression
.Constant (false));
96 public void UserDefinedClass ()
98 MethodInfo mi
= typeof (OpClass
).GetMethod ("op_LessThanOrEqual");
100 Assert
.IsNotNull (mi
);
102 BinaryExpression expr
= Expression
.LessThanOrEqual (Expression
.Constant (new OpClass ()), Expression
.Constant (new OpClass ()));
103 Assert
.AreEqual (ExpressionType
.LessThanOrEqual
, expr
.NodeType
);
104 Assert
.AreEqual (typeof (bool), expr
.Type
);
105 Assert
.AreEqual (mi
, expr
.Method
);
106 Assert
.AreEqual ("op_LessThanOrEqual", expr
.Method
.Name
);
107 Assert
.AreEqual ("(value(MonoTests.System.Linq.Expressions.OpClass) <= value(MonoTests.System.Linq.Expressions.OpClass))", expr
.ToString ());
111 public void NullableInt32LessThanOrEqual ()
113 var l
= Expression
.Parameter (typeof (int?), "l");
114 var r
= Expression
.Parameter (typeof (int?), "r");
116 var lte
= Expression
.Lambda
<Func
<int?, int?, bool>> (
117 Expression
.LessThanOrEqual (l
, r
), l
, r
).Compile ();
119 Assert
.IsFalse (lte (null, null));
120 Assert
.IsFalse (lte (null, 1));
121 Assert
.IsFalse (lte (null, -1));
122 Assert
.IsFalse (lte (1, null));
123 Assert
.IsFalse (lte (-1, null));
124 Assert
.IsTrue (lte (1, 2));
125 Assert
.IsFalse (lte (2, 1));
126 Assert
.IsTrue (lte (1, 1));
130 public void NullableInt32LessThanOrEqualLiftedToNull ()
132 var l
= Expression
.Parameter (typeof (int?), "l");
133 var r
= Expression
.Parameter (typeof (int?), "r");
135 var lte
= Expression
.Lambda
<Func
<int?, int?, bool?>> (
136 Expression
.LessThanOrEqual (l
, r
, true, null), l
, r
).Compile ();
138 Assert
.AreEqual ((bool?) null, lte (null, null));
139 Assert
.AreEqual ((bool?) null, lte (null, 1));
140 Assert
.AreEqual ((bool?) null, lte (null, -1));
141 Assert
.AreEqual ((bool?) null, lte (1, null));
142 Assert
.AreEqual ((bool?) null, lte (-1, null));
143 Assert
.AreEqual ((bool?) true, lte (1, 2));
144 Assert
.AreEqual ((bool?) false, lte (2, 1));
145 Assert
.AreEqual ((bool?) true, lte (1, 1));
151 public Slot (int val
)
156 public static bool operator >= (Slot a
, Slot b
)
158 return a
.Value
>= b
.Value
;
161 public static bool operator <= (Slot a
, Slot b
)
163 return a
.Value
<= b
.Value
;
168 public void UserDefinedLessThanOrEqualLifted ()
170 var l
= Expression
.Parameter (typeof (Slot
?), "l");
171 var r
= Expression
.Parameter (typeof (Slot
?), "r");
173 var node
= Expression
.LessThanOrEqual (l
, r
);
174 Assert
.IsTrue (node
.IsLifted
);
175 Assert
.IsFalse (node
.IsLiftedToNull
);
176 Assert
.AreEqual (typeof (bool), node
.Type
);
177 Assert
.IsNotNull (node
.Method
);
179 var lte
= Expression
.Lambda
<Func
<Slot
?, Slot
?, bool>> (node
, l
, r
).Compile ();
181 Assert
.AreEqual (false, lte (new Slot (1), new Slot (0)));
182 Assert
.AreEqual (true, lte (new Slot (-1), new Slot (1)));
183 Assert
.AreEqual (true, lte (new Slot (1), new Slot (1)));
184 Assert
.AreEqual (false, lte (null, new Slot (1)));
185 Assert
.AreEqual (false, lte (new Slot (1), null));
186 Assert
.AreEqual (false, lte (null, null));
190 public void UserDefinedLessThanOrEqualLiftedToNull ()
192 var l
= Expression
.Parameter (typeof (Slot
?), "l");
193 var r
= Expression
.Parameter (typeof (Slot
?), "r");
195 var node
= Expression
.LessThanOrEqual (l
, r
, true, null);
196 Assert
.IsTrue (node
.IsLifted
);
197 Assert
.IsTrue (node
.IsLiftedToNull
);
198 Assert
.AreEqual (typeof (bool?), node
.Type
);
199 Assert
.IsNotNull (node
.Method
);
201 var lte
= Expression
.Lambda
<Func
<Slot
?, Slot
?, bool?>> (node
, l
, r
).Compile ();
203 Assert
.AreEqual (false, lte (new Slot (1), new Slot (0)));
204 Assert
.AreEqual (true, lte (new Slot (-1), new Slot (1)));
205 Assert
.AreEqual (true, lte (new Slot (1), new Slot (1)));
206 Assert
.AreEqual (null, lte (null, new Slot (1)));
207 Assert
.AreEqual (null, lte (new Slot (1), null));
208 Assert
.AreEqual (null, lte (null, null));