2 // DataRelationTest.cs - NUnit Test Cases for DataRelation
\r
5 // Ville Palo (vi64pa@koti.soon.fi)
\r
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
\r
8 // (C) 2003 Ville Palo
\r
9 // (C) 2003 Martin Willemoes Hansen
\r
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using NUnit.Framework;
\r
39 namespace MonoTests.System.Data
\r
42 public class DataRelationTest : Assertion
\r
44 private DataSet Set = null;
\r
45 private DataTable Mom = null;
\r
46 private DataTable Child = null;
\r
49 public void GetReady()
\r
51 Set = new DataSet ();
\r
52 Mom = new DataTable ("Mom");
\r
53 Child = new DataTable ("Child");
\r
54 Set.Tables.Add (Mom);
\r
55 Set.Tables.Add (Child);
\r
57 DataColumn Col = new DataColumn ("Name");
\r
58 DataColumn Col2 = new DataColumn ("ChildName");
\r
59 Mom.Columns.Add (Col);
\r
60 Mom.Columns.Add (Col2);
\r
62 DataColumn Col3 = new DataColumn ("Name");
\r
63 DataColumn Col4 = new DataColumn ("Age");
\r
64 Col4.DataType = Type.GetType ("System.Int16");
\r
65 Child.Columns.Add (Col3);
\r
66 Child.Columns.Add (Col4);
\r
70 public void Foreign ()
\r
72 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
\r
73 Set.Relations.Add (Relation);
\r
75 DataRow Row = Mom.NewRow ();
\r
80 Row = Mom.NewRow ();
\r
85 Row = Mom.NewRow ();
\r
89 Row = Child.NewRow ();
\r
92 Child.Rows.Add (Row);
\r
94 Row = Child.NewRow ();
\r
97 Child.Rows.Add (Row);
\r
99 AssertEquals ("test#01", 2, Child.Rows.Count);
\r
101 Row = Mom.Rows [0];
\r
104 AssertEquals ("test#02", 1, Child.Rows.Count);
\r
106 Row = Mom.NewRow ();
\r
107 Row [0] = "Teresa";
\r
111 Mom.Rows.Add (Row);
\r
113 } catch (Exception e) {
\r
114 AssertEquals ("test#04", typeof (ConstraintException), e.GetType ());
\r
115 AssertEquals ("test#05", "Column 'ChildName' is constrained to be unique. Value 'Dick' is already present.", e.Message);
\r
118 Row = Mom.NewRow ();
\r
119 Row [0] = "Teresa";
\r
121 Mom.Rows.Add (Row);
\r
122 AssertEquals ("test#06", 1, Child.Rows.Count);
\r
124 Row = Child.NewRow ();
\r
129 Child.Rows.Add (Row);
\r
131 } catch (Exception e) {
\r
132 AssertEquals ("test#08", typeof (InvalidConstraintException), e.GetType ());
\r
133 AssertEquals ("test#09", "ForeignKeyConstraint Rel requires the child key values (Jack) to exist in the parent table.", e.Message);
\r
139 [ExpectedException (typeof(InvalidConstraintException))]
\r
140 public void InvalidConstraintException ()
\r
142 // Parent Columns and Child Columns don't have type-matching columns.
\r
143 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [1], true);
\r
147 [ExpectedException (typeof (InvalidConstraintException))]
\r
148 public void InvalidConstraintException2 ()
\r
150 // Parent Columns and Child Columns don't have type-matching columns.
\r
151 Child.Columns [1].DataType = Mom.Columns [1].DataType;
\r
153 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [1], true);
\r
154 Set.Relations.Add (Relation);
\r
155 AssertEquals("test#01", 1, Set.Relations.Count);
157 Child.Columns [1].DataType = Type.GetType ("System.Double");
\r
161 public void DataSetRelations ()
\r
163 DataRelation Relation;
\r
164 AssertEquals ("test#01", 0, Set.Relations.Count);
\r
165 AssertEquals ("test#02", 0, Mom.ParentRelations.Count);
\r
166 AssertEquals ("test#03", 0, Mom.ChildRelations.Count);
\r
167 AssertEquals ("test#04", 0, Child.ParentRelations.Count);
\r
168 AssertEquals ("test#05", 0, Child.ChildRelations.Count);
\r
170 Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
\r
171 Set.Relations.Add (Relation);
\r
173 AssertEquals ("test#06", 1, Set.Relations.Count);
\r
174 AssertEquals ("test#07", 0, Mom.ParentRelations.Count);
\r
175 AssertEquals ("test#08", 1, Mom.ChildRelations.Count);
\r
176 AssertEquals ("test#09", 1, Child.ParentRelations.Count);
\r
177 AssertEquals ("test#10", 0, Child.ChildRelations.Count);
\r
179 Relation = Set.Relations [0];
\r
180 AssertEquals ("test#11", 1, Relation.ParentColumns.Length);
\r
181 AssertEquals ("test#12", 1, Relation.ChildColumns.Length);
\r
182 AssertEquals ("test#13", "Rel", Relation.ChildKeyConstraint.ConstraintName);
\r
183 AssertEquals ("test#14", "Constraint1", Relation.ParentKeyConstraint.ConstraintName);
\r
187 public void Constraints ()
\r
190 AssertEquals ("test#01", 0, Mom.Constraints.Count);
\r
191 AssertEquals ("test#02", 0, Child.Constraints.Count);
\r
193 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
\r
194 Set.Relations.Add (Relation);
\r
196 AssertEquals ("test#03", 1, Mom.Constraints.Count);
\r
197 AssertEquals ("test#04", 1, Child.Constraints.Count);
\r
198 AssertEquals ("test#05", typeof (ForeignKeyConstraint), Child.Constraints [0].GetType ());
\r
199 AssertEquals ("test#05", typeof (UniqueConstraint), Mom.Constraints [0].GetType ());
\r
204 public void Creation ()
\r
207 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
\r
208 Set.Relations.Add (Relation);
\r
209 DataRelation Test = null;
\r
210 AssertEquals ("test#01", 1, Mom.ChildRelations.Count);
\r
211 AssertEquals ("test#02", 0, Child.ChildRelations.Count);
\r
212 AssertEquals ("test#03", 0, Mom.ParentRelations.Count);
\r
213 AssertEquals ("test#04", 1, Child.ParentRelations.Count);
\r
215 Test = Child.ParentRelations [0];
\r
216 AssertEquals ("test#05", "Rel", Test.ToString ());
\r
217 AssertEquals ("test#06", "Rel", Test.RelationName);
\r
218 AssertEquals ("test#07", "Mom", Test.ParentTable.TableName);
\r
219 AssertEquals ("test#08", 1, Test.ParentKeyConstraint.Columns.Length);
\r
220 AssertEquals ("test#09", false, Test.ParentKeyConstraint.IsPrimaryKey);
\r
221 AssertEquals ("test#10", 1, Test.ParentColumns.Length);
\r
222 AssertEquals ("test#11", false, Test.Nested);
\r
223 AssertEquals ("test#12", 0, Test.ExtendedProperties.Count);
\r
224 AssertEquals ("test#13", "Child", Test.ChildTable.TableName);
\r
225 AssertEquals ("test#14", "Rel", Test.ChildKeyConstraint.ConstraintName);
\r
226 AssertEquals ("test#15", 1, Test.ChildColumns.Length);
\r
230 public void Creation2 ()
\r
232 DataSet Set = new DataSet ();
\r
233 DataTable Mom2 = new DataTable ("Mom");
\r
234 DataTable Child2 = new DataTable ("Child");
\r
235 DataTable Hubby = new DataTable ("Hubby");
\r
236 Set.Tables.Add (Mom2);
\r
237 Set.Tables.Add (Child2);
\r
238 Set.Tables.Add (Hubby);
\r
240 DataColumn Col = new DataColumn ("Name");
\r
241 DataColumn Col2 = new DataColumn ("ChildName");
\r
242 DataColumn Col3 = new DataColumn ("hubby");
\r
243 Mom2.Columns.Add (Col);
\r
244 Mom2.Columns.Add (Col2);
\r
245 Mom2.Columns.Add (Col3);
\r
247 DataColumn Col4 = new DataColumn ("Name");
\r
248 DataColumn Col5 = new DataColumn ("Age");
\r
249 DataColumn Col6 = new DataColumn ("father");
\r
250 Child2.Columns.Add (Col4);
\r
251 Child2.Columns.Add (Col5);
\r
252 Child2.Columns.Add (Col6);
\r
255 DataColumn Col7 = new DataColumn ("Name");
\r
256 DataColumn Col8 = new DataColumn ("Age");
\r
257 Hubby.Columns.Add (Col7);
\r
258 Hubby.Columns.Add (Col8);
\r
261 DataColumn [] Parents = new DataColumn [2];
\r
262 Parents [0] = Col2;
\r
263 Parents [1] = Col3;
\r
264 DataColumn [] Childs = new DataColumn [2];
\r
268 DataRelation Relation = null;
\r
270 Relation = new DataRelation ("Rel", Parents, Childs);
\r
272 } catch (InvalidConstraintException e) {
\r
273 // AssertEquals ("test#02", typeof (InvalidConstraintException), e.GetType ());
\r
274 // AssertEquals ("test#03", "Cannot create a Key from Columns that belong to different tables.", e.Message);
\r
278 Relation = new DataRelation ("Rel", Parents, Childs);
\r
280 Set.Relations.Add (Relation);
\r
282 DataRelation Test = null;
\r
283 AssertEquals ("test#01", 1, Mom2.ChildRelations.Count);
\r
284 AssertEquals ("test#02", 0, Child2.ChildRelations.Count);
\r
285 AssertEquals ("test#03", 0, Mom2.ParentRelations.Count);
\r
286 AssertEquals ("test#04", 1, Child2.ParentRelations.Count);
\r
288 Test = Child2.ParentRelations [0];
\r
289 AssertEquals ("test#05", "Rel", Test.ToString ());
\r
290 AssertEquals ("test#06", "Rel", Test.RelationName);
\r
291 AssertEquals ("test#07", "Mom", Test.ParentTable.TableName);
\r
292 AssertEquals ("test#08", 2, Test.ParentKeyConstraint.Columns.Length);
\r
293 AssertEquals ("test#09", false, Test.ParentKeyConstraint.IsPrimaryKey);
\r
294 AssertEquals ("test#10", 2, Test.ParentColumns.Length);
\r
295 AssertEquals ("test#11", false, Test.Nested);
\r
296 AssertEquals ("test#12", 0, Test.ExtendedProperties.Count);
\r
297 AssertEquals ("test#13", "Child", Test.ChildTable.TableName);
\r
298 AssertEquals ("test#14", "Rel", Test.ChildKeyConstraint.ConstraintName);
\r
299 AssertEquals ("test#15", 2, Test.ChildColumns.Length);
\r
300 AssertEquals ("test#16", 1, Mom2.Constraints.Count);
\r
301 AssertEquals ("test#17", "Constraint1", Mom2.Constraints [0].ToString ());
\r
302 AssertEquals ("test#18", 1, Child2.Constraints.Count);
\r
303 AssertEquals ("test#19", 0, Hubby.Constraints.Count);
\r
307 public void Creation3 ()
\r
310 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0], false);
\r
311 Set.Relations.Add (Relation);
\r
312 DataRelation Test = null;
\r
314 AssertEquals ("test#01", 1, Mom.ChildRelations.Count);
\r
315 AssertEquals ("test#02", 0, Child.ChildRelations.Count);
\r
316 AssertEquals ("test#03", 0, Mom.ParentRelations.Count);
\r
317 AssertEquals ("test#04", 1, Child.ParentRelations.Count);
\r
319 Test = Child.ParentRelations [0];
\r
321 AssertEquals ("test#05", "Rel", Test.ToString ());
\r
323 AssertEquals ("test#06", "Rel", Test.RelationName);
\r
324 AssertEquals ("test#07", "Mom", Test.ParentTable.TableName);
\r
326 Assert ("test#08", Test.ParentKeyConstraint == null);
\r
328 Assert ("test#09", Test.ParentKeyConstraint == null);
\r
330 AssertEquals ("test#10", 1, Test.ParentColumns.Length);
\r
331 AssertEquals ("test#11", false, Test.Nested);
\r
332 AssertEquals ("test#12", 0, Test.ExtendedProperties.Count);
\r
333 AssertEquals ("test#13", "Child", Test.ChildTable.TableName);
\r
335 Assert ("test#14", Test.ChildKeyConstraint == null);
\r
336 AssertEquals ("test#15", 1, Test.ChildColumns.Length);
\r
337 AssertEquals ("test#16", 0, Mom.Constraints.Count);
\r
338 AssertEquals ("test#17", 0, Child.Constraints.Count);
\r
343 public void Creation4 ()
\r
346 DataRelation Relation = new DataRelation ("Rel", "Mom", "Child",
\r
347 new string [] {"ChildName"},
\r
348 new string [] {"Name"}, true);
\r
351 Set.Relations.Add (Relation);
\r
353 } catch (Exception e) {
\r
354 AssertEquals ("test#02", typeof (NullReferenceException), e.GetType ());
\r
358 Set.Relations.AddRange (new DataRelation [] {Relation});
\r
360 } catch (Exception e) {
\r
361 AssertEquals ("test#04", typeof (NullReferenceException), e.GetType ());
\r
365 Set.Relations.AddRange (new DataRelation [] {Relation});
\r
368 DataRelation Test = null;
\r
369 AssertEquals ("test#01", 1, Mom.ChildRelations.Count);
\r
370 AssertEquals ("test#02", 0, Child.ChildRelations.Count);
\r
371 AssertEquals ("test#03", 0, Mom.ParentRelations.Count);
\r
372 AssertEquals ("test#04", 1, Child.ParentRelations.Count);
\r
374 Test = Child.ParentRelations [0];
\r
375 AssertEquals ("test#05", "Rel", Test.ToString ());
\r
376 AssertEquals ("test#06", "Rel", Test.RelationName);
\r
377 AssertEquals ("test#07", "Mom", Test.ParentTable.TableName);
\r
379 AssertEquals ("test#08", true, Test.ParentKeyConstraint == null);
\r
381 AssertEquals ("test#10", 1, Test.ParentColumns.Length);
\r
382 AssertEquals ("test#11", true, Test.Nested);
\r
383 AssertEquals ("test#12", 0, Test.ExtendedProperties.Count);
\r
384 AssertEquals ("test#13", "Child", Test.ChildTable.TableName);
\r
385 AssertEquals ("test#14", true, Test.ChildKeyConstraint == null);
\r
386 AssertEquals ("test#15", 1, Test.ChildColumns.Length);
\r
391 public void RelationFromSchema ()
\r
393 DataSet Set = new DataSet ();
\r
394 Set.ReadXmlSchema ("Test/System.Data/store.xsd");
\r
395 DataTable Table = Set.Tables [0];
\r
397 AssertEquals ("test#01", false, Table.CaseSensitive);
\r
398 AssertEquals ("test#02", 1, Table.ChildRelations.Count);
\r
399 AssertEquals ("test#03", 0, Table.ParentRelations.Count);
\r
400 AssertEquals ("test#04", 1, Table.Constraints.Count);
\r
401 AssertEquals ("test#05", 1, Table.PrimaryKey.Length);
\r
402 AssertEquals ("test#06", 0, Table.Rows.Count);
\r
403 AssertEquals ("test#07", "bookstore", Table.TableName);
\r
404 AssertEquals ("test#08", 1, Table.Columns.Count);
\r
406 DataRelation Relation = Table.ChildRelations [0];
\r
407 AssertEquals ("test#09", 1, Relation.ChildColumns.Length);
\r
408 AssertEquals ("test#10", "bookstore_book", Relation.ChildKeyConstraint.ConstraintName);
\r
409 AssertEquals ("test#11", 1, Relation.ChildKeyConstraint.Columns.Length);
\r
410 AssertEquals ("test#12", "book", Relation.ChildTable.TableName);
\r
411 AssertEquals ("test#13", "NewDataSet", Relation.DataSet.DataSetName);
\r
412 AssertEquals ("test#14", 0, Relation.ExtendedProperties.Count);
\r
413 AssertEquals ("test#15", true, Relation.Nested);
\r
414 AssertEquals ("test#16", 1, Relation.ParentColumns.Length);
\r
415 AssertEquals ("test#17", "Constraint1", Relation.ParentKeyConstraint.ConstraintName);
\r
416 AssertEquals ("test#18", "bookstore", Relation.ParentTable.TableName);
\r
417 AssertEquals ("test#19", "bookstore_book", Relation.RelationName);
\r
419 Table = Set.Tables [1];
\r
421 AssertEquals ("test#20", false, Table.CaseSensitive);
\r
422 AssertEquals ("test#21", 1, Table.ChildRelations.Count);
\r
423 AssertEquals ("test#22", 1, Table.ParentRelations.Count);
\r
424 AssertEquals ("test#23", 2, Table.Constraints.Count);
\r
425 AssertEquals ("test#24", 1, Table.PrimaryKey.Length);
\r
426 AssertEquals ("test#25", 0, Table.Rows.Count);
\r
427 AssertEquals ("test#26", "book", Table.TableName);
\r
428 AssertEquals ("test#27", 5, Table.Columns.Count);
\r
430 Relation = Table.ChildRelations [0];
\r
431 AssertEquals ("test#28", 1, Relation.ChildColumns.Length);
\r
432 AssertEquals ("test#29", "book_author", Relation.ChildKeyConstraint.ConstraintName);
\r
433 AssertEquals ("test#30", 1, Relation.ChildKeyConstraint.Columns.Length);
\r
434 AssertEquals ("test#31", "author", Relation.ChildTable.TableName);
\r
435 AssertEquals ("test#32", "NewDataSet", Relation.DataSet.DataSetName);
\r
436 AssertEquals ("test#33", 0, Relation.ExtendedProperties.Count);
\r
437 AssertEquals ("test#34", true, Relation.Nested);
\r
438 AssertEquals ("test#35", 1, Relation.ParentColumns.Length);
\r
439 AssertEquals ("test#36", "Constraint1", Relation.ParentKeyConstraint.ConstraintName);
\r
440 AssertEquals ("test#37", "book", Relation.ParentTable.TableName);
\r
441 AssertEquals ("test#38", "book_author", Relation.RelationName);
\r
443 Table = Set.Tables [2];
\r
444 AssertEquals ("test#39", false, Table.CaseSensitive);
\r
445 AssertEquals ("test#40", 0, Table.ChildRelations.Count);
\r
446 AssertEquals ("test#41", 1, Table.ParentRelations.Count);
\r
447 AssertEquals ("test#42", 1, Table.Constraints.Count);
\r
448 AssertEquals ("test#43", 0, Table.PrimaryKey.Length);
\r
449 AssertEquals ("test#44", 0, Table.Rows.Count);
\r
450 AssertEquals ("test#45", "author", Table.TableName);
\r
451 AssertEquals ("test#46", 3, Table.Columns.Count);
\r
455 public void ChildRows ()
\r
458 DataRelation Relation = new DataRelation ("Rel", Mom.Columns [1], Child.Columns [0]);
\r
459 Set.Relations.Add (Relation);
\r
461 DataRow TempRow = Mom.NewRow ();
\r
462 TempRow [0] = "teresa";
\r
463 TempRow [1] = "john";
\r
464 Mom.Rows.Add (TempRow);
\r
466 TempRow = Mom.NewRow ();
\r
467 TempRow [0] = "teresa";
\r
468 TempRow [1] = "Dick";
\r
469 Mom.Rows.Add (TempRow);
\r
471 TempRow = Child.NewRow ();
\r
472 TempRow [0] = "john";
\r
473 TempRow [1] = "15";
\r
474 Child.Rows.Add (TempRow);
\r
476 TempRow = Child.NewRow ();
\r
477 TempRow [0] = "Dick";
\r
478 TempRow [1] = "10";
\r
479 Child.Rows.Add (TempRow);
\r
481 DataRow Row = Mom.Rows [1];
\r
482 TempRow = Row.GetChildRows ("Rel") [0];
\r
483 AssertEquals ("test#01", "Dick", TempRow [0]);
\r
484 AssertEquals ("test#02", "10", TempRow [1].ToString ());
\r
485 TempRow = TempRow.GetParentRow ("Rel");
\r
486 AssertEquals ("test#03", "teresa", TempRow [0]);
\r
487 AssertEquals ("test#04", "Dick", TempRow [1]);
\r
489 Row = Child.Rows [0];
\r
490 TempRow = Row.GetParentRows ("Rel") [0];
\r
491 AssertEquals ("test#05", "teresa", TempRow [0]);
\r
492 AssertEquals ("test#06", "john", TempRow [1]);
\r