(SetDataGrid): call CheckValidDataSourceSystem.Windows.Forms/DataGridColumnStyle.cs
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / CurrencyManagerTest.cs
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.
19 //
20 // Copyright (c) 2006 Novell, Inc.
21 //
22 // Authors:
23 //      Jackson Harper  jackson@ximian.com
24
25 using System;
26 using System.Collections;
27 using System.ComponentModel;
28 using System.Data;
29 using System.Reflection;
30 using System.Windows.Forms;
31
32 using NUnit.Framework;
33
34 namespace MonoTests.System.Windows.Forms
35 {
36         [TestFixture]
37         public class CurrencyManagerTest
38         {
39                 [Test]
40                 public void Defaults ()
41                 {
42                         BindingContext bc = new BindingContext ();
43                         ArrayList data_source = new ArrayList ();
44                         CurrencyManager cm = bc [data_source] as CurrencyManager;
45
46                         Assert.AreSame (data_source, cm.List, "DEFAULTS1");
47                         Assert.AreEqual (0, cm.Count, "DEFAULTS2");
48                         Assert.AreEqual (-1, cm.Position, "DEFAULTS3");
49                 }
50
51                 [Test]
52                 [ExpectedException (typeof (IndexOutOfRangeException))]
53                 public void UninitializedCurrent ()
54                 {
55                         BindingContext bc = new BindingContext ();
56                         ArrayList data_source = new ArrayList ();
57                         CurrencyManager cm = bc [data_source] as CurrencyManager;
58
59                         // This line should throw
60                         Assert.AreSame (null, cm.Current, "CurrentOfEmpty");
61                 }
62
63                 [Test]
64                 public void DataSetList ()
65                 {
66                         DataSet dataset = new DataSet ("DataSet");
67                         DataTable table = new DataTable ("Table");
68                         BindingContext bc = new BindingContext ();
69                         CurrencyManager cm;
70
71                         dataset.Tables.Add (table);
72                         cm = bc [dataset] as CurrencyManager;
73
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");
79                 }
80
81                 [Test]
82                 public void DataSetListTable ()
83                 {
84                         DataSet dataset = new DataSet ("DataSet");
85                         DataTable table = new DataTable ("Table");
86                         BindingContext bc = new BindingContext ();
87                         CurrencyManager cm;
88
89                         dataset.Tables.Add (table);
90                         cm = bc [dataset, "Table"] as CurrencyManager;
91
92                         Assert.AreEqual (typeof (DataView), cm.List.GetType (), "DATASETLIST1");
93                         Assert.AreEqual (0, cm.Count, "DATASETLIST2");
94                         Assert.AreEqual (-1, cm.Position, "DATASETLIST3");
95                 }
96
97                 [Test]
98                 [ExpectedException (typeof (ArgumentException))]
99                 public void DataSetListTableBogusField ()
100                 {
101                         DataSet dataset = new DataSet ("DataSet");
102                         DataTable table = new DataTable ("Table.Column");
103                         BindingContext bc = new BindingContext ();
104                         CurrencyManager cm;
105
106                         dataset.Tables.Add (table);
107
108                         // child list can't be created
109                         cm = bc [dataset, "Table"] as CurrencyManager;
110                 }
111
112                 [Test] // bug #80107
113                 public void DataView ()
114                 {
115                         DataView dv = new DataView ();
116
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");
122
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;
129
130                         Assert.AreEqual (2, cm.Count, "#B1");
131                         Assert.AreEqual (0, cm.Position, "#B2");
132                 }
133
134                 [Test]
135                 public void MoveArrayListForward ()
136                 {
137                         ArrayList data_source = new ArrayList ();
138                         BindingContext bc = new BindingContext ();
139
140                         for (int i = 0; i < 10; i++)
141                                 data_source.Add (new object ());
142
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++;
147                         }
148
149                         cm.Position++;
150                         cm.Position++;
151
152                         Assert.AreSame (data_source [9], cm.Current, "MOVEALFEND");
153                 }
154
155                 [Test]
156                 public void MoveArrayListBackward ()
157                 {
158                         ArrayList data_source = new ArrayList ();
159                         BindingContext bc = new BindingContext ();
160
161                         for (int i = 0; i < 10; i++)
162                                 data_source.Add (new object ());
163
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--;
169                         }
170
171                         cm.Position--;
172                         cm.Position--;
173
174                         Assert.AreSame (data_source [0], cm.Current, "MOVEALBSTART");
175                 }
176
177                 [Test]
178                 public void SetPositionArrayList ()
179                 {
180                         ArrayList data_source = new ArrayList ();
181                         BindingContext bc = new BindingContext ();
182
183                         for (int i = 0; i < 10; i++)
184                                 data_source.Add (new object ());
185
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);
190                         }
191
192                         cm.Position--;
193
194                         for (int i = 0; i < 10; i++) {
195                                 cm.Position = i;
196                                 Assert.AreSame (data_source [i], cm.Current, "MOVEAL2-" + i);
197                         }
198
199                         for (int i = 5; i < 10; i++) {
200                                 cm.Position = i;
201                                 Assert.AreSame (data_source [i], cm.Current, "MOVEAL3-" + i);
202                         }
203                 }
204
205                 [Test]
206                 public void LateBuildDataTable ()
207                 {
208                         DataTable data_source = new DataTable ("Table");
209                         BindingContext bc = new BindingContext ();
210                         CurrencyManager cm = bc [data_source] as CurrencyManager;
211
212                         Assert.AreEqual (-1, cm.Position, "LATEBUILDTABLE1");
213                         Assert.AreEqual (0, cm.Count, "LATEBUILDTABLE2");
214
215                         DataColumn column = new DataColumn ("Column");
216                         column.DataType = typeof (int);
217                         data_source.Columns.Add (column);
218                         
219                         for (int i = 0; i < 10; i++) {
220                                 DataRow row = data_source.NewRow ();
221                                 row ["Column"] = i;
222                                 data_source.Rows.Add (row);
223                         }
224
225                         Assert.AreEqual (0, cm.Position, "LATEBUILDTABLE3");
226                         Assert.AreEqual (10, cm.Count, "LATEBUILDTABLE4");
227                 }
228
229                 [Test]
230                 public void LateBuildArrayList ()
231                 {
232                         ArrayList data_source = new ArrayList ();
233                         BindingContext bc = new BindingContext ();
234                         CurrencyManager cm = bc [data_source] as CurrencyManager;
235
236                         Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST1");
237                         Assert.AreEqual (0, cm.Count, "LATEBUILDLIST2");
238
239                         data_source.AddRange (new object [] { 1, 2, 3, 4, 5, 6, 7 });
240
241                         Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST3");
242                         Assert.AreEqual (7, cm.Count, "LATEBUILDLIST4");
243                 }
244
245                 [Test]
246                 public void MoveDataTableForward ()
247                 {
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");
252
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);
259                         }
260
261
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++;
267                         }
268
269                         cm.Position++;
270                         cm.Position++;
271
272                         Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "MOVETABLEF-END");
273                 }
274
275                 [Test]
276                 public void MoveDataTableBackward ()
277                 {
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");
282
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);
289                         }
290
291
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--;
298                         }
299
300                         cm.Position--;
301                         cm.Position--;
302
303                         Assert.AreEqual (0, ((DataRowView) cm.Current) ["Column"], "MOVETABLEB-START");
304                 }
305
306                 [Test]
307                 public void SetPositionDataTable ()
308                 {
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");
313
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);
320                         }
321
322
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);
328                         }
329
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);
335                         }
336                 }
337
338                 [Test]
339                 public void NavigateDataSetToTable ()
340                 {
341                         DataSet data_source = new DataSet ("DataSet");
342                         DataTable table = new DataTable ("Table");
343                         DataColumn column = new DataColumn ("Column");
344                         BindingContext bc = new BindingContext ();
345
346                         data_source.Tables.Add (table);
347
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);
354                         }
355
356                         CurrencyManager cm = bc [data_source, "Table"] as CurrencyManager;
357
358                         Assert.AreEqual (0, cm.Position, "NAVSETTOTABLE1");
359                         Assert.AreEqual (10, cm.Count, "NAVSETTOTABLE2");
360                         Assert.AreEqual (typeof (DataView), cm.List.GetType (), "NAVSETTOTABLE3");
361
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++;
367                         }
368
369                         cm.Position++;
370                         cm.Position++;
371
372                         Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "NAVSETTOTABLE-END");
373                 }
374
375                 [Test]
376                 public void NavigateDataSetToColumn ()
377                 {
378                         DataSet data_source = new DataSet ("DataSet");
379                         DataTable table = new DataTable ("Table");
380                         DataColumn column = new DataColumn ("Column");
381                         BindingContext bc = new BindingContext ();
382
383                         data_source.Tables.Add (table);
384
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);
391                         }
392
393                         CurrencyManager cm = bc [data_source, "Table.Column"] as CurrencyManager;
394
395                         Assert.AreEqual (null, cm, "NAVSETTOCOLUMN1");
396                 }
397
398                 [Test]
399                 public void NavigateDataSetToParentRelation ()
400                 {
401                         DataSet data_source = CreateRelatedDataSet ();
402                         BindingContext bc = new BindingContext ();
403                         CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
404
405                         Assert.AreEqual (0, cm.Position, "NAVSETTORELATION1");
406                         Assert.AreEqual (1, cm.Count, "NAVSETTORELATION2");
407                         Assert.IsTrue (cm.List is DataView, "NAVSETTORELATION3");
408
409                         DataRowView row = cm.Current as DataRowView;
410                         Assert.IsFalse (row == null, "NAVSETTORELATION-NULL-VALUE");
411                         Assert.AreEqual (0, row ["Two"], "NAVSETTORELATION-VALUE");
412
413                         cm.Position++;
414                         cm.Position++;
415
416                         Assert.AreEqual (0, ((DataRowView) cm.Current) ["Two"], "NAVSETTORELATION-END");
417                 }
418
419                 [Test]
420                 [ExpectedException (typeof (ArgumentException))]
421                 public void DataSetToChildRelation ()
422                 {
423                         DataSet data_source = CreateRelatedDataSet ();
424                         BindingContext bc = new BindingContext ();
425
426                         // Can't create a list on a child relation
427                         CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
428                 }
429
430                 [Test]
431                 public void DataSetToParentRelationField ()
432                 {
433                         DataSet data_source = CreateRelatedDataSet ();
434                         BindingContext bc = new BindingContext ();
435
436                         CurrencyManager cm = bc [data_source, "Table1.Relation.Two"] as CurrencyManager;
437
438                         Assert.AreEqual (null, cm, "SETTOPARENTRELATIONFIELD");
439                 }
440
441                 [Test]
442                 public void MultiColumnedRelation ()
443                 {
444                         DataSet dataset = new DataSet ();
445                         DataTable sports = new DataTable ("Sports");
446                         DataTable athletes = new DataTable ("Athletes");
447                 
448                         DataColumn column;
449                         DataRow row;
450
451                         column = new DataColumn ();
452                         column.DataType = typeof (int);
453                         column.ColumnName = "SportID";
454                         column.Unique = true;
455                         sports.Columns.Add (column);
456
457                         column = new DataColumn ();
458                         column.DataType = typeof (string);
459                         column.ColumnName = "SportName";
460                         sports.Columns.Add (column);
461
462
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);
469                         }
470                 
471                 
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);
478
479                         column = new DataColumn ();
480                         column.DataType = typeof (int);
481                         column.ColumnName = "Sport";
482                         athletes.Columns.Add (column);
483
484                         column = new DataColumn ();
485                         column.DataType = typeof (string);
486                         column.ColumnName = "AthleteName";
487                         athletes.Columns.Add (column);
488
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);
499                         }
500
501                         dataset.Tables.Add (sports);
502                         dataset.Tables.Add (athletes);
503                         dataset.Relations.Add ("AthletesSports", sports.Columns ["SportID"], athletes.Columns ["Sport"]);
504
505                         BindingContext bc = new BindingContext ();
506                         CurrencyManager cm = bc [dataset, "Sports.AthletesSports"] as CurrencyManager;
507
508                         Assert.AreEqual (0, cm.Position, "MC1");
509                         Assert.AreEqual (4, cm.Count, "MC2");
510
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");
516
517                         cm.Position++;
518
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");
524
525                         cm.Position++;
526
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");
532
533                         cm.Position++;
534
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");
540
541                         cm.Position++;
542
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");
548                 }
549
550                 private DataSet CreateRelatedDataSet ()
551                 {
552                         DataSet dataset = new DataSet ("DataSet");
553                         DataTable dt1 = new DataTable ("Table1");
554                         DataTable dt2 = new DataTable ("Table2");
555                         DataColumn column;
556
557                         column = new DataColumn ("One");
558                         column.DataType = typeof (int);
559                         column.Unique = true;
560                         dt1.Columns.Add (column);
561
562                         for (int i = 0; i < 10; i++) {
563                                 DataRow row = dt1.NewRow ();
564                                 row ["One"] = i;
565                                 dt1.Rows.Add (row);
566                         }
567                         
568                         column = new DataColumn ("Two");
569                         column.DataType = typeof (int);
570                         column.Unique = true;
571                         dt2.Columns.Add (column);
572
573                         for (int i = 0; i < 10; i++) {
574                                 DataRow row = dt2.NewRow ();
575                                 row ["Two"] = i;
576                                 dt2.Rows.Add (row);
577                         }
578
579                         dataset.Tables.Add (dt1);
580                         dataset.Tables.Add (dt2);
581                         dataset.Relations.Add ("Relation", dt1.Columns ["One"], dt2.Columns ["Two"]);
582
583                         return dataset;
584                 }
585                 [Test]
586                 public void EndUninitializedEdit ()
587                 {
588                         ArrayList list = new ArrayList ();
589                         BindingContext bc = new BindingContext ();
590                         CurrencyManager cm = bc [list] as CurrencyManager;
591
592                         cm.EndCurrentEdit ();
593                 }
594
595                 [Test]
596                 public void CancelUninitializedEdit ()
597                 {
598                         ArrayList list = new ArrayList ();
599                         BindingContext bc = new BindingContext ();
600                         CurrencyManager cm = bc [list] as CurrencyManager;
601
602                         cm.CancelCurrentEdit ();
603                 }
604
605                 [Test]
606                 public void CheckPositionOfRelatedSibling1 ()
607                 {
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;
612
613                         cm.Position++;
614                         cm.Position++;
615
616                         // position is not updated
617                         Assert.AreEqual (0, scm.Position, "#8");
618                 }
619
620                 [Test]
621                 public void CheckPositionOfRelatedSibling2 ()
622                 {
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;
627
628                         Assert.AreEqual (0, cm.Position, "#1");
629
630                         scm.Position++;
631
632                         Assert.AreEqual (0, cm.Position, "#2");
633                 }
634
635                 int event_num;
636                 int current_changed;
637                 int position_changed;
638                 int item_changed;
639                 ItemChangedEventArgs item_changed_args;
640
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);*/ }
645
646                 [Test]
647                 public void AddNew ()
648                 {
649                         DataSet data_source = CreateRelatedDataSet ();
650                         BindingContext bc = new BindingContext ();
651                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
652
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);
657
658                         Assert.AreEqual (0, cm.Position, "AddNew1");
659                         Assert.AreEqual (10, cm.Count, "AddNew2");
660                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
661
662                         cm.AddNew ();
663
664                         Assert.AreEqual (10, cm.Position, "AddNew3");
665                         Assert.AreEqual (11, cm.Count, "AddNew4");
666                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew4.5");
667
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");
672
673                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
674                         cm.PositionChanged -= new EventHandler (PositionChanged);
675                 }
676
677                 [Test]
678                 public void CancelAddNew ()
679                 {
680                         DataSet data_source = CreateRelatedDataSet ();
681                         BindingContext bc = new BindingContext ();
682                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
683
684                         DataView dv = cm.List as DataView;
685
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);
691
692                         Assert.AreEqual (0, cm.Position, "CancelAddNew1");
693                         Assert.AreEqual (10, cm.Count, "CancelAddNew2");
694                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
695
696                         cm.AddNew ();
697
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");
702
703                         cm.CancelCurrentEdit ();
704
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");
709
710                         Assert.AreEqual (9, cm.Position, "CancelAddNew11");
711                         Assert.AreEqual (10, cm.Count, "CancelAddNew12");
712                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew12.5");
713
714                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
715                         cm.PositionChanged -= new EventHandler (PositionChanged);
716                 }
717
718                 [Test]
719                 public void EndAddNew ()
720                 {
721                         DataSet data_source = CreateRelatedDataSet ();
722                         BindingContext bc = new BindingContext ();
723                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
724
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);
729
730                         Assert.AreEqual (0, cm.Position, "EndAddNew1");
731                         Assert.AreEqual (10, cm.Count, "EndAddNew2");
732
733                         cm.AddNew ();
734
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");
739
740                         cm.EndCurrentEdit ();
741
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");
746
747                         Assert.AreEqual (10, cm.Position, "EndAddNew11");
748                         Assert.AreEqual (11, cm.Count, "EndAddNew12");
749
750                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
751                         cm.PositionChanged -= new EventHandler (PositionChanged);
752                 }
753
754                 [Test]
755                 public void AddNew2 ()
756                 {
757                         DataSet data_source = CreateRelatedDataSet ();
758                         BindingContext bc = new BindingContext ();
759                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
760
761                         DataView dv = cm.List as DataView;
762
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);
768
769                         Assert.AreEqual (0, cm.Position, "AddNew1");
770                         Assert.AreEqual (10, cm.Count, "AddNew2");
771
772                         cm.AddNew ();
773
774                         Assert.AreEqual (10, cm.Position, "AddNew3");
775                         Assert.AreEqual (11, cm.Count, "AddNew4");
776
777                         // this does an implicit EndCurrentEdit
778                         cm.AddNew ();
779
780                         Assert.AreEqual (11, cm.Position, "AddNew5");
781                         Assert.AreEqual (12, cm.Count, "AddNew6");
782                 }
783
784
785                 DataSet CreateRelatedDataSetLarge ()
786                 {
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;
792
793                         // customer table
794                         column = new DataColumn ("CustomerID");
795                         column.DataType = typeof (int);
796                         column.Unique = true;
797                         dt1.Columns.Add (column);
798
799                         column = new DataColumn ("CustomerName");
800                         column.DataType = typeof (string);
801                         column.Unique = false;
802                         dt1.Columns.Add (column);
803
804                         // order table
805                         column = new DataColumn ("OrderID");
806                         column.DataType = typeof (int);
807                         column.Unique = true;
808                         dt2.Columns.Add (column);
809
810                         column = new DataColumn ("ItemName");
811                         column.DataType = typeof (string);
812                         column.Unique = false;
813                         dt2.Columns.Add (column);
814
815                         column = new DataColumn ("CustomerID");
816                         column.DataType = typeof (int);
817                         column.Unique = false;
818                         dt2.Columns.Add (column);
819
820                         column = new DataColumn ("AddressID");
821                         column.DataType = typeof (int);
822                         column.Unique = false;
823                         dt2.Columns.Add (column);
824
825                         // address table
826                         column = new DataColumn ("AddressID");
827                         column.DataType = typeof (int);
828                         column.Unique = true;
829                         dt3.Columns.Add (column);
830
831                         column = new DataColumn ("AddressString");
832                         column.DataType = typeof (string);
833                         column.Unique = false;
834                         dt3.Columns.Add (column);
835
836                         column = new DataColumn ("CustomerID");
837                         column.DataType = typeof (int);
838                         column.Unique = false;
839                         dt3.Columns.Add (column);
840
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);
846                         }
847
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);
857                                 }
858                         }
859
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);
868                                 }
869                         }
870
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"]);
877
878                         return dataset;
879                 }
880
881                 [Test]
882                 public void RelatedCurrencyManagerTest ()
883                 {
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;
888
889                         IList list = rcm.List;
890                         Assert.AreEqual (3, rcm.Count, "count1");
891                         Assert.AreEqual (3, list.Count, "listcount1");
892
893                         cm.Position = 1;
894                         Assert.AreEqual (3, rcm.Count, "count2");
895                         Assert.AreEqual (3, list.Count, "listcount2");
896
897                         cm.Position = 5;
898                         Assert.AreEqual (5, rcm.Count, "count3");
899                         Assert.AreEqual (3, list.Count, "listcount3");
900                 }
901                 
902                 [Test]
903                 public void TestCurrencyManagerBindings ()
904                 {
905                         DataSet data_source = CreateRelatedDataSetLarge ();
906                         BindingContext bc = new BindingContext ();
907
908                         CurrencyManager cm = bc [data_source] as CurrencyManager;
909
910                         Console.WriteLine ("cm properties:");
911                         foreach (PropertyDescriptor pd in cm.GetItemProperties ())
912                                 Console.WriteLine (" + {0}", pd.Name);
913                         Console.WriteLine ();
914
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 ();
924
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);
934
935                         Console.WriteLine ();
936
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 ();
942
943                 }
944
945                 Type GetFinalType (CurrencyManager cm)
946                 {
947                         FieldInfo fi = cm.GetType().GetField ("finalType", BindingFlags.NonPublic | BindingFlags.Instance);
948
949                         return (Type)fi.GetValue (cm);
950                 }
951
952                 [Test]
953                 public void FinalTypeTest ()
954                 {
955                         BindingContext bc = new BindingContext ();
956                         CurrencyManager cm;
957                         ArrayList al;
958                         DataSet data_source = CreateRelatedDataSetLarge ();
959
960                         /* empty arraylist */
961                         al = new ArrayList ();
962                         cm = bc[al] as CurrencyManager;
963                         Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A1");
964
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");
970
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");
976
977                         /* dataview */
978                         cm = bc [data_source, "Customers"] as CurrencyManager;
979                         Assert.AreEqual (typeof (DataView), GetFinalType (cm), "A4");
980
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");
986                 }
987         }
988 }