for TARGET_J2EE only:
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / DataBindingTests.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) 2007 Novell, Inc.
21 //
22 // Authors:
23 //      Chris Toshok    toshok@ximian.com
24
25 #define WITH_BINDINGS
26
27 using System;
28 using System.Collections;
29 using System.ComponentModel;
30 using System.Data;
31 using System.Reflection;
32 using System.Windows.Forms;
33
34 using NUnit.Framework;
35 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
36
37 namespace MonoTests.System.Windows.Forms.DataBinding
38 {
39         public class DataBindingTest
40         {
41                 protected int event_num;
42                 protected string event_log = "";
43
44                 protected void CurrentChanged (object sender, EventArgs args)
45                 {
46                         //Console.WriteLine (Environment.StackTrace);
47                         event_log += String.Format ("{0}: CurrentChanged\n", event_num++);
48                 }
49                 protected void PositionChanged (object sender, EventArgs args)
50                 {
51                         //Console.WriteLine (Environment.StackTrace);
52                         event_log += String.Format ("{0}: PositionChanged (to {1})\n", event_num++, ((CurrencyManager)sender).Position);
53                 }
54                 protected void ItemChanged (object sender, ItemChangedEventArgs args)
55                 {
56                         //Console.WriteLine (Environment.StackTrace);
57                         event_log += String.Format ("{0}: ItemChanged (index = {1})\n", event_num++, args.Index);
58                 }
59                 protected void ListChanged (object sender, ListChangedEventArgs args)
60                 {
61                         //Console.WriteLine (Environment.StackTrace);
62                         event_log += String.Format ("{0}: ListChanged ({1}, {2}, {3})\n", event_num++, args.ListChangedType, args.OldIndex, args.NewIndex);
63                 }
64                 protected void MetaDataChanged (object sender, EventArgs args)
65                 {
66                         //Console.WriteLine (Environment.StackTrace);
67                         event_log += String.Format ("{0}: MetaDataChanged\n", event_num++);
68                 }
69 #if NET_2_0
70                 protected void BindingComplete (object sender, BindingCompleteEventArgs args)
71                 {
72                         //Console.WriteLine (Environment.StackTrace);
73                         event_log += String.Format ("{0}: BindingComplete\n", event_num++);
74                 }
75                 protected void CurrentItemChanged (object sender, EventArgs args)
76                 {
77                         //Console.WriteLine (Environment.StackTrace);
78                         event_log += String.Format ("{0}: CurrentItemChanged\n", event_num++);
79                 }
80                 protected void DataError (object sender, BindingManagerDataErrorEventArgs args)
81                 {
82                         //Console.WriteLine (Environment.StackTrace);
83                         event_log += String.Format ("{0}: DataError\n", event_num++);
84                 }
85 #endif
86                 protected void Format (object sender, ConvertEventArgs args)
87                 {
88                         //Console.WriteLine (Environment.StackTrace);
89                         event_log += String.Format ("{0}: Binding.Format\n", event_num++);
90                 }
91                 protected void Parse (object sender, ConvertEventArgs args)
92                 {
93                         //Console.WriteLine (Environment.StackTrace);
94                         event_log += String.Format ("{0}: Binding.Parse\n", event_num++);
95                 }
96
97                 void TextChanged (object sender, EventArgs e)
98                 {
99                         //Console.WriteLine (Environment.StackTrace);
100                         event_log += String.Format ("{0}: TextChanged\n", event_num++);
101                 }
102
103                 protected void HookupCurrencyManager (CurrencyManager cm)
104                 {
105                         cm.CurrentChanged += new EventHandler (CurrentChanged);
106                         cm.PositionChanged += new EventHandler (PositionChanged);
107                         cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
108                         cm.MetaDataChanged += new EventHandler (MetaDataChanged);
109 #if NET_2_0
110                         cm.BindingComplete += new BindingCompleteEventHandler (BindingComplete);
111                         cm.CurrentItemChanged += new EventHandler (CurrentItemChanged);
112                         cm.DataError += new BindingManagerDataErrorEventHandler (DataError);
113 #endif
114                 }
115
116                 protected void HookupPropertyManager (PropertyManager pm)
117                 {
118                         pm.CurrentChanged += new EventHandler (CurrentChanged);
119                         pm.PositionChanged += new EventHandler (PositionChanged);
120 #if NET_2_0
121                         pm.BindingComplete += new BindingCompleteEventHandler (BindingComplete);
122                         pm.CurrentItemChanged += new EventHandler (CurrentItemChanged);
123                         pm.DataError += new BindingManagerDataErrorEventHandler (DataError);
124 #endif
125                 }
126
127                 protected void HookupBinding (Binding b)
128                 {
129                         b.Parse += new ConvertEventHandler (Parse);
130                         b.Format += new ConvertEventHandler (Format);
131                 }
132
133                 protected void HookupControl (Control c)
134                 {
135                         c.TextChanged += new EventHandler (TextChanged);
136                 }
137         }
138
139         [TestFixture]
140         public class CurrencyManagerTest2 : DataBindingTest
141         {
142                 [Test]
143                 public void TestDeleteOnlyRow ()
144                 {
145                         Control c = new Control ();
146                         c.CreateControl ();
147                         Binding binding;
148                         CurrencyManager cm;
149
150                         DataSet dataSet1 = new DataSet();
151                         dataSet1.Tables.Add();
152                         dataSet1.Tables[0].Columns.Add();
153
154                         DataRow newrow = dataSet1.Tables[0].NewRow ();
155                         dataSet1.Tables[0].Rows.Add(newrow);
156
157                         c.BindingContext = new BindingContext ();
158                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
159                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
160
161                         HookupCurrencyManager (cm);
162                         HookupBinding (binding);
163
164                         cm.Position = 0;
165
166                         Assert.AreEqual (1, cm.Count, "1");
167
168                         DataRowView row = (DataRowView)cm.Current;
169
170                         event_log = "";
171                         event_num = 0;
172
173                         row.Delete ();
174
175                         // Console.WriteLine (event_log);
176
177                         Assert.AreEqual (
178 #if NET_2_0
179                                  "0: PositionChanged (to -1)\n1: ItemChanged (index = -1)\n2: PositionChanged (to -1)\n3: CurrentChanged\n4: CurrentItemChanged\n5: ItemChanged (index = -1)\n"
180 #else // NET_1_0
181                                  "0: PositionChanged (to -1)\n1: ItemChanged (index = -1)\n2: ItemChanged (index = -1)\n"
182 #endif
183                                  , event_log, "2");
184
185                         Assert.AreEqual (0, cm.Count, "3");
186                 }
187
188                 [Test]
189                 public void TestDeleteRowBeforeCurrent ()
190                 {
191                         Control c = new Control ();
192                         c.CreateControl ();
193                         Binding binding;
194                         CurrencyManager cm;
195                         DataRow newrow;
196
197                         DataSet dataSet1 = new DataSet();
198                         dataSet1.Tables.Add();
199                         dataSet1.Tables[0].Columns.Add();
200
201                         newrow = dataSet1.Tables[0].NewRow ();
202                         dataSet1.Tables[0].Rows.Add(newrow);
203
204                         newrow = dataSet1.Tables[0].NewRow ();
205                         dataSet1.Tables[0].Rows.Add(newrow);
206
207                         c.BindingContext = new BindingContext ();
208                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
209                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
210
211                         HookupCurrencyManager (cm);
212 #if WITH_BINDINGS
213                         HookupBinding (binding);
214 #endif
215
216                         cm.Position = 1;
217
218                         Assert.AreEqual (2, cm.Count, "1");
219
220                         DataView dv = dataSet1.Tables[0].DefaultView;
221                         DataRowView row = dv[0];
222
223                         event_log = "";
224                         event_num = 0;
225
226                         row.Delete ();
227
228                         Console.WriteLine (event_log);
229
230                         Assert.AreEqual (
231
232 #if NET_2_0
233 #if WITH_BINDINGS
234                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: PositionChanged (to 0)\n3: ItemChanged (index = -1)\n4: Binding.Format\n"
235 #else
236                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: PositionChanged (to 0)\n3: ItemChanged (index = -1)\n"
237 #endif
238 #else // NET_1_0
239 #if WITH_BINDINGS
240                                  "0: CurrentChanged\n1: PositionChanged (to 0)\n2: ItemChanged (index = -1)\n3: Binding.Format\n"
241 #else
242                                  "0: CurrentChanged\n1: PositionChanged (to 0)\n2: ItemChanged (index = -1)\n"
243 #endif
244 #endif
245                                  , event_log, "2");
246                 }
247
248                 [Test]
249                 public void TestDeleteRowAfterCurrent ()
250                 {
251                         Control c = new Control ();
252                         c.CreateControl ();
253                         Binding binding;
254                         CurrencyManager cm;
255                         DataRow newrow;
256
257                         DataSet dataSet1 = new DataSet();
258                         dataSet1.Tables.Add();
259                         dataSet1.Tables[0].Columns.Add();
260
261                         newrow = dataSet1.Tables[0].NewRow ();
262                         dataSet1.Tables[0].Rows.Add(newrow);
263
264                         newrow = dataSet1.Tables[0].NewRow ();
265                         dataSet1.Tables[0].Rows.Add(newrow);
266
267                         c.BindingContext = new BindingContext ();
268                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
269                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
270
271                         HookupCurrencyManager (cm);
272 #if WITH_BINDINGS
273                         HookupBinding (binding);
274 #endif
275
276                         cm.Position = 0;
277
278                         Assert.AreEqual (2, cm.Count, "1");
279
280                         DataView dv = dataSet1.Tables[0].DefaultView;
281                         DataRowView row = dv[1];
282
283                         event_log = "";
284                         event_num = 0;
285
286                         row.Delete ();
287
288                         Console.WriteLine (event_log);
289
290 #if WITH_BINDINGS
291                         Assert.AreEqual ("0: ItemChanged (index = -1)\n1: Binding.Format\n", event_log, "2");
292 #else
293                         Assert.AreEqual ("0: ItemChanged (index = -1)\n", event_log, "2");
294 #endif
295
296                         Assert.AreEqual (1, cm.Count, "3");
297                 }
298
299                 [Test]
300                 public void TestDeleteCurrentRowWithOthers ()
301                 {
302                         Control c = new Control ();
303                         c.CreateControl ();
304                         Binding binding;
305                         CurrencyManager cm;
306                         DataRow newrow;
307
308                         DataSet dataSet1 = new DataSet();
309                         dataSet1.Tables.Add();
310                         dataSet1.Tables[0].Columns.Add();
311
312                         newrow = dataSet1.Tables[0].NewRow ();
313                         dataSet1.Tables[0].Rows.Add(newrow);
314
315                         newrow = dataSet1.Tables[0].NewRow ();
316                         dataSet1.Tables[0].Rows.Add(newrow);
317
318                         c.BindingContext = new BindingContext ();
319                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
320                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
321
322                         HookupCurrencyManager (cm);
323 #if WITH_BINDINGS
324                         HookupBinding (binding);
325 #endif
326                         cm.Position = 0;
327
328                         Assert.AreEqual (2, cm.Count, "1");
329
330                         DataView dv = dataSet1.Tables[0].DefaultView;
331                         DataRowView row = dv[0];
332
333                         event_log = "";
334                         event_num = 0;
335
336                         row.Delete ();
337
338                         Console.WriteLine (event_log);
339
340                         Assert.AreEqual (
341 #if NET_2_0
342 #if WITH_BINDINGS
343                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n3: Binding.Format\n"
344 #else
345                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n"
346 #endif
347 #else
348 #if WITH_BINDINGS
349                                  "0: CurrentChanged\n1: ItemChanged (index = -1)\n2: Binding.Format\n"
350 #else
351                                  "0: CurrentChanged\n1: ItemChanged (index = -1)\n"
352 #endif
353 #endif
354                                  , event_log, "2");
355
356                         Assert.AreEqual (1, cm.Count, "3");
357                 }
358
359                 [Test]
360                 public void TestAddFirstRow ()
361                 {
362                         if (TestHelper.RunningOnUnix) {
363                                 Assert.Ignore ("Fails at the moment");
364                         }
365
366                         Control c = new Control ();
367                         c.CreateControl ();
368                         Binding binding;
369                         CurrencyManager cm;
370
371                         DataSet dataSet1 = new DataSet();
372                         dataSet1.Tables.Add();
373                         dataSet1.Tables[0].Columns.Add();
374
375                         c.BindingContext = new BindingContext ();
376                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
377                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
378
379                         HookupCurrencyManager (cm);
380 #if WITH_BINDINGS
381                         HookupBinding (binding);
382 #endif
383
384                         cm.Position = 0;
385
386                         Assert.AreEqual (0, cm.Count, "1");
387
388                         event_log = "";
389                         event_num = 0;
390
391                         DataRow newrow = dataSet1.Tables[0].NewRow ();
392                         dataSet1.Tables[0].Rows.Add(newrow);
393
394                         Console.WriteLine (event_log);
395
396                         Assert.AreEqual (
397 #if NET_2_0
398 #if WITH_BINDINGS
399                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: CurrentItemChanged\n3: ItemChanged (index = -1)\n4: ItemChanged (index = -1)\n5: Binding.Format\n6: Binding.Format\n7: Binding.Format\n"
400 #else
401                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: CurrentItemChanged\n3: ItemChanged (index = -1)\n4: ItemChanged (index = -1)\n"
402 #endif
403 #else
404 #if WITH_BINDINGS
405                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: ItemChanged (index = -1)\n3: ItemChanged (index = -1)\n4: Binding.Format\n5: Binding.Format\n6: Binding.Format\n"
406 #else
407                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: ItemChanged (index = -1)\n3: ItemChanged (index = -1)\n"
408 #endif
409 #endif
410                                  , event_log, "2");
411
412                         Assert.AreEqual (1, cm.Count, "3");
413                 }
414
415                 [Test]
416                 public void TestAppendRowAfterCurrent ()
417                 {
418                         Control c = new Control ();
419                         c.CreateControl ();
420                         Binding binding;
421                         CurrencyManager cm;
422
423                         DataSet dataSet1 = new DataSet();
424                         dataSet1.Tables.Add();
425                         dataSet1.Tables[0].Columns.Add();
426
427                         c.BindingContext = new BindingContext ();
428                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
429                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
430
431                         HookupCurrencyManager (cm);
432 #if WITH_BINDINGS
433                         HookupBinding (binding);
434 #endif
435
436                         cm.Position = 0;
437
438                         Assert.AreEqual (0, cm.Count, "1");
439
440                         DataRow newrow = dataSet1.Tables[0].NewRow ();
441                         dataSet1.Tables[0].Rows.Add(newrow);
442
443                         event_log = "";
444                         event_num = 0;
445
446                         newrow = dataSet1.Tables[0].NewRow ();
447                         dataSet1.Tables[0].Rows.Add(newrow);
448
449                         Console.WriteLine (event_log);
450
451 #if WITH_BINDINGS
452                         Assert.AreEqual ("0: ItemChanged (index = -1)\n1: Binding.Format\n", event_log, "2");
453 #else
454                         Assert.AreEqual ("0: ItemChanged (index = -1)\n", event_log, "2");
455 #endif
456
457                         Assert.AreEqual (2, cm.Count, "3");
458                 }
459
460                 [Test]
461                 public void TestInsertRowBeforeCurrent ()
462                 {
463 #if NET_2_0
464 #if WITH_BINDINGS
465                         if (TestHelper.RunningOnUnix) {
466                                 Assert.Ignore ("Too many Binding.Format events here");
467                         }
468 #endif
469 #endif
470                         Control c = new Control ();
471                         c.CreateControl ();
472                         Binding binding;
473                         CurrencyManager cm;
474
475                         DataSet dataSet1 = new DataSet();
476                         dataSet1.Tables.Add();
477                         dataSet1.Tables[0].Columns.Add();
478
479                         c.BindingContext = new BindingContext ();
480                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
481                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
482
483                         /* insert 2 rows */
484                         DataRow newrow = dataSet1.Tables[0].NewRow ();
485                         dataSet1.Tables[0].Rows.Add(newrow);
486                         newrow = dataSet1.Tables[0].NewRow ();
487                         dataSet1.Tables[0].Rows.Add(newrow);
488
489                         Assert.AreEqual (2, cm.Count, "1");
490
491                         cm.Position = 1;
492
493                         HookupCurrencyManager (cm);
494 #if WITH_BINDINGS
495                         HookupBinding (binding);
496 #endif
497
498                         event_log = "";
499                         event_num = 0;
500
501                         newrow = dataSet1.Tables[0].NewRow ();
502                         dataSet1.Tables[0].Rows.InsertAt(newrow, 0);
503
504                         Console.WriteLine (event_log);
505
506                         Assert.AreEqual (
507 #if NET_2_0
508 #if WITH_BINDINGS
509                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n3: PositionChanged (to 2)\n4: Binding.Format\n"
510 #else
511                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n3: PositionChanged (to 2)\n"
512 #endif
513 #else
514 #if WITH_BINDINGS
515                                  "0: ItemChanged (index = -1)\n1: Binding.Format\n"
516 #else
517                                  "0: ItemChanged (index = -1)\n"
518 #endif
519 #endif
520                                  , event_log, "2");
521
522                         Assert.AreEqual (3, cm.Count, "3");
523                 }
524
525                 [Test]
526                 public void TestInsertRowAtCurrent ()
527                 {
528                         Control c = new Control ();
529                         c.CreateControl ();
530                         Binding binding;
531                         CurrencyManager cm;
532
533                         DataSet dataSet1 = new DataSet();
534                         dataSet1.Tables.Add();
535                         dataSet1.Tables[0].Columns.Add();
536
537                         c.BindingContext = new BindingContext ();
538                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
539                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
540
541                         HookupCurrencyManager (cm);
542 #if WITH_BINDINGS
543                         HookupBinding (binding);
544 #endif
545
546                         /* insert 2 rows */
547                         DataRow newrow = dataSet1.Tables[0].NewRow ();
548                         dataSet1.Tables[0].Rows.Add(newrow);
549                         newrow = dataSet1.Tables[0].NewRow ();
550                         dataSet1.Tables[0].Rows.Add(newrow);
551
552                         Assert.AreEqual (2, cm.Count, "1");
553
554                         cm.Position = 1;
555
556                         event_log = "";
557                         event_num = 0;
558
559                         newrow = dataSet1.Tables[0].NewRow ();
560                         dataSet1.Tables[0].Rows.InsertAt(newrow, 1);
561
562                         Console.WriteLine (event_log);
563
564                         Assert.AreEqual (
565 #if NET_2_0
566 #if WITH_BINDINGS
567                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n3: PositionChanged (to 2)\n4: Binding.Format\n"
568 #else
569                                  "0: CurrentChanged\n1: CurrentItemChanged\n2: ItemChanged (index = -1)\n3: PositionChanged (to 2)\n"
570 #endif
571 #else
572 #if WITH_BINDINGS
573                                  "0: ItemChanged (index = -1)\n1: Binding.Format\n"
574 #else
575                                  "0: ItemChanged (index = -1)\n"
576 #endif
577 #endif
578                                  , event_log, "2");
579
580                         Assert.AreEqual (3, cm.Count, "3");
581                 }
582
583                 [Test]
584                 public void TestColumnAdd ()
585                 {
586                         Control c = new Control ();
587                         c.CreateControl ();
588                         Binding binding;
589                         CurrencyManager cm;
590
591                         DataSet dataSet1 = new DataSet();
592                         dataSet1.Tables.Add();
593                         dataSet1.Tables[0].Columns.Add();
594
595                         c.BindingContext = new BindingContext ();
596                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
597                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
598
599                         HookupCurrencyManager (cm);
600                         HookupBinding (binding);
601
602                         cm.Position = 0;
603
604                         Assert.AreEqual (0, cm.Count, "1");
605
606                         event_log = "";
607                         event_num = 0;
608
609                         dataSet1.Tables[0].Columns.Add();
610
611                         Console.WriteLine (event_log);
612
613 #if NET_2_0                     
614                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "2");
615 #else
616                         Assert.AreEqual ("0: MetaDataChanged\n1: MetaDataChanged\n", event_log, "2");
617 #endif
618                         Assert.AreEqual (0, cm.Count, "3");
619                 }
620
621                 [Test]
622                 public void TestColumnRemove ()
623                 {
624                         Control c = new Control ();
625                         c.CreateControl ();
626                         Binding binding;
627                         CurrencyManager cm;
628
629                         DataSet dataSet1 = new DataSet();
630                         dataSet1.Tables.Add();
631                         dataSet1.Tables[0].Columns.Add();
632                         dataSet1.Tables[0].Columns.Add();
633
634                         c.BindingContext = new BindingContext ();
635                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
636                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
637
638                         HookupCurrencyManager (cm);
639                         HookupBinding (binding);
640
641                         cm.Position = 0;
642
643                         Assert.AreEqual (0, cm.Count, "1");
644
645                         event_log = "";
646                         event_num = 0;
647
648                         dataSet1.Tables[0].Columns.Remove(dataSet1.Tables[0].Columns[1]);
649
650                         Console.WriteLine (event_log);
651                         
652                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "2");
653
654                         Assert.AreEqual (0, cm.Count, "3");
655                 }
656
657                 [Test]
658                 public void TestColumnRemoveBound ()
659                 {
660                         Control c = new Control ();
661                         c.CreateControl ();
662                         Binding binding;
663                         CurrencyManager cm;
664
665                         DataSet dataSet1 = new DataSet();
666                         dataSet1.Tables.Add();
667                         dataSet1.Tables[0].Columns.Add();
668                         dataSet1.Tables[0].Columns.Add();
669
670                         c.BindingContext = new BindingContext ();
671                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
672                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
673
674                         HookupCurrencyManager (cm);
675                         HookupBinding (binding);
676
677                         cm.Position = 0;
678
679                         Assert.IsFalse (binding.IsBinding, "1");
680                         Assert.AreEqual (0, cm.Count, "2");
681
682                         event_log = "";
683                         event_num = 0;
684
685                         dataSet1.Tables[0].Columns.Remove(dataSet1.Tables[0].Columns[0]);
686
687                         Console.WriteLine (event_log);
688                         
689                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "3");
690
691                         Assert.AreEqual (0, cm.Count, "4");
692
693                         Assert.IsFalse (binding.IsBinding, "5");
694                 }
695
696                 [Test]
697                 public void TestColumnChangeName ()
698                 {
699                         Control c = new Control ();
700                         c.CreateControl ();
701                         Binding binding;
702                         CurrencyManager cm;
703
704                         DataSet dataSet1 = new DataSet();
705                         dataSet1.Tables.Add();
706
707                         dataSet1.Tables [0].Columns.CollectionChanged += new CollectionChangeEventHandler (
708                                 DataColumnCollection_CollectionChanged);
709
710                         dataSet1.Tables[0].Columns.Add();
711
712                         c.BindingContext = new BindingContext ();
713                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
714                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
715
716                         HookupCurrencyManager (cm);
717                         HookupBinding (binding);
718
719                         cm.Position = 0;
720
721                         Assert.IsFalse (binding.IsBinding, "1");
722                         Assert.AreEqual (0, cm.Count, "2");
723
724                         event_log = "";
725                         event_num = 0;
726
727                         dataSet1.Tables [0].DefaultView.ListChanged += new ListChangedEventHandler (
728                                 DataView_ListChanged);
729
730                         dataSet1.Tables[0].Columns[0].ColumnName = "new name";
731
732                         Console.WriteLine (event_log);
733                         
734                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "3");
735
736                         Assert.AreEqual (0, cm.Count, "4");
737
738                         Assert.IsFalse (binding.IsBinding, "5");
739                 }
740
741                 void DataColumnCollection_CollectionChanged (object sender, CollectionChangeEventArgs e)
742                 {
743                         Console.WriteLine ("collection changed : {0} {1}", e.Action, e.Element.GetType());
744                 }
745
746                 void DataView_ListChanged (object sender, ListChangedEventArgs e)
747                 {
748                         Console.WriteLine ("list changed : {0} {1} {2}", e.ListChangedType, e.OldIndex, e.NewIndex);
749                 }
750
751                 [Test]
752                 public void TestRowModify ()
753                 {
754                         Control c = new Control ();
755                         c.CreateControl ();
756                         Binding binding;
757                         CurrencyManager cm;
758                         string column_name;
759
760                         DataSet dataSet1 = new DataSet();
761                         dataSet1.Tables.Add();
762                         dataSet1.Tables[0].Columns.Add();
763
764                         DataRow newrow = dataSet1.Tables[0].NewRow ();
765                         dataSet1.Tables[0].Rows.Add(newrow);
766
767                         column_name = dataSet1.Tables[0].Columns[0].ColumnName;
768
769                         c.BindingContext = new BindingContext ();
770                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
771
772                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], column_name);
773
774                         HookupCurrencyManager (cm);
775 #if WITH_BINDINGS
776                         HookupBinding (binding);
777 #endif
778                         cm.Position = 0;
779
780                         Assert.AreEqual (1, cm.Count, "1");
781
782                         event_log = "";
783                         event_num = 0;
784
785                         DataRowView row = (DataRowView)cm.Current;
786                         row.BeginEdit ();
787                         row[column_name] = "hi";
788                         row.EndEdit ();
789
790                         Console.WriteLine (event_log);
791
792                         Assert.AreEqual (
793 #if NET_2_0
794 #if WITH_BINDINGS
795                                          "0: CurrentItemChanged\n1: ItemChanged (index = 0)\n2: Binding.Format\n"
796 #else
797                                          "0: CurrentItemChanged\n1: ItemChanged (index = 0)\n"
798 #endif
799 #else
800 #if WITH_BINDINGS
801                                          "0: ItemChanged (index = 0)\n1: Binding.Format\n"
802 #else
803                                          "0: ItemChanged (index = 0)\n"
804 #endif
805 #endif
806                                          , event_log, "2");
807
808                         Assert.AreEqual (1, cm.Count, "3");
809                 }
810
811                 [Test]
812                 public void TestRowCancelModify ()
813                 {
814                         Control c = new Control ();
815                         c.CreateControl ();
816                         Binding binding;
817                         CurrencyManager cm;
818                         string column_name;
819
820                         DataSet dataSet1 = new DataSet();
821                         dataSet1.Tables.Add();
822                         dataSet1.Tables[0].Columns.Add();
823
824                         DataRow newrow = dataSet1.Tables[0].NewRow ();
825                         dataSet1.Tables[0].Rows.Add(newrow);
826
827                         column_name = dataSet1.Tables[0].Columns[0].ColumnName;
828
829                         c.BindingContext = new BindingContext ();
830                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
831
832                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], column_name);
833
834                         HookupCurrencyManager (cm);
835                         HookupBinding (binding);
836
837                         cm.Position = 0;
838
839                         Assert.AreEqual (1, cm.Count, "1");
840
841                         event_log = "";
842                         event_num = 0;
843
844                         DataRowView row = (DataRowView)cm.Current;
845                         row.BeginEdit ();
846                         row[column_name] = "hi";
847                         cm.CancelCurrentEdit ();
848
849                         Console.WriteLine (event_log);
850                         Assert.AreEqual ("0: ItemChanged (index = 0)\n", event_log, "2");
851
852                         Assert.AreEqual (1, cm.Count, "3");
853                 }
854
855
856                 [Test]
857                 public void TestDeleteInEdit ()
858                 {
859                         Control c = new Control ();
860                         c.CreateControl ();
861                         Binding binding;
862                         BindingContext bc = new BindingContext ();
863                         CurrencyManager cm;
864
865                         DataSet dataSet1 = new DataSet();
866                         dataSet1.Tables.Add();
867                         dataSet1.Tables[0].Columns.Add();
868
869                         DataRow newrow = dataSet1.Tables[0].NewRow ();
870                         dataSet1.Tables[0].Rows.Add(newrow);
871
872                         cm = (CurrencyManager) bc[dataSet1, dataSet1.Tables[0].TableName];
873                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
874
875                         Assert.AreEqual (1, cm.Count, "1");
876
877                         HookupCurrencyManager (cm);
878 #if WITH_BINDINGS
879                         HookupBinding (binding);
880 #endif
881
882                         cm.Position = 0;
883
884                         event_log = "";
885                         event_num = 0;
886
887                         DataRowView row = (DataRowView)cm.Current;
888                         row.Delete ();
889
890                         Console.WriteLine (event_log);
891
892                         Assert.AreEqual (
893 #if NET_2_0
894                                  "0: PositionChanged (to -1)\n1: ItemChanged (index = -1)\n2: PositionChanged (to -1)\n3: CurrentChanged\n4: CurrentItemChanged\n5: ItemChanged (index = -1)\n"
895 #else
896                                  "0: PositionChanged (to -1)\n1: ItemChanged (index = -1)\n2: ItemChanged (index = -1)\n"
897 #endif
898                                  , event_log, "1");
899
900                         Assert.AreEqual (0, cm.Count, "2");
901                 }
902
903                 [Test]
904                 public void Bug81022 ()
905                 {
906                         if (TestHelper.RunningOnUnix) {
907                                 Assert.Ignore ("Fails at the moment");
908                         }
909
910                         BindingContext bc = new BindingContext ();
911                         CurrencyManager cm;
912
913                         DataView dv = new DataView();
914                         DataTable dt = new DataTable("Testdata");
915
916                         cm = (CurrencyManager)bc [dt];
917
918                         HookupCurrencyManager (cm);
919
920                         event_log = ""; event_num = 0;
921
922                         dv.Table = dt;
923
924                         Assert.AreEqual ("", event_log, "1");
925
926                         Console.WriteLine (">1");
927                         dt.Columns.Add("A");
928                         Console.WriteLine ("<1");
929
930                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "1");
931
932                         event_log = ""; event_num = 0;
933                         Console.WriteLine (">2");
934                         dt.Columns.Add("B");
935                         Console.WriteLine ("<2");
936
937                         Assert.AreEqual ("0: MetaDataChanged\n", event_log, "2");
938
939                         event_log = ""; event_num = 0;
940                         Console.WriteLine (">3");
941                         dt.Rows.Add(new object[]{"A1", "B1"});
942                         Console.WriteLine ("<3");
943
944 #if NET_2_0
945                         Assert.AreEqual ("0: PositionChanged (to 0)\n1: CurrentChanged\n2: CurrentItemChanged\n3: ItemChanged (index = -1)\n4: ItemChanged (index = -1)\n", event_log, "3");
946 #else
947                         Assert.AreEqual ("0: PositionChanged (to 0)\n1: CurrentChanged\n2: ItemChanged (index = -1)\n3: ItemChanged (index = -1)\n", event_log, "3");
948 #endif
949
950                         event_log = ""; event_num = 0;
951                         Console.WriteLine (">4");
952                         dt.Rows.Add(new object[]{"A2", "B2"});
953                         Console.WriteLine ("<4");
954
955                         Assert.AreEqual ("0: ItemChanged (index = -1)\n", event_log, "4");
956
957                         Assert.AreEqual (2, cm.Count, "5");
958                 }
959
960                 [Test]
961                 public void CancelAddNew ()
962                 {
963                         if (TestHelper.RunningOnUnix) {
964                                 Assert.Ignore ("Fails at the moment");
965                         }
966
967                         Control c = new Control ();
968                         c.CreateControl ();
969                         Binding binding;
970                         CurrencyManager cm;
971
972                         DataSet dataSet1 = new DataSet();
973                         dataSet1.Tables.Add();
974                         dataSet1.Tables[0].Columns.Add();
975
976                         c.BindingContext = new BindingContext ();
977                         cm = (CurrencyManager) c.BindingContext[dataSet1, dataSet1.Tables[0].TableName];
978                         binding = c.DataBindings.Add ("Text", dataSet1.Tables[0], dataSet1.Tables[0].Columns[0].ColumnName);
979
980                         HookupCurrencyManager (cm);
981 #if WITH_BINDINGS
982                         HookupBinding (binding);
983 #endif
984                         event_log = "";
985                         event_num = 0;
986
987                         Console.WriteLine (">>>");
988                         cm.AddNew ();
989
990                         cm.CancelCurrentEdit ();
991                         Console.WriteLine ("<<<");
992
993                         Console.WriteLine (event_log);
994
995                         Assert.AreEqual (
996 #if NET_2_0
997                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: CurrentItemChanged\n3: ItemChanged (index = -1)\n4: ItemChanged (index = -1)\n5: PositionChanged (to -1)\n6: ItemChanged (index = -1)\n7: PositionChanged (to -1)\n8: CurrentChanged\n9: CurrentItemChanged\n10: ItemChanged (index = -1)\n11: ItemChanged (index = -1)\n",
998 #else
999                                  "0: PositionChanged (to 0)\n1: CurrentChanged\n2: ItemChanged (index = -1)\n3: ItemChanged (index = -1)\n4: CurrentChanged\n5: PositionChanged (to -1)\n6: ItemChanged (index = -1)\n7: ItemChanged (index = -1)\n8: ItemChanged (index = -1)\n",
1000 #endif
1001                                  event_log, "1");
1002
1003                 }
1004         }
1005
1006         [TestFixture]
1007         public class PropertyManagerTest2 : DataBindingTest
1008         {
1009                 [Test]
1010                 public void TestPropertyChange ()
1011                 {
1012                         if (TestHelper.RunningOnUnix) {
1013                                 Assert.Ignore ("Fails at the moment");
1014                         }
1015
1016                         Control c1 = new Control ();
1017                         Control c2 = new Control ();
1018
1019                         c1.CreateControl ();
1020                         c2.CreateControl ();
1021
1022                         Binding binding;
1023                         PropertyManager pm;
1024
1025                         c1.BindingContext = new BindingContext ();
1026                         c2.BindingContext = c1.BindingContext;
1027
1028                         pm = (PropertyManager) c2.BindingContext[c1, "Text"];
1029
1030                         binding = c2.DataBindings.Add ("Text", c1, "Text");
1031
1032                         Console.WriteLine (pm.GetType());
1033                         Console.WriteLine (binding.BindingManagerBase.GetType());
1034                         Assert.IsFalse (pm == binding.BindingManagerBase, "0");
1035
1036                         HookupPropertyManager (pm);
1037                         HookupBinding (binding);
1038
1039                         event_log = "";
1040                         event_num = 0;
1041
1042                         c1.Text = "hi";
1043
1044                         Console.WriteLine (event_log);
1045
1046 #if NET_2_0
1047                         Assert.AreEqual ("0: CurrentChanged\n1: CurrentItemChanged\n2: Binding.Format\n3: CurrentChanged\n4: CurrentItemChanged\n", event_log, "1");
1048 #else
1049                         Assert.AreEqual ("0: CurrentChanged\n1: Binding.Format\n2: CurrentChanged\n", event_log, "1");
1050 #endif
1051                 }
1052         }
1053 }