2007-01-10 Chris Toshok <toshok@ximian.com>
[mono-project.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / CurrencyManagerTest.cs
blob3c7280a7bfa121a15a0d60a0437365cc12fb3896
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.
20 // Copyright (c) 2006 Novell, Inc.
22 // Authors:
23 // Jackson Harper jackson@ximian.com
25 using System;
26 using System.Collections;
27 using System.ComponentModel;
28 using System.Data;
29 using System.Reflection;
30 using System.Windows.Forms;
32 using NUnit.Framework;
34 namespace MonoTests.System.Windows.Forms
36 [TestFixture]
37 public class CurrencyManagerTest
39 [Test]
40 public void Defaults ()
42 BindingContext bc = new BindingContext ();
43 ArrayList data_source = new ArrayList ();
44 CurrencyManager cm = bc [data_source] as CurrencyManager;
46 Assert.AreSame (data_source, cm.List, "DEFAULTS1");
47 Assert.AreEqual (0, cm.Count, "DEFAULTS2");
48 Assert.AreEqual (-1, cm.Position, "DEFAULTS3");
51 [Test]
52 [ExpectedException (typeof (IndexOutOfRangeException))]
53 public void UninitializedCurrent ()
55 BindingContext bc = new BindingContext ();
56 ArrayList data_source = new ArrayList ();
57 CurrencyManager cm = bc [data_source] as CurrencyManager;
59 // This line should throw
60 Assert.AreSame (null, cm.Current, "CurrentOfEmpty");
63 [Test]
64 public void DataSetList ()
66 DataSet dataset = new DataSet ("DataSet");
67 DataTable table = new DataTable ("Table");
68 BindingContext bc = new BindingContext ();
69 CurrencyManager cm;
71 dataset.Tables.Add (table);
72 cm = bc [dataset] as CurrencyManager;
74 Assert.AreEqual (typeof (DataViewManager), cm.List.GetType (), "DATASETLIST1");
75 Assert.AreEqual (1, cm.Count, "DATASETLIST2");
76 Assert.AreEqual (0, cm.Position, "DATASETLIST3");
77 // Assert.AreEqual (typeof (DataViewManagerListItemTypeDescriptor), cm.Current.GetType (),
78 // "DATASETLIST4");
81 [Test]
82 public void DataSetListTable ()
84 DataSet dataset = new DataSet ("DataSet");
85 DataTable table = new DataTable ("Table");
86 BindingContext bc = new BindingContext ();
87 CurrencyManager cm;
89 dataset.Tables.Add (table);
90 cm = bc [dataset, "Table"] as CurrencyManager;
92 Assert.AreEqual (typeof (DataView), cm.List.GetType (), "DATASETLIST1");
93 Assert.AreEqual (0, cm.Count, "DATASETLIST2");
94 Assert.AreEqual (-1, cm.Position, "DATASETLIST3");
97 [Test]
98 [ExpectedException (typeof (ArgumentException))]
99 public void DataSetListTableBogusField ()
101 DataSet dataset = new DataSet ("DataSet");
102 DataTable table = new DataTable ("Table.Column");
103 BindingContext bc = new BindingContext ();
104 CurrencyManager cm;
106 dataset.Tables.Add (table);
108 // child list can't be created
109 cm = bc [dataset, "Table"] as CurrencyManager;
112 [Test] // bug #80107
113 public void DataView ()
115 DataView dv = new DataView ();
117 BindingContext bc = new BindingContext ();
118 CurrencyManager cm = bc [dv, string.Empty] as CurrencyManager;
119 Assert.IsNotNull (cm, "#A1");
120 Assert.AreEqual (0, cm.Count, "#A2");
121 Assert.AreEqual (-1, cm.Position, "#A3");
123 DataTable dt = new DataTable ("Testdata");
124 dt.Columns.Add ("A");
125 dt.Columns.Add ("B");
126 dt.Rows.Add (new object [] { "A1", "B1" });
127 dt.Rows.Add (new object [] { "A2", "B2" });
128 dv.Table = dt;
130 Assert.AreEqual (2, cm.Count, "#B1");
131 Assert.AreEqual (0, cm.Position, "#B2");
134 [Test]
135 public void MoveArrayListForward ()
137 ArrayList data_source = new ArrayList ();
138 BindingContext bc = new BindingContext ();
140 for (int i = 0; i < 10; i++)
141 data_source.Add (new object ());
143 CurrencyManager cm = bc [data_source] as CurrencyManager;
144 for (int i = 0; i < 10; i++) {
145 Assert.AreSame (data_source [i], cm.Current, "MOVEALF" + i);
146 cm.Position++;
149 cm.Position++;
150 cm.Position++;
152 Assert.AreSame (data_source [9], cm.Current, "MOVEALFEND");
155 [Test]
156 public void MoveArrayListBackward ()
158 ArrayList data_source = new ArrayList ();
159 BindingContext bc = new BindingContext ();
161 for (int i = 0; i < 10; i++)
162 data_source.Add (new object ());
164 CurrencyManager cm = bc [data_source] as CurrencyManager;
165 cm.Position = 9;
166 for (int i = 9; i >= 0; i--) {
167 Assert.AreSame (data_source [i], cm.Current, "MOVEALB" + i);
168 cm.Position--;
171 cm.Position--;
172 cm.Position--;
174 Assert.AreSame (data_source [0], cm.Current, "MOVEALBSTART");
177 [Test]
178 public void SetPositionArrayList ()
180 ArrayList data_source = new ArrayList ();
181 BindingContext bc = new BindingContext ();
183 for (int i = 0; i < 10; i++)
184 data_source.Add (new object ());
186 CurrencyManager cm = bc [data_source] as CurrencyManager;
187 for (int i = 3; i >= 0; i--) {
188 cm.Position = i;
189 Assert.AreSame (data_source [i], cm.Current, "MOVEAL1-" + i);
192 cm.Position--;
194 for (int i = 0; i < 10; i++) {
195 cm.Position = i;
196 Assert.AreSame (data_source [i], cm.Current, "MOVEAL2-" + i);
199 for (int i = 5; i < 10; i++) {
200 cm.Position = i;
201 Assert.AreSame (data_source [i], cm.Current, "MOVEAL3-" + i);
205 [Test]
206 public void LateBuildDataTable ()
208 DataTable data_source = new DataTable ("Table");
209 BindingContext bc = new BindingContext ();
210 CurrencyManager cm = bc [data_source] as CurrencyManager;
212 Assert.AreEqual (-1, cm.Position, "LATEBUILDTABLE1");
213 Assert.AreEqual (0, cm.Count, "LATEBUILDTABLE2");
215 DataColumn column = new DataColumn ("Column");
216 column.DataType = typeof (int);
217 data_source.Columns.Add (column);
219 for (int i = 0; i < 10; i++) {
220 DataRow row = data_source.NewRow ();
221 row ["Column"] = i;
222 data_source.Rows.Add (row);
225 Assert.AreEqual (0, cm.Position, "LATEBUILDTABLE3");
226 Assert.AreEqual (10, cm.Count, "LATEBUILDTABLE4");
229 [Test]
230 public void LateBuildArrayList ()
232 ArrayList data_source = new ArrayList ();
233 BindingContext bc = new BindingContext ();
234 CurrencyManager cm = bc [data_source] as CurrencyManager;
236 Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST1");
237 Assert.AreEqual (0, cm.Count, "LATEBUILDLIST2");
239 data_source.AddRange (new object [] { 1, 2, 3, 4, 5, 6, 7 });
241 Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST3");
242 Assert.AreEqual (7, cm.Count, "LATEBUILDLIST4");
245 [Test]
246 public void MoveDataTableForward ()
248 DataTable data_source = new DataTable ("Table");
249 BindingContext bc = new BindingContext ();
250 CurrencyManager cm = bc [data_source] as CurrencyManager;
251 DataColumn column = new DataColumn ("Column");
253 column.DataType = typeof (int);
254 data_source.Columns.Add (column);
255 for (int i = 0; i < 10; i++) {
256 DataRow row = data_source.NewRow ();
257 row ["Column"] = i;
258 data_source.Rows.Add (row);
262 for (int i = 0; i < 10; i++) {
263 DataRowView row = cm.Current as DataRowView;
264 Assert.IsFalse (row == null, "MOVETABLEF-NULL-" + i);
265 Assert.AreEqual (row ["Column"], i, "MOVETABLEF-" + i);
266 cm.Position++;
269 cm.Position++;
270 cm.Position++;
272 Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "MOVETABLEF-END");
275 [Test]
276 public void MoveDataTableBackward ()
278 DataTable data_source = new DataTable ("Table");
279 BindingContext bc = new BindingContext ();
280 CurrencyManager cm = bc [data_source] as CurrencyManager;
281 DataColumn column = new DataColumn ("Column");
283 column.DataType = typeof (int);
284 data_source.Columns.Add (column);
285 for (int i = 0; i < 10; i++) {
286 DataRow row = data_source.NewRow ();
287 row ["Column"] = i;
288 data_source.Rows.Add (row);
292 cm.Position = 9;
293 for (int i = 9; i >= 0; i--) {
294 DataRowView row = cm.Current as DataRowView;
295 Assert.IsFalse (row == null, "MOVETABLEB-NULL-" + i);
296 Assert.AreEqual (row ["Column"], i, "MOVETABLEB-" + i);
297 cm.Position--;
300 cm.Position--;
301 cm.Position--;
303 Assert.AreEqual (0, ((DataRowView) cm.Current) ["Column"], "MOVETABLEB-START");
306 [Test]
307 public void SetPositionDataTable ()
309 DataTable data_source = new DataTable ("Table");
310 BindingContext bc = new BindingContext ();
311 CurrencyManager cm = bc [data_source] as CurrencyManager;
312 DataColumn column = new DataColumn ("Column");
314 column.DataType = typeof (int);
315 data_source.Columns.Add (column);
316 for (int i = 0; i < 10; i++) {
317 DataRow row = data_source.NewRow ();
318 row ["Column"] = i;
319 data_source.Rows.Add (row);
323 for (int i = 5; i < 10; i++) {
324 cm.Position = i;
325 DataRowView row = cm.Current as DataRowView;
326 Assert.IsFalse (row == null, "SETTABLE1-NULL-" + i);
327 Assert.AreEqual (row ["Column"], i, "SETTABLE1-" + i);
330 for (int i = 5; i >= 0; i--) {
331 cm.Position = i;
332 DataRowView row = cm.Current as DataRowView;
333 Assert.IsFalse (row == null, "SETTABLE2-NULL-" + i);
334 Assert.AreEqual (row ["Column"], i, "SETTABLE2-" + i);
338 [Test]
339 public void NavigateDataSetToTable ()
341 DataSet data_source = new DataSet ("DataSet");
342 DataTable table = new DataTable ("Table");
343 DataColumn column = new DataColumn ("Column");
344 BindingContext bc = new BindingContext ();
346 data_source.Tables.Add (table);
348 column.DataType = typeof (int);
349 table.Columns.Add (column);
350 for (int i = 0; i < 10; i++) {
351 DataRow row = table.NewRow ();
352 row ["Column"] = i;
353 table.Rows.Add (row);
356 CurrencyManager cm = bc [data_source, "Table"] as CurrencyManager;
358 Assert.AreEqual (0, cm.Position, "NAVSETTOTABLE1");
359 Assert.AreEqual (10, cm.Count, "NAVSETTOTABLE2");
360 Assert.AreEqual (typeof (DataView), cm.List.GetType (), "NAVSETTOTABLE3");
362 for (int i = 0; i < 10; i++) {
363 DataRowView row = cm.Current as DataRowView;
364 Assert.IsFalse (row == null, "NAVSETTOTABLE-NULL-" + i);
365 Assert.AreEqual (i, row ["Column"], "NAVSETTOTABLE-" + i);
366 cm.Position++;
369 cm.Position++;
370 cm.Position++;
372 Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "NAVSETTOTABLE-END");
375 [Test]
376 public void NavigateDataSetToColumn ()
378 DataSet data_source = new DataSet ("DataSet");
379 DataTable table = new DataTable ("Table");
380 DataColumn column = new DataColumn ("Column");
381 BindingContext bc = new BindingContext ();
383 data_source.Tables.Add (table);
385 column.DataType = typeof (int);
386 table.Columns.Add (column);
387 for (int i = 0; i < 10; i++) {
388 DataRow row = table.NewRow ();
389 row ["Column"] = i;
390 table.Rows.Add (row);
393 CurrencyManager cm = bc [data_source, "Table.Column"] as CurrencyManager;
395 Assert.AreEqual (null, cm, "NAVSETTOCOLUMN1");
398 [Test]
399 public void NavigateDataSetToParentRelation ()
401 DataSet data_source = CreateRelatedDataSet ();
402 BindingContext bc = new BindingContext ();
403 CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
405 Assert.AreEqual (0, cm.Position, "NAVSETTORELATION1");
406 Assert.AreEqual (1, cm.Count, "NAVSETTORELATION2");
407 Assert.IsTrue (cm.List is DataView, "NAVSETTORELATION3");
409 DataRowView row = cm.Current as DataRowView;
410 Assert.IsFalse (row == null, "NAVSETTORELATION-NULL-VALUE");
411 Assert.AreEqual (0, row ["Two"], "NAVSETTORELATION-VALUE");
413 cm.Position++;
414 cm.Position++;
416 Assert.AreEqual (0, ((DataRowView) cm.Current) ["Two"], "NAVSETTORELATION-END");
419 [Test]
420 [ExpectedException (typeof (ArgumentException))]
421 public void DataSetToChildRelation ()
423 DataSet data_source = CreateRelatedDataSet ();
424 BindingContext bc = new BindingContext ();
426 // Can't create a list on a child relation
427 CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
430 [Test]
431 public void DataSetToParentRelationField ()
433 DataSet data_source = CreateRelatedDataSet ();
434 BindingContext bc = new BindingContext ();
436 CurrencyManager cm = bc [data_source, "Table1.Relation.Two"] as CurrencyManager;
438 Assert.AreEqual (null, cm, "SETTOPARENTRELATIONFIELD");
441 [Test]
442 public void MultiColumnedRelation ()
444 DataSet dataset = new DataSet ();
445 DataTable sports = new DataTable ("Sports");
446 DataTable athletes = new DataTable ("Athletes");
448 DataColumn column;
449 DataRow row;
451 column = new DataColumn ();
452 column.DataType = typeof (int);
453 column.ColumnName = "SportID";
454 column.Unique = true;
455 sports.Columns.Add (column);
457 column = new DataColumn ();
458 column.DataType = typeof (string);
459 column.ColumnName = "SportName";
460 sports.Columns.Add (column);
463 string [] sports_names = new string [] { "Hockey", "Baseball", "Basketball", "Football", "Boxing", "Surfing" };
464 for (int i = 0; i < sports_names.Length; i++) {
465 row = sports.NewRow ();
466 row ["SportID"] = i;
467 row ["SportName"] = sports_names [i];
468 sports.Rows.Add (row);
472 // Athletes table
473 column = new DataColumn ();
474 column.DataType = typeof (int);
475 column.ColumnName = "AthleteID";
476 column.Unique = true;
477 athletes.Columns.Add (column);
479 column = new DataColumn ();
480 column.DataType = typeof (int);
481 column.ColumnName = "Sport";
482 athletes.Columns.Add (column);
484 column = new DataColumn ();
485 column.DataType = typeof (string);
486 column.ColumnName = "AthleteName";
487 athletes.Columns.Add (column);
489 string [] athlete_names = new string [] { "@alp", "@lupus", "@tjfontaine", "duncan", "marv", "WindowsUninstall",
490 "@jackson", "@migHome", "_Synced[work]", "GodZhila", "Raboo",
491 "@jchambers", "@mkestner", "barbosa", "IzeBurn", "squinky86",
492 "@kangaroo", "@paco", "Demian", "logiclrd", "tenshiKur0" };
493 for (int i = 0; i < athlete_names.Length; i++) {
494 row = athletes.NewRow ();
495 row ["AthleteID"] = i;
496 row ["Sport"] = i % sports_names.Length;
497 row ["AthleteName"] = athlete_names [i];
498 athletes.Rows.Add (row);
501 dataset.Tables.Add (sports);
502 dataset.Tables.Add (athletes);
503 dataset.Relations.Add ("AthletesSports", sports.Columns ["SportID"], athletes.Columns ["Sport"]);
505 BindingContext bc = new BindingContext ();
506 CurrencyManager cm = bc [dataset, "Sports.AthletesSports"] as CurrencyManager;
508 Assert.AreEqual (0, cm.Position, "MC1");
509 Assert.AreEqual (4, cm.Count, "MC2");
511 DataRowView rowview = cm.Current as DataRowView;
512 Assert.IsFalse (rowview == null, "MC3");
513 Assert.AreEqual (0, rowview ["AthleteID"], "MC4");
514 Assert.AreEqual ("@alp", rowview ["AthleteName"], "MC5");
515 Assert.AreEqual (0, rowview ["Sport"], "MC6");
517 cm.Position++;
519 rowview = cm.Current as DataRowView;
520 Assert.IsFalse (rowview == null, "MC7");
521 Assert.AreEqual (6, rowview ["AthleteID"], "MC8");
522 Assert.AreEqual ("@jackson", rowview ["AthleteName"], "MC9");
523 Assert.AreEqual (0, rowview ["Sport"], "MC10");
525 cm.Position++;
527 rowview = cm.Current as DataRowView;
528 Assert.IsFalse (rowview == null, "MC11");
529 Assert.AreEqual (12, rowview ["AthleteID"], "MC12");
530 Assert.AreEqual ("@mkestner", rowview ["AthleteName"], "MC13");
531 Assert.AreEqual (0, rowview ["Sport"], "MC14");
533 cm.Position++;
535 rowview = cm.Current as DataRowView;
536 Assert.IsFalse (rowview == null, "MC15");
537 Assert.AreEqual (18, rowview ["AthleteID"], "MC16");
538 Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC17");
539 Assert.AreEqual (0, rowview ["Sport"], "MC18");
541 cm.Position++;
543 rowview = cm.Current as DataRowView;
544 Assert.IsFalse (rowview == null, "MC19");
545 Assert.AreEqual (18, rowview ["AthleteID"], "MC20");
546 Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC21");
547 Assert.AreEqual (0, rowview ["Sport"], "MC22");
550 private DataSet CreateRelatedDataSet ()
552 DataSet dataset = new DataSet ("DataSet");
553 DataTable dt1 = new DataTable ("Table1");
554 DataTable dt2 = new DataTable ("Table2");
555 DataColumn column;
557 column = new DataColumn ("One");
558 column.DataType = typeof (int);
559 column.Unique = true;
560 dt1.Columns.Add (column);
562 for (int i = 0; i < 10; i++) {
563 DataRow row = dt1.NewRow ();
564 row ["One"] = i;
565 dt1.Rows.Add (row);
568 column = new DataColumn ("Two");
569 column.DataType = typeof (int);
570 column.Unique = true;
571 dt2.Columns.Add (column);
573 for (int i = 0; i < 10; i++) {
574 DataRow row = dt2.NewRow ();
575 row ["Two"] = i;
576 dt2.Rows.Add (row);
579 dataset.Tables.Add (dt1);
580 dataset.Tables.Add (dt2);
581 dataset.Relations.Add ("Relation", dt1.Columns ["One"], dt2.Columns ["Two"]);
583 return dataset;
585 [Test]
586 public void EndUninitializedEdit ()
588 ArrayList list = new ArrayList ();
589 BindingContext bc = new BindingContext ();
590 CurrencyManager cm = bc [list] as CurrencyManager;
592 cm.EndCurrentEdit ();
595 [Test]
596 public void CancelUninitializedEdit ()
598 ArrayList list = new ArrayList ();
599 BindingContext bc = new BindingContext ();
600 CurrencyManager cm = bc [list] as CurrencyManager;
602 cm.CancelCurrentEdit ();
605 [Test]
606 public void CheckPositionOfRelatedSibling1 ()
608 DataSet data_source = CreateRelatedDataSet ();
609 BindingContext bc = new BindingContext ();
610 CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
611 CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
613 cm.Position++;
614 cm.Position++;
616 // position is not updated
617 Assert.AreEqual (0, scm.Position, "#8");
620 [Test]
621 public void CheckPositionOfRelatedSibling2 ()
623 DataSet data_source = CreateRelatedDataSet ();
624 BindingContext bc = new BindingContext ();
625 CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
626 CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
628 Assert.AreEqual (0, cm.Position, "#1");
630 scm.Position++;
632 Assert.AreEqual (0, cm.Position, "#2");
635 int event_num;
636 int current_changed;
637 int position_changed;
638 int item_changed;
639 ItemChangedEventArgs item_changed_args;
641 void CurrentChanged (object sender, EventArgs args) { current_changed = ++event_num; /*Console.WriteLine ("current_changed = {0}", current_changed); Console.WriteLine (Environment.StackTrace);*/ }
642 void PositionChanged (object sender, EventArgs args) { position_changed = ++event_num; /*Console.WriteLine ("position_changed = {0}", position_changed); Console.WriteLine (Environment.StackTrace);*/}
643 void ItemChanged (object sender, ItemChangedEventArgs args) { item_changed = ++event_num; item_changed_args = args; /*Console.WriteLine ("item_changed = {0}, index = {1}", item_changed, args.Index); Console.WriteLine (Environment.StackTrace);*/ }
644 void ListChanged (object sender, ListChangedEventArgs args) { /*Console.WriteLine ("ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex); Console.WriteLine (Environment.StackTrace);*/ }
646 [Test]
647 public void AddNew ()
649 DataSet data_source = CreateRelatedDataSet ();
650 BindingContext bc = new BindingContext ();
651 CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
653 event_num = current_changed = position_changed = -1;
654 cm.CurrentChanged += new EventHandler (CurrentChanged);
655 cm.PositionChanged += new EventHandler (PositionChanged);
656 cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
658 Assert.AreEqual (0, cm.Position, "AddNew1");
659 Assert.AreEqual (10, cm.Count, "AddNew2");
660 Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
662 cm.AddNew ();
664 Assert.AreEqual (10, cm.Position, "AddNew3");
665 Assert.AreEqual (11, cm.Count, "AddNew4");
666 Assert.AreEqual (cm.Count, cm.List.Count, "AddNew4.5");
668 Assert.AreEqual (0, item_changed, "AddNew5");
669 Assert.AreEqual (-1, item_changed_args.Index, "AddNew6");
670 Assert.AreEqual (1, current_changed, "AddNew7");
671 Assert.AreEqual (2, position_changed, "AddNew8");
673 cm.CurrentChanged -= new EventHandler (CurrentChanged);
674 cm.PositionChanged -= new EventHandler (PositionChanged);
677 [Test]
678 public void CancelAddNew ()
680 DataSet data_source = CreateRelatedDataSet ();
681 BindingContext bc = new BindingContext ();
682 CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
684 DataView dv = cm.List as DataView;
686 event_num = current_changed = position_changed = -1;
687 cm.CurrentChanged += new EventHandler (CurrentChanged);
688 cm.PositionChanged += new EventHandler (PositionChanged);
689 cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
690 dv.ListChanged += new ListChangedEventHandler (ListChanged);
692 Assert.AreEqual (0, cm.Position, "CancelAddNew1");
693 Assert.AreEqual (10, cm.Count, "CancelAddNew2");
694 Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
696 cm.AddNew ();
698 Assert.AreEqual (0, item_changed, "CancelAddNew3");
699 Assert.AreEqual (-1, item_changed_args.Index, "CancelAddNew4");
700 Assert.AreEqual (1, current_changed, "CancelAddNew5");
701 Assert.AreEqual (2, position_changed, "CancelAddNew6");
703 cm.CancelCurrentEdit ();
705 Assert.AreEqual (6, item_changed, "CancelAddNew7");
706 Assert.AreEqual (9, item_changed_args.Index, "CancelAddNew8");
707 Assert.AreEqual (3, current_changed, "CancelAddNew9");
708 Assert.AreEqual (4, position_changed, "CancelAddNew10");
710 Assert.AreEqual (9, cm.Position, "CancelAddNew11");
711 Assert.AreEqual (10, cm.Count, "CancelAddNew12");
712 Assert.AreEqual (cm.Count, cm.List.Count, "AddNew12.5");
714 cm.CurrentChanged -= new EventHandler (CurrentChanged);
715 cm.PositionChanged -= new EventHandler (PositionChanged);
718 [Test]
719 public void EndAddNew ()
721 DataSet data_source = CreateRelatedDataSet ();
722 BindingContext bc = new BindingContext ();
723 CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
725 event_num = current_changed = position_changed = -1;
726 cm.CurrentChanged += new EventHandler (CurrentChanged);
727 cm.PositionChanged += new EventHandler (PositionChanged);
728 cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
730 Assert.AreEqual (0, cm.Position, "EndAddNew1");
731 Assert.AreEqual (10, cm.Count, "EndAddNew2");
733 cm.AddNew ();
735 Assert.AreEqual (0, item_changed, "EndAddNew3");
736 Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew4");
737 Assert.AreEqual (1, current_changed, "EndAddNew5");
738 Assert.AreEqual (2, position_changed, "EndAddNew6");
740 cm.EndCurrentEdit ();
742 // Assert.AreEqual (3, item_changed, "EndAddNew7");
743 // Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew8");
744 Assert.AreEqual (1, current_changed, "EndAddNew9");
745 Assert.AreEqual (2, position_changed, "EndAddNew10");
747 Assert.AreEqual (10, cm.Position, "EndAddNew11");
748 Assert.AreEqual (11, cm.Count, "EndAddNew12");
750 cm.CurrentChanged -= new EventHandler (CurrentChanged);
751 cm.PositionChanged -= new EventHandler (PositionChanged);
754 [Test]
755 public void AddNew2 ()
757 DataSet data_source = CreateRelatedDataSet ();
758 BindingContext bc = new BindingContext ();
759 CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
761 DataView dv = cm.List as DataView;
763 event_num = current_changed = position_changed = -1;
764 cm.CurrentChanged += new EventHandler (CurrentChanged);
765 cm.PositionChanged += new EventHandler (PositionChanged);
766 cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
767 dv.ListChanged += new ListChangedEventHandler (ListChanged);
769 Assert.AreEqual (0, cm.Position, "AddNew1");
770 Assert.AreEqual (10, cm.Count, "AddNew2");
772 cm.AddNew ();
774 Assert.AreEqual (10, cm.Position, "AddNew3");
775 Assert.AreEqual (11, cm.Count, "AddNew4");
777 // this does an implicit EndCurrentEdit
778 cm.AddNew ();
780 Assert.AreEqual (11, cm.Position, "AddNew5");
781 Assert.AreEqual (12, cm.Count, "AddNew6");
785 DataSet CreateRelatedDataSetLarge ()
787 DataSet dataset = new DataSet ("CustomerSet");
788 DataTable dt1 = new DataTable ("Customers");
789 DataTable dt2 = new DataTable ("Orders");
790 DataTable dt3 = new DataTable ("Addresses");
791 DataColumn column;
793 // customer table
794 column = new DataColumn ("CustomerID");
795 column.DataType = typeof (int);
796 column.Unique = true;
797 dt1.Columns.Add (column);
799 column = new DataColumn ("CustomerName");
800 column.DataType = typeof (string);
801 column.Unique = false;
802 dt1.Columns.Add (column);
804 // order table
805 column = new DataColumn ("OrderID");
806 column.DataType = typeof (int);
807 column.Unique = true;
808 dt2.Columns.Add (column);
810 column = new DataColumn ("ItemName");
811 column.DataType = typeof (string);
812 column.Unique = false;
813 dt2.Columns.Add (column);
815 column = new DataColumn ("CustomerID");
816 column.DataType = typeof (int);
817 column.Unique = false;
818 dt2.Columns.Add (column);
820 column = new DataColumn ("AddressID");
821 column.DataType = typeof (int);
822 column.Unique = false;
823 dt2.Columns.Add (column);
825 // address table
826 column = new DataColumn ("AddressID");
827 column.DataType = typeof (int);
828 column.Unique = true;
829 dt3.Columns.Add (column);
831 column = new DataColumn ("AddressString");
832 column.DataType = typeof (string);
833 column.Unique = false;
834 dt3.Columns.Add (column);
836 column = new DataColumn ("CustomerID");
837 column.DataType = typeof (int);
838 column.Unique = false;
839 dt3.Columns.Add (column);
841 for (int i = 0; i < 10; i ++) {
842 DataRow row = dt1.NewRow ();
843 row["CustomerID"] = i;
844 row["CustomerName"] = String.Format ("Customer Name #{0}", i);
845 dt1.Rows.Add (row);
848 int ordernum = 0;
849 for (int i = 0; i < 10; i ++) {
850 for (int j = 0; j < (i < 5 ? 3 : 5); j ++) {
851 DataRow row = dt2.NewRow ();
852 row["OrderID"] = ordernum++;
853 row["ItemName"] = String.Format ("Item order #{0}", j);
854 row["CustomerID"] = i;
855 row["AddressID"] = j;
856 dt2.Rows.Add (row);
860 int addressid = 0;
861 for (int i = 0; i < 4; i ++) {
862 for (int j = 0; j < 4; j ++) {
863 DataRow row = dt3.NewRow ();
864 row["AddressID"] = addressid++;
865 row["AddressString"] = String.Format ("Customer Address {0}", j);
866 row["CustomerID"] = i;
867 dt3.Rows.Add (row);
871 dataset.Tables.Add (dt1);
872 dataset.Tables.Add (dt2);
873 dataset.Tables.Add (dt3);
874 dataset.Relations.Add ("Customer_Orders", dt1.Columns["CustomerID"], dt2.Columns["CustomerID"]);
875 dataset.Relations.Add ("Customer_Addresses", dt1.Columns["CustomerID"], dt3.Columns["CustomerID"]);
876 dataset.Relations.Add ("Address_Orders", dt3.Columns["AddressID"], dt2.Columns["AddressID"]);
878 return dataset;
881 [Test]
882 public void RelatedCurrencyManagerTest ()
884 DataSet data_source = CreateRelatedDataSetLarge ();
885 BindingContext bc = new BindingContext ();
886 CurrencyManager cm = bc [data_source, "Customers"] as CurrencyManager;
887 CurrencyManager rcm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
889 IList list = rcm.List;
890 Assert.AreEqual (3, rcm.Count, "count1");
891 Assert.AreEqual (3, list.Count, "listcount1");
893 cm.Position = 1;
894 Assert.AreEqual (3, rcm.Count, "count2");
895 Assert.AreEqual (3, list.Count, "listcount2");
897 cm.Position = 5;
898 Assert.AreEqual (5, rcm.Count, "count3");
899 Assert.AreEqual (3, list.Count, "listcount3");
902 [Test]
903 public void TestCurrencyManagerBindings ()
905 DataSet data_source = CreateRelatedDataSetLarge ();
906 BindingContext bc = new BindingContext ();
908 CurrencyManager cm = bc [data_source] as CurrencyManager;
910 Console.WriteLine ("cm properties:");
911 foreach (PropertyDescriptor pd in cm.GetItemProperties ())
912 Console.WriteLine (" + {0}", pd.Name);
913 Console.WriteLine ();
915 Console.WriteLine ("dataset:");
916 Console.WriteLine ("cm = {0}", cm.GetType());
917 Console.WriteLine ("cm.Count = {0}", cm.Count);
918 cm.Position = 0;
919 Console.WriteLine ("cm.Current = {0}", cm.Current);
920 Console.WriteLine ("cm.Current properties");
921 foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
922 Console.WriteLine (" + {0}", pd.Name);
923 Console.WriteLine ();
925 cm = bc [data_source.Tables["Customers"]] as CurrencyManager;
926 Console.WriteLine ("datatable:");
927 Console.WriteLine ("cm = {0}", cm.GetType());
928 Console.WriteLine ("cm.Count = {0}", cm.Count);
929 cm.Position = 0;
930 Console.WriteLine ("cm.Current = {0}", cm.Current);
931 Console.WriteLine ("cm.Current properties");
932 foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
933 Console.WriteLine (" + {0}", pd.Name);
935 Console.WriteLine ();
937 DataViewManager vm = new DataViewManager (data_source);
938 Console.WriteLine ("vm properties:");
939 foreach (PropertyDescriptor pd in ((ITypedList)vm).GetItemProperties (null))
940 Console.WriteLine (" + {0}", pd.Name);
941 Console.WriteLine ();
945 Type GetFinalType (CurrencyManager cm)
947 FieldInfo fi = cm.GetType().GetField ("finalType", BindingFlags.NonPublic | BindingFlags.Instance);
949 return (Type)fi.GetValue (cm);
952 [Test]
953 public void FinalTypeTest ()
955 BindingContext bc = new BindingContext ();
956 CurrencyManager cm;
957 ArrayList al;
958 DataSet data_source = CreateRelatedDataSetLarge ();
960 /* empty arraylist */
961 al = new ArrayList ();
962 cm = bc[al] as CurrencyManager;
963 Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A1");
965 /* arraylist with a string element*/
966 al = new ArrayList ();
967 al.Add ("hi");
968 cm = bc[al] as CurrencyManager;
969 Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A2");
971 /* string array */
972 string[] s = new string[1];
973 s[0] = "hi";
974 cm = bc[s] as CurrencyManager;
975 Assert.AreEqual (typeof (string[]), GetFinalType (cm), "A3");
977 /* dataview */
978 cm = bc [data_source, "Customers"] as CurrencyManager;
979 Assert.AreEqual (typeof (DataView), GetFinalType (cm), "A4");
981 /* relatedview */
982 cm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
983 /* on MS this is a RelatedView, on Mono a RelatedDataView. both subclass from DataView, so let's check that. */
984 Assert.IsFalse (typeof (DataView) == GetFinalType (cm), "A5");
985 Assert.IsTrue (typeof (DataView).IsAssignableFrom (GetFinalType (cm)), "A6");