New test.
[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
26 using System;
27 using System.Data;
28 using System.Collections;
29 using System.ComponentModel;
30 using System.Reflection;
31 using System.Windows.Forms;
32
33 using NUnit.Framework;
34
35 namespace MonoTests.System.Windows.Forms {
36
37         [TestFixture]
38         public class CurrencyManagerTest {
39
40                 [Test]
41                 public void Defaults ()
42                 {
43                         BindingContext bc = new BindingContext ();
44                         ArrayList data_source = new ArrayList ();
45                         CurrencyManager cm = bc [data_source] as CurrencyManager;
46
47                         Assert.AreSame (data_source, cm.List, "DEFAULTS1");
48                         Assert.AreEqual (0, cm.Count, "DEFAULTS2");
49                         Assert.AreEqual (-1, cm.Position, "DEFAULTS3");
50                 }
51
52                 [Test]
53                 [ExpectedException (typeof (IndexOutOfRangeException))]
54                 public void UninitializedCurrent ()
55                 {
56                         BindingContext bc = new BindingContext ();
57                         ArrayList data_source = new ArrayList ();
58                         CurrencyManager cm = bc [data_source] as CurrencyManager;
59
60                         // This line should throw
61                         Assert.AreSame (null, cm.Current, "CurrentOfEmpty");
62                 }
63
64                 [Test]
65                 public void DataSetList ()
66                 {
67                         DataSet dataset = new DataSet ("DataSet");
68                         DataTable table = new DataTable ("Table");
69                         BindingContext bc = new BindingContext ();
70                         CurrencyManager cm;
71
72                         dataset.Tables.Add (table);
73                         cm = bc [dataset] as CurrencyManager;
74
75                         Assert.AreEqual (typeof (DataViewManager), cm.List.GetType (), "DATASETLIST1");
76                         Assert.AreEqual (1, cm.Count, "DATASETLIST2");
77                         Assert.AreEqual (0, cm.Position, "DATASETLIST3");
78 //                      Assert.AreEqual (typeof (DataViewManagerListItemTypeDescriptor), cm.Current.GetType (),
79 //                                      "DATASETLIST4");
80                 }
81
82                 [Test]
83                 public void DataSetListTable ()
84                 {
85                         DataSet dataset = new DataSet ("DataSet");
86                         DataTable table = new DataTable ("Table");
87                         BindingContext bc = new BindingContext ();
88                         CurrencyManager cm;
89
90                         dataset.Tables.Add (table);
91                         cm = bc [dataset, "Table"] as CurrencyManager;
92
93                         Assert.AreEqual (typeof (DataView), cm.List.GetType (), "DATASETLIST1");
94                         Assert.AreEqual (0, cm.Count, "DATASETLIST2");
95                         Assert.AreEqual (-1, cm.Position, "DATASETLIST3");
96                 }
97
98                 [Test]
99                 [ExpectedException (typeof (ArgumentException))]
100                 public void DataSetListTableBogusField ()
101                 {
102                         DataSet dataset = new DataSet ("DataSet");
103                         DataTable table = new DataTable ("Table.Column");
104                         BindingContext bc = new BindingContext ();
105                         CurrencyManager cm;
106
107                         dataset.Tables.Add (table);
108
109                         // child list can't be created
110                         cm = bc [dataset, "Table"] as CurrencyManager;
111                 }
112
113                 [Test]
114                 public void MoveArrayListForward ()
115                 {
116                         ArrayList data_source = new ArrayList ();
117                         BindingContext bc = new BindingContext ();
118
119                         for (int i = 0; i < 10; i++)
120                                 data_source.Add (new object ());
121
122                         CurrencyManager cm = bc [data_source] as CurrencyManager;
123                         for (int i = 0; i < 10; i++) {
124                                 Assert.AreSame (data_source [i], cm.Current, "MOVEALF" + i);
125                                 cm.Position++;
126                         }
127
128                         cm.Position++;
129                         cm.Position++;
130
131                         Assert.AreSame (data_source [9], cm.Current, "MOVEALFEND");
132                 }
133
134                 [Test]
135                 public void MoveArrayListBackward ()
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                         cm.Position = 9;
145                         for (int i = 9; i >= 0; i--) {
146                                 Assert.AreSame (data_source [i], cm.Current, "MOVEALB" + i);
147                                 cm.Position--;
148                         }
149
150                         cm.Position--;
151                         cm.Position--;
152
153                         Assert.AreSame (data_source [0], cm.Current, "MOVEALBSTART");
154                 }
155
156                 [Test]
157                 public void SetPositionArrayList ()
158                 {
159                         ArrayList data_source = new ArrayList ();
160                         BindingContext bc = new BindingContext ();
161
162                         for (int i = 0; i < 10; i++)
163                                 data_source.Add (new object ());
164
165                         CurrencyManager cm = bc [data_source] as CurrencyManager;
166                         for (int i = 3; i >= 0; i--) {
167                                 cm.Position = i;
168                                 Assert.AreSame (data_source [i], cm.Current, "MOVEAL1-" + i);
169                         }
170
171                         cm.Position--;
172
173                         for (int i = 0; i < 10; i++) {
174                                 cm.Position = i;
175                                 Assert.AreSame (data_source [i], cm.Current, "MOVEAL2-" + i);
176                         }
177
178                         for (int i = 5; i < 10; i++) {
179                                 cm.Position = i;
180                                 Assert.AreSame (data_source [i], cm.Current, "MOVEAL3-" + i);
181                         }
182                 }
183
184                 [Test]
185                 public void LateBuildDataTable ()
186                 {
187                         DataTable data_source = new DataTable ("Table");
188                         BindingContext bc = new BindingContext ();
189                         CurrencyManager cm = bc [data_source] as CurrencyManager;
190
191                         Assert.AreEqual (-1, cm.Position, "LATEBUILDTABLE1");
192                         Assert.AreEqual (0, cm.Count, "LATEBUILDTABLE2");
193
194                         DataColumn column = new DataColumn ("Column");
195                         column.DataType = typeof (int);
196                         data_source.Columns.Add (column);
197                         
198                         for (int i = 0; i < 10; i++) {
199                                 DataRow row = data_source.NewRow ();
200                                 row ["Column"] = i;
201                                 data_source.Rows.Add (row);
202                         }
203
204                         Assert.AreEqual (0, cm.Position, "LATEBUILDTABLE3");
205                         Assert.AreEqual (10, cm.Count, "LATEBUILDTABLE4");
206                 }
207
208                 [Test]
209                 public void LateBuildArrayList ()
210                 {
211                         ArrayList data_source = new ArrayList ();
212                         BindingContext bc = new BindingContext ();
213                         CurrencyManager cm = bc [data_source] as CurrencyManager;
214
215                         Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST1");
216                         Assert.AreEqual (0, cm.Count, "LATEBUILDLIST2");
217
218                         data_source.AddRange (new object [] { 1, 2, 3, 4, 5, 6, 7 });
219
220                         Assert.AreEqual (-1, cm.Position, "LATEBUILDLIST3");
221                         Assert.AreEqual (7, cm.Count, "LATEBUILDLIST4");
222                 }
223
224                 [Test]
225                 public void MoveDataTableForward ()
226                 {
227                         DataTable data_source = new DataTable ("Table");
228                         BindingContext bc = new BindingContext ();
229                         CurrencyManager cm = bc [data_source] as CurrencyManager;
230                         DataColumn column = new DataColumn ("Column");
231
232                         column.DataType = typeof (int);
233                         data_source.Columns.Add (column);
234                         for (int i = 0; i < 10; i++) {
235                                 DataRow row = data_source.NewRow ();
236                                 row ["Column"] = i;
237                                 data_source.Rows.Add (row);
238                         }
239
240
241                         for (int i = 0; i < 10; i++) {
242                                 DataRowView row = cm.Current as DataRowView;
243                                 Assert.IsFalse (row == null, "MOVETABLEF-NULL-" + i);
244                                 Assert.AreEqual (row ["Column"], i, "MOVETABLEF-" + i);
245                                 cm.Position++;
246                         }
247
248                         cm.Position++;
249                         cm.Position++;
250
251                         Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "MOVETABLEF-END");
252                 }
253
254                 [Test]
255                 public void MoveDataTableBackward ()
256                 {
257                         DataTable data_source = new DataTable ("Table");
258                         BindingContext bc = new BindingContext ();
259                         CurrencyManager cm = bc [data_source] as CurrencyManager;
260                         DataColumn column = new DataColumn ("Column");
261
262                         column.DataType = typeof (int);
263                         data_source.Columns.Add (column);
264                         for (int i = 0; i < 10; i++) {
265                                 DataRow row = data_source.NewRow ();
266                                 row ["Column"] = i;
267                                 data_source.Rows.Add (row);
268                         }
269
270
271                         cm.Position = 9;
272                         for (int i = 9; i >= 0; i--) {
273                                 DataRowView row = cm.Current as DataRowView;
274                                 Assert.IsFalse (row == null, "MOVETABLEB-NULL-" + i);
275                                 Assert.AreEqual (row ["Column"], i, "MOVETABLEB-" + i);
276                                 cm.Position--;
277                         }
278
279                         cm.Position--;
280                         cm.Position--;
281
282                         Assert.AreEqual (0, ((DataRowView) cm.Current) ["Column"], "MOVETABLEB-START");
283                 }
284
285                 [Test]
286                 public void SetPositionDataTable ()
287                 {
288                         DataTable data_source = new DataTable ("Table");
289                         BindingContext bc = new BindingContext ();
290                         CurrencyManager cm = bc [data_source] as CurrencyManager;
291                         DataColumn column = new DataColumn ("Column");
292
293                         column.DataType = typeof (int);
294                         data_source.Columns.Add (column);
295                         for (int i = 0; i < 10; i++) {
296                                 DataRow row = data_source.NewRow ();
297                                 row ["Column"] = i;
298                                 data_source.Rows.Add (row);
299                         }
300
301
302                         for (int i = 5; i < 10; i++) {
303                                 cm.Position = i;
304                                 DataRowView row = cm.Current as DataRowView;
305                                 Assert.IsFalse (row == null, "SETTABLE1-NULL-" + i);
306                                 Assert.AreEqual (row ["Column"], i, "SETTABLE1-" + i);
307                         }
308
309                         for (int i = 5; i >= 0; i--) {
310                                 cm.Position = i;
311                                 DataRowView row = cm.Current as DataRowView;
312                                 Assert.IsFalse (row == null, "SETTABLE2-NULL-" + i);
313                                 Assert.AreEqual (row ["Column"], i, "SETTABLE2-" + i);
314                         }
315                 }
316
317                 [Test]
318                 public void NavigateDataSetToTable ()
319                 {
320                         DataSet data_source = new DataSet ("DataSet");
321                         DataTable table = new DataTable ("Table");
322                         DataColumn column = new DataColumn ("Column");
323                         BindingContext bc = new BindingContext ();
324
325                         data_source.Tables.Add (table);
326
327                         column.DataType = typeof (int);
328                         table.Columns.Add (column);
329                         for (int i = 0; i < 10; i++) {
330                                 DataRow row = table.NewRow ();
331                                 row ["Column"] = i;
332                                 table.Rows.Add (row);
333                         }
334
335                         CurrencyManager cm = bc [data_source, "Table"] as CurrencyManager;
336
337                         Assert.AreEqual (0, cm.Position, "NAVSETTOTABLE1");
338                         Assert.AreEqual (10, cm.Count, "NAVSETTOTABLE2");
339                         Assert.AreEqual (typeof (DataView), cm.List.GetType (), "NAVSETTOTABLE3");
340
341                         for (int i = 0; i < 10; i++) {
342                                 DataRowView row = cm.Current as DataRowView;
343                                 Assert.IsFalse (row == null, "NAVSETTOTABLE-NULL-" + i);
344                                 Assert.AreEqual (i, row ["Column"], "NAVSETTOTABLE-" + i);
345                                 cm.Position++;
346                         }
347
348                         cm.Position++;
349                         cm.Position++;
350
351                         Assert.AreEqual (9, ((DataRowView) cm.Current) ["Column"], "NAVSETTOTABLE-END");
352                 }
353
354                 [Test]
355                 public void NavigateDataSetToColumn ()
356                 {
357                         DataSet data_source = new DataSet ("DataSet");
358                         DataTable table = new DataTable ("Table");
359                         DataColumn column = new DataColumn ("Column");
360                         BindingContext bc = new BindingContext ();
361
362                         data_source.Tables.Add (table);
363
364                         column.DataType = typeof (int);
365                         table.Columns.Add (column);
366                         for (int i = 0; i < 10; i++) {
367                                 DataRow row = table.NewRow ();
368                                 row ["Column"] = i;
369                                 table.Rows.Add (row);
370                         }
371
372                         CurrencyManager cm = bc [data_source, "Table.Column"] as CurrencyManager;
373
374                         Assert.AreEqual (null, cm, "NAVSETTOCOLUMN1");
375                 }
376
377                 [Test]
378                 public void NavigateDataSetToParentRelation ()
379                 {
380                         DataSet data_source = CreateRelatedDataSet ();
381                         BindingContext bc = new BindingContext ();
382                         CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
383
384                         Assert.AreEqual (0, cm.Position, "NAVSETTORELATION1");
385                         Assert.AreEqual (1, cm.Count, "NAVSETTORELATION2");
386                         Assert.IsTrue (cm.List is DataView, "NAVSETTORELATION3");
387
388                         DataRowView row = cm.Current as DataRowView;
389                         Assert.IsFalse (row == null, "NAVSETTORELATION-NULL-VALUE");
390                         Assert.AreEqual (0, row ["Two"], "NAVSETTORELATION-VALUE");
391
392                         cm.Position++;
393                         cm.Position++;
394
395                         Assert.AreEqual (0, ((DataRowView) cm.Current) ["Two"], "NAVSETTORELATION-END");
396                 }
397
398                 [Test]
399                 [ExpectedException (typeof (ArgumentException))]
400                 public void DataSetToChildRelation ()
401                 {
402                         DataSet data_source = CreateRelatedDataSet ();
403                         BindingContext bc = new BindingContext ();
404
405                         // Can't create a list on a child relation
406                         CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
407                 }
408
409                 [Test]
410                 public void DataSetToParentRelationField ()
411                 {
412                         DataSet data_source = CreateRelatedDataSet ();
413                         BindingContext bc = new BindingContext ();
414
415                         CurrencyManager cm = bc [data_source, "Table1.Relation.Two"] as CurrencyManager;
416
417                         Assert.AreEqual (null, cm, "SETTOPARENTRELATIONFIELD");
418                 }
419
420                 [Test]
421                 public void MultiColumnedRelation ()
422                 {
423                         DataSet dataset = new DataSet ();
424                         DataTable sports = new DataTable ("Sports");
425                         DataTable athletes = new DataTable ("Athletes");
426                 
427                         DataColumn column;
428                         DataRow row;
429
430                         column = new DataColumn ();
431                         column.DataType = typeof (int);
432                         column.ColumnName = "SportID";
433                         column.Unique = true;
434                         sports.Columns.Add (column);
435
436                         column = new DataColumn ();
437                         column.DataType = typeof (string);
438                         column.ColumnName = "SportName";
439                         sports.Columns.Add (column);
440
441
442                         string [] sports_names = new string [] { "Hockey", "Baseball", "Basketball", "Football", "Boxing", "Surfing" };
443                         for (int i = 0; i < sports_names.Length; i++) {
444                                 row = sports.NewRow ();
445                                 row ["SportID"] = i;
446                                 row ["SportName"] = sports_names [i];
447                                 sports.Rows.Add (row);
448                         }
449                 
450                 
451                         // Athletes table
452                         column = new DataColumn ();
453                         column.DataType = typeof (int);
454                         column.ColumnName = "AthleteID";
455                         column.Unique = true;
456                         athletes.Columns.Add (column);
457
458                         column = new DataColumn ();
459                         column.DataType = typeof (int);
460                         column.ColumnName = "Sport";
461                         athletes.Columns.Add (column);
462
463                         column = new DataColumn ();
464                         column.DataType = typeof (string);
465                         column.ColumnName = "AthleteName";
466                         athletes.Columns.Add (column);
467
468                         string [] athlete_names = new string [] { "@alp", "@lupus", "@tjfontaine", "duncan", "marv", "WindowsUninstall",
469                                                                   "@jackson", "@migHome", "_Synced[work]", "GodZhila", "Raboo",
470                                                                   "@jchambers", "@mkestner", "barbosa", "IzeBurn", "squinky86",
471                                                                   "@kangaroo",  "@paco", "Demian", "logiclrd", "tenshiKur0" };
472                         for (int i = 0; i < athlete_names.Length; i++) {
473                                 row = athletes.NewRow ();
474                                 row ["AthleteID"] = i;
475                                 row ["Sport"] = i % sports_names.Length;
476                                 row ["AthleteName"] = athlete_names [i];
477                                 athletes.Rows.Add (row);
478                         }
479
480                         dataset.Tables.Add (sports);
481                         dataset.Tables.Add (athletes);
482                         dataset.Relations.Add ("AthletesSports", sports.Columns ["SportID"], athletes.Columns ["Sport"]);
483
484                         BindingContext bc = new BindingContext ();
485                         CurrencyManager cm = bc [dataset, "Sports.AthletesSports"] as CurrencyManager;
486
487                         Assert.AreEqual (0, cm.Position, "MC1");
488                         Assert.AreEqual (4, cm.Count, "MC2");
489
490                         DataRowView rowview = cm.Current as DataRowView;
491                         Assert.IsFalse (rowview == null, "MC3");
492                         Assert.AreEqual (0, rowview ["AthleteID"], "MC4");
493                         Assert.AreEqual ("@alp", rowview ["AthleteName"], "MC5");
494                         Assert.AreEqual (0, rowview ["Sport"], "MC6");
495
496                         cm.Position++;
497
498                         rowview = cm.Current as DataRowView;
499                         Assert.IsFalse (rowview == null, "MC7");
500                         Assert.AreEqual (6, rowview ["AthleteID"], "MC8");
501                         Assert.AreEqual ("@jackson", rowview ["AthleteName"], "MC9");
502                         Assert.AreEqual (0, rowview ["Sport"], "MC10");
503
504                         cm.Position++;
505
506                         rowview = cm.Current as DataRowView;
507                         Assert.IsFalse (rowview == null, "MC11");
508                         Assert.AreEqual (12, rowview ["AthleteID"], "MC12");
509                         Assert.AreEqual ("@mkestner", rowview ["AthleteName"], "MC13");
510                         Assert.AreEqual (0, rowview ["Sport"], "MC14");
511
512                         cm.Position++;
513
514                         rowview = cm.Current as DataRowView;
515                         Assert.IsFalse (rowview == null, "MC15");
516                         Assert.AreEqual (18, rowview ["AthleteID"], "MC16");
517                         Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC17");
518                         Assert.AreEqual (0, rowview ["Sport"], "MC18");
519
520                         cm.Position++;
521
522                         rowview = cm.Current as DataRowView;
523                         Assert.IsFalse (rowview == null, "MC19");
524                         Assert.AreEqual (18, rowview ["AthleteID"], "MC20");
525                         Assert.AreEqual ("Demian", rowview ["AthleteName"], "MC21");
526                         Assert.AreEqual (0, rowview ["Sport"], "MC22");
527                 }
528
529                 private DataSet CreateRelatedDataSet ()
530                 {
531                         DataSet dataset = new DataSet ("DataSet");
532                         DataTable dt1 = new DataTable ("Table1");
533                         DataTable dt2 = new DataTable ("Table2");
534                         DataColumn column;
535
536                         column = new DataColumn ("One");
537                         column.DataType = typeof (int);
538                         column.Unique = true;
539                         dt1.Columns.Add (column);
540
541                         for (int i = 0; i < 10; i++) {
542                                 DataRow row = dt1.NewRow ();
543                                 row ["One"] = i;
544                                 dt1.Rows.Add (row);
545                         }
546                         
547                         column = new DataColumn ("Two");
548                         column.DataType = typeof (int);
549                         column.Unique = true;
550                         dt2.Columns.Add (column);
551
552                         for (int i = 0; i < 10; i++) {
553                                 DataRow row = dt2.NewRow ();
554                                 row ["Two"] = i;
555                                 dt2.Rows.Add (row);
556                         }
557
558                         dataset.Tables.Add (dt1);
559                         dataset.Tables.Add (dt2);
560                         dataset.Relations.Add ("Relation", dt1.Columns ["One"], dt2.Columns ["Two"]);
561
562                         return dataset;
563                 }
564                 [Test]
565                 public void EndUninitializedEdit ()
566                 {
567                         ArrayList list = new ArrayList ();
568                         BindingContext bc = new BindingContext ();
569                         CurrencyManager cm = bc [list] as CurrencyManager;
570
571                         cm.EndCurrentEdit ();
572                 }
573
574                 [Test]
575                 public void CancelUninitializedEdit ()
576                 {
577                         ArrayList list = new ArrayList ();
578                         BindingContext bc = new BindingContext ();
579                         CurrencyManager cm = bc [list] as CurrencyManager;
580
581                         cm.CancelCurrentEdit ();
582                 }
583
584                 [Test]
585                 public void CheckPositionOfRelatedSibling1 ()
586                 {
587                         DataSet data_source = CreateRelatedDataSet ();
588                         BindingContext bc = new BindingContext ();
589                         CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
590                         CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
591
592                         cm.Position++;
593                         cm.Position++;
594
595                         // position is not updated
596                         Assert.AreEqual (0, scm.Position, "#8");
597                 }
598
599                 [Test]
600                 public void CheckPositionOfRelatedSibling2 ()
601                 {
602                         DataSet data_source = CreateRelatedDataSet ();
603                         BindingContext bc = new BindingContext ();
604                         CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
605                         CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
606
607                         Assert.AreEqual (0, cm.Position, "#1");
608
609                         scm.Position++;
610
611                         Assert.AreEqual (0, cm.Position, "#2");
612                 }
613
614                 int event_num;
615                 int current_changed;
616                 int position_changed;
617                 int item_changed;
618                 ItemChangedEventArgs item_changed_args;
619
620                 void CurrentChanged (object sender, EventArgs args) { current_changed = ++event_num;  /*Console.WriteLine ("current_changed = {0}", current_changed); Console.WriteLine (Environment.StackTrace);*/ }
621                 void PositionChanged (object sender, EventArgs args) { position_changed = ++event_num;  /*Console.WriteLine ("position_changed = {0}", position_changed); Console.WriteLine (Environment.StackTrace);*/}
622                 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);*/ }
623                 void ListChanged (object sender, ListChangedEventArgs args) { /*Console.WriteLine ("ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex); Console.WriteLine (Environment.StackTrace);*/ }
624
625                 [Test]
626                 public void AddNew ()
627                 {
628                         DataSet data_source = CreateRelatedDataSet ();
629                         BindingContext bc = new BindingContext ();
630                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
631
632                         event_num = current_changed = position_changed = -1;
633                         cm.CurrentChanged += new EventHandler (CurrentChanged);
634                         cm.PositionChanged += new EventHandler (PositionChanged);
635                         cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
636
637                         Assert.AreEqual (0, cm.Position, "AddNew1");
638                         Assert.AreEqual (10, cm.Count, "AddNew2");
639                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
640
641                         cm.AddNew ();
642
643                         Assert.AreEqual (10, cm.Position, "AddNew3");
644                         Assert.AreEqual (11, cm.Count, "AddNew4");
645                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew4.5");
646
647                         Assert.AreEqual (0, item_changed, "AddNew5");
648                         Assert.AreEqual (-1, item_changed_args.Index, "AddNew6");
649                         Assert.AreEqual (1, current_changed, "AddNew7");
650                         Assert.AreEqual (2, position_changed, "AddNew8");
651
652                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
653                         cm.PositionChanged -= new EventHandler (PositionChanged);
654                 }
655
656                 [Test]
657                 public void CancelAddNew ()
658                 {
659                         DataSet data_source = CreateRelatedDataSet ();
660                         BindingContext bc = new BindingContext ();
661                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
662
663                         DataView dv = cm.List as DataView;
664
665                         event_num = current_changed = position_changed = -1;
666                         cm.CurrentChanged += new EventHandler (CurrentChanged);
667                         cm.PositionChanged += new EventHandler (PositionChanged);
668                         cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
669                         dv.ListChanged += new ListChangedEventHandler (ListChanged);
670
671                         Assert.AreEqual (0, cm.Position, "CancelAddNew1");
672                         Assert.AreEqual (10, cm.Count, "CancelAddNew2");
673                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
674
675                         cm.AddNew ();
676
677                         Assert.AreEqual (0, item_changed, "CancelAddNew3");
678                         Assert.AreEqual (-1, item_changed_args.Index, "CancelAddNew4");
679                         Assert.AreEqual (1, current_changed, "CancelAddNew5");
680                         Assert.AreEqual (2, position_changed, "CancelAddNew6");
681
682                         cm.CancelCurrentEdit ();
683
684                         Assert.AreEqual (6, item_changed, "CancelAddNew7");
685                         Assert.AreEqual (9, item_changed_args.Index, "CancelAddNew8");
686                         Assert.AreEqual (3, current_changed, "CancelAddNew9");
687                         Assert.AreEqual (4, position_changed, "CancelAddNew10");
688
689                         Assert.AreEqual (9, cm.Position, "CancelAddNew11");
690                         Assert.AreEqual (10, cm.Count, "CancelAddNew12");
691                         Assert.AreEqual (cm.Count, cm.List.Count, "AddNew12.5");
692
693                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
694                         cm.PositionChanged -= new EventHandler (PositionChanged);
695                 }
696
697                 [Test]
698                 public void EndAddNew ()
699                 {
700                         DataSet data_source = CreateRelatedDataSet ();
701                         BindingContext bc = new BindingContext ();
702                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
703
704                         event_num = current_changed = position_changed = -1;
705                         cm.CurrentChanged += new EventHandler (CurrentChanged);
706                         cm.PositionChanged += new EventHandler (PositionChanged);
707                         cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
708
709                         Assert.AreEqual (0, cm.Position, "EndAddNew1");
710                         Assert.AreEqual (10, cm.Count, "EndAddNew2");
711
712                         cm.AddNew ();
713
714                         Assert.AreEqual (0, item_changed, "EndAddNew3");
715                         Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew4");
716                         Assert.AreEqual (1, current_changed, "EndAddNew5");
717                         Assert.AreEqual (2, position_changed, "EndAddNew6");
718
719                         cm.EndCurrentEdit ();
720
721                         //                      Assert.AreEqual (3, item_changed, "EndAddNew7");
722                         //                      Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew8");
723                         Assert.AreEqual (1, current_changed, "EndAddNew9");
724                         Assert.AreEqual (2, position_changed, "EndAddNew10");
725
726                         Assert.AreEqual (10, cm.Position, "EndAddNew11");
727                         Assert.AreEqual (11, cm.Count, "EndAddNew12");
728
729                         cm.CurrentChanged -= new EventHandler (CurrentChanged);
730                         cm.PositionChanged -= new EventHandler (PositionChanged);
731                 }
732
733                 [Test]
734                 public void AddNew2 ()
735                 {
736                         DataSet data_source = CreateRelatedDataSet ();
737                         BindingContext bc = new BindingContext ();
738                         CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
739
740                         DataView dv = cm.List as DataView;
741
742                         event_num = current_changed = position_changed = -1;
743                         cm.CurrentChanged += new EventHandler (CurrentChanged);
744                         cm.PositionChanged += new EventHandler (PositionChanged);
745                         cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
746                         dv.ListChanged += new ListChangedEventHandler (ListChanged);
747
748                         Assert.AreEqual (0, cm.Position, "AddNew1");
749                         Assert.AreEqual (10, cm.Count, "AddNew2");
750
751                         cm.AddNew ();
752
753                         Assert.AreEqual (10, cm.Position, "AddNew3");
754                         Assert.AreEqual (11, cm.Count, "AddNew4");
755
756                         // this does an implicit EndCurrentEdit
757                         cm.AddNew ();
758
759                         Assert.AreEqual (11, cm.Position, "AddNew5");
760                         Assert.AreEqual (12, cm.Count, "AddNew6");
761                 }
762
763
764                 DataSet CreateRelatedDataSetLarge ()
765                 {
766                         DataSet dataset = new DataSet ("CustomerSet");
767                         DataTable dt1 = new DataTable ("Customers");
768                         DataTable dt2 = new DataTable ("Orders");
769                         DataTable dt3 = new DataTable ("Addresses");
770                         DataColumn column;
771
772                         // customer table
773                         column = new DataColumn ("CustomerID");
774                         column.DataType = typeof (int);
775                         column.Unique = true;
776                         dt1.Columns.Add (column);
777
778                         column = new DataColumn ("CustomerName");
779                         column.DataType = typeof (string);
780                         column.Unique = false;
781                         dt1.Columns.Add (column);
782
783                         // order table
784                         column = new DataColumn ("OrderID");
785                         column.DataType = typeof (int);
786                         column.Unique = true;
787                         dt2.Columns.Add (column);
788
789                         column = new DataColumn ("ItemName");
790                         column.DataType = typeof (string);
791                         column.Unique = false;
792                         dt2.Columns.Add (column);
793
794                         column = new DataColumn ("CustomerID");
795                         column.DataType = typeof (int);
796                         column.Unique = false;
797                         dt2.Columns.Add (column);
798
799                         column = new DataColumn ("AddressID");
800                         column.DataType = typeof (int);
801                         column.Unique = false;
802                         dt2.Columns.Add (column);
803
804                         // address table
805                         column = new DataColumn ("AddressID");
806                         column.DataType = typeof (int);
807                         column.Unique = true;
808                         dt3.Columns.Add (column);
809
810                         column = new DataColumn ("AddressString");
811                         column.DataType = typeof (string);
812                         column.Unique = false;
813                         dt3.Columns.Add (column);
814
815                         column = new DataColumn ("CustomerID");
816                         column.DataType = typeof (int);
817                         column.Unique = false;
818                         dt3.Columns.Add (column);
819
820                         for (int i = 0; i < 10; i ++) {
821                                 DataRow row = dt1.NewRow ();
822                                 row["CustomerID"] = i;
823                                 row["CustomerName"] = String.Format ("Customer Name #{0}", i);
824                                 dt1.Rows.Add (row);
825                         }
826
827                         int ordernum = 0;
828                         for (int i = 0; i < 10; i ++) {
829                                 for (int j = 0; j < (i < 5 ? 3 : 5); j ++) {
830                                         DataRow row = dt2.NewRow ();
831                                         row["OrderID"] = ordernum++;
832                                         row["ItemName"] = String.Format ("Item order #{0}", j);
833                                         row["CustomerID"] = i;
834                                         row["AddressID"] = j;
835                                         dt2.Rows.Add (row);
836                                 }
837                         }
838
839                         int addressid = 0;
840                         for (int i = 0; i < 4; i ++) {
841                                 for (int j = 0; j < 4; j ++) {
842                                         DataRow row = dt3.NewRow ();
843                                         row["AddressID"] = addressid++;
844                                         row["AddressString"] = String.Format ("Customer Address {0}", j);
845                                         row["CustomerID"] = i;
846                                         dt3.Rows.Add (row);
847                                 }
848                         }
849
850                         dataset.Tables.Add (dt1);
851                         dataset.Tables.Add (dt2);
852                         dataset.Tables.Add (dt3);
853                         dataset.Relations.Add ("Customer_Orders", dt1.Columns["CustomerID"], dt2.Columns["CustomerID"]);
854                         dataset.Relations.Add ("Customer_Addresses", dt1.Columns["CustomerID"], dt3.Columns["CustomerID"]);
855                         dataset.Relations.Add ("Address_Orders", dt3.Columns["AddressID"], dt2.Columns["AddressID"]);
856
857                         return dataset;
858                 }
859
860                 [Test]
861                 public void RelatedCurrencyManagerTest ()
862                 {
863                         DataSet data_source = CreateRelatedDataSetLarge ();
864                         BindingContext bc = new BindingContext ();
865                         CurrencyManager cm = bc [data_source, "Customers"] as CurrencyManager;
866                         CurrencyManager rcm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
867
868                         IList list = rcm.List;
869                         Assert.AreEqual (3, rcm.Count, "count1");
870                         Assert.AreEqual (3, list.Count, "listcount1");
871
872                         cm.Position = 1;
873                         Assert.AreEqual (3, rcm.Count, "count2");
874                         Assert.AreEqual (3, list.Count, "listcount2");
875
876                         cm.Position = 5;
877                         Assert.AreEqual (5, rcm.Count, "count3");
878                         Assert.AreEqual (3, list.Count, "listcount3");
879                 }
880                 
881                 [Test]
882                 public void TestCurrencyManagerBindings ()
883                 {
884                         DataSet data_source = CreateRelatedDataSetLarge ();
885                         BindingContext bc = new BindingContext ();
886
887                         CurrencyManager cm = bc [data_source] as CurrencyManager;
888
889                         Console.WriteLine ("cm properties:");
890                         foreach (PropertyDescriptor pd in cm.GetItemProperties ())
891                                 Console.WriteLine (" + {0}", pd.Name);
892                         Console.WriteLine ();
893
894                         Console.WriteLine ("dataset:");
895                         Console.WriteLine ("cm = {0}", cm.GetType());
896                         Console.WriteLine ("cm.Count = {0}", cm.Count);
897                         cm.Position = 0;
898                         Console.WriteLine ("cm.Current = {0}", cm.Current);
899                         Console.WriteLine ("cm.Current properties");
900                         foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
901                                 Console.WriteLine (" + {0}", pd.Name);
902                         Console.WriteLine ();
903
904                         cm = bc [data_source.Tables["Customers"]] as CurrencyManager;
905                         Console.WriteLine ("datatable:");
906                         Console.WriteLine ("cm = {0}", cm.GetType());
907                         Console.WriteLine ("cm.Count = {0}", cm.Count);
908                         cm.Position = 0;
909                         Console.WriteLine ("cm.Current = {0}", cm.Current);
910                         Console.WriteLine ("cm.Current properties");
911                         foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
912                                 Console.WriteLine (" + {0}", pd.Name);
913
914                         Console.WriteLine ();
915
916                         DataViewManager vm = new DataViewManager (data_source);
917                         Console.WriteLine ("vm properties:");
918                         foreach (PropertyDescriptor pd in ((ITypedList)vm).GetItemProperties (null))
919                                 Console.WriteLine (" + {0}", pd.Name);
920                         Console.WriteLine ();
921
922                 }
923
924                 Type GetFinalType (CurrencyManager cm)
925                 {
926                         FieldInfo fi = cm.GetType().GetField ("finalType", BindingFlags.NonPublic | BindingFlags.Instance);
927
928                         return (Type)fi.GetValue (cm);
929                 }
930
931                 [Test]
932                 public void FinalTypeTest ()
933                 {
934                         BindingContext bc = new BindingContext ();
935                         CurrencyManager cm;
936                         ArrayList al;
937                         DataSet data_source = CreateRelatedDataSetLarge ();
938
939                         /* empty arraylist */
940                         al = new ArrayList ();
941                         cm = bc[al] as CurrencyManager;
942                         Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A1");
943
944                         /* arraylist with a string element*/
945                         al = new ArrayList ();
946                         al.Add ("hi");
947                         cm = bc[al] as CurrencyManager;
948                         Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A2");
949
950                         /* string array */
951                         string[] s = new string[1];
952                         s[0] = "hi";
953                         cm = bc[s] as CurrencyManager;
954                         Assert.AreEqual (typeof (string[]), GetFinalType (cm), "A3");
955
956                         /* dataview */
957                         cm = bc [data_source, "Customers"] as CurrencyManager;
958                         Assert.AreEqual (typeof (DataView), GetFinalType (cm), "A4");
959
960                         /* relatedview */
961                         cm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
962                         /* on MS this is a RelatedView, on Mono a RelatedDataView.  both subclass from DataView, so let's check that. */
963                         Assert.IsFalse (typeof (DataView) == GetFinalType (cm), "A5");
964                         Assert.IsTrue (typeof (DataView).IsAssignableFrom (GetFinalType (cm)), "A6");
965                 }
966         }
967 }
968