[System.Data] Try to fix random DataViewTest.DefaultColumnNameAddListChangedTest...
[mono.git] / mcs / class / System.Data / Test / System.Data / DataViewTest.cs
index 799eeceb186723fb2446f5a5da13a158fb102ed4..4be1824f6674c064bd460a4a3f0cab070727b250 100644 (file)
@@ -51,14 +51,19 @@ namespace MonoTests.System.Data
                ListChangedEventArgs listChangedArgs;
                TextWriter eventWriter;
 
+               DataColumn dc1;
+               DataColumn dc2;
+               DataColumn dc3;
+               DataColumn dc4;
+
                [SetUp]
                public void GetReady ()
                {
                        dataTable = new DataTable ("itemTable");
-                       DataColumn dc1 = new DataColumn ("itemId");
-                       DataColumn dc2 = new DataColumn ("itemName");
-                       DataColumn dc3 = new DataColumn ("itemPrice");
-                       DataColumn dc4 = new DataColumn ("itemCategory");
+                       dc1 = new DataColumn ("itemId");
+                       dc2 = new DataColumn ("itemName");
+                       dc3 = new DataColumn ("itemPrice");
+                       dc4 = new DataColumn ("itemCategory");
                        
                        dataTable.Columns.Add (dc1);
                        dataTable.Columns.Add (dc2);
@@ -122,6 +127,27 @@ namespace MonoTests.System.Data
                        dataView = null;
                }
 
+               [Test]
+               [ExpectedException (typeof (DataException))]
+               public void TestSortWithoutTable ()
+               {
+                       DataView dv = new DataView ();
+                       dv.Table = new DataTable ();
+                       dv.Sort = "abc";
+               }
+
+               [Test]
+               public void TestSort ()
+               {
+                       DataView dv = new DataView ();
+                       dv.Table = new DataTable ("dummy");
+                       dv.Table.Columns.Add ("abc");
+                       dv.Sort = "abc";
+                       dv.Sort = string.Empty;
+                       dv.Sort = "abc";
+                       AssertEquals ("test#01", "abc", dv.Sort);
+               }
+
                [Test]
                public void DataView ()
                {
@@ -225,6 +251,45 @@ namespace MonoTests.System.Data
                        AssertEquals ("Deleted.Value", "1", v);
                }
 
+               //xamarin bug #18898 # / novell bug #595899
+               [Test]
+               public void Bug18898 ()
+               {
+                       var table = new DataTable();
+                       table.Columns.Add("col1");
+                       table.Columns.Add("col2");
+                       
+                       table.Rows.Add("1", "2");
+                       table.Rows.Add("4", "3");
+
+                       table.AcceptChanges();
+
+                       table.Rows.Add("5", "6");
+
+                       DataView dv = new DataView(table, string.Empty, string.Empty, DataViewRowState.Added);
+                       dv.AllowNew = true;
+                       var new_row = dv.AddNew();
+                       new_row[0] = "7";
+                       new_row[1] = "8";
+
+                       var another_new_row = dv.AddNew();
+                       another_new_row[0] = "9";
+                       another_new_row[1] = "10";
+
+                       AssertEquals ("#1", dv[2][0], "9");
+
+                       //This should not throw a System.Data.VersionNotFoundException: "There is no Proposed data to accces"
+                       AssertEquals ("#1", dv[1][0], "7");     
+
+               }
+
+               [Test]
+               public void NullTableGetItemPropertiesTest ()
+               {
+                       DataView dataview = new DataView ();
+                       PropertyDescriptorCollection col = ((ITypedList)dataview).GetItemProperties (null);
+                       AssertEquals ("1", 0, col.Count);
+               }
 
                #region Sort Tests
                [Test]
@@ -345,14 +410,20 @@ namespace MonoTests.System.Data
                        dataView.AllowNew = true;
                        DataRowView drv = dataView.AddNew ();
                        AssertEquals ("test#01",ListChangedType.ItemAdded,listChangedArgs.ListChangedType);
-                       AssertEquals ("test#02",drv["itemName"],dataView [dataView.Count - 1]["itemName"]);
+                       AssertEquals ("test#02",-1,listChangedArgs.OldIndex);
+                       AssertEquals ("test#03",5,listChangedArgs.NewIndex);
+                       AssertEquals ("test#04",drv["itemName"],dataView [dataView.Count - 1]["itemName"]);
                        listChangedArgs = null;
                        drv["itemId"] = "item " + 1001;
                        drv["itemName"] = "name " + rndm.Next();
                        drv["itemPrice"] = "Rs. " + (rndm.Next() % 1000);
                        drv["itemCategory"] = "Cat " + ((rndm.Next() % 10) + 1);
                        // Actually no events are arisen when items are set.
