2008-05-21 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / DataGridViewDataBindingTest.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)
21 //
22 // Author:
23 //      Jonathan Pobst  (monkey@jpobst.com)
24 //
25
26 #if NET_2_0
27
28 using NUnit.Framework;
29 using System;
30 using System.Drawing;
31 using System.Windows.Forms;
32 using System.ComponentModel;
33 using System.Collections;
34 using System.Data;
35 using System.Collections.Generic;
36
37 namespace MonoTests.System.Windows.Forms.DataGridViewBindingTest
38 {
39
40         [TestFixture]
41         public class DataSetBindingTest
42         {
43                 [Test]
44                 public void TestDataSet ()
45                 {
46                         // Binding to a DataSet doesn't work unless you specify DataMember
47                         Form f = new Form ();
48                         f.ShowInTaskbar = false;
49                         
50                         DataSet ds = new DataSet ();
51                         
52                         DataTable dt = ds.Tables.Add ("Muppets");
53
54                         dt.Columns.Add ("ID");
55                         dt.Columns.Add ("Name");
56                         dt.Columns.Add ("Sex");
57
58                         dt.Rows.Add (1, "Kermit", "Male");
59                         dt.Rows.Add (2, "Miss Piggy", "Female");
60                         dt.Rows.Add (3, "Gonzo", "Male");
61                         
62                         DataGridView dgv = new DataGridView ();
63                         dgv.DataSource = ds;
64         
65                         f.Controls.Add (dgv);
66                         f.Show ();
67                         
68                         Assert.AreEqual (0, dgv.Columns.Count, "A1");
69                         Assert.AreEqual (0, dgv.Rows.Count, "A2");
70                         
71                         dgv.DataMember = "Muppets";
72
73                         Assert.AreEqual (3, dgv.Columns.Count, "A3");
74                         Assert.AreEqual (4, dgv.Rows.Count, "A4");                      
75                         
76                         f.Dispose ();
77                 }
78
79                 [Test]
80                 public void TestBasic ()
81                 {
82                         // Binding to a basic DataTable
83                         Form f = new Form ();
84                         f.ShowInTaskbar = false;
85                         
86                         DataSet ds = new DataSet ();
87
88                         DataTable dt = ds.Tables.Add ("Muppets");
89
90                         dt.Columns.Add ("ID");
91                         dt.Columns.Add ("Name");
92                         dt.Columns.Add ("Sex");
93
94                         dt.Rows.Add (1, "Kermit", "Male");
95                         dt.Rows.Add (2, "Miss Piggy", "Female");
96                         dt.Rows.Add (3, "Gonzo", "Male");
97
98                         DataGridView dgv = new DataGridView ();
99                         dgv.DataSource = dt;
100
101                         f.Controls.Add (dgv);
102                         f.Show ();
103
104                         Assert.AreEqual (3, dgv.ColumnCount, "A1");
105                         Assert.AreEqual (4, dgv.RowCount, "A2");
106
107                         Assert.AreEqual ("ID", dgv.Columns[0].Name, "A3");
108                         Assert.AreEqual ("ID", dgv.Columns[0].DataPropertyName, "A4");
109                         Assert.AreEqual (0, dgv.Columns[0].DisplayIndex, "A5");
110                         Assert.AreEqual ("ID", dgv.Columns[0].HeaderText, "A6");
111                         Assert.AreEqual (0, dgv.Columns[0].Index, "A7");
112                         Assert.AreEqual (true, dgv.Columns[0].IsDataBound, "A8");
113                         Assert.AreEqual (false, dgv.Columns[0].ReadOnly, "A9");
114                         Assert.AreEqual (true, dgv.Columns[0].Visible, "A10");
115                         Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[0].CellType.ToString (), "A11");
116                         Assert.AreEqual ("System.String", dgv.Columns[0].ValueType.ToString (), "A11-B");
117                         Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxColumn", dgv.Columns[0].GetType ().ToString (), "A11-C");
118
119                         Assert.AreEqual ("Name", dgv.Columns[1].Name, "A12");
120                         Assert.AreEqual ("Name", dgv.Columns[1].DataPropertyName, "A13");
121                         Assert.AreEqual (1, dgv.Columns[1].DisplayIndex, "A14");
122                         Assert.AreEqual ("Name", dgv.Columns[1].HeaderText, "A15");
123                         Assert.AreEqual (1, dgv.Columns[1].Index, "A16");
124                         Assert.AreEqual (true, dgv.Columns[1].IsDataBound, "A17");
125                         Assert.AreEqual (false, dgv.Columns[1].ReadOnly, "A18");
126                         Assert.AreEqual (true, dgv.Columns[1].Visible, "A19");
127                         Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[1].CellType.ToString (), "A20");
128                         Assert.AreEqual ("System.String", dgv.Columns[1].ValueType.ToString (), "A20-B");
129
130                         Assert.AreEqual ("Sex", dgv.Columns[2].Name, "A21");
131                         Assert.AreEqual ("Sex", dgv.Columns[2].DataPropertyName, "A22");
132                         Assert.AreEqual (2, dgv.Columns[2].DisplayIndex, "A23");
133                         Assert.AreEqual ("Sex", dgv.Columns[2].HeaderText, "A24");
134                         Assert.AreEqual (2, dgv.Columns[2].Index, "A25");
135                         Assert.AreEqual (true, dgv.Columns[2].IsDataBound, "A26");
136                         Assert.AreEqual (false, dgv.Columns[2].ReadOnly, "A27");
137                         Assert.AreEqual (true, dgv.Columns[2].Visible, "A28");
138                         Assert.AreEqual ("System.Windows.Forms.DataGridViewTextBoxCell", dgv.Columns[2].CellType.ToString (), "A29");
139                         Assert.AreEqual ("System.String", dgv.Columns[2].ValueType.ToString (), "A29-B");
140
141                         Assert.AreEqual ("1", dgv.Rows[0].Cells[0].Value, "A30");
142                         Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[1].Value, "A31");
143                         Assert.AreEqual ("Male", dgv.Rows[0].Cells[2].Value, "A32");
144                         Assert.AreEqual ("2", dgv.Rows[1].Cells[0].Value, "A33");
145                         Assert.AreEqual ("Miss Piggy", dgv.Rows[1].Cells[1].Value, "A34");
146                         Assert.AreEqual ("Female", dgv.Rows[1].Cells[2].Value, "A35");
147                         Assert.AreEqual ("3", dgv.Rows[2].Cells[0].Value, "A36");
148                         Assert.AreEqual ("Gonzo", dgv.Rows[2].Cells[1].Value, "A37");
149                         Assert.AreEqual ("Male", dgv.Rows[2].Cells[2].Value, "A38");
150                         
151                         f.Dispose ();
152                 }
153
154                 [Test]
155                 public void TestCheckBoxColumn ()
156                 {
157                         // Binding to a basic DataTable with a boolean value
158                         Form f = new Form ();
159                         f.ShowInTaskbar = false;
160
161                         DataSet ds = new DataSet ();
162
163                         DataTable dt = ds.Tables.Add ("Muppets");
164
165                         dt.Columns.Add ("ID");
166                         dt.Columns.Add ("Name");
167                         dt.Columns.Add ("IsFunny", typeof (bool));
168
169                         dt.Rows.Add (1, "Kermit", "true");
170                         dt.Rows.Add (2, "Miss Piggy", "false");
171                         dt.Rows.Add (3, "Gonzo", DBNull.Value);
172                         dt.Rows.Add (4, "Animal", true);
173                         dt.Rows.Add (5, "Fozzy", false);
174                         dt.Rows.Add (6, "Beaker", "TRUE");
175                         dt.Rows.Add (7, "Bunsen", "fALSe");
176                         dt.Rows.Add (8, "Sweedish Chef", 1);
177                         dt.Rows.Add (9, "Rolf", 0);
178
179                         DataGridView dgv = new DataGridView ();
180                         dgv.DataSource = dt;
181
182                         f.Controls.Add (dgv);
183                         f.Show ();
184
185                         Assert.AreEqual (3, dgv.ColumnCount, "A1");
186                         Assert.AreEqual (10, dgv.RowCount, "A2");
187
188                         Assert.AreEqual ("IsFunny", dgv.Columns[2].Name, "A3");
189                         Assert.AreEqual ("IsFunny", dgv.Columns[2].DataPropertyName, "A4");
190                         Assert.AreEqual (2, dgv.Columns[2].DisplayIndex, "A5");
191                         Assert.AreEqual ("IsFunny", dgv.Columns[2].HeaderText, "A6");
192                         Assert.AreEqual (2, dgv.Columns[2].Index, "A7");
193                         Assert.AreEqual (true, dgv.Columns[2].IsDataBound, "A8");
194                         Assert.AreEqual (false, dgv.Columns[2].ReadOnly, "A9");
195                         Assert.AreEqual (true, dgv.Columns[2].Visible, "A10");
196                         Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxCell", dgv.Columns[2].CellType.ToString (), "A11");
197                         Assert.AreEqual ("System.Boolean", dgv.Columns[2].ValueType.ToString (), "A12");
198                         Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxColumn", dgv.Columns[2].GetType ().ToString (), "A12-B");
199
200                         Assert.AreEqual (true, dgv.Rows[0].Cells[2].Value, "A13");
201                         Assert.AreEqual (false, dgv.Rows[1].Cells[2].Value, "A14");
202                         Assert.AreEqual (DBNull.Value, dgv.Rows[2].Cells[2].Value, "A15");
203                         Assert.AreEqual (true, dgv.Rows[3].Cells[2].Value, "A16");
204                         Assert.AreEqual (false, dgv.Rows[4].Cells[2].Value, "A17");
205                         Assert.AreEqual (true, dgv.Rows[5].Cells[2].Value, "A18");
206                         Assert.AreEqual (false, dgv.Rows[6].Cells[2].Value, "A19");
207                         Assert.AreEqual (true, dgv.Rows[7].Cells[2].Value, "A20");
208                         Assert.AreEqual (false, dgv.Rows[8].Cells[2].Value, "A21");
209
210                         Assert.AreEqual ("System.Windows.Forms.DataGridViewCheckBoxCell", dgv.Rows[8].Cells[2].GetType ().ToString (), "A22");
211                         
212                         f.Dispose ();
213                 }
214
215                 [Test]
216                 public void TestAutoGenerateColumns ()
217                 {
218                         // Binding when AutoGenerateColumns is false
219                         Form f = new Form ();
220                         f.ShowInTaskbar = false;
221
222                         DataSet ds = new DataSet ();
223
224                         DataTable dt = ds.Tables.Add ("Muppets");
225
226                         dt.Columns.Add ("ID");
227                         dt.Columns.Add ("Name");
228
229                         dt.Rows.Add (1, "Kermit");
230                         dt.Rows.Add (2, "Miss Piggy");
231                         dt.Rows.Add (3, "Gonzo");
232
233                         DataGridView dgv = new DataGridView ();
234                         dgv.AutoGenerateColumns = false;
235                         dgv.DataSource = dt;
236
237                         f.Controls.Add (dgv);
238                         f.Show ();
239
240                         Assert.AreEqual (0, dgv.ColumnCount, "A1");
241                         Assert.AreEqual (0, dgv.RowCount, "A2");
242
243                         dgv.DataSource = null;
244                         
245                         DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
246                         col1.DataPropertyName = "Name";
247                         dgv.Columns.Add (col1);
248
249                         dgv.DataSource = dt;
250
251                         Assert.AreEqual (1, dgv.ColumnCount, "A3");
252                         Assert.AreEqual (4, dgv.RowCount, "A4");
253
254                         Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[0].Value, "A5");
255
256                         dgv.DataSource = null;
257
258                         DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn ();
259                         col2.DataPropertyName = "id";
260                         dgv.Columns.Add (col2);
261
262                         dgv.DataSource = dt;
263
264                         Assert.AreEqual (2, dgv.ColumnCount, "A6");
265                         Assert.AreEqual (4, dgv.RowCount, "A7");
266
267                         Assert.AreEqual ("Kermit", dgv.Rows[0].Cells[0].Value, "A8");
268                         Assert.AreEqual ("1", dgv.Rows[0].Cells[1].Value, "A9");
269
270                         f.Dispose ();
271                 }
272         }
273         
274         [TestFixture]
275         public class BindingListTest
276         {
277                 [Test]  // bug #325239
278                 public void TestNullItemInList ()
279                 {
280                         Form f = new Form ();
281                         f.ShowInTaskbar = false;
282
283                         // The list contains one object, but the object is null
284                         IList<Customer> list = new Customer[1];
285
286                         DataGridView dgv = new DataGridView ();
287                         dgv.DataSource = new BindingList<Customer> (list);
288
289                         f.Controls.Add (dgv);
290                         f.Show ();
291
292                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
293                         Assert.AreEqual (2, dgv.RowCount, "A2");
294
295                         f.Dispose ();
296                 }
297
298                 private class Customer
299                 {
300                         string name;
301                         
302                         public string Name {
303                                 get { return name; }
304                                 set { name = value; }
305                         }
306                 }
307         }
308
309         [TestFixture]
310         public class ArrayTest
311         {
312                 [Test]  // bug #337470
313                 public void TestNestedCollections ()
314                 {
315                         // The grid should not accept collection properties, like Names
316                         Form f = new Form ();
317                         f.ShowInTaskbar = false;
318
319                         Array customers = new Customer[1];
320                         customers.SetValue (new Customer (), 0);
321                         
322                         DataGridView dgv = new DataGridView ();
323                         dgv.DataSource = customers;
324
325                         f.Controls.Add (dgv);
326                         f.Show ();
327
328                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
329                         Assert.AreEqual ("Name", dgv.Columns[0].Name, "A2");
330
331                         f.Dispose ();
332                 }
333
334                 private class Customer
335                 {
336                         public string Name { get { return "Kermit"; } }
337                         public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }
338                 }
339         }
340
341         [TestFixture]
342         public class BindingSourceTest
343         {
344                 [Test]  // bug #345483
345                 public void TestBindingSource ()
346                 {
347                         // The grid has to extract the List from the BindingSource
348                         Form f = new Form ();
349                         f.ShowInTaskbar = false;
350
351                         BindingSource BindingSource = new BindingSource ();
352
353                         DataSet dataSet1 = new DataSet ();
354
355                         dataSet1.Tables.Add ();
356                         dataSet1.Tables[0].Columns.Add ();
357                         dataSet1.Tables[0].Columns.Add ();
358                         dataSet1.Tables[0].Columns.Add ();
359                         dataSet1.Tables[0].Columns.Add ();
360                         dataSet1.Tables[0].Columns.Add ();
361                         dataSet1.Tables[0].Rows.Add ("111111", "222222", "333333", "444444", "555555");
362
363                         BindingSource.DataSource = dataSet1.Tables[0];
364
365                         DataGridView dgv = new DataGridView ();
366                         dgv.DataSource = BindingSource;
367
368                         f.Controls.Add (dgv);
369                         f.Show ();
370
371                         Assert.AreEqual (5, dgv.ColumnCount, "A1");
372                         Assert.AreEqual (2, dgv.RowCount, "A2");
373
374                         Assert.AreEqual ("Column1", dgv.Columns[0].Name, "A3");
375                         Assert.AreEqual ("111111", dgv.Rows[0].Cells[0].Value, "A4");
376
377                         f.Dispose ();
378                 }
379
380                 private class Customer
381                 {
382                         public string Name { get { return "Kermit"; } }
383                         public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }
384                 }
385         }
386 }
387 #endif