1 // 2 // ExpressionTest_Not.cs 3 // 4 // Author: 5 // Jb Evain (jbevain@novell.com) 6 // 7 // (C) 2008 Novell, Inc. (http://www.novell.com) 8 // 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: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 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. 27 // 28 29 using System; 30 using System.Reflection; 31 using System.Linq; 32 using System.Linq.Expressions; 33 using NUnit.Framework; 34 35 namespace MonoTests.System.Linq.Expressions 36 { 37 [TestFixture] 38 public class ExpressionTest_Not 39 { 40 [Test] 41 [ExpectedException (typeof (ArgumentNullException))] Arg1Null()42 public void Arg1Null () 43 { 44 Expression.Not (null); 45 } 46 47 [Test] 48 [ExpectedException (typeof (ArgumentException))] MethodArgNotStatic()49 public void MethodArgNotStatic () 50 { 51 Expression.Not (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryNotStatic")); 52 } 53 54 [Test] 55 [ExpectedException (typeof (ArgumentException))] MethodArgParameterCount()56 public void MethodArgParameterCount () 57 { 58 Expression.Not (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryParameterCount")); 59 } 60 61 [Test] 62 [ExpectedException (typeof (ArgumentException))] MethodArgReturnsVoid()63 public void MethodArgReturnsVoid () 64 { 65 Expression.Not (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryReturnVoid")); 66 } 67 68 [Test] Number()69 public void Number () 70 { 71 var up = Expression.Not (1.ToConstant ()); 72 Assert.AreEqual ("Not(1)", up.ToString ()); 73 } 74 75 [Test] UserDefinedClass()76 public void UserDefinedClass () 77 { 78 var mi = typeof (OpClass).GetMethod ("op_LogicalNot"); 79 80 var expr = Expression.Not (Expression.Constant (new OpClass ())); 81 Assert.AreEqual (ExpressionType.Not, expr.NodeType); 82 Assert.AreEqual (typeof (OpClass), expr.Type); 83 Assert.AreEqual (mi, expr.Method); 84 Assert.AreEqual ("op_LogicalNot", expr.Method.Name); 85 Assert.AreEqual ("Not(value(MonoTests.System.Linq.Expressions.OpClass))", expr.ToString ()); 86 } 87 88 [Test] NotNullableInt32()89 public void NotNullableInt32 () 90 { 91 var n = Expression.Not (Expression.Parameter (typeof (int?), "")); 92 Assert.AreEqual (typeof (int?), n.Type); 93 Assert.IsTrue (n.IsLifted); 94 Assert.IsTrue (n.IsLiftedToNull); 95 Assert.IsNull (n.Method); 96 } 97 98 [Test] NotNullableBool()99 public void NotNullableBool () 100 { 101 var n = Expression.Not (Expression.Parameter (typeof (bool?), "")); 102 Assert.AreEqual (typeof (bool?), n.Type); 103 Assert.IsTrue (n.IsLifted); 104 Assert.IsTrue (n.IsLiftedToNull); 105 Assert.IsNull (n.Method); 106 } 107 108 [Test] CompileNotInt32()109 public void CompileNotInt32 () 110 { 111 var p = Expression.Parameter (typeof (int), "i"); 112 var not = Expression.Lambda<Func<int, int>> (Expression.Not (p), p).Compile (); 113 114 Assert.AreEqual (-2, not (1)); 115 Assert.AreEqual (-4, not (3)); 116 Assert.AreEqual (2, not (-3)); 117 } 118 119 [Test] CompiledNotNullableInt32()120 public void CompiledNotNullableInt32 () 121 { 122 var p = Expression.Parameter (typeof (int?), "i"); 123 var not = Expression.Lambda<Func<int?, int?>> (Expression.Not (p), p).Compile (); 124 125 Assert.AreEqual (null, not (null)); 126 Assert.AreEqual ((int?) -4, not (3)); 127 Assert.AreEqual ((int?) 2, not (-3)); 128 } 129 130 [Test] CompileNotBool()131 public void CompileNotBool () 132 { 133 var p = Expression.Parameter (typeof (bool), "i"); 134 var not = Expression.Lambda<Func<bool, bool>> (Expression.Not (p), p).Compile (); 135 136 Assert.AreEqual (false, not (true)); 137 Assert.AreEqual (true, not (false)); 138 } 139 140 [Test] CompiledNotNullableBool()141 public void CompiledNotNullableBool () 142 { 143 var p = Expression.Parameter (typeof (bool?), "i"); 144 var not = Expression.Lambda<Func<bool?, bool?>> (Expression.Not (p), p).Compile (); 145 146 Assert.AreEqual ((bool?) null, not (null)); 147 Assert.AreEqual ((bool?) false, not (true)); 148 Assert.AreEqual ((bool?) true, not (false)); 149 } 150 151 struct Slot { 152 public int Value; 153 SlotMonoTests.System.Linq.Expressions.ExpressionTest_Not.Slot154 public Slot (int value) 155 { 156 this.Value = value; 157 } 158 operator !MonoTests.System.Linq.Expressions.ExpressionTest_Not.Slot159 public static bool operator ! (Slot s) 160 { 161 return s.Value > 0; 162 } 163 } 164 165 [Test] UserDefinedNotNullable()166 public void UserDefinedNotNullable () 167 { 168 var s = Expression.Parameter (typeof (Slot?), "s"); 169 var node = Expression.Not (s); 170 Assert.IsTrue (node.IsLifted); 171 Assert.IsTrue (node.IsLiftedToNull); 172 Assert.AreEqual (typeof (bool?), node.Type); 173 Assert.AreEqual (typeof (Slot).GetMethod ("op_LogicalNot"), node.Method); 174 175 var not = Expression.Lambda<Func<Slot?, bool?>> (node, s).Compile (); 176 177 Assert.AreEqual (null, not (null)); 178 Assert.AreEqual (true, not (new Slot (1))); 179 Assert.AreEqual (false, not (new Slot (0))); 180 } 181 } 182 } 183