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:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
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.
23 // Jackson Harper jackson@ximian.com
26 using System
.Collections
;
27 using System
.ComponentModel
;
29 using System
.Reflection
;
30 using System
.Windows
.Forms
;
32 using NUnit
.Framework
;
34 namespace MonoTests
.System
.Windows
.Forms
37 public class CurrencyManagerTest
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");
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");
64 public void DataSetList ()
66 DataSet dataset
= new DataSet ("DataSet");
67 DataTable table
= new DataTable ("Table");
68 BindingContext bc
= new BindingContext ();
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 (),
82 public void DataSetListTable ()
84 DataSet dataset
= new DataSet ("DataSet");
85 DataTable table
= new DataTable ("Table");
86 BindingContext bc
= new BindingContext ();
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");
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 ();
106 dataset
.Tables
.Add (table
);
108 // child list can't be created
109 cm
= bc
[dataset
, "Table"] as CurrencyManager
;
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" }
);
130 Assert
.AreEqual (2, cm
.Count
, "#B1");
131 Assert
.AreEqual (0, cm
.Position
, "#B2");
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
);
152 Assert
.AreSame (data_source
[9], cm
.Current
, "MOVEALFEND");
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
;
166 for (int i
= 9; i
>= 0; i
--) {
167 Assert
.AreSame (data_source
[i
], cm
.Current
, "MOVEALB" + i
);
174 Assert
.AreSame (data_source
[0], cm
.Current
, "MOVEALBSTART");
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
--) {
189 Assert
.AreSame (data_source
[i
], cm
.Current
, "MOVEAL1-" + i
);
194 for (int i
= 0; i
< 10; i
++) {
196 Assert
.AreSame (data_source
[i
], cm
.Current
, "MOVEAL2-" + i
);
199 for (int i
= 5; i
< 10; i
++) {
201 Assert
.AreSame (data_source
[i
], cm
.Current
, "MOVEAL3-" + i
);
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 ();
222 data_source
.Rows
.Add (row
);
225 Assert
.AreEqual (0, cm
.Position
, "LATEBUILDTABLE3");
226 Assert
.AreEqual (10, cm
.Count
, "LATEBUILDTABLE4");
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");
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 ();
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
);
272 Assert
.AreEqual (9, ((DataRowView
) cm
.Current
) ["Column"], "MOVETABLEF-END");
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 ();
288 data_source
.Rows
.Add (row
);
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
);
303 Assert
.AreEqual (0, ((DataRowView
) cm
.Current
) ["Column"], "MOVETABLEB-START");
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 ();
319 data_source
.Rows
.Add (row
);
323 for (int i
= 5; i
< 10; 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
--) {
332 DataRowView row
= cm
.Current
as DataRowView
;
333 Assert
.IsFalse (row
== null, "SETTABLE2-NULL-" + i
);
334 Assert
.AreEqual (row
["Column"], i
, "SETTABLE2-" + i
);
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 ();
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
);
372 Assert
.AreEqual (9, ((DataRowView
) cm
.Current
) ["Column"], "NAVSETTOTABLE-END");
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 ();
390 table
.Rows
.Add (row
);
393 CurrencyManager cm
= bc
[data_source
, "Table.Column"] as CurrencyManager
;
395 Assert
.AreEqual (null, cm
, "NAVSETTOCOLUMN1");
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");
416 Assert
.AreEqual (0, ((DataRowView
) cm
.Current
) ["Two"], "NAVSETTORELATION-END");
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
;
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");
442 public void MultiColumnedRelation ()
444 DataSet dataset
= new DataSet ();
445 DataTable sports
= new DataTable ("Sports");
446 DataTable athletes
= new DataTable ("Athletes");
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 ();
467 row
["SportName"] = sports_names
[i
];
468 sports
.Rows
.Add (row
);
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");
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");
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");
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");
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");
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 ();
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 ();
579 dataset
.Tables
.Add (dt1
);
580 dataset
.Tables
.Add (dt2
);
581 dataset
.Relations
.Add ("Relation", dt1
.Columns
["One"], dt2
.Columns
["Two"]);
586 public void EndUninitializedEdit ()
588 ArrayList list
= new ArrayList ();
589 BindingContext bc
= new BindingContext ();
590 CurrencyManager cm
= bc
[list
] as CurrencyManager
;
592 cm
.EndCurrentEdit ();
596 public void CancelUninitializedEdit ()
598 ArrayList list
= new ArrayList ();
599 BindingContext bc
= new BindingContext ();
600 CurrencyManager cm
= bc
[list
] as CurrencyManager
;
602 cm
.CancelCurrentEdit ();
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
;
616 // position is not updated
617 Assert
.AreEqual (0, scm
.Position
, "#8");
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");
632 Assert
.AreEqual (0, cm
.Position
, "#2");
637 int position_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
);*/
}
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");
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
);
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");
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
);
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");
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
);
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");
774 Assert
.AreEqual (10, cm
.Position
, "AddNew3");
775 Assert
.AreEqual (11, cm
.Count
, "AddNew4");
777 // this does an implicit EndCurrentEdit
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");
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
);
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
);
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
);
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
;
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
;
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"]);
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");
894 Assert
.AreEqual (3, rcm
.Count
, "count2");
895 Assert
.AreEqual (3, list
.Count
, "listcount2");
898 Assert
.AreEqual (5, rcm
.Count
, "count3");
899 Assert
.AreEqual (3, list
.Count
, "listcount3");
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
);
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
);
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
);
953 public void FinalTypeTest ()
955 BindingContext bc
= new BindingContext ();
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 ();
968 cm
= bc
[al
] as CurrencyManager
;
969 Assert
.AreEqual (typeof (ArrayList
), GetFinalType (cm
), "A2");
972 string[] s
= new string[1];
974 cm
= bc
[s
] as CurrencyManager
;
975 Assert
.AreEqual (typeof (string[]), GetFinalType (cm
), "A3");
978 cm
= bc
[data_source
, "Customers"] as CurrencyManager
;
979 Assert
.AreEqual (typeof (DataView
), GetFinalType (cm
), "A4");
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");