add tests
[mono.git] / mcs / class / System.Core / Test / System.Linq.Expressions / ExpressionTest_Negate.cs
1 //
2 // ExpressionTest_Negate.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_Negate
39         {
40                 [Test]
41                 [ExpectedException (typeof (ArgumentNullException))]
42                 public void Arg1Null ()
43                 {
44                         Expression.Negate (null);
45                 }
46
47                 [Test]
48                 [ExpectedException (typeof (ArgumentException))]
49                 public void MethodArgNotStatic ()
50                 {
51                         Expression.Negate (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryNotStatic"));
52                 }
53
54                 [Test]
55                 [ExpectedException (typeof (ArgumentException))]
56                 public void MethodArgParameterCount ()
57                 {
58                         Expression.Negate (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryParameterCount"));
59                 }
60
61                 [Test]
62                 [ExpectedException (typeof (ArgumentException))]
63                 public void MethodArgReturnsVoid ()
64                 {
65                         Expression.Negate (Expression.Constant (new object ()), typeof (OpClass).GetMethod ("WrongUnaryReturnVoid"));
66                 }
67
68                 [Test]
69                 [ExpectedException (typeof (InvalidOperationException))]
70                 [Category ("NotWorking")]
71                 public void NegateBool ()
72                 {
73                         Expression.UnaryPlus (true.ToConstant ());
74                 }
75
76                 [Test]
77                 public void Number ()
78                 {
79                         var up = Expression.Negate (Expression.Constant (1));
80                         Assert.AreEqual ("-1", up.ToString ());
81                 }
82
83                 [Test]
84                 public void UserDefinedClass ()
85                 {
86                         var mi = typeof (OpClass).GetMethod ("op_UnaryNegation");
87
88                         var expr = Expression.Negate (Expression.Constant (new OpClass ()));
89                         Assert.AreEqual (ExpressionType.Negate, expr.NodeType);
90                         Assert.AreEqual (typeof (OpClass), expr.Type);
91                         Assert.AreEqual (mi, expr.Method);
92                         Assert.AreEqual ("op_UnaryNegation", expr.Method.Name);
93                         Assert.AreEqual ("-value(MonoTests.System.Linq.Expressions.OpClass)",   expr.ToString ());
94                 }
95
96                 [Test]
97                 public void NegateNullableInt32 ()
98                 {
99                         var n = Expression.Negate (Expression.Parameter (typeof (int?), ""));
100                         Assert.AreEqual (typeof (int?), n.Type);
101                         Assert.IsTrue (n.IsLifted);
102                         Assert.IsTrue (n.IsLiftedToNull);
103                         Assert.IsNull (n.Method);
104                 }
105
106                 [Test]
107                 public void CompileNegateInt32 ()
108                 {
109                         var p = Expression.Parameter (typeof (int), "i");
110                         var negate = Expression.Lambda<Func<int, int>> (Expression.Negate (p), p).Compile ();
111
112                         Assert.AreEqual (-2, negate (2));
113                         Assert.AreEqual (0, negate (0));
114                         Assert.AreEqual (3, negate (-3));
115                 }
116         }
117 }