2009-06-06 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / ListControlTest.cs
1 //
2 // ListControlTest.cs: Tests for ListControl abstract class.
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 //
23 // Copyright (c) 2006 Novell, Inc. (http://www.novell.com)
24 //
25 // Authors:
26 //      Carlos Alberto Cortez <calberto.cortez@gmail.com>
27 //
28
29 using System;
30 using System.Collections;
31 #if NET_2_0
32 using System.ComponentModel;
33 #endif
34 using System.IO;
35 using System.Data;
36 using System.Globalization;
37 using System.Windows.Forms;
38 using NUnit.Framework;
39
40 namespace MonoTests.System.Windows.Forms
41 {
42         [TestFixture]
43         public class ListControlTest : TestHelper
44         {
45                 private int dataSourceChanged;
46
47                 [SetUp]
48                 protected override void SetUp () {
49                         dataSourceChanged = 0;
50                         base.SetUp ();
51                 }
52
53                 [Test]
54                 // Bug 80794
55                 public void DataBindingsTest ()
56                 {
57                         string table =
58 @"<?xml version=""1.0"" standalone=""yes""?>
59 <DOK>
60 <DOK>
61 <klient>287</klient>
62 </DOK>
63 </DOK>
64 ";
65                         string lookup =
66 @"<?xml version=""1.0"" standalone=""yes""?>
67 <klient>
68 <klient>
69 <nimi>FAILED</nimi>
70 <kood>316</kood>
71 </klient>
72 <klient>
73 <nimi>SUCCESS</nimi>
74 <kood>287</kood>
75 </klient>
76 </klient>";
77
78                         using (Form frm = new Form ()) {
79                                 frm.ShowInTaskbar = false;
80                                 DataSet dsTable = new DataSet ();
81                                 dsTable.ReadXml (new StringReader (table));
82                                 DataSet dsLookup = new DataSet ();
83                                 dsLookup.ReadXml (new StringReader (lookup));
84                                 ComboBox cb = new ComboBox ();
85                                 cb.DataSource = dsLookup.Tables [0];
86                                 cb.DisplayMember = "nimi";
87                                 cb.ValueMember = "kood";
88                                 cb.DataBindings.Add ("SelectedValue", dsTable.Tables [0], "klient");
89                                 frm.Controls.Add (cb);
90                                 Assert.AreEqual ("", cb.Text, "#01");
91                                 frm.Show ();
92                                 Assert.AreEqual ("SUCCESS", cb.Text, "#02");
93                         }
94                 }
95
96                 [Test]
97                 public void GetItemText ()
98                 {
99                         MockItem itemA = new MockItem ("A", 1);
100                         MockItem itemB = new MockItem ("B", 2);
101                         object itemC = new object ();
102
103                         ListControlChild lc = new ListControlChild ();
104                         lc.DisplayMember = "Text";
105
106                         // No DataSource available
107                         Assert.AreEqual ("A", lc.GetItemText (itemA), "#A1");
108                         Assert.AreEqual ("B", lc.GetItemText (itemB), "#A2");
109                         Assert.AreEqual (itemC.GetType ().FullName, lc.GetItemText (itemC), "#A3");
110
111                         lc.DisplayMember = String.Empty;
112
113                         Assert.AreEqual (itemA.GetType ().FullName, lc.GetItemText (itemA), "#B1");
114                         Assert.AreEqual (itemB.GetType ().FullName, lc.GetItemText (itemB), "#B2");
115                         Assert.AreEqual (itemC.GetType ().FullName, lc.GetItemText (itemC), "#B3");
116
117                         // DataSource available
118                         object [] objects = new object [] {itemA, itemB, itemC};
119                         lc.DisplayMember = "Text";
120                         lc.DataSource = objects;
121
122                         Assert.AreEqual ("A", lc.GetItemText (itemA), "#C1");
123                         Assert.AreEqual ("B", lc.GetItemText (itemB), "#C2");
124                         Assert.AreEqual (itemC.GetType ().FullName, lc.GetItemText (itemC), "#C3");
125
126                         lc.DisplayMember = String.Empty;
127
128                         Assert.AreEqual (itemA.GetType ().FullName, lc.GetItemText (itemA), "#D1");
129                         Assert.AreEqual (itemB.GetType ().FullName, lc.GetItemText (itemB), "#D2");
130                         Assert.AreEqual (itemC.GetType ().FullName, lc.GetItemText (itemC), "#D3");
131                 }
132                 
133                 [Test]
134                 public void FilterItemOnProperty ()
135                 {
136                         MockItem itemA = new MockItem ("A", 1);
137                         MockItem itemB = new MockItem ("B", 2);
138                         object itemC = new object ();
139
140                         ListControlChild lc = new ListControlChild ();
141                         lc.DisplayMember = "Text";
142
143                         // No DataSource available
144                         Assert.AreEqual ("A", lc.FilterItem (itemA, lc.DisplayMember), "#A1");
145                         Assert.AreEqual ("B", lc.FilterItem (itemB, lc.DisplayMember), "#A2");
146                         Assert.AreEqual (itemC, lc.FilterItem (itemC, lc.DisplayMember), "#A3");
147
148                         lc.DisplayMember = String.Empty;
149
150                         Assert.AreEqual (itemA, lc.FilterItem (itemA, lc.DisplayMember), "#B1");
151                         Assert.AreEqual (itemB, lc.FilterItem (itemB, lc.DisplayMember), "#B2");
152                         Assert.AreEqual (itemC, lc.FilterItem (itemC, lc.DisplayMember), "#B3");
153
154                         // DataSource available
155                         object [] objects = new object [] {itemA, itemB, itemC};
156                         lc.DisplayMember = "Text";
157                         lc.DataSource = objects;
158
159                         Assert.AreEqual ("A", lc.FilterItem (itemA, lc.DisplayMember), "#C1");
160                         Assert.AreEqual ("B", lc.FilterItem (itemB, lc.DisplayMember), "#C2");
161                         Assert.AreEqual (itemC, lc.FilterItem (itemC, lc.DisplayMember), "#C3");
162
163                         lc.DisplayMember = String.Empty;
164
165                         Assert.AreEqual (itemA, lc.FilterItem (itemA, lc.DisplayMember), "#D1");
166                         Assert.AreEqual (itemB, lc.FilterItem (itemB, lc.DisplayMember), "#D2");
167                         Assert.AreEqual (itemC, lc.FilterItem (itemC, lc.DisplayMember), "#D3");
168                 }
169
170                 [Test]
171                 public void DisplayMemberNullTest ()
172                 {
173                         ListControlChild lc = new ListControlChild ();
174                         lc.DisplayMember = null;
175                         Assert.AreEqual (String.Empty, lc.DisplayMember, "#1");
176                 }
177
178                 [Test]
179                 [ExpectedException (typeof (Exception))]
180                 public void DataSourceWrongArgumentType ()
181                 {
182                         ListControlChild lc = new ListControlChild ();
183                         lc.DataSource = new object ();
184                 }
185
186                 [Test]
187                 public void DataSource1 ()
188                 {
189                         ArrayList list1 = new ArrayList ();
190                         list1.Add ("item 1");
191                         ArrayList list2 = new ArrayList ();
192
193                         ListControlChild lc = new ListControlChild ();
194                         lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
195                         lc.DataSource = list1;
196                         Assert.AreEqual (1, dataSourceChanged, "#A1");
197                         Assert.AreSame (list1, lc.DataSource, "#A2");
198
199                         Form form = new Form ();
200                         form.Controls.Add (lc);
201
202                         Assert.AreEqual (1, dataSourceChanged, "#B1");
203                         Assert.AreSame (list1, lc.DataSource, "#B2");
204                         lc.DataSource = list1;
205                         Assert.AreEqual (1, dataSourceChanged, "#B3");
206                         Assert.AreSame (list1, lc.DataSource, "#B4");
207                         lc.DataSource = list2;
208                         Assert.AreEqual (2, dataSourceChanged, "#B5");
209                         Assert.AreSame (list2, lc.DataSource, "#B6");
210                         lc.DataSource = null;
211                         Assert.AreEqual (3, dataSourceChanged, "#B7");
212                         Assert.IsNull (lc.DataSource, "#B8");
213
214                         list1.Add ("whatever");
215                         list2.Add ("whatever");
216                         list1.Clear ();
217                         list2.Clear ();
218
219                         form.Dispose ();
220                 }
221
222                 [Test]
223                 public void DataSource2 ()
224                 {
225                         ArrayList list1 = new ArrayList ();
226                         list1.Add ("item 1");
227                         ArrayList list2 = new ArrayList ();
228
229                         ListControlChild lc = new ListControlChild ();
230                         lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
231
232                         Form form = new Form ();
233                         form.Controls.Add (lc);
234
235                         Assert.AreEqual (0, dataSourceChanged, "#1");
236                         Assert.IsNull (lc.DataSource, "#2");
237                         lc.DataSource = list1;
238                         Assert.AreEqual (1, dataSourceChanged, "#3");
239                         Assert.AreSame (list1, lc.DataSource, "#4");
240                         lc.DataSource = list2;
241                         Assert.AreEqual (2, dataSourceChanged, "#5");
242                         Assert.AreSame (list2, lc.DataSource, "#6");
243                         lc.DataSource = null;
244                         Assert.AreEqual (3, dataSourceChanged, "#7");
245                         Assert.IsNull (lc.DataSource, "#8");
246
247                         list1.Add ("whatever");
248                         list2.Add ("whatever");
249                         list1.Clear ();
250                         list2.Clear ();
251
252                         form.Dispose ();
253                 }
254
255                 [Test]
256                 public void SelectedValue ()
257                 {
258                         Form f = new Form ();
259                         f.ShowInTaskbar = false;
260                         ListControlChild lc = new ListControlChild ();
261                         f.Controls.Add (lc);
262
263                         ArrayList list = new ArrayList ();
264                         list.Add (new MockItem ("TextA", 1));
265                         list.Add (new MockItem (String.Empty, 4));
266                         list.Add (new MockItem ("TextC", 9));
267
268                         lc.ValueMember = "Text";
269                         lc.DataSource = list;
270
271                         f.Show ();
272
273                         lc.SelectedValue = "TextC";
274                         Assert.AreEqual (2, lc.SelectedIndex, "#B1");
275                         Assert.AreEqual ("TextC", lc.SelectedValue, "#B2");
276
277                         lc.SelectedValue = String.Empty;
278                         Assert.AreEqual (1, lc.SelectedIndex, "#C1");
279                         Assert.AreEqual (String.Empty, lc.SelectedValue, "#C2");
280
281                         lc.SelectedValue = "TextA";
282                         Assert.AreEqual (0, lc.SelectedIndex, "#D1");
283                         Assert.AreEqual ("TextA", lc.SelectedValue, "#D2");
284
285                         try {
286                                 lc.SelectedValue = null;
287                                 Assert.Fail ("#E1");
288                         } catch (ArgumentNullException) {
289                         }
290
291                         f.Dispose ();
292                 }
293
294                 [Test]
295                 public void SelectedValue2 ()
296                 {
297                         Form f = new Form ();
298                         f.ShowInTaskbar = false;
299                         ListControlChild child = new ListControlChild ();
300
301                         ArrayList list = new ArrayList ();
302                         list.Add (new MockItem ("A", 0));
303                         list.Add (new MockItem ("B", 1));
304                         list.Add (new MockItem ("C", 2));
305                         child.DataSource = list;
306                         child.ValueMember = "Text";
307
308                         MockItem item = new MockItem (String.Empty, 0);
309                         child.DataBindings.Add ("SelectedValue", item, "Text");
310
311                         Assert.AreEqual (-1, child.SelectedIndex, "#A1");
312
313                         f.Controls.Add (child);
314                         Assert.AreEqual (-1, child.SelectedIndex, "#B1");
315
316                         // When the form is shown, normally the SelectedIndex is the
317                         // CurrencyManager.Position (0 in this case), but it should remain as -1
318                         // since SelectedValue is bound to a String.Empty value. See #324286
319                         f.Show ();
320                         CurrencyManager manager = (CurrencyManager)f.BindingContext [list];
321                         Assert.AreEqual (-1, child.SelectedIndex, "#C1");
322                         Assert.AreEqual (0, manager.Position, "#C2");
323
324                         f.Dispose ();
325                 }
326
327 #if NET_2_0
328                 [Test] // bug #81771
329                 public void DataSource_BindingList1 ()
330                 {
331                         BindingList<string> list1 = new BindingList<string> ();
332                         list1.Add ("item 1");
333                         BindingList<string> list2 = new BindingList<string> ();
334
335                         ListControlChild lc = new ListControlChild ();
336                         lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
337                         lc.DataSource = list1;
338                         Assert.AreEqual (1, dataSourceChanged, "#A1");
339                         Assert.AreSame (list1, lc.DataSource, "#A2");
340
341                         Form form = new Form ();
342                         form.Controls.Add (lc);
343
344                         Assert.AreEqual (1, dataSourceChanged, "#B1");
345                         Assert.AreSame (list1, lc.DataSource, "#B2");
346                         lc.DataSource = list2;
347                         Assert.AreEqual (2, dataSourceChanged, "#B3");
348                         Assert.AreSame (list2, lc.DataSource, "#B4");
349                         lc.DataSource = null;
350                         Assert.AreEqual (3, dataSourceChanged, "#B5");
351                         Assert.IsNull (lc.DataSource, "#B6");
352
353                         list1.Add ("item");
354                         list1.Clear ();
355
356                         form.Dispose ();
357                 }
358
359                 [Test] // bug #81771
360                 public void DataSource_BindingList2 ()
361                 {
362                         BindingList<string> list1 = new BindingList<string> ();
363                         list1.Add ("item 1");
364                         BindingList<string> list2 = new BindingList<string> ();
365
366                         ListControlChild lc = new ListControlChild ();
367                         lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
368
369                         Form form = new Form ();
370                         form.Controls.Add (lc);
371
372                         Assert.AreEqual (0, dataSourceChanged, "#1");
373                         Assert.IsNull (lc.DataSource, "#2");
374                         lc.DataSource = list1;
375                         Assert.AreEqual (1, dataSourceChanged, "#3");
376                         Assert.AreSame (list1, lc.DataSource, "#4");
377                         lc.DataSource = list2;
378                         Assert.AreEqual (2, dataSourceChanged, "#5");
379                         Assert.AreSame (list2, lc.DataSource, "#6");
380                         lc.DataSource = null;
381                         Assert.AreEqual (3, dataSourceChanged, "#7");
382                         Assert.IsNull (lc.DataSource, "#8");
383                         list1.Add ("item");
384                         list1.Clear ();
385
386                         form.Dispose ();
387                 }
388
389                 [Test]
390                 public void AllowSelection ()
391                 {
392                         ListControlChild lc = new ListControlChild ();
393                         Assert.IsTrue (lc.allow_selection);
394                 }
395                 
396                 [Test]
397                 public void BehaviorFormatting ()
398                 {
399                         ListControl lc = new ListControlChild ();
400                         DateTime dt = new DateTime (1, 2, 3, 4, 5, 6);
401
402                         Assert.AreEqual (false, lc.FormattingEnabled, "A1");
403                         Assert.AreEqual (null, lc.FormatInfo, "A2");
404                         Assert.AreEqual (string.Empty, lc.FormatString, "A3");
405                         
406                         Assert.AreEqual (dt.ToString (), lc.GetItemText (dt), "A4");
407                         
408                         lc.FormattingEnabled = true;
409                         lc.FormatString = "MM/dd";
410
411                         Assert.AreEqual ("02/03", lc.GetItemText (dt), "A5");
412
413                         lc.Format += new ListControlConvertEventHandler (lc_Format);
414                         Assert.AreEqual ("Monkey!", lc.GetItemText (dt), "A6");
415                 }
416
417                 void lc_Format (object sender, ListControlConvertEventArgs e)
418                 {
419                         e.Value = "Monkey!";
420                 }
421
422                 [Test]
423                 public void FormattingChanges ()
424                 {
425                         bool refresh_items_called = false;
426
427                         ListControlChild lc = new ListControlChild ();
428                         lc.RefreshingItems += delegate
429                         {
430                                 refresh_items_called = true;
431                         };
432
433                         lc.FormattingEnabled = !lc.FormattingEnabled;
434                         Assert.AreEqual (true, refresh_items_called, "A1");
435
436                         refresh_items_called = false;
437                         lc.FormatInfo = CultureInfo.CurrentCulture;
438                         Assert.AreEqual (true, refresh_items_called, "B1");
439
440                         refresh_items_called = false;
441                         lc.FormatString = CultureInfo.CurrentCulture.NumberFormat.ToString ();
442                         Assert.AreEqual (true, refresh_items_called, "C1");
443                 }
444 #endif
445
446                 void ListControl_DataSourceChanged (object sender, EventArgs e)
447                 {
448                         dataSourceChanged++;
449                 }
450
451                 public class ListControlChild : ListControl
452                 {
453                         int selected_index = -1;
454
455                         public override int SelectedIndex {
456                                 get {
457                                         return selected_index;
458                                 }
459                                 set {
460                                         selected_index = value;
461                                 }
462                         }
463
464 #if NET_2_0
465                         public bool allow_selection {
466                                 get { return base.AllowSelection; }
467                         }
468 #endif
469
470                         public object FilterItem (object obj, string field)
471                         {
472                                 return FilterItemOnProperty (obj, field);
473                         }
474
475                         protected override void RefreshItem (int index)
476                         {
477                         }
478
479 #if NET_2_0
480                         protected override void RefreshItems ()
481                         {
482                                 base.RefreshItems ();
483
484                                 if (RefreshingItems != null)
485                                         RefreshingItems (this, EventArgs.Empty);
486                         }
487
488                         public event EventHandler RefreshingItems;
489 #endif
490
491                         protected override void SetItemsCore (IList items)
492                         {
493                         }
494                 }
495         }
496
497         public class MockItem
498         {
499                 public MockItem (string text, int value)
500                 {
501                         _text = text;
502                         _value = value;
503                 }
504
505                 public MockItem ()
506                 {
507                         _text = String.Empty;
508                         _value = -1;
509                 }
510
511                 public string Text {
512                         get { return _text; }
513                         set {
514                                 if (_text == value)
515                                         return;
516
517                                 _text = value;
518                                 OnTextChanged (EventArgs.Empty);
519                         }
520                 }
521
522                 public int Value {
523                         get { return _value; }
524                         set {
525                                 if (_value == value)
526                                         return;
527
528                                 _value = value;
529                                 OnValueChanged (EventArgs.Empty);
530                         }
531                 }
532
533                 protected virtual void OnTextChanged (EventArgs args)
534                 {
535                         if (TextChanged != null)
536                                 TextChanged (this, args);
537                 }
538
539                 protected virtual void OnValueChanged (EventArgs args)
540                 {
541                         if (ValueChanged != null)
542                                 ValueChanged (this, args);
543                 }
544
545                 public event EventHandler TextChanged;
546                 public event EventHandler ValueChanged;
547
548                 private string _text;
549                 private int _value;
550         }
551
552         public class MockContainer
553         {
554                 MockItem item;
555
556                 public MockItem Item
557                 {
558                         get
559                         {
560                                 return item;
561                         }
562                         set
563                         {
564                                 item = value;
565                         }
566                 }
567         }
568 }