importing messaging-2008 branch to trunk.
[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 : TestHelper
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                 [Test]  // Bug #399601
274                 public void TestAddingWithoutAutoGenerate ()
275                 {
276                         // Binding when AutoGenerateColumns is false
277                         // and adding rows to the dataset
278                         Form f = new Form ();
279                         f.ShowInTaskbar = false;
280
281                         DataSet ds = new DataSet ();
282
283                         DataTable dt = ds.Tables.Add ("Muppets");
284
285                         dt.Columns.Add ("ID");
286                         dt.Columns.Add ("Name");
287
288                         DataGridView dgv = new DataGridView ();
289                         dgv.AutoGenerateColumns = false;
290                         dgv.AllowUserToAddRows = false;
291                         
292                         DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
293                         col1.DataPropertyName = "Name";
294                         dgv.Columns.Add (col1);
295
296                         dgv.DataSource = dt;
297
298                         f.Controls.Add (dgv);
299                         f.Show ();
300
301                         dt.Rows.Add (1, "Kermit");
302                         dt.Rows.Add (2, "Miss Piggy");
303                         dt.Rows.Add (3, "Gonzo");
304
305                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
306                         Assert.AreEqual (3, dgv.RowCount, "A2");
307
308                         f.Dispose ();
309                 }
310
311                 [Test]
312                 public void TestDeleting ()
313                 {
314                         // Binding when AutoGenerateColumns is false
315                         // and deleting rows from the dataset and DGV
316                         Form f = new Form ();
317                         f.ShowInTaskbar = false;
318
319                         DataSet ds = new DataSet ();
320
321                         DataTable dt = ds.Tables.Add ("Muppets");
322
323                         dt.Columns.Add ("ID");
324                         dt.Columns.Add ("Name");
325
326                         DataGridView dgv = new DataGridView ();
327                         dgv.AutoGenerateColumns = false;
328                         dgv.AllowUserToAddRows = false;
329
330                         DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
331                         col1.DataPropertyName = "Name";
332                         dgv.Columns.Add (col1);
333
334                         dgv.DataSource = dt;
335
336                         f.Controls.Add (dgv);
337                         f.Show ();
338
339                         dt.Rows.Add (1, "Kermit");
340                         dt.Rows.Add (2, "Miss Piggy");
341                         dt.Rows.Add (3, "Gonzo");
342
343                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
344                         Assert.AreEqual (3, dgv.RowCount, "A2");
345
346                         dt.Rows[2].Delete ();
347                         Assert.AreEqual (2, dgv.RowCount, "A3");
348
349                         dgv.Rows.RemoveAt (0);
350                         Assert.AreEqual (1, dgv.RowCount, "A4");
351                         
352                         f.Dispose();
353                 }
354
355                 [Test]
356                 public void TestChangingDataSetAfterSettingDataSource ()
357                 {
358                         // Binding when AutoGenerateColumns is false
359                         // and deleting rows from the dataset and DGV
360                         Form f = new Form ();
361                         f.ShowInTaskbar = false;
362
363                         DataSet ds = new DataSet ();
364
365                         DataGridView dgv = new DataGridView ();
366                         dgv.AutoGenerateColumns = false;
367                         dgv.AllowUserToAddRows = false;
368
369                         DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn ();
370                         col1.DataPropertyName = "Name";
371                         dgv.Columns.Add (col1);
372
373                         dgv.DataSource = ds;
374                         dgv.DataMember = "Muppets";
375
376                         DataTable dt = ds.Tables.Add ("Muppets");
377
378                         dt.Columns.Add ("ID");
379                         dt.Columns.Add ("Name");
380
381                         f.Controls.Add (dgv);
382                         f.Show ();
383
384                         dt.Rows.Add (1, "Kermit");
385                         dt.Rows.Add (2, "Miss Piggy");
386                         dt.Rows.Add (3, "Gonzo");
387
388                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
389                         Assert.AreEqual (3, dgv.RowCount, "A2");
390
391                         dt.Rows[2].Delete ();
392                         Assert.AreEqual (2, dgv.RowCount, "A3");
393
394                         dgv.Rows.RemoveAt (0);
395                         Assert.AreEqual (1, dgv.RowCount, "A4");
396
397                         f.Dispose ();
398                 }
399
400                 [Test]  // bug #448005
401                 public void TestClearing ()
402                 {
403                         // Binding to a DataSet doesn't work unless you specify DataMember
404                         Form f = new Form ();
405                         f.ShowInTaskbar = false;
406
407                         DataSet ds = new DataSet ();
408
409                         DataTable dt = ds.Tables.Add ("Muppets");
410
411                         dt.Columns.Add ("ID");
412                         dt.Columns.Add ("Name");
413                         dt.Columns.Add ("Sex");
414
415                         dt.Rows.Add (1, "Kermit", "Male");
416                         dt.Rows.Add (2, "Miss Piggy", "Female");
417                         dt.Rows.Add (3, "Gonzo", "Male");
418
419                         DataGridView dgv = new DataGridView ();
420                         dgv.DataSource = ds;
421
422                         f.Controls.Add (dgv);
423                         f.Show ();
424
425                         dgv.DataMember = "Muppets";
426
427                         Assert.AreEqual (3, dgv.Columns.Count, "A1");
428                         Assert.AreEqual (4, dgv.Rows.Count, "A2");
429                         
430                         ds.Tables[0].Clear ();
431                         
432                         Assert.AreEqual (3, dgv.Columns.Count, "A3");
433                         Assert.AreEqual (1, dgv.Rows.Count, "A4");
434
435                         f.Dispose ();
436                 }
437
438         }
439         
440         [TestFixture]
441         public class BindingListTest : TestHelper
442         {
443                 [Test]  // bug #325239
444                 public void TestNullItemInList ()
445                 {
446                         Form f = new Form ();
447                         f.ShowInTaskbar = false;
448
449                         // The list contains one object, but the object is null
450                         IList<Customer> list = new Customer[1];
451
452                         DataGridView dgv = new DataGridView ();
453                         dgv.DataSource = new BindingList<Customer> (list);
454
455                         f.Controls.Add (dgv);
456                         f.Show ();
457
458                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
459                         Assert.AreEqual (2, dgv.RowCount, "A2");
460
461                         f.Dispose ();
462                 }
463
464                 private class Customer
465                 {
466                         string name;
467                         
468                         public string Name {
469                                 get { return name; }
470                                 set { name = value; }
471                         }
472                 }
473         }
474
475         [TestFixture]
476         public class ArrayTest : TestHelper
477         {
478                 [Test]  // bug #337470
479                 public void TestNestedCollections ()
480                 {
481                         // The grid should not accept collection properties, like Names
482                         Form f = new Form ();
483                         f.ShowInTaskbar = false;
484
485                         Array customers = new Customer[1];
486                         customers.SetValue (new Customer (), 0);
487                         
488                         DataGridView dgv = new DataGridView ();
489                         dgv.DataSource = customers;
490
491                         f.Controls.Add (dgv);
492                         f.Show ();
493
494                         Assert.AreEqual (1, dgv.ColumnCount, "A1");
495                         Assert.AreEqual ("Name", dgv.Columns[0].Name, "A2");
496
497                         f.Dispose ();
498                 }
499
500                 private class Customer
501                 {
502                         public string Name { get { return "Kermit"; } }
503                         public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }
504                 }
505         }
506
507         [TestFixture]
508         public class BindingSourceTest : TestHelper
509         {
510                 [Test]  // bug #345483
511                 public void TestBindingSource ()
512                 {
513                         // The grid has to extract the List from the BindingSource
514                         Form f = new Form ();
515                         f.ShowInTaskbar = false;
516
517                         BindingSource BindingSource = new BindingSource ();
518
519                         DataSet dataSet1 = new DataSet ();
520
521                         dataSet1.Tables.Add ();
522                         dataSet1.Tables[0].Columns.Add ();
523                         dataSet1.Tables[0].Columns.Add ();
524                         dataSet1.Tables[0].Columns.Add ();
525                         dataSet1.Tables[0].Columns.Add ();
526                         dataSet1.Tables[0].Columns.Add ();
527                         dataSet1.Tables[0].Rows.Add ("111111", "222222", "333333", "444444", "555555");
528
529                         BindingSource.DataSource = dataSet1.Tables[0];
530
531                         DataGridView dgv = new DataGridView ();
532                         dgv.DataSource = BindingSource;
533
534                         f.Controls.Add (dgv);
535                         f.Show ();
536
537                         Assert.AreEqual (5, dgv.ColumnCount, "A1");
538                         Assert.AreEqual (2, dgv.RowCount, "A2");
539
540                         Assert.AreEqual ("Column1", dgv.Columns[0].Name, "A3");
541                         Assert.AreEqual ("111111", dgv.Rows[0].Cells[0].Value, "A4");
542
543                         f.Dispose ();
544                 }
545
546                 private class Customer
547                 {
548                         public string Name { get { return "Kermit"; } }
549                         public string[] Names { get { return new string[] { "Kermit", "Gonzo" }; } }
550                 }
551         }
552 }
553 #endif