// 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 ()
{
// 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]
// Can't create a list on a child relation
CurrencyManager cm = bc [data_source, "Table2.Relation"] as CurrencyManager;
+
+ TestHelper.RemoveWarning (cm);
}
[Test]
return dataset;
}
-
[Test]
public void EndUninitializedEdit ()
{
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");
+ }
}
}
-