2007-03-28 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / CurrencyManagerTest.cs
index 3dd672af5080b3ae287bd4bea6576aa2469120e0..46e065bb945ad7c1eafb5176dba01296cb9999c5 100644 (file)
 // 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 {
-
+namespace MonoTests.System.Windows.Forms
+{
        [TestFixture]
-       public class CurrencyManagerTest {
-
+       public class CurrencyManagerTest
+       {
                [Test]
                public void Defaults ()
                {
@@ -106,6 +107,30 @@ namespace MonoTests.System.Windows.Forms {
 
                        // 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");
                }
 
                [Test]
@@ -402,6 +427,8 @@ namespace MonoTests.System.Windows.Forms {
 
                        // Can't create a list on a child relation
                        CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
+
+                       TestHelper.RemoveWarning (cm);
                }
 
                [Test]
@@ -559,7 +586,6 @@ namespace MonoTests.System.Windows.Forms {
 
                        return dataset;
                }
-
                [Test]
                public void EndUninitializedEdit ()
                {
@@ -579,6 +605,388 @@ namespace MonoTests.System.Windows.Forms {
 
                        cm.CancelCurrentEdit ();
                }
+
+               [Test]
+               public void CheckPositionOfRelatedSibling1 ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
+                       CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       cm.Position++;
+                       cm.Position++;
+
+                       // position is not updated
+                       Assert.AreEqual (0, scm.Position, "#8");
+               }
+
+               [Test]
+               public void CheckPositionOfRelatedSibling2 ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1.Relation"] as CurrencyManager;
+                       CurrencyManager scm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       Assert.AreEqual (0, cm.Position, "#1");
+
+                       scm.Position++;
+
+                       Assert.AreEqual (0, cm.Position, "#2");
+               }
+
+               int event_num;
+               int current_changed;
+               int position_changed;
+               int item_changed;
+               ItemChangedEventArgs item_changed_args;
+
+               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);*/ }
+
+               [Test]
+               public void AddNew ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       event_num = current_changed = position_changed = -1;
+                       cm.CurrentChanged += new EventHandler (CurrentChanged);
+                       cm.PositionChanged += new EventHandler (PositionChanged);
+                       cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
+
+                       Assert.AreEqual (0, cm.Position, "AddNew1");
+                       Assert.AreEqual (10, cm.Count, "AddNew2");
+                       Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
+
+                       cm.AddNew ();
+
+                       Assert.AreEqual (10, cm.Position, "AddNew3");
+                       Assert.AreEqual (11, cm.Count, "AddNew4");
+                       Assert.AreEqual (cm.Count, cm.List.Count, "AddNew4.5");
+
+                       Assert.AreEqual (0, item_changed, "AddNew5");
+                       Assert.AreEqual (-1, item_changed_args.Index, "AddNew6");
+                       Assert.AreEqual (1, current_changed, "AddNew7");
+                       Assert.AreEqual (2, position_changed, "AddNew8");
+
+                       cm.CurrentChanged -= new EventHandler (CurrentChanged);
+                       cm.PositionChanged -= new EventHandler (PositionChanged);
+               }
+
+               [Test]
+               public void CancelAddNew ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       DataView dv = cm.List as DataView;
+
+                       event_num = current_changed = position_changed = -1;
+                       cm.CurrentChanged += new EventHandler (CurrentChanged);
+                       cm.PositionChanged += new EventHandler (PositionChanged);
+                       cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
+                       dv.ListChanged += new ListChangedEventHandler (ListChanged);
+
+                       Assert.AreEqual (0, cm.Position, "CancelAddNew1");
+                       Assert.AreEqual (10, cm.Count, "CancelAddNew2");
+                       Assert.AreEqual (cm.Count, cm.List.Count, "AddNew2.5");
+
+                       cm.AddNew ();
+
+                       Assert.AreEqual (0, item_changed, "CancelAddNew3");
+                       Assert.AreEqual (-1, item_changed_args.Index, "CancelAddNew4");
+                       Assert.AreEqual (1, current_changed, "CancelAddNew5");
+                       Assert.AreEqual (2, position_changed, "CancelAddNew6");
+
+                       cm.CancelCurrentEdit ();
+
+                       Assert.AreEqual (6, item_changed, "CancelAddNew7");
+                       Assert.AreEqual (9, item_changed_args.Index, "CancelAddNew8");
+                       Assert.AreEqual (3, current_changed, "CancelAddNew9");
+                       Assert.AreEqual (4, position_changed, "CancelAddNew10");
+
+                       Assert.AreEqual (9, cm.Position, "CancelAddNew11");
+                       Assert.AreEqual (10, cm.Count, "CancelAddNew12");
+                       Assert.AreEqual (cm.Count, cm.List.Count, "AddNew12.5");
+
+                       cm.CurrentChanged -= new EventHandler (CurrentChanged);
+                       cm.PositionChanged -= new EventHandler (PositionChanged);
+               }
+
+               [Test]
+               public void EndAddNew ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       event_num = current_changed = position_changed = -1;
+                       cm.CurrentChanged += new EventHandler (CurrentChanged);
+                       cm.PositionChanged += new EventHandler (PositionChanged);
+                       cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
+
+                       Assert.AreEqual (0, cm.Position, "EndAddNew1");
+                       Assert.AreEqual (10, cm.Count, "EndAddNew2");
+
+                       cm.AddNew ();
+
+                       Assert.AreEqual (0, item_changed, "EndAddNew3");
+                       Assert.AreEqual (-1, item_changed_args.Index, "EndAddNew4");
+                       Assert.AreEqual (1, current_changed, "EndAddNew5");
+                       Assert.AreEqual (2, position_changed, "EndAddNew6");
+
+                       cm.EndCurrentEdit ();
+
+                       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");
+
+                       Assert.AreEqual (10, cm.Position, "EndAddNew11");
+                       Assert.AreEqual (11, cm.Count, "EndAddNew12");
+
+                       cm.CurrentChanged -= new EventHandler (CurrentChanged);
+                       cm.PositionChanged -= new EventHandler (PositionChanged);
+               }
+
+               [Test]
+               public void AddNew2 ()
+               {
+                       DataSet data_source = CreateRelatedDataSet ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Table1"] as CurrencyManager;
+
+                       DataView dv = cm.List as DataView;
+
+                       event_num = current_changed = position_changed = -1;
+                       cm.CurrentChanged += new EventHandler (CurrentChanged);
+                       cm.PositionChanged += new EventHandler (PositionChanged);
+                       cm.ItemChanged += new ItemChangedEventHandler (ItemChanged);
+                       dv.ListChanged += new ListChangedEventHandler (ListChanged);
+
+                       Assert.AreEqual (0, cm.Position, "AddNew1");
+                       Assert.AreEqual (10, cm.Count, "AddNew2");
+
+                       cm.AddNew ();
+
+                       Assert.AreEqual (10, cm.Position, "AddNew3");
+                       Assert.AreEqual (11, cm.Count, "AddNew4");
+
+                       // this does an implicit EndCurrentEdit
+                       cm.AddNew ();
+
+                       Assert.AreEqual (11, cm.Position, "AddNew5");
+                       Assert.AreEqual (12, cm.Count, "AddNew6");
+               }
+
+
+               DataSet CreateRelatedDataSetLarge ()
+               {
+                       DataSet dataset = new DataSet ("CustomerSet");
+                       DataTable dt1 = new DataTable ("Customers");
+                       DataTable dt2 = new DataTable ("Orders");
+                       DataTable dt3 = new DataTable ("Addresses");
+                       DataColumn column;
+
+                       // customer table
+                       column = new DataColumn ("CustomerID");
+                       column.DataType = typeof (int);
+                       column.Unique = true;
+                       dt1.Columns.Add (column);
+
+                       column = new DataColumn ("CustomerName");
+                       column.DataType = typeof (string);
+                       column.Unique = false;
+                       dt1.Columns.Add (column);
+
+                       // order table
+                       column = new DataColumn ("OrderID");
+                       column.DataType = typeof (int);
+                       column.Unique = true;
+                       dt2.Columns.Add (column);
+
+                       column = new DataColumn ("ItemName");
+                       column.DataType = typeof (string);
+                       column.Unique = false;
+                       dt2.Columns.Add (column);
+
+                       column = new DataColumn ("CustomerID");
+                       column.DataType = typeof (int);
+                       column.Unique = false;
+                       dt2.Columns.Add (column);
+
+                       column = new DataColumn ("AddressID");
+                       column.DataType = typeof (int);
+                       column.Unique = false;
+                       dt2.Columns.Add (column);
+
+                       // address table
+                       column = new DataColumn ("AddressID");
+                       column.DataType = typeof (int);
+                       column.Unique = true;
+                       dt3.Columns.Add (column);
+
+                       column = new DataColumn ("AddressString");
+                       column.DataType = typeof (string);
+                       column.Unique = false;
+                       dt3.Columns.Add (column);
+
+                       column = new DataColumn ("CustomerID");
+                       column.DataType = typeof (int);
+                       column.Unique = false;
+                       dt3.Columns.Add (column);
+
+                       for (int i = 0; i < 10; i ++) {
+                               DataRow row = dt1.NewRow ();
+                               row["CustomerID"] = i;
+                               row["CustomerName"] = String.Format ("Customer Name #{0}", i);
+                               dt1.Rows.Add (row);
+                       }
+
+                       int ordernum = 0;
+                       for (int i = 0; i < 10; i ++) {
+                               for (int j = 0; j < (i < 5 ? 3 : 5); j ++) {
+                                       DataRow row = dt2.NewRow ();
+                                       row["OrderID"] = ordernum++;
+                                       row["ItemName"] = String.Format ("Item order #{0}", j);
+                                       row["CustomerID"] = i;
+                                       row["AddressID"] = j;
+                                       dt2.Rows.Add (row);
+                               }
+                       }
+
+                       int addressid = 0;
+                       for (int i = 0; i < 4; i ++) {
+                               for (int j = 0; j < 4; j ++) {
+                                       DataRow row = dt3.NewRow ();
+                                       row["AddressID"] = addressid++;
+                                       row["AddressString"] = String.Format ("Customer Address {0}", j);
+                                       row["CustomerID"] = i;
+                                       dt3.Rows.Add (row);
+                               }
+                       }
+
+                       dataset.Tables.Add (dt1);
+                       dataset.Tables.Add (dt2);
+                       dataset.Tables.Add (dt3);
+                       dataset.Relations.Add ("Customer_Orders", dt1.Columns["CustomerID"], dt2.Columns["CustomerID"]);
+                       dataset.Relations.Add ("Customer_Addresses", dt1.Columns["CustomerID"], dt3.Columns["CustomerID"]);
+                       dataset.Relations.Add ("Address_Orders", dt3.Columns["AddressID"], dt2.Columns["AddressID"]);
+
+                       return dataset;
+               }
+
+               [Test]
+               public void RelatedCurrencyManagerTest ()
+               {
+                       DataSet data_source = CreateRelatedDataSetLarge ();
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm = bc [data_source, "Customers"] as CurrencyManager;
+                       CurrencyManager rcm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
+
+                       IList list = rcm.List;
+                       Assert.AreEqual (3, rcm.Count, "count1");
+                       Assert.AreEqual (3, list.Count, "listcount1");
+
+                       cm.Position = 1;
+                       Assert.AreEqual (3, rcm.Count, "count2");
+                       Assert.AreEqual (3, list.Count, "listcount2");
+
+                       cm.Position = 5;
+                       Assert.AreEqual (5, rcm.Count, "count3");
+                       Assert.AreEqual (3, list.Count, "listcount3");
+               }
+               
+               [Test]
+               public void TestCurrencyManagerBindings ()
+               {
+                       DataSet data_source = CreateRelatedDataSetLarge ();
+                       BindingContext bc = new BindingContext ();
+
+                       CurrencyManager cm = bc [data_source] as CurrencyManager;
+
+                       Console.WriteLine ("cm properties:");
+                       foreach (PropertyDescriptor pd in cm.GetItemProperties ())
+                               Console.WriteLine (" + {0}", pd.Name);
+                       Console.WriteLine ();
+
+                       Console.WriteLine ("dataset:");
+                       Console.WriteLine ("cm = {0}", cm.GetType());
+                       Console.WriteLine ("cm.Count = {0}", cm.Count);
+                       cm.Position = 0;
+                       Console.WriteLine ("cm.Current = {0}", cm.Current);
+                       Console.WriteLine ("cm.Current properties");
+                       foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
+                               Console.WriteLine (" + {0}", pd.Name);
+                       Console.WriteLine ();
+
+                       cm = bc [data_source.Tables["Customers"]] as CurrencyManager;
+                       Console.WriteLine ("datatable:");
+                       Console.WriteLine ("cm = {0}", cm.GetType());
+                       Console.WriteLine ("cm.Count = {0}", cm.Count);
+                       cm.Position = 0;
+                       Console.WriteLine ("cm.Current = {0}", cm.Current);
+                       Console.WriteLine ("cm.Current properties");
+                       foreach (PropertyDescriptor pd in ((ICustomTypeDescriptor)cm.Current).GetProperties ())
+                               Console.WriteLine (" + {0}", pd.Name);
+
+                       Console.WriteLine ();
+
+                       DataViewManager vm = new DataViewManager (data_source);
+                       Console.WriteLine ("vm properties:");
+                       foreach (PropertyDescriptor pd in ((ITypedList)vm).GetItemProperties (null))
+                               Console.WriteLine (" + {0}", pd.Name);
+                       Console.WriteLine ();
+
+               }
+
+               Type GetFinalType (CurrencyManager cm)
+               {
+                       FieldInfo fi = cm.GetType().GetField ("finalType", BindingFlags.NonPublic | BindingFlags.Instance);
+
+                       return (Type)fi.GetValue (cm);
+               }
+
+               [Test]
+               public void FinalTypeTest ()
+               {
+                       BindingContext bc = new BindingContext ();
+                       CurrencyManager cm;
+                       ArrayList al;
+                       DataSet data_source = CreateRelatedDataSetLarge ();
+
+                       /* empty arraylist */
+                       al = new ArrayList ();
+                       cm = bc[al] as CurrencyManager;
+                       Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A1");
+
+                       /* arraylist with a string element*/
+                       al = new ArrayList ();
+                       al.Add ("hi");
+                       cm = bc[al] as CurrencyManager;
+                       Assert.AreEqual (typeof (ArrayList), GetFinalType (cm), "A2");
+
+                       /* string array */
+                       string[] s = new string[1];
+                       s[0] = "hi";
+                       cm = bc[s] as CurrencyManager;
+                       Assert.AreEqual (typeof (string[]), GetFinalType (cm), "A3");
+
+                       /* dataview */
+                       cm = bc [data_source, "Customers"] as CurrencyManager;
+                       Assert.AreEqual (typeof (DataView), GetFinalType (cm), "A4");
+
+                       /* relatedview */
+                       cm = bc [data_source, "Customers.Customer_Orders"] as CurrencyManager;
+                       /* on MS this is a RelatedView, on Mono a RelatedDataView.  both subclass from DataView, so let's check that. */
+                       Assert.IsFalse (typeof (DataView) == GetFinalType (cm), "A5");
+                       Assert.IsTrue (typeof (DataView).IsAssignableFrom (GetFinalType (cm)), "A6");
+               }
        }
 }
-