2 // ListControlTest.cs: Tests for ListControl abstract class.
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:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
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.
23 // Copyright (c) 2006 Novell, Inc. (http://www.novell.com)
26 // Carlos Alberto Cortez <calberto.cortez@gmail.com>
30 using System.Collections;
31 using System.ComponentModel;
34 using System.Globalization;
35 using System.Windows.Forms;
36 using NUnit.Framework;
38 namespace MonoTests.System.Windows.Forms
41 public class ListControlTest : TestHelper
43 private int dataSourceChanged;
46 protected override void SetUp () {
47 dataSourceChanged = 0;
53 public void DataBindingsTest ()
56 @"<?xml version=""1.0"" standalone=""yes""?>
64 @"<?xml version=""1.0"" standalone=""yes""?>
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");
90 Assert.AreEqual ("SUCCESS", cb.Text, "#02");
95 public void GetItemText ()
97 MockItem itemA = new MockItem ("A", 1);
98 MockItem itemB = new MockItem ("B", 2);
99 object itemC = new object ();
101 ListControlChild lc = new ListControlChild ();
102 lc.DisplayMember = "Text";
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");
109 lc.DisplayMember = String.Empty;
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");
115 // DataSource available
116 object [] objects = new object [] {itemA, itemB, itemC};
117 lc.DisplayMember = "Text";
118 lc.DataSource = objects;
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");
124 lc.DisplayMember = String.Empty;
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");
132 public void FilterItemOnProperty ()
134 MockItem itemA = new MockItem ("A", 1);
135 MockItem itemB = new MockItem ("B", 2);
136 object itemC = new object ();
138 ListControlChild lc = new ListControlChild ();
139 lc.DisplayMember = "Text";
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");
146 lc.DisplayMember = String.Empty;
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");
152 // DataSource available
153 object [] objects = new object [] {itemA, itemB, itemC};
154 lc.DisplayMember = "Text";
155 lc.DataSource = objects;
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");
161 lc.DisplayMember = String.Empty;
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");
169 public void DisplayMemberNullTest ()
171 ListControlChild lc = new ListControlChild ();
172 lc.DisplayMember = null;
173 Assert.AreEqual (String.Empty, lc.DisplayMember, "#1");
177 [ExpectedException (typeof (Exception))]
178 public void DataSourceWrongArgumentType ()
180 ListControlChild lc = new ListControlChild ();
181 lc.DataSource = new object ();
185 public void DataSource1 ()
187 ArrayList list1 = new ArrayList ();
188 list1.Add ("item 1");
189 ArrayList list2 = new ArrayList ();
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");
197 Form form = new Form ();
198 form.Controls.Add (lc);
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");
212 list1.Add ("whatever");
213 list2.Add ("whatever");
221 public void DataSource2 ()
223 ArrayList list1 = new ArrayList ();
224 list1.Add ("item 1");
225 ArrayList list2 = new ArrayList ();
227 ListControlChild lc = new ListControlChild ();
228 lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
230 Form form = new Form ();
231 form.Controls.Add (lc);
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");
245 list1.Add ("whatever");
246 list2.Add ("whatever");
254 public void SelectedValue ()
256 Form f = new Form ();
257 f.ShowInTaskbar = false;
258 ListControlChild lc = new ListControlChild ();
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));
266 lc.ValueMember = "Text";
267 lc.DataSource = list;
271 lc.SelectedValue = "TextC";
272 Assert.AreEqual (2, lc.SelectedIndex, "#B1");
273 Assert.AreEqual ("TextC", lc.SelectedValue, "#B2");
275 lc.SelectedValue = String.Empty;
276 Assert.AreEqual (1, lc.SelectedIndex, "#C1");
277 Assert.AreEqual (String.Empty, lc.SelectedValue, "#C2");
279 lc.SelectedValue = "TextA";
280 Assert.AreEqual (0, lc.SelectedIndex, "#D1");
281 Assert.AreEqual ("TextA", lc.SelectedValue, "#D2");
284 lc.SelectedValue = null;
286 } catch (ArgumentNullException) {
293 public void SelectedValue2 ()
295 Form f = new Form ();
296 f.ShowInTaskbar = false;
297 ListControlChild child = new ListControlChild ();
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";
306 MockItem item = new MockItem (String.Empty, 0);
307 child.DataBindings.Add ("SelectedValue", item, "Text");
309 Assert.AreEqual (-1, child.SelectedIndex, "#A1");
311 f.Controls.Add (child);
312 Assert.AreEqual (-1, child.SelectedIndex, "#B1");
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
318 CurrencyManager manager = (CurrencyManager)f.BindingContext [list];
319 Assert.AreEqual (-1, child.SelectedIndex, "#C1");
320 Assert.AreEqual (0, manager.Position, "#C2");
326 public void DataSource_BindingList1 ()
328 BindingList<string> list1 = new BindingList<string> ();
329 list1.Add ("item 1");
330 BindingList<string> list2 = new BindingList<string> ();
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");
338 Form form = new Form ();
339 form.Controls.Add (lc);
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");
357 public void DataSource_BindingList2 ()
359 BindingList<string> list1 = new BindingList<string> ();
360 list1.Add ("item 1");
361 BindingList<string> list2 = new BindingList<string> ();
363 ListControlChild lc = new ListControlChild ();
364 lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
366 Form form = new Form ();
367 form.Controls.Add (lc);
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");
387 public void AllowSelection ()
389 ListControlChild lc = new ListControlChild ();
390 Assert.IsTrue (lc.allow_selection);
394 public void BehaviorFormatting ()
396 ListControl lc = new ListControlChild ();
397 DateTime dt = new DateTime (1, 2, 3, 4, 5, 6);
399 Assert.AreEqual (false, lc.FormattingEnabled, "A1");
400 Assert.AreEqual (null, lc.FormatInfo, "A2");
401 Assert.AreEqual (string.Empty, lc.FormatString, "A3");
403 Assert.AreEqual (dt.ToString (), lc.GetItemText (dt), "A4");
405 lc.FormattingEnabled = true;
406 lc.FormatString = "MM/dd";
408 Assert.AreEqual ("02/03", lc.GetItemText (dt), "A5");
410 lc.Format += new ListControlConvertEventHandler (lc_Format);
411 Assert.AreEqual ("Monkey!", lc.GetItemText (dt), "A6");
414 void lc_Format (object sender, ListControlConvertEventArgs e)
420 public void FormattingChanges ()
422 bool refresh_items_called = false;
424 ListControlChild lc = new ListControlChild ();
425 lc.RefreshingItems += delegate
427 refresh_items_called = true;
430 lc.FormattingEnabled = !lc.FormattingEnabled;
431 Assert.AreEqual (true, refresh_items_called, "A1");
433 refresh_items_called = false;
434 lc.FormatInfo = CultureInfo.CurrentCulture;
435 Assert.AreEqual (true, refresh_items_called, "B1");
437 refresh_items_called = false;
438 lc.FormatString = CultureInfo.CurrentCulture.NumberFormat.ToString ();
439 Assert.AreEqual (true, refresh_items_called, "C1");
442 void ListControl_DataSourceChanged (object sender, EventArgs e)
448 public void FormatEventValueType ()
450 string event_log = null;
451 ComboBox comboBox = new ComboBox ();
452 comboBox.FormattingEnabled = true;
453 comboBox.Format += delegate(object sender, ListControlConvertEventArgs e)
455 event_log = e.Value.GetType ().Name;
458 int [] objects = new int [] { 1, 2, 3 };
459 comboBox.DataSource = objects;
460 comboBox.GetItemText (1);
462 Assert.AreEqual (typeof (int).Name, event_log, "#A0");
465 public class ListControlChild : ListControl
467 int selected_index = -1;
469 public override int SelectedIndex {
471 return selected_index;
474 selected_index = value;
478 public bool allow_selection {
479 get { return base.AllowSelection; }
482 public object FilterItem (object obj, string field)
484 return FilterItemOnProperty (obj, field);
487 protected override void RefreshItem (int index)
491 protected override void RefreshItems ()
493 base.RefreshItems ();
495 if (RefreshingItems != null)
496 RefreshingItems (this, EventArgs.Empty);
499 public event EventHandler RefreshingItems;
501 protected override void SetItemsCore (IList items)
507 public class MockItem
509 public MockItem (string text, int value)
517 _text = String.Empty;
522 get { return _text; }
528 OnTextChanged (EventArgs.Empty);
533 get { return _value; }
539 OnValueChanged (EventArgs.Empty);
543 protected virtual void OnTextChanged (EventArgs args)
545 if (TextChanged != null)
546 TextChanged (this, args);
549 protected virtual void OnValueChanged (EventArgs args)
551 if (ValueChanged != null)
552 ValueChanged (this, args);
555 public event EventHandler TextChanged;
556 public event EventHandler ValueChanged;
558 private string _text;
562 public class MockContainer