2010-05-19 Jb Evain <jbevain@novell.com>
[mono.git] / mcs / class / System.Core / Test / System.Linq / LookupTest.cs
1 //
2 // LookupTest.cs
3 //
4 // Author:
5 //   Jb Evain (jbevain@novell.com)
6 //
7 // (C) 2009 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.Collections.Generic;
31 using System.Linq;
32
33 using NUnit.Framework;
34
35 namespace MonoTests.System.Linq {
36
37         [TestFixture]
38         public class LookupTest {
39
40                 class Color {
41
42                         public string Name { get; set; }
43                         public int Value { get; set; }
44
45                         public Color (string name, int value)
46                         {
47                                 Name = name;
48                                 Value = value;
49                         }
50                 }
51
52                 static IEnumerable<Color> GetColors ()
53                 {
54                         yield return new Color ("Red", 0xff0000);
55                         yield return new Color ("Green", 0x00ff00);
56                         yield return new Color ("Blue", 0x0000ff);
57                 }
58
59                 [Test]
60                 public void LookupIgnoreCase ()
61                 {
62                         var lookup = GetColors ().ToLookup (
63                                 c => c.Name,
64                                 c => c.Value,
65                                 StringComparer.OrdinalIgnoreCase);
66
67                         Assert.AreEqual (0xff0000, lookup ["red"].First ());
68                         Assert.AreEqual (0x00ff00, lookup ["GrEeN"].First ());
69                         Assert.AreEqual (0x0000ff, lookup ["Blue"].First ());
70                 }
71                 
72                 [Test]
73                 public void LookupContains()
74                 {
75                         var lookup = new [] { "hi", "bye" }.ToLookup (c => c [0].ToString ());
76                         
77                         Assert.IsTrue (lookup.Contains ("h"));
78                         Assert.IsFalse (lookup.Contains ("d"));
79                         Assert.IsFalse (lookup.Contains (null));
80                 }
81                 
82                 [Test]
83                 public void LookupContainsNull()
84                 {
85                         var lookup = new [] { "hi", "bye", "42" }.ToLookup (c => (Char.IsNumber (c [0]) ? null : c [0].ToString ()));
86                         
87                         Assert.IsTrue (lookup.Contains ("h"));
88                         Assert.IsTrue (lookup.Contains (null));
89                         Assert.IsFalse (lookup.Contains ("d"));
90                 }
91                 
92                 [Test]
93                 public void LookupEnumeratorWithoutNull()
94                 {
95                         var lookup = new [] { "hi", "bye" }.ToLookup (c => c [0].ToString ());
96                         
97                         Assert.IsTrue (lookup.Any (g => g.Key == "h"));
98                         Assert.IsTrue (lookup.Any (g => g.Key == "b"));
99                         Assert.IsFalse (lookup.Any (g => g.Key == null));
100                 }
101                 
102                 [Test]
103                 public void LookupEnumeratorWithNull()
104                 {
105                         var lookup = new [] { "hi", "bye", "42" }.ToLookup (c => (Char.IsNumber (c [0]) ? null : c [0].ToString ()));
106                         
107                         Assert.IsTrue (lookup.Any (g => g.Key == "h"));
108                         Assert.IsTrue (lookup.Any (g => g.Key == "b"));
109                         Assert.IsTrue (lookup.Any (g => g.Key == null));
110                 }
111                 
112                 [Test]
113                 public void LookupNullKeyNone()
114                 {
115                         var lookup = new [] { "hi", "bye" }.ToLookup (c => c [0].ToString ());
116                         
117                         Assert.AreEqual (2, lookup.Count);
118                         Assert.AreEqual (0, lookup [null].Count ());
119                 }
120
121                 [Test]
122                 public void EmptyResult ()
123                 {
124                         var lookup = GetColors ().ToLookup (
125                                 c => c.Name,
126                                 c => c.Value,
127                                 StringComparer.OrdinalIgnoreCase);
128
129                         var l = lookup ["notexist"];
130                         Assert.IsNotNull (l);
131                         int [] values = (int []) l;
132                         Assert.AreEqual (values.Length, 0);
133                 }
134         }
135 }