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