-                       AssertNull ("test#03", listChangedArgs);
+                       AssertNull ("test#05", listChangedArgs);
+                       drv.CancelEdit ();
+                       AssertEquals ("test#06",ListChangedType.ItemDeleted,listChangedArgs.ListChangedType);
+                       AssertEquals ("test#07",-1,listChangedArgs.OldIndex);
+                       AssertEquals ("test#08",5,listChangedArgs.NewIndex);
                }
 
                [Test]
@@ -371,14 +442,14 @@ namespace MonoTests.System.Data
                        AssertNull ("#1", dv.Table);
                        dv.EndInit ();
 
-                       AssertEquals ("#2", table, dv.Table);
+                       AssertNull ("#2", dv.Table); // still.
                        AssertEquals ("#3", 0, table.Columns.Count);
 
                        table.EndInit ();
+                       AssertEquals ("#5", table, dv.Table);
                        AssertEquals ("#4", 2, table.Columns.Count);
                }
 
-#if NET_2_0
                private bool dvInitialized;
                 private void OnDataViewInitialized (object src, EventArgs args)
                 {
@@ -403,17 +474,18 @@ namespace MonoTests.System.Data
                        dv.Table = table;
                        AssertNull ("#1", dv.Table);
                        dv.EndInit ();
-
-                       dv.Initialized -= new EventHandler (OnDataViewInitialized);
                        
-                       AssertEquals ("#2", table, dv.Table);
+                       AssertNull ("#2", dv.Table);
                        AssertEquals ("#3", 0, table.Columns.Count);
 
                        table.EndInit ();
+
+                       dv.Initialized -= new EventHandler (OnDataViewInitialized); // this should not be unregistered before table.EndInit().
+                       
                        AssertEquals ("#4", 2, table.Columns.Count);
-                       AssertEquals("DataViewInitialized #5", dvInitialized, true);
+                       AssertEquals ("#6", table, dv.Table);
+                       AssertEquals ("DataViewInitialized #5", true, dvInitialized);
                }
-#endif
 
                [Test]
                [ExpectedException(typeof(ArgumentException))]
@@ -451,9 +523,6 @@ namespace MonoTests.System.Data
 
                [Test]
                [ExpectedException (typeof (ArgumentException))]
-#if TARGET_JVM\r
-               [NUnit.Framework.Category ("NotWorking")] // defect 5446
-#endif
                public void Find_3 ()
                {
                        dataView.Sort = "itemID, itemName";
@@ -573,7 +642,7 @@ namespace MonoTests.System.Data
                        DataView TestView = new DataView (dataTable);
                        TestView.Delete (0);
                        DataRow r = TestView.Table.Rows [0];
-                       Assertion.Assert ("Dv #1", !(r ["itemId"] == "item 1"));
+                       Assertion.Assert ("Dv #1", !((string)r ["itemId"] == "item 1"));
                }
 
                [Test]
@@ -594,12 +663,12 @@ namespace MonoTests.System.Data
                }
 
                [Test]
-               [ExpectedException (typeof (DataException))]
+               [ExpectedException (typeof (IndexOutOfRangeException))]
                public void TestDeleteClosed ()
                {
                        DataView TestView = new DataView (dataTable);
                        TestView.Dispose (); // Close the table
-                       TestView.Delete (0);
+                       TestView.Delete (0); // cannot access to item at 0.
                }
 
                [Test] // based on bug #74631
@@ -680,11 +749,90 @@ namespace MonoTests.System.Data
                        AssertEquals (reference, eventWriter.ToString ());
                }
 
+               [Test]
+               public void ColumnChangeName ()
+               {
+                       string result = @"setting table...
+---- OnListChanged PropertyDescriptorChanged,0,0
+---- OnListChanged Reset,-1,-1
+table was set.
+---- OnListChanged PropertyDescriptorChanged,0,0
+";
+
+                       eventWriter = new StringWriter ();
+
+                       ComplexEventSequence1View dv =
+                               new ComplexEventSequence1View (dataTable, eventWriter);
+
+                       dc2.ColumnName = "new_column_name";
+
+                       AssertEquals (result.Replace ("\r\n", "\n"), eventWriter.ToString ().Replace ("\r\n", "\n"));
+               }
+
                private void ListChanged (object o, ListChangedEventArgs e)
                {
                        eventWriter.Write (" =====" + e.ListChangedType + ":" + e.NewIndex);
                }
 
