Bug 15574. XML deserialization recursion: add array type to known_types?
[mono.git] / mcs / class / System.Core / Test / System.Linq.Expressions / ExpressionTest_ListBind.cs
1 //
2 // ExpressionTest_ListBind.cs
3 //
4 // Author:
5 //   olivier Dufour (olivier.duff@gmail.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.Collections.Generic;
32 using System.Linq;
33 using System.Linq.Expressions;
34 using NUnit.Framework;
35
36 namespace MonoTests.System.Linq.Expressions {
37
38         [TestFixture]
39         public class ExpressionTest_ListBind {
40
41                 [Test]
42                 [ExpectedException (typeof (ArgumentNullException))]
43                 public void MemberNull ()
44                 {
45                         Expression.ListBind (null as MemberInfo, new List<ElementInit> ());
46                 }
47
48                 [Test]
49                 [ExpectedException (typeof (ArgumentNullException))]
50                 public void PropertyAccessorNull ()
51                 {
52                         Expression.ListBind (null as MethodInfo, new List<ElementInit> ());
53                 }
54
55                 [Test]
56                 [ExpectedException (typeof (ArgumentNullException))]
57                 public void ArgNull ()
58                 {
59                         var list = new List<ElementInit> ();
60                         list.Add (null);
61                         Expression.ListBind (typeof (Foo).GetProperty ("Bar").GetSetMethod (), list);
62                 }
63
64                 [Test]
65                 [ExpectedException (typeof (ArgumentException))]
66                 public void MemberTypeImplementIEnumerable ()
67                 {
68                         Expression.ListBind (typeof (Foo).GetMember ("baz") [0], new List<ElementInit> ());
69                 }
70
71                 [Test]
72                 [ExpectedException (typeof (ArgumentException))]
73                 public void MethodeGetImplementIEnumerable2 ()
74                 {
75                         Expression.ListBind (typeof (Foo).GetProperty ("BarBar").GetGetMethod (), new List<ElementInit> ());
76                 }
77
78                 [Test]
79                 [ExpectedException (typeof (ArgumentException))]
80                 public void MethodMustBeAnAccessor ()
81                 {
82                         Expression.ListBind (typeof (Foo).GetMethod ("test"), new List<ElementInit> ());
83                 }
84
85                 [Test]
86                 public void ListBindToString ()
87                 {
88                         var add = typeof (List<string>).GetMethod ("Add");
89
90                         var list = new List<ElementInit> () {
91                                 Expression.ElementInit (add, Expression.Constant ("foo")),
92                                 Expression.ElementInit (add, Expression.Constant ("bar")),
93                                 Expression.ElementInit (add, Expression.Constant ("baz")),
94                         };
95
96                         var binding = Expression.ListBind (typeof (Foo).GetProperty ("List"), list);
97
98                         Assert.AreEqual ("List = {Void Add(System.String)(\"foo\"), Void Add(System.String)(\"bar\"), Void Add(System.String)(\"baz\")}", binding.ToString ());
99                 }
100
101                 [Test]
102                 public void CompiledListBinding ()
103                 {
104                         var add = typeof (List<string>).GetMethod ("Add");
105
106                         var lb = Expression.Lambda<Func<Foo>> (
107                                 Expression.MemberInit (
108                                         Expression.New (typeof (Foo)),
109                                         Expression.ListBind (
110                                                 typeof (Foo).GetProperty ("List"),
111                                                 Expression.ElementInit (add, Expression.Constant ("foo")),
112                                                 Expression.ElementInit (add, Expression.Constant ("bar")),
113                                                 Expression.ElementInit (add, Expression.Constant ("baz"))))).Compile ();
114
115                         var foo = lb ();
116
117                         Assert.IsNotNull (foo);
118                         Assert.AreEqual (3, foo.List.Count);
119                         Assert.AreEqual ("foo", foo.List [0]);
120                         Assert.AreEqual ("bar", foo.List [1]);
121                         Assert.AreEqual ("baz", foo.List [2]);
122                 }
123
124                 public class Foo {
125
126                         public string [] foo;
127                         public string str;
128
129                         public int baz;
130
131                         private List<string> list = new List<string> ();
132
133                         public List<string> List {
134                                 get { return list; }
135                         }
136
137                         public string [] Bar
138                         {
139                                 get { return foo; }
140                                 set { foo = value; }
141                         }
142
143                         public int BarBar
144                         {
145                                 get { return 0; }
146                         }
147
148                         public string [] test ()
149                         {
150                                 return null;
151                         }
152                 }
153         }
154 }