// Authors:
// Jackson Harper jackson@ximian.com
-
using System;
-using System.Data;
using System.Collections;
using System.ComponentModel;
+using System.Data;
using System.Reflection;
using System.Windows.Forms;
using NUnit.Framework;
-namespace MonoTests.System.Windows.Forms {
+#if NET_2_0
+using System.Collections.ObjectModel;
+#endif
+namespace MonoTests.System.Windows.Forms.DataBinding
+{
[TestFixture]
- public class CurrencyManagerTest {
-
+ public class CurrencyManagerTest : TestHelper
+ {
[Test]
public void Defaults ()
{
// child list can't be created
cm = bc [dataset, "Table"] as CurrencyManager;
+
+ TestHelper.RemoveWarning (cm);
+ }
+
+ [Test] // bug #80107
+ public void DataView ()
+ {
+ DataView dv = new DataView ();
+
+ BindingContext bc = new BindingContext ();
+ CurrencyManager cm = bc [dv, string.Empty] as CurrencyManager;
+ Assert.IsNotNull (cm, "#A1");
+ Assert.AreEqual (0, cm.Count, "#A2");
+ Assert.AreEqual (-1, cm.Position, "#A3");
+
+ DataTable dt = new DataTable ("Testdata");
+ dt.Columns.Add ("A");
+ dt.Columns.Add ("B");
+ dt.Rows.Add (new object [] { "A1", "B1" });
+ dt.Rows.Add (new object [] { "A2", "B2" });
+ dv.Table = dt;
+
+ Assert.AreEqual (2, cm.Count, "#B1");
+ Assert.AreEqual (0, cm.Position, "#B2");
+ }
+
+#if NET_2_0
+ [Test]
+ public void IsBindingEmptyDataSource ()
+ {
+ Control c = new Control ();
+ c.BindingContext = new BindingContext ();
+ c.CreateControl ();
+
+ BindingList<string> list = new BindingList<string> ();
+ CurrencyManager cm = (CurrencyManager)c.BindingContext [list];
+
+ Assert.AreEqual (true, cm.IsBindingSuspended, "A1");
+
+ cm.ResumeBinding ();
+ Assert.AreEqual (true, cm.IsBindingSuspended, "B1");
+
+ list.Add ("A");
+ Assert.AreEqual (false, cm.IsBindingSuspended, "D1");
+
+ list.Clear ();
+ Assert.AreEqual (true, cm.IsBindingSuspended, "E1");
}
+#endif
[Test]
public void MoveArrayListForward ()
// Can't create a list on a child relation
CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
+
+ TestHelper.RemoveWarning (cm);
}
[Test]
int current_changed;
int position_changed;
int item_changed;
+ int metadata_changed;
+ string event_log = "";
ItemChangedEventArgs item_changed_args;
+#if NET_2_0
+ bool list_changed_called;
+ ListChangedEventArgs list_changed_args;
+#endif
- void CurrentChanged (object sender, EventArgs args) { current_changed = ++event_num; /*Console.WriteLine ("current_changed = {0}", current_changed); Console.WriteLine (Environment.StackTrace);*/ }
- void PositionChanged (object sender, EventArgs args) { position_changed = ++event_num; /*Console.WriteLine ("position_changed = {0}", position_changed); Console.WriteLine (Environment.StackTrace);*/}
- 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);*/ }
- void ListChanged (object sender, ListChangedEventArgs args) { /*Console.WriteLine ("ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex); Console.WriteLine (Environment.StackTrace);*/ }
+ void CurrentChanged (object sender, EventArgs args)
+ {
+ current_changed = ++event_num;
+ Console.WriteLine ("current_changed = {0}", current_changed);
+ //Console.WriteLine (Environment.StackTrace);
+ event_log += String.Format ("{0}: CurrentChanged\n", current_changed);
+ }
+ void PositionChanged (object sender, EventArgs args)
+ {
+ position_changed = ++event_num;
+ Console.WriteLine ("position_changed = {0}", position_changed);
+ //Console.WriteLine (Environment.StackTrace);
+ event_log += String.Format ("{0}: PositionChanged (to {1})\n", position_changed, ((CurrencyManager)sender).Position);
+ }
+ 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);
+ event_log += String.Format ("{0}: ItemChanged (index = {1})\n", item_changed, args.Index);
+ }
+ void ListChanged (object sender, ListChangedEventArgs args)
+ {
+ Console.WriteLine ("ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex);
+ //Console.WriteLine (Environment.StackTrace);
+ event_log += String.Format (" : ListChanged ({0}, {1}, {2})\n", args.ListChangedType, args.OldIndex, args.NewIndex);
+ }
+ void MetaDataChanged (object sender, EventArgs args)
+ {
+ metadata_changed = ++event_num;
+ Console.WriteLine ("metadata_changed = {0}", metadata_changed);
+ //Console.WriteLine (Environment.StackTrace);
+ event_log += String.Format ("{0}: MetaDataChanged\n", metadata_changed);
+ }
+#if NET_2_0
+ // CurrencyManager.ListChanged handler, not IBindingList.ListChanged
+ void ListChangedEvent (object sender, ListChangedEventArgs args)
+ {
+ list_changed_called = true;
+ list_changed_args = args;
+ Console.WriteLine ("CurrencyManager.ListChanged ({0},{1},{2})", args.ListChangedType, args.OldIndex, args.NewIndex);
+
+ }
+#endif
[Test]
public void AddNew ()
cm.CurrentChanged += new EventHandler (CurrentChanged);
cm.PositionChanged += new EventHandler (PositionChanged);
cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
+#if NET_2_0
+ list_changed_called = false;
+ cm.ListChanged += new ListChangedEventHandler (ListChangedEvent);
+#endif
Assert.AreEqual (0, cm.Position, "AddNew1");
Assert.AreEqual (10, cm.Count, "AddNew2");
Assert.AreEqual (-1, item_changed_args.Index, "AddNew6");
Assert.AreEqual (1, current_changed, "AddNew7");
Assert.AreEqual (2, position_changed, "AddNew8");
+#if NET_2_0
+ Assert.AreEqual (true, list_changed_called, "AddNew9");
+ Assert.AreEqual (-1, list_changed_args.OldIndex, "AddNew10");
+ Assert.AreEqual (10, list_changed_args.NewIndex, "AddNew11");
+#endif
cm.CurrentChanged -= new EventHandler (CurrentChanged);
cm.PositionChanged -= new EventHandler (PositionChanged);
+#if NET_2_0
+ cm.ListChanged -= new ListChangedEventHandler (ListChangedEvent);
+#endif
}
[Test]
public void CancelAddNew ()
{
+ if (TestHelper.RunningOnUnix) {
+ Assert.Ignore ("Fails at the moment");
+ }
+
DataSet data_source = CreateRelatedDataSet ();
BindingContext bc = new BindingContext ();
CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
cm.PositionChanged -= new EventHandler (PositionChanged);
}
+#if NET_2_0
+ class CancelAddNewList<T> : Collection<T>, ICancelAddNew
+ {
+ public bool EndNewCalled;
+ public bool CancelNewCalled;
+ public int LastIndex = -1;
+
+ public void EndNew (int index)
+ {
+ EndNewCalled = true;
+ LastIndex = index;
+ }
+
+ public void CancelNew (int index)
+ {
+ CancelNewCalled = true;
+ LastIndex = index;
+ }
+
+ public void Reset ()
+ {
+ EndNewCalled = CancelNewCalled = false;
+ LastIndex = -1;
+ }
+ }
+
+ // Support for ICancelNew interface
+ [Test]
+ public void CancelAddNew2 ()
+ {
+ BindingContext bc = new BindingContext ();
+ CancelAddNewList<int> list = new CancelAddNewList<int> ();
+ list.Add (4);
+ list.Add (6);
+
+ CurrencyManager cm = (CurrencyManager)bc [list];
+
+ Assert.AreEqual (false, list.EndNewCalled, "A1");
+ Assert.AreEqual (false, list.CancelNewCalled, "A2");
+ Assert.AreEqual (-1, list.LastIndex, "A3");
+
+ cm.CancelCurrentEdit ();
+ Assert.AreEqual (false, list.EndNewCalled, "B1");
+ Assert.AreEqual (true, list.CancelNewCalled, "B2");
+ Assert.AreEqual (0, list.LastIndex, "B3");
+
+ cm.Position = 1;
+ list.Reset ();
+
+ cm.CancelCurrentEdit ();
+ Assert.AreEqual (false, list.EndNewCalled, "C1");
+ Assert.AreEqual (true, list.CancelNewCalled, "C2");
+ Assert.AreEqual (1, list.LastIndex, "C3");
+ }
+#endif
+
[Test]
public void EndAddNew ()
{
+#if NET_2_0
+ if (TestHelper.RunningOnUnix) {
+ Assert.Ignore ("Fails with 2.0 profile");
+ }
+#endif
DataSet data_source = CreateRelatedDataSet ();
BindingContext bc = new BindingContext ();
- CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
+ CurrencyManager cm = bc [data_source.Tables["Table1"], ""] as CurrencyManager;
+
+ data_source.Tables["Table1"].DefaultView.ListChanged +=
+ new ListChangedEventHandler (DataView_ListChanged);
event_num = current_changed = position_changed = -1;
cm.CurrentChanged += new EventHandler (CurrentChanged);
Assert.AreEqual (10, cm.Count, "EndAddNew2");
cm.AddNew ();
+ Console.WriteLine ("position = {0}", cm.Position);
Assert.AreEqual (0, item_changed, "EndAddNew3");
Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew4");
Assert.AreEqual (2, position_changed, "EndAddNew6");
cm.EndCurrentEdit ();
+ Console.WriteLine ("position = {0}", cm.Position);
- // Assert.AreEqual (3, item_changed, "EndAddNew7");
- // Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew8");
+ Assert.AreEqual (3, item_changed, "EndAddNew7");
+ Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew8");
Assert.AreEqual (1, current_changed, "EndAddNew9");
Assert.AreEqual (2, position_changed, "EndAddNew10");
cm.PositionChanged -= new EventHandler (PositionChanged);
}
+ void DataView_ListChanged (object sender, ListChangedEventArgs e)
+ {
+ Console.WriteLine ("{0} {1} {2}", e.ListChangedType, e.OldIndex, e.NewIndex);
+ }
+
+#if NET_2_0
+ // Support for ICancelNew interface
+ [Test]
+ public void EndAddNew2 ()
+ {
+ BindingContext bc = new BindingContext ();
+ CancelAddNewList<int> list = new CancelAddNewList<int> ();
+ list.Add (4);
+ list.Add (6);
+
+ CurrencyManager cm = (CurrencyManager)bc [list];
+
+ Assert.AreEqual (false, list.EndNewCalled, "A1");
+ Assert.AreEqual (false, list.CancelNewCalled, "A2");
+ Assert.AreEqual (-1, list.LastIndex, "A3");
+
+ cm.EndCurrentEdit ();
+ Assert.AreEqual (true, list.EndNewCalled, "B1");
+ Assert.AreEqual (false, list.CancelNewCalled, "B2");
+ Assert.AreEqual (0, list.LastIndex, "B3");
+
+ cm.Position = 1;
+ list.Reset ();
+
+ cm.EndCurrentEdit ();
+ Assert.AreEqual (true, list.EndNewCalled, "C1");
+ Assert.AreEqual (false, list.CancelNewCalled, "C2");
+ Assert.AreEqual (1, list.LastIndex, "C3");
+ }
+#endif
+
[Test]
public void AddNew2 ()
{
+ if (TestHelper.RunningOnUnix) {
+ Assert.Ignore ("Fails at the moment due to a System.Data constraint violation");
+ }
+
DataSet data_source = CreateRelatedDataSet ();
BindingContext bc = new BindingContext ();
CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
Assert.AreEqual (5, rcm.Count, "count3");
Assert.AreEqual (3, list.Count, "listcount3");
}
-
+
[Test]
public void TestCurrencyManagerBindings ()
{
Assert.IsFalse (typeof (DataView) == GetFinalType (cm), "A5");
Assert.IsTrue (typeof (DataView).IsAssignableFrom (GetFinalType (cm)), "A6");
}
+
+#if NET_2_0
+ [Test]
+ public void ListChangedEventTest ()
+ {
+ Control c = new Control ();
+ c.BindingContext = new BindingContext ();
+ c.CreateControl ();
+
+ BindingListChild<MockItem> binding_list = new BindingListChild<MockItem> ();
+ CurrencyManager currency_manager = (CurrencyManager)c.BindingContext [binding_list];
+ currency_manager.ListChanged += new ListChangedEventHandler(ListChangedEvent);
+
+ ClearListChangedLog ();
+
+ MockItem item = binding_list.AddNew ();
+ binding_list.EndNew (binding_list.IndexOf (item));
+ Assert.IsTrue (list_changed_called, "#A1");
+ Assert.AreEqual (ListChangedType.ItemAdded, list_changed_args.ListChangedType, "#A2");
+
+ ClearListChangedLog ();
+
+ binding_list.Insert (0, new MockItem ());
+ Assert.IsTrue (list_changed_called, "#B1");
+ Assert.AreEqual (ListChangedType.ItemAdded, list_changed_args.ListChangedType, "#B2");
+
+ ClearListChangedLog ();
+
+ binding_list.RemoveAt (0);
+ Assert.IsTrue (list_changed_called, "#D1");
+ Assert.AreEqual (ListChangedType.ItemDeleted, list_changed_args.ListChangedType, "#D2");
+
+ ClearListChangedLog ();
+
+ binding_list [0] = new MockItem ();
+ Assert.IsTrue (list_changed_called, "#E1");
+ Assert.AreEqual (ListChangedType.ItemChanged, list_changed_args.ListChangedType, "#E2");
+
+ ClearListChangedLog ();
+
+ binding_list.DoResetItem (0);
+ Assert.IsTrue (list_changed_called, "#F1");
+ Assert.AreEqual (ListChangedType.ItemChanged, list_changed_args.ListChangedType, "#F2");
+
+ ClearListChangedLog ();
+
+ binding_list.DoResetBinding ();
+ Assert.IsTrue (list_changed_called, "#G1");
+ Assert.AreEqual (ListChangedType.Reset, list_changed_args.ListChangedType, "#G2");
+
+ binding_list.Clear ();
+ Assert.IsTrue (list_changed_called, "#F1");
+ Assert.AreEqual (ListChangedType.Reset, list_changed_args.ListChangedType, "#F2");
+
+ currency_manager.ListChanged -= ListChangedEvent;
+ }
+
+ void ClearListChangedLog ()
+ {
+ list_changed_called = false;
+ list_changed_args = null;
+ }
+
+ public class BindingListChild<T> : BindingList<T>
+ {
+ public void DoResetItem (int position)
+ {
+ ResetItem (position);
+ }
+
+ public void DoResetBinding ()
+ {
+ ResetBindings ();
+ }
+ }
+#endif
+
}
}
-