Standardized Mainsoft System.Data tests except exception tests.
[mono.git] / mcs / class / System.Data / Test / System.Data / ForeignKeyConstraintTest2.cs
1 // Authors:
2 //   Rafael Mizrahi   <rafim@mainsoft.com>
3 //   Erez Lotan       <erezl@mainsoft.com>
4 //   Oren Gurfinkel   <oreng@mainsoft.com>
5 //   Ofer Borstein
6 // 
7 // Copyright (c) 2004 Mainsoft Co.
8 // 
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using NUnit.Framework;
30 using System;
31 using System.Data;
32 using MonoTests.System.Data.Test.Utils;
33
34 namespace MonoTests_System.Data
35 {
36         [TestFixture] public class ForeignKeyConstraintTest2
37         {
38                 [Test] public void Columns()
39                 {
40                         //int RowCount;
41                         DataSet ds = new DataSet();
42                         DataTable dtParent = DataProvider.CreateParentDataTable();
43                         DataTable dtChild = DataProvider.CreateChildDataTable();
44                         ds.Tables.Add(dtParent);
45                         ds.Tables.Add(dtChild);
46
47                         ForeignKeyConstraint fc = null;
48                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
49
50                         // Columns
51                         Assert.AreEqual(dtChild.Columns[0] , fc.Columns[0]  , "FKC");
52
53                         // Columns count
54                         Assert.AreEqual(1 , fc.Columns.Length , "FKC");
55                 }
56
57                 [Test] public void Equals()
58                 {
59                         DataSet ds = new DataSet();
60                         DataTable dtParent = DataProvider.CreateParentDataTable();
61                         DataTable dtChild = DataProvider.CreateChildDataTable();
62                         ds.Tables.Add(dtParent);
63                         ds.Tables.Add(dtChild);
64                         dtParent.PrimaryKey = new DataColumn[] {dtParent.Columns[0]};
65                         ds.EnforceConstraints = true;
66
67                         ForeignKeyConstraint fc1,fc2;
68                         fc1 = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
69
70                         fc2 = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[1]);
71                         // different columnn
72                         Assert.AreEqual(false, fc1.Equals(fc2), "FKC");
73
74                         //Two System.Data.ForeignKeyConstraint are equal if they constrain the same columns.
75                         // same column
76                         fc2 = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
77                         Assert.AreEqual(true, fc1.Equals(fc2), "FKC");
78                 }
79
80                 [Test] public void RelatedColumns()
81                 {
82                         DataSet ds = new DataSet();
83                         DataTable dtParent = DataProvider.CreateParentDataTable();
84                         DataTable dtChild = DataProvider.CreateChildDataTable();
85                         ds.Tables.Add(dtParent);
86                         ds.Tables.Add(dtChild);
87                         ForeignKeyConstraint fc = null;
88                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
89
90                         // RelatedColumns
91                         Assert.AreEqual(new DataColumn[] {dtParent.Columns[0]}, fc.RelatedColumns , "FKC");
92                 }
93
94                 [Test] public void RelatedTable()
95                 {
96                         DataSet ds = new DataSet();
97                         DataTable dtParent = DataProvider.CreateParentDataTable();
98                         DataTable dtChild = DataProvider.CreateChildDataTable();
99                         ds.Tables.Add(dtParent);
100                         ds.Tables.Add(dtChild);
101                         ForeignKeyConstraint fc = null;
102                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
103
104                         // RelatedTable
105                         Assert.AreEqual(dtParent, fc.RelatedTable , "FKC");
106                 }
107
108                 [Test] public void Table()
109                 {
110                         DataSet ds = new DataSet();
111                         DataTable dtParent = DataProvider.CreateParentDataTable();
112                         DataTable dtChild = DataProvider.CreateChildDataTable();
113                         ds.Tables.Add(dtParent);
114                         ds.Tables.Add(dtChild);
115                         ForeignKeyConstraint fc = null;
116                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
117
118                         // Table
119                         Assert.AreEqual(dtChild , fc.Table , "FKC");
120                 }
121
122                 [Test] public new void ToString()
123                 {
124                         DataTable dtParent = DataProvider.CreateParentDataTable();
125                         DataTable dtChild = DataProvider.CreateChildDataTable();
126
127                         ForeignKeyConstraint fc = null;
128                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
129
130                         // ToString - default
131                         Assert.AreEqual(string.Empty , fc.ToString(), "FKC");
132
133                         fc = new ForeignKeyConstraint("myConstraint",dtParent.Columns[0],dtChild.Columns[0]);
134                         // Tostring - Constraint name
135                         Assert.AreEqual("myConstraint", fc.ToString(), "FKC");
136                 }
137
138                 [Test] public void acceptRejectRule()
139                 {
140                         DataSet ds = getNewDataSet();
141
142                         ForeignKeyConstraint fc = new ForeignKeyConstraint(ds.Tables[0].Columns[0],ds.Tables[1].Columns[0]);
143                         fc.AcceptRejectRule= AcceptRejectRule.Cascade;
144                         ds.Tables[1].Constraints.Add(fc);
145
146                         //Update the parent 
147
148                         ds.Tables[0].Rows[0]["ParentId"] = 777;
149                         Assert.AreEqual(true, ds.Tables[1].Select("ParentId=777").Length > 0 , "FKC");
150                         ds.Tables[0].RejectChanges();
151                         Assert.AreEqual(0, ds.Tables[1].Select("ParentId=777").Length , "FKC");
152                 }
153                 private DataSet getNewDataSet()
154                 {
155                         DataSet ds1 = new DataSet();
156                         ds1.Tables.Add(DataProvider.CreateParentDataTable());
157                         ds1.Tables.Add(DataProvider.CreateChildDataTable());
158                         //      ds1.Tables.Add(DataProvider.CreateChildDataTable());
159                         ds1.Tables[0].PrimaryKey=  new DataColumn[] {ds1.Tables[0].Columns[0]};
160
161                         return ds1;
162                 }
163
164                 [Test] public void constraintName()
165                 {
166                         DataSet ds = new DataSet();
167                         DataTable dtParent = DataProvider.CreateParentDataTable();
168                         DataTable dtChild = DataProvider.CreateChildDataTable();
169                         ds.Tables.Add(dtParent);
170                         ds.Tables.Add(dtChild);
171
172                         ForeignKeyConstraint fc = null;
173                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
174
175                         // default 
176                         Assert.AreEqual(string.Empty , fc.ConstraintName , "FKC");
177
178                         fc.ConstraintName  = "myConstraint";
179
180                         // set/get 
181                         Assert.AreEqual("myConstraint" , fc.ConstraintName , "FKC");
182                 }
183
184                 [Test] public void ctor_ParentColChildCol()
185                 {
186                         DataTable dtParent = DataProvider.CreateParentDataTable();
187                         DataTable dtChild = DataProvider.CreateChildDataTable();
188                         DataSet ds = new DataSet();
189                         ds.Tables.Add(dtChild);
190                         ds.Tables.Add(dtParent);
191
192                         ForeignKeyConstraint fc = null;
193
194                         // Ctor ArgumentException
195                         try 
196                         {
197                                 fc = new ForeignKeyConstraint(new DataColumn[] {dtParent.Columns[0]} ,new DataColumn[] {dtChild.Columns[0],dtChild.Columns[1]});                                
198                                 Assert.Fail("DS333: ctor Indexer Failed to throw ArgumentException");
199                         }
200                         catch (ArgumentException) {}
201                         catch (AssertionException exc) {throw  exc;}
202                         catch (Exception exc)
203                         {
204                                 Assert.Fail("DS334: ctor. Wrong exception type. Got:" + exc);
205                         }
206
207                         fc = new ForeignKeyConstraint(new DataColumn[] {dtParent.Columns[0],dtParent.Columns[1]} ,new DataColumn[] {dtChild.Columns[0],dtChild.Columns[2]});                            
208
209                         // Add constraint to table - ArgumentException
210                         try 
211                         {
212                                 dtChild.Constraints.Add(fc);
213                                 Assert.Fail("DS333: ctor Indexer Failed to throw ArgumentException");
214                         }
215                         catch (ArgumentException) {}
216                         catch (AssertionException exc) {throw  exc;}
217                         catch (Exception exc)
218                         {
219                                 Assert.Fail("DS334: ctor. Wrong exception type. Got:" + exc);
220                         }
221
222                         // Child Table Constraints Count - two columnns
223                         Assert.AreEqual(0, dtChild.Constraints.Count , "FKC");
224
225                         // Parent Table Constraints Count - two columnns
226                         Assert.AreEqual(1, dtParent.Constraints.Count , "FKC");
227
228                         // DataSet relations Count
229                         Assert.AreEqual(0, ds.Relations.Count , "FKC");
230
231                         dtParent.Constraints.Clear();
232                         dtChild.Constraints.Clear();
233
234                         fc = new ForeignKeyConstraint(new DataColumn[] {dtParent.Columns[0]} ,new DataColumn[] {dtChild.Columns[0]});
235                         // Ctor
236                         Assert.AreEqual(false , fc == null , "FKC");
237
238                         // Child Table Constraints Count
239                         Assert.AreEqual(0, dtChild.Constraints.Count , "FKC");
240
241                         // Parent Table Constraints Count
242                         Assert.AreEqual(0, dtParent.Constraints.Count , "FKC");
243
244                         // DataSet relations Count
245                         Assert.AreEqual(0, ds.Relations.Count , "FKC");
246
247                         dtChild.Constraints.Add(fc);
248
249                         // Child Table Constraints Count, Add
250                         Assert.AreEqual(1, dtChild.Constraints.Count , "FKC");
251
252                         // Parent Table Constraints Count, Add
253                         Assert.AreEqual(1, dtParent.Constraints.Count , "FKC");
254
255                         // DataSet relations Count, Add
256                         Assert.AreEqual(0, ds.Relations.Count , "FKC");
257
258                         // Parent Table Constraints type
259                         Assert.AreEqual(typeof(UniqueConstraint), dtParent.Constraints[0].GetType() , "FKC");
260
261                         // Parent Table Constraints type
262                         Assert.AreEqual(typeof(ForeignKeyConstraint), dtChild.Constraints[0].GetType() , "FKC");
263
264                         // Parent Table Primary key
265                         Assert.AreEqual(0, dtParent.PrimaryKey.Length , "FKC");
266
267                         dtChild.Constraints.Clear();
268                         dtParent.Constraints.Clear();
269                         ds.Relations.Add(new DataRelation("myRelation",dtParent.Columns[0],dtChild.Columns[0]));
270
271                         // Relation - Child Table Constraints Count
272                         Assert.AreEqual(1, dtChild.Constraints.Count , "FKC");
273
274                         // Relation - Parent Table Constraints Count
275                         Assert.AreEqual(1, dtParent.Constraints.Count , "FKC");
276
277                         // Relation - Parent Table Constraints type
278                         Assert.AreEqual(typeof(UniqueConstraint), dtParent.Constraints[0].GetType() , "FKC");
279
280                         // Relation - Parent Table Constraints type
281                         Assert.AreEqual(typeof(ForeignKeyConstraint), dtChild.Constraints[0].GetType() , "FKC");
282
283                         // Relation - Parent Table Primary key
284                         Assert.AreEqual(0, dtParent.PrimaryKey.Length , "FKC");
285                 }
286
287                 [Test] public void ctor_NameParentColChildCol()
288                 {
289                         DataTable dtParent = DataProvider.CreateParentDataTable();
290                         DataTable dtChild = DataProvider.CreateChildDataTable();
291
292                         ForeignKeyConstraint fc = null;
293                         fc = new ForeignKeyConstraint("myForeignKey",dtParent.Columns[0],dtChild.Columns[0]);
294
295                         // Ctor
296                         Assert.AreEqual(false , fc == null , "FKC");
297
298                         // Ctor - name
299                         Assert.AreEqual("myForeignKey" , fc.ConstraintName  , "FKC");
300                 }
301
302                 [Test] public void ctor_NameParentColsChildCols()
303                 {
304                         DataTable dtParent = DataProvider.CreateParentDataTable();
305                         DataTable dtChild = DataProvider.CreateChildDataTable();
306
307                         ForeignKeyConstraint fc = null;
308                         fc = new ForeignKeyConstraint("myForeignKey",new DataColumn[] {dtParent.Columns[0]} ,new DataColumn[] {dtChild.Columns[0]});
309
310                         // Ctor
311                         Assert.AreEqual(false , fc == null , "FKC");
312
313                         // Ctor - name
314                         Assert.AreEqual("myForeignKey" , fc.ConstraintName  , "FKC");
315                 }
316
317                 [Test] public void deleteRule()
318                 {
319                         DataSet ds = new DataSet();
320                         DataTable dtParent = DataProvider.CreateParentDataTable();
321                         DataTable dtChild = DataProvider.CreateChildDataTable();
322                         ds.Tables.Add(dtParent);
323                         ds.Tables.Add(dtChild);
324                         dtParent.PrimaryKey = new DataColumn[] {dtParent.Columns[0]};
325                         ds.EnforceConstraints = true;
326
327                         ForeignKeyConstraint fc = null;
328                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
329
330                         //checking default
331                         // Default
332                         Assert.AreEqual(Rule.Cascade , fc.DeleteRule , "FKC");
333
334                         //checking set/get
335                         foreach (Rule rule in Enum.GetValues(typeof(Rule)))
336                         {
337                                 // Set/Get - rule
338                                 fc.DeleteRule = rule;
339                                 Assert.AreEqual(rule, fc.DeleteRule , "FKC");
340                         }
341
342                         dtChild.Constraints.Add(fc);
343
344                         //checking delete rule
345
346                         // Rule = None, Delete Exception
347                         fc.DeleteRule = Rule.None;
348                         //Exception = "Cannot delete this row because constraints are enforced on relation Constraint1, and deleting this row will strand child rows."
349                         try 
350                         {
351                                 dtParent.Rows.Find(1).Delete();
352                                 Assert.Fail("DS333: Find Indexer Failed to throw InvalidConstraintException");
353                         }
354                         catch (InvalidConstraintException) {}
355                         catch (AssertionException exc) {throw  exc;}
356                         catch (Exception exc)
357                         {
358                                 Assert.Fail("DS334: Find. Wrong exception type. Got:" + exc);
359                         }
360
361                         // Rule = None, Delete succeed
362                         fc.DeleteRule = Rule.None;
363                         foreach (DataRow dr in dtChild.Select("ParentId = 1"))
364                                 dr.Delete();
365                         dtParent.Rows.Find(1).Delete();
366                         Assert.AreEqual(0, dtParent.Select("ParentId=1").Length , "FKC");
367
368                         // Rule = Cascade
369                         fc.DeleteRule = Rule.Cascade;
370                         dtParent.Rows.Find(2).Delete();
371                         Assert.AreEqual(0, dtChild.Select("ParentId=2").Length , "FKC");
372
373                         // Rule = SetNull
374                         DataSet ds1 = new DataSet();
375                         ds1.Tables.Add(DataProvider.CreateParentDataTable());
376                         ds1.Tables.Add(DataProvider.CreateChildDataTable());
377
378                         ForeignKeyConstraint fc1 = new ForeignKeyConstraint(ds1.Tables[0].Columns[0],ds1.Tables[1].Columns[1]); 
379                         fc1.DeleteRule = Rule.SetNull;
380                         ds1.Tables[1].Constraints.Add(fc1);
381
382                         Assert.AreEqual(0, ds1.Tables[1].Select("ChildId is null").Length, "FKC");
383
384                         ds1.Tables[0].PrimaryKey=  new DataColumn[] {ds1.Tables[0].Columns[0]};
385                         ds1.Tables[0].Rows.Find(3).Delete();
386
387                         ds1.Tables[0].AcceptChanges();
388                         ds1.Tables[1].AcceptChanges();  
389
390                         DataRow[] arr =  ds1.Tables[1].Select("ChildId is null");
391
392                         /*foreach (DataRow dr in arr)
393                                         {
394                                                 Assert.AreEqual(null, dr["ChildId"], "FKC");
395                                         }*/
396
397                         Assert.AreEqual(4, arr.Length , "FKC");
398
399                         // Rule = SetDefault
400                         //fc.DeleteRule = Rule.SetDefault;
401                         ds1 = new DataSet();
402                         ds1.Tables.Add(DataProvider.CreateParentDataTable());
403                         ds1.Tables.Add(DataProvider.CreateChildDataTable());
404
405                         fc1 = new ForeignKeyConstraint(ds1.Tables[0].Columns[0],ds1.Tables[1].Columns[1]); 
406                         fc1.DeleteRule = Rule.SetDefault;
407                         ds1.Tables[1].Constraints.Add(fc1);
408                         ds1.Tables[1].Columns[1].DefaultValue="777";
409
410                         //Add new row  --> in order to apply the forigen key rules
411                         DataRow dr2 = ds1.Tables[0].NewRow();
412                         dr2["ParentId"] = 777;
413                         ds1.Tables[0].Rows.Add(dr2);
414
415                         ds1.Tables[0].PrimaryKey=  new DataColumn[] {ds1.Tables[0].Columns[0]};
416                         ds1.Tables[0].Rows.Find(3).Delete();
417                         Assert.AreEqual(4, ds1.Tables[1].Select("ChildId=777").Length  , "FKC");
418                 }
419
420                 [Test] public void extendedProperties()
421                 {
422                         DataTable dtParent = DataProvider.CreateParentDataTable();
423                         DataTable dtChild = DataProvider.CreateParentDataTable();
424
425                         ForeignKeyConstraint fc = null;
426                         fc = new ForeignKeyConstraint(dtParent.Columns[0],dtChild.Columns[0]);
427
428                         PropertyCollection pc = fc.ExtendedProperties ;
429
430                         // Checking ExtendedProperties default 
431                         Assert.AreEqual(true, fc != null, "FKC");
432
433                         // Checking ExtendedProperties count 
434                         Assert.AreEqual(0, pc.Count , "FKC");
435                 }
436         }
437 }