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;
32 using System.ComponentModel;
36 using System.Globalization;
37 using System.Windows.Forms;
38 using NUnit.Framework;
40 namespace MonoTests.System.Windows.Forms
43 public class ListControlTest : TestHelper
45 private int dataSourceChanged;
48 protected override void SetUp () {
49 dataSourceChanged = 0;
55 public void DataBindingsTest ()
58 @"<?xml version=""1.0"" standalone=""yes""?>
66 @"<?xml version=""1.0"" standalone=""yes""?>
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");
92 Assert.AreEqual ("SUCCESS", cb.Text, "#02");
97 public void GetItemText ()
99 MockItem itemA = new MockItem ("A", 1);
100 MockItem itemB = new MockItem ("B", 2);
101 object itemC = new object ();
103 ListControlChild lc = new ListControlChild ();
104 lc.DisplayMember = "Text";
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");
111 lc.DisplayMember = String.Empty;
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");
117 // DataSource available
118 object [] objects = new object [] {itemA, itemB, itemC};
119 lc.DisplayMember = "Text";
120 lc.DataSource = objects;
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");
126 lc.DisplayMember = String.Empty;
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");
134 public void FilterItemOnProperty ()
136 MockItem itemA = new MockItem ("A", 1);
137 MockItem itemB = new MockItem ("B", 2);
138 object itemC = new object ();
140 ListControlChild lc = new ListControlChild ();
141 lc.DisplayMember = "Text";
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");
148 lc.DisplayMember = String.Empty;
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");
154 // DataSource available
155 object [] objects = new object [] {itemA, itemB, itemC};
156 lc.DisplayMember = "Text";
157 lc.DataSource = objects;
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");
163 lc.DisplayMember = String.Empty;
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");
171 public void DisplayMemberNullTest ()
173 ListControlChild lc = new ListControlChild ();
174 lc.DisplayMember = null;
175 Assert.AreEqual (String.Empty, lc.DisplayMember, "#1");
179 [ExpectedException (typeof (Exception))]
180 public void DataSourceWrongArgumentType ()
182 ListControlChild lc = new ListControlChild ();
183 lc.DataSource = new object ();
187 public void DataSource1 ()
189 ArrayList list1 = new ArrayList ();
190 list1.Add ("item 1");
191 ArrayList list2 = new ArrayList ();
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");
199 Form form = new Form ();
200 form.Controls.Add (lc);
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");
214 list1.Add ("whatever");
215 list2.Add ("whatever");
223 public void DataSource2 ()
225 ArrayList list1 = new ArrayList ();
226 list1.Add ("item 1");
227 ArrayList list2 = new ArrayList ();
229 ListControlChild lc = new ListControlChild ();
230 lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
232 Form form = new Form ();
233 form.Controls.Add (lc);
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");
247 list1.Add ("whatever");
248 list2.Add ("whatever");
256 public void SelectedValue ()
258 Form f = new Form ();
259 f.ShowInTaskbar = false;
260 ListControlChild lc = new ListControlChild ();
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));
268 lc.ValueMember = "Text";
269 lc.DataSource = list;
273 lc.SelectedValue = "TextC";
274 Assert.AreEqual (2, lc.SelectedIndex, "#B1");
275 Assert.AreEqual ("TextC", lc.SelectedValue, "#B2");
277 lc.SelectedValue = String.Empty;
278 Assert.AreEqual (1, lc.SelectedIndex, "#C1");
279 Assert.AreEqual (String.Empty, lc.SelectedValue, "#C2");
281 lc.SelectedValue = "TextA";
282 Assert.AreEqual (0, lc.SelectedIndex, "#D1");
283 Assert.AreEqual ("TextA", lc.SelectedValue, "#D2");
286 lc.SelectedValue = null;
288 } catch (ArgumentNullException) {
295 public void SelectedValue2 ()
297 Form f = new Form ();
298 f.ShowInTaskbar = false;
299 ListControlChild child = new ListControlChild ();
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";
308 MockItem item = new MockItem (String.Empty, 0);
309 child.DataBindings.Add ("SelectedValue", item, "Text");
311 Assert.AreEqual (-1, child.SelectedIndex, "#A1");
313 f.Controls.Add (child);
314 Assert.AreEqual (-1, child.SelectedIndex, "#B1");
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
320 CurrencyManager manager = (CurrencyManager)f.BindingContext [list];
321 Assert.AreEqual (-1, child.SelectedIndex, "#C1");
322 Assert.AreEqual (0, manager.Position, "#C2");
329 public void DataSource_BindingList1 ()
331 BindingList<string> list1 = new BindingList<string> ();
332 list1.Add ("item 1");
333 BindingList<string> list2 = new BindingList<string> ();
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");
341 Form form = new Form ();
342 form.Controls.Add (lc);
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");
360 public void DataSource_BindingList2 ()
362 BindingList<string> list1 = new BindingList<string> ();
363 list1.Add ("item 1");
364 BindingList<string> list2 = new BindingList<string> ();
366 ListControlChild lc = new ListControlChild ();
367 lc.DataSourceChanged += new EventHandler (ListControl_DataSourceChanged);
369 Form form = new Form ();
370 form.Controls.Add (lc);
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");
390 public void AllowSelection ()
392 ListControlChild lc = new ListControlChild ();
393 Assert.IsTrue (lc.allow_selection);
397 public void BehaviorFormatting ()
399 ListControl lc = new ListControlChild ();
400 DateTime dt = new DateTime (1, 2, 3, 4, 5, 6);
402 Assert.AreEqual (false, lc.FormattingEnabled, "A1");
403 Assert.AreEqual (null, lc.FormatInfo, "A2");
404 Assert.AreEqual (string.Empty, lc.FormatString, "A3");
406 Assert.AreEqual (dt.ToString (), lc.GetItemText (dt), "A4");
408 lc.FormattingEnabled = true;
409 lc.FormatString = "MM/dd";
411 Assert.AreEqual ("02/03", lc.GetItemText (dt), "A5");
413 lc.Format += new ListControlConvertEventHandler (lc_Format);
414 Assert.AreEqual ("Monkey!", lc.GetItemText (dt), "A6");
417 void lc_Format (object sender, ListControlConvertEventArgs e)
423 public void FormattingChanges ()
425 bool refresh_items_called = false;
427 ListControlChild lc = new ListControlChild ();
428 lc.RefreshingItems += delegate
430 refresh_items_called = true;
433 lc.FormattingEnabled = !lc.FormattingEnabled;
434 Assert.AreEqual (true, refresh_items_called, "A1");
436 refresh_items_called = false;
437 lc.FormatInfo = CultureInfo.CurrentCulture;
438 Assert.AreEqual (true, refresh_items_called, "B1");
440 refresh_items_called = false;
441 lc.FormatString = CultureInfo.CurrentCulture.NumberFormat.ToString ();
442 Assert.AreEqual (true, refresh_items_called, "C1");
446 void ListControl_DataSourceChanged (object sender, EventArgs e)
451 public class ListControlChild : ListControl
453 int selected_index = -1;
455 public override int SelectedIndex {
457 return selected_index;
460 selected_index = value;
465 public bool allow_selection {
466 get { return base.AllowSelection; }
470 public object FilterItem (object obj, string field)
472 return FilterItemOnProperty (obj, field);
475 protected override void RefreshItem (int index)
480 protected override void RefreshItems ()
482 base.RefreshItems ();
484 if (RefreshingItems != null)
485 RefreshingItems (this, EventArgs.Empty);
488 public event EventHandler RefreshingItems;
491 protected override void SetItemsCore (IList items)
497 public class MockItem
499 public MockItem (string text, int value)
507 _text = String.Empty;
512 get { return _text; }
518 OnTextChanged (EventArgs.Empty);
523 get { return _value; }
529 OnValueChanged (EventArgs.Empty);
533 protected virtual void OnTextChanged (EventArgs args)
535 if (TextChanged != null)
536 TextChanged (this, args);
539 protected virtual void OnValueChanged (EventArgs args)
541 if (ValueChanged != null)
542 ValueChanged (this, args);
545 public event EventHandler TextChanged;
546 public event EventHandler ValueChanged;
548 private string _text;
552 public class MockContainer