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