2 // Rafael Mizrahi <rafim@mainsoft.com>
3 // Erez Lotan <erezl@mainsoft.com>
4 // Oren Gurfinkel <oreng@mainsoft.com>
7 // Copyright (c) 2004 Mainsoft Co.
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
29 using NUnit.Framework;
31 using System.ComponentModel;
32 using System.Collections;
34 using MonoTests.System.Data.Utils;
36 namespace MonoTests.System.Data
38 [TestFixture] public class DataRelationCollectionTest2
40 private int changesCounter = 0;
42 private void Relations_CollectionChanged(object sender, CollectionChangeEventArgs e)
47 private DataSet getDataSet()
49 DataSet ds = new DataSet();
50 DataTable dt1 = DataProvider.CreateParentDataTable();
51 DataTable dt2 = DataProvider.CreateChildDataTable();
64 [Test] public void AddRange()
66 DataSet ds = getDataSet();
67 DataRelation[] relArray = new DataRelation[2];
69 relArray[0] = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
70 relArray[1] = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
72 ds.Relations.AddRange(relArray);
74 Assert.AreEqual(2, ds.Relations.Count, "DRC1");
75 Assert.AreEqual("rel1", ds.Relations[0].RelationName, "DRC2");
76 Assert.AreEqual("rel2", ds.Relations[1].RelationName, "DRC3");
78 ds.Relations.AddRange(null);
81 [Test] public void Add_ByDataColumns()
83 DataSet ds = getDataSet();
84 ds.Relations.Add(ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
86 Assert.AreEqual(1, ds.Relations.Count, "DRC4");
88 Assert.AreEqual(1, ds.Tables[0].ChildRelations.Count, "DRC5"); //When adding a relation,it's also added on the tables
89 Assert.AreEqual(1, ds.Tables[1].ParentRelations.Count, "DRC6");
91 Assert.AreEqual(typeof(UniqueConstraint), ds.Tables[0].Constraints[0].GetType(), "DRC7");
92 Assert.AreEqual(typeof(ForeignKeyConstraint), ds.Tables[1].Constraints[0].GetType(), "DRC8");
95 [Test] public void Add_ByNameDataColumns()
97 DataSet ds = getDataSet();
98 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
100 Assert.AreEqual(1, ds.Relations.Count, "DRC9");
102 Assert.AreEqual(1, ds.Tables[0].ChildRelations.Count, "DRC10"); //When adding a relation,it's also added on the tables
103 Assert.AreEqual(1, ds.Tables[1].ParentRelations.Count, "DRC11");
105 Assert.AreEqual(typeof(UniqueConstraint), ds.Tables[0].Constraints[0].GetType(), "DRC12");
106 Assert.AreEqual(typeof(ForeignKeyConstraint), ds.Tables[1].Constraints[0].GetType(), "DRC13");
108 Assert.AreEqual("rel1", ds.Relations[0].RelationName, "DRC14");
109 Assert.AreEqual("rel1", ds.Tables[0].ChildRelations[0].RelationName, "DRC15");
110 Assert.AreEqual("rel1", ds.Tables[1].ParentRelations[0].RelationName, "DRC16");
113 [Test] public void Add_ByNameDataColumnsWithConstraint()
115 DataSet ds = getDataSet();
116 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"],true);
118 Assert.AreEqual(1, ds.Relations.Count, "DRC17");
120 Assert.AreEqual(1, ds.Tables[0].ChildRelations.Count, "DRC18"); //When adding a relation,it's also added on the tables
121 Assert.AreEqual(1, ds.Tables[1].ParentRelations.Count, "DRC19");
123 Assert.AreEqual(typeof(UniqueConstraint), ds.Tables[0].Constraints[0].GetType(), "DRC20");
124 Assert.AreEqual(typeof(ForeignKeyConstraint), ds.Tables[1].Constraints[0].GetType(), "DRC21");
126 Assert.AreEqual("rel1", ds.Relations[0].RelationName, "DRC22");
127 Assert.AreEqual("rel1", ds.Tables[0].ChildRelations[0].RelationName, "DRC23");
128 Assert.AreEqual("rel1", ds.Tables[1].ParentRelations[0].RelationName, "DRC24");
130 [Test] public void Add_ByNameDataColumnsWithOutConstraint()
132 DataSet ds = getDataSet();
133 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"],false);
135 Assert.AreEqual(1, ds.Relations.Count, "DRC25");
137 Assert.AreEqual(1, ds.Tables[0].ChildRelations.Count, "DRC26"); //When adding a relation,it's also added on the tables
138 Assert.AreEqual(1, ds.Tables[1].ParentRelations.Count, "DRC27");
140 Assert.AreEqual(0, ds.Tables[0].Constraints.Count, "DRC28");
141 Assert.AreEqual(0, ds.Tables[1].Constraints.Count, "DRC29");
143 Assert.AreEqual("rel1", ds.Relations[0].RelationName, "DRC30");
144 Assert.AreEqual("rel1", ds.Tables[0].ChildRelations[0].RelationName, "DRC31");
145 Assert.AreEqual("rel1", ds.Tables[1].ParentRelations[0].RelationName, "DRC32");
148 [Test] public void CanRemove()
150 DataSet ds = getDataSet();
151 ds.Relations.Add(ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
152 Assert.AreEqual(true, ds.Relations.CanRemove(ds.Relations[0]), "DRC33");
153 Assert.AreEqual(true, ds.Tables[0].ChildRelations.CanRemove(ds.Tables[0].ChildRelations[0]), "DRC34");
154 Assert.AreEqual(true, ds.Tables[1].ParentRelations.CanRemove(ds.Tables[1].ParentRelations[0]), "DRC35");
155 Assert.AreEqual(false, ds.Relations.CanRemove(null), "DRC36");
157 [Test] public void CanRemove_DataRelation()
159 DataSet ds = getDataSet();
160 DataSet ds1 = getDataSet();
162 DataRelation rel = new DataRelation("rel1",
163 ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
165 Assert.AreEqual(false, ds1.Relations.CanRemove(rel), "DRC37");
168 [Test] public void Clear()
170 DataSet ds = getDataSet();
172 ds.Relations.Add(ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
173 ds.Relations.CollectionChanged+=new CollectionChangeEventHandler(Relations_CollectionChanged);
174 ds.Relations.Clear();
175 Assert.AreEqual(0, ds.Relations.Count, "DRC38");
176 Assert.AreEqual(1, changesCounter, "DRC39");
180 /// Clear was already checked at the clear sub test
182 [Test] public void CollectionChanged()
184 DataSet ds = getDataSet();
186 ds.Relations.CollectionChanged+=new CollectionChangeEventHandler(Relations_CollectionChanged);
188 DataRelation rel = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"]
189 ,ds.Tables[1].Columns["ParentId"]);
191 ds.Relations.Add(rel);
193 ds.Relations.Remove(rel);
195 Assert.AreEqual(2, changesCounter, "DRC40");
198 [Test] public void Contains()
200 DataSet ds = getDataSet();
201 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
203 Assert.AreEqual(true, ds.Relations.Contains("rel1"), "DRC41");
204 Assert.AreEqual(false, ds.Relations.Contains("RelL"), "DRC42");
205 Assert.AreEqual(false, ds.Relations.Contains("rel2"), "DRC43");
208 [Test] public void CopyTo()
210 DataSet ds = getDataSet();
212 DataRelation[] dataRelArray = new DataRelation[2];
214 ds.Relations.Add(new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]));
216 ds.Relations.CopyTo(dataRelArray,1);
218 Assert.AreEqual("rel1", dataRelArray[1].RelationName, "DRC44");
220 ds.Relations.CopyTo(dataRelArray,0);
222 Assert.AreEqual("rel1", dataRelArray[0].RelationName, "DRC45");
225 [Test] public void Count()
227 DataSet ds = getDataSet();
228 Assert.AreEqual(0, ds.Relations.Count, "DRC46");
229 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
230 Assert.AreEqual(1, ds.Relations.Count, "DRC47");
231 ds.Relations.Add("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
232 Assert.AreEqual(2, ds.Relations.Count, "DRC48");
233 ds.Relations.Remove("rel2");
234 Assert.AreEqual(1, ds.Relations.Count, "DRC49");
235 ds.Relations.Remove("rel1");
236 Assert.AreEqual(0, ds.Relations.Count, "DRC50");
239 [Test] public void GetEnumerator()
241 DataSet ds = getDataSet();
243 ds.Relations.Add("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
244 ds.Relations.Add("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
246 IEnumerator myEnumerator = ds.Relations.GetEnumerator();
248 while (myEnumerator.MoveNext())
251 Assert.AreEqual("rel", ((DataRelation)myEnumerator.Current).RelationName.Substring(0,3), "DRC51");
253 Assert.AreEqual(2, counter, "DRC52");
256 [Test] public void IndexOf_ByDataRelation()
258 DataSet ds = getDataSet();
259 DataSet ds1 = getDataSet();
261 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
262 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
263 DataRelation rel3 = new DataRelation("rel3",ds1.Tables[0].Columns["ParentId"],ds1.Tables[1].Columns["ParentId"]);
265 ds.Relations.Add(rel1);
266 ds.Relations.Add(rel2);
268 Assert.AreEqual(1, ds.Relations.IndexOf(rel2), "DRC53");
269 Assert.AreEqual(0, ds.Relations.IndexOf(rel1), "DRC54");
270 Assert.AreEqual(-1, ds.Relations.IndexOf((DataRelation)null), "DRC55");
271 Assert.AreEqual(-1, ds.Relations.IndexOf(rel3), "DRC56");
274 [Test] public void IndexOf_ByDataRelationName()
276 DataSet ds = getDataSet();
277 DataSet ds1 = getDataSet();
279 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
280 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
281 DataRelation rel3 = new DataRelation("rel3",ds1.Tables[0].Columns["ParentId"],ds1.Tables[1].Columns["ParentId"]);
283 ds.Relations.Add(rel1);
284 ds.Relations.Add(rel2);
286 Assert.AreEqual(1, ds.Relations.IndexOf("rel2"), "DRC57");
287 Assert.AreEqual(0, ds.Relations.IndexOf("rel1"), "DRC58");
288 Assert.AreEqual(-1, ds.Relations.IndexOf((string)null), "DRC59");
289 Assert.AreEqual(-1, ds.Relations.IndexOf("rel3"), "DRC60");
292 [Test] public void Item()
294 DataSet ds = getDataSet();
295 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
296 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
298 ds.Relations.Add(rel1);
299 ds.Relations.Add(rel2);
301 Assert.AreEqual("rel1", ds.Relations["rel1"].RelationName, "DRC61");
302 Assert.AreEqual("rel2", ds.Relations["rel2"].RelationName, "DRC62");
303 Assert.AreEqual("rel1", ds.Relations[0].RelationName, "DRC63");
304 Assert.AreEqual("rel2", ds.Relations[1].RelationName, "DRC64");
308 public void Add_DataColumn1()
\r
310 DataSet ds = DataProvider.CreateForigenConstraint();
\r
311 int originalRelationsCount = ds.Relations.Count;
\r
313 DataRelation rel = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"]
\r
314 ,ds.Tables[1].Columns["ParentId"]);
\r
316 ds.Relations.Add(rel);
\r
318 Assert.AreEqual(originalRelationsCount+1,ds.Relations.Count,"DRC70");
\r
320 Assert.AreEqual(1,ds.Tables[0].ChildRelations.Count,"DRC71"); //When adding a relation,it's also added on the tables
\r
321 Assert.AreEqual(1,ds.Tables[1].ParentRelations.Count,"DRC72");
\r
323 Assert.AreEqual(typeof(UniqueConstraint),ds.Tables[0].Constraints[0].GetType(),"DRC73");
\r
324 Assert.AreEqual(typeof(ForeignKeyConstraint),ds.Tables[1].Constraints[0].GetType(),"DRC74");
\r
328 ds.Relations.Add(rel);
\r
329 Assert.Fail("DR75: Add failed to throw ArgumentException");
\r
331 catch (ArgumentException) {}
\r
332 catch (AssertionException exc) {throw exc;}
\r
333 catch (Exception exc)
\r
335 Assert.Fail("DR76: Add. Wrong exception type. Got:" + exc);
\r
338 ds.Relations.Add(null);
\r
342 public void Add_DataColumn2()
\r
344 DataSet ds = GetDataSet();
\r
345 DataTable dt1 = ds.Tables[0];
\r
346 DataTable dt2 = ds.Tables[1];
\r
348 dt1.ChildRelations.Add(new DataRelation("rel1",dt1.Columns["ParentId"],dt2.Columns["ParentId"]));
\r
350 Assert.AreEqual(1,dt1.ChildRelations.Count,"DRC77");
\r
351 Assert.AreEqual(1,dt2.ParentRelations.Count,"DRC78");
\r
352 Assert.AreEqual(1,ds.Relations.Count,"DRC79"); //When adding relationship,it's also added on the dataset
\r
356 public void Add_DataColumn3()
\r
358 DataSet ds = GetDataSet();
\r
360 ds.Tables[1].ParentRelations.Add(new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]));
\r
362 Assert.AreEqual(1,ds.Tables[0].ChildRelations.Count,"DRC80");
\r
363 Assert.AreEqual(1,ds.Tables[1].ParentRelations.Count,"DRC81");
\r
364 Assert.AreEqual(1,ds.Relations.Count,"DRC82");
\r
368 public void Add_DataColumn4()
\r
370 DataSet ds = GetDataSet();
\r
371 DataTable dt = new DataTable();
\r
372 dt.Columns.Add("ParentId");
\r
375 ds.Relations.Add(new DataRelation("rel1",dt.Columns[0],ds.Tables[0].Columns[0]));
\r
376 Assert.Fail("DRC82: Add failed to throw InvalidConstraintException");
\r
378 catch (InvalidConstraintException) {}
\r
379 catch (AssertionException exc) {throw exc;}
\r
380 catch (Exception exc)
\r
382 Assert.Fail("DRC83: Add. Wrong exception type. Got:" + exc);
\r
387 public void Add_DataColumn5()
\r
389 DataSet ds = GetDataSet();
\r
392 private DataSet GetDataSet()
\r
394 DataSet ds = new DataSet();
\r
395 DataTable dt1 = DataProvider.CreateParentDataTable();
\r
396 DataTable dt2 = DataProvider.CreateChildDataTable();
\r
398 ds.Tables.Add(dt1);
\r
399 ds.Tables.Add(dt2);
\r
404 public void Remove_DataColumn()
\r
406 DataSet ds = getDataSet();
\r
407 DataSet ds1 = getDataSet();
\r
408 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
\r
409 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
\r
411 ds.Relations.Add(rel1);
\r
412 ds.Relations.Add(rel2);
\r
414 Assert.AreEqual(2,ds.Relations.Count,"DRC84");
\r
416 ds.Relations.CollectionChanged+=new CollectionChangeEventHandler(Relations_CollectionChanged);
\r
419 ds.Relations.Remove(rel1);
\r
420 Assert.AreEqual(1,ds.Relations.Count,"DRC85");
\r
421 Assert.AreEqual("rel2",ds.Relations[0].RelationName,"DRC86");
\r
422 ds.Relations.Remove(rel2);
\r
423 Assert.AreEqual(0,ds.Relations.Count,"DRC87");
\r
424 Assert.AreEqual(2,changesCounter,"DRC88"); //How many times the event fired
\r
425 ds.Relations.Remove((DataRelation)null);
\r
429 DataRelation rel3 = new DataRelation("rel3",ds1.Tables[0].Columns["ParentId"],ds1.Tables[1].Columns["ParentId"]);
\r
430 ds.Relations.Remove(rel3);
\r
431 Assert.Fail("DRC89: Remove failed to throw ArgumentException");
\r
433 catch (ArgumentException) {}
\r
434 catch (AssertionException exc) {throw exc;}
\r
435 catch (Exception exc)
\r
437 Assert.Fail("DRC90: Remove. Wrong exception type. Got:" + exc);
\r
442 public void Remove_String()
\r
444 DataSet ds = getDataSet();
\r
445 DataSet ds1 = getDataSet();
\r
446 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
\r
447 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
\r
449 ds.Relations.Add(rel1);
\r
450 ds.Relations.Add(rel2);
\r
452 Assert.AreEqual(ds.Relations.Count,2,"DRC91");
\r
454 ds.Relations.CollectionChanged+=new CollectionChangeEventHandler(Relations_CollectionChanged);
\r
457 ds.Relations.Remove("rel1");
\r
458 Assert.AreEqual(1,ds.Relations.Count,"DRC92");
\r
459 Assert.AreEqual("rel2",ds.Relations[0].RelationName,"DRC93");
\r
460 ds.Relations.Remove("rel2");
\r
461 Assert.AreEqual(0,ds.Relations.Count,"DRC94");
\r
462 Assert.AreEqual(2,changesCounter,"DRC95"); //How many times the event fired
\r
466 ds.Relations.Remove((string)null);
\r
467 Assert.Fail("DRC96: Remove failed to throw ArgumentException");
\r
469 catch (ArgumentException) {}
\r
470 catch (AssertionException exc) {throw exc;}
\r
471 catch (Exception exc)
\r
473 Assert.Fail("DRC97: Remove. Wrong exception type. Got:" + exc);
\r
479 //DataRelation rel3 = new DataRelation("rel3",ds1.Tables[0].Columns["ParentId"],ds1.Tables[1].Columns["ParentId"]);
\r
480 ds.Relations.Remove("rel3");
\r
481 Assert.Fail("DRC98: Remove failed to throw ArgumentException");
\r
483 catch (ArgumentException) {}
\r
484 catch (AssertionException exc) {throw exc;}
\r
485 catch (Exception exc)
\r
487 Assert.Fail("DRC99: Remove. Wrong exception type. Got:" + exc);
\r
491 private void RemoveAt()
\r
493 DataSet ds = getDataSet();
\r
494 DataSet ds1 = getDataSet();
\r
495 DataRelation rel1 = new DataRelation("rel1",ds.Tables[0].Columns["ParentId"],ds.Tables[1].Columns["ParentId"]);
\r
496 DataRelation rel2 = new DataRelation("rel2",ds.Tables[0].Columns["String1"],ds.Tables[1].Columns["String1"]);
\r
498 ds.Relations.Add(rel1);
\r
499 ds.Relations.Add(rel2);
\r
501 Assert.AreEqual(2,ds.Relations.Count,"DRC100");
\r
503 ds.Relations.CollectionChanged+=new CollectionChangeEventHandler(Relations_CollectionChanged);
\r
506 ds.Relations.RemoveAt(0);
\r
507 Assert.AreEqual(1,ds.Relations.Count,"DRC101");
\r
508 Assert.AreEqual("rel2",ds.Relations[0].RelationName,"DRC102");
\r
509 ds.Relations.RemoveAt(0);
\r
510 Assert.AreEqual(0,ds.Relations.Count,"DRC103");
\r
511 Assert.AreEqual(2,changesCounter,"DRC104"); //How many times the event fired
\r
516 //DataRelation rel3 = new DataRelation("rel3",ds1.Tables[0].Columns["ParentId"],ds1.Tables[1].Columns["ParentId"]);
\r
517 ds.Relations.RemoveAt(-1);
\r
518 Assert.Fail("DRC105: RemoveAt failed to throw IndexOutOfRangeException");
\r
520 catch (IndexOutOfRangeException) {}
\r
521 catch (AssertionException exc) {throw exc;}
\r
522 catch (Exception exc)
\r
524 Assert.Fail("DRC106: RemoveAt. Wrong exception type. Got:" + exc);
\r