+               [Test]
+               [NUnit.Framework.Category ("NotWorking")]
+               public void ComplexEventSequence2 ()
+               {
+                       string result = @"setting table...
+---- OnListChanged PropertyDescriptorChanged,0,0
+----- UpdateIndex : True
+---- OnListChanged Reset,-1,-1
+table was set.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ col1 added.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ col2 added.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ col3 added.
+---- OnListChanged Reset,-1,-1
+added tables to dataset
+---- OnListChanged PropertyDescriptorAdded,0,0
+added relation 1
+---- OnListChanged PropertyDescriptorAdded,0,0
+added relation 2
+---- OnListChanged PropertyDescriptorDeleted,0,0
+removed relation 2
+";
+
+                       eventWriter = new StringWriter ();
+
+                       DataSet ds = new DataSet ();
+                       DataTable dt = new DataTable ("table");
+                       DataTable dt2 = new DataTable ("table2");
+                       ComplexEventSequence1View dv =
+                               new ComplexEventSequence1View (dt, eventWriter);
+                       dt.Columns.Add ("col1");
+                       eventWriter.WriteLine (" col1 added.");
+                       dt.Columns.Add ("col2");
+                       eventWriter.WriteLine (" col2 added.");
+                       dt.Columns.Add ("col3");
+                       eventWriter.WriteLine (" col3 added.");
+
+                       dt2.Columns.Add ("col1");
+                       dt2.Columns.Add ("col2");
+                       dt2.Columns.Add ("col3");
+
+                       ds.Tables.Add (dt);
+                       ds.Tables.Add (dt2);
+
+                       eventWriter.WriteLine ("added tables to dataset");
+                       ds.Relations.Add ("Relation", dt.Columns ["col1"], dt2.Columns ["col1"]);
+                       eventWriter.WriteLine ("added relation 1");
+
+                       DataRelation dr = ds.Relations.Add ("Relation2", dt2.Columns ["col2"], dt.Columns ["col2"]);
+                       eventWriter.WriteLine ("added relation 2");
+
+                       ds.Relations.Remove (dr);
+                       eventWriter.WriteLine ("removed relation 2");
+
+                       AssertEquals (result.Replace ("\r\n", "\n"), eventWriter.ToString ().Replace ("\r\n", "\n"));
+               }
+
                [Test]
                [NUnit.Framework.Category ("NotWorking")]
                public void ComplexEventSequence1 ()
@@ -794,7 +942,48 @@ table changed.
                        dv.Table = new DataTable ("table2");
                        eventWriter.WriteLine ("table changed.");
 
-                       AssertEquals (result, eventWriter.ToString ().Replace ("\r\n", "\n"));
+                       AssertEquals (result.Replace ("\r\n", "\n"), eventWriter.ToString ().Replace ("\r\n", "\n"));
+               }
+
+               [Test]
+               public void DefaultColumnNameAddListChangedTest ()
+               {
+                       string result = @"setting table...
+---- OnListChanged PropertyDescriptorChanged,0,0
+---- OnListChanged Reset,-1,-1
+table was set.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ default named column added.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ non-default named column added.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ another default named column added (Column2).
+---- OnListChanged PropertyDescriptorAdded,0,0
+ add a column with the same name as the default columnnames.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ add a column with a null name.
+---- OnListChanged PropertyDescriptorAdded,0,0
+ add a column with an empty name.
+";
+                       eventWriter = new StringWriter ();
+                       DataTable dt = new DataTable ("table");
+                       ComplexEventSequence1View dv =
+                               new ComplexEventSequence1View (dt, eventWriter);
+                       dt.Columns.Add ();
+                       eventWriter.WriteLine (" default named column added.");
+                       dt.Columns.Add ("non-defaultNamedColumn");
+                       eventWriter.WriteLine (" non-default named column added.");
+                       DataColumn c = dt.Columns.Add ();
+                       eventWriter.WriteLine (" another default named column added ({0}).", c.ColumnName);
+                       dt.Columns.Add ("Column3");
+                       eventWriter.WriteLine (" add a column with the same name as the default columnnames.");
+                       dt.Columns.Add ((string)null);
+                       eventWriter.WriteLine (" add a column with a null name.");
+                       dt.Columns.Add ("");
+                       eventWriter.WriteLine (" add a column with an empty name.");
+
+                       AssertEquals (result.Replace ("\r\n", "\n"), eventWriter.ToString ().Replace ("\r\n", "\n"));
+                       GC.KeepAlive (dv);
                }
 
                public class ComplexEventSequence1View : DataView