(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / System.Data / Test / System.Data / ConstraintCollectionTest.cs
blobdcdeab5cf33bf1ebfc493644aab28079f38e0157
1 // ConstraintCollection.cs - NUnit Test Cases for testing the ConstraintCollection
2 // class.
3 //
4 // Authors:
5 // Franklin Wise (gracenote@earthlink.net)
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
7 // Roopa Wilson (rowilson@novell.com)
8 //
9 // (C) Franklin Wise
10 // (C) 2003 Martin Willemoes Hansen
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:
22 //
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 //
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.
36 using NUnit.Framework;
37 using System;
38 using System.Data;
40 namespace MonoTests.System.Data
42 [TestFixture]
43 public class ConstraintCollectionTest : Assertion {
44 private DataTable _table;
45 private DataTable _table2;
46 private Constraint _constraint1;
47 private Constraint _constraint2;
49 [SetUp]
50 public void GetReady()
52 //Setup DataTable
53 _table = new DataTable("TestTable");
54 _table.Columns.Add("Col1",typeof(int));
55 _table.Columns.Add("Col2",typeof(int));
56 _table.Columns.Add("Col3",typeof(int));
58 _table2 = new DataTable("TestTable");
59 _table2.Columns.Add("Col1",typeof(int));
60 _table2.Columns.Add("Col2",typeof(int));
62 //Use UniqueConstraint to test Constraint Base Class
63 _constraint1 = new UniqueConstraint(_table.Columns[0],false);
64 _constraint2 = new UniqueConstraint(_table.Columns[1],false);
66 // not sure why this is needed since a new _table was just created
67 // for us, but this Clear() keeps the tests from throwing
68 // an exception when the Add() is called.
69 _table.Constraints.Clear();
72 [Test]
73 public void Add()
75 ConstraintCollection col = _table.Constraints;
76 col.Add(_constraint1);
77 col.Add(_constraint2);
79 AssertEquals("Count doesn't equal added.",2, col.Count);
82 [Test]
83 public void AddExceptions()
85 ConstraintCollection col = _table.Constraints;
87 //null
88 try
90 col.Add(null);
91 Fail("B1: Failed to throw ArgumentNullException.");
93 catch (ArgumentNullException) {}
94 catch (AssertionException exc) {throw exc;}
95 catch
97 Fail("A1: Wrong exception type");
100 //duplicate name
101 try
103 _constraint1.ConstraintName = "Dog";
104 _constraint2.ConstraintName = "dog"; //case insensitive
105 col.Add(_constraint1);
106 col.Add(_constraint2);
107 #if NET_1_1
108 #else
109 Fail("Failed to throw Duplicate name exception.");
110 #endif
111 col.Remove (_constraint2); // only for !1.0
112 col.Remove (_constraint1);
114 #if ! NET_1_1
115 catch (DuplicateNameException) {
117 #endif
118 catch (AssertionException exc) {throw exc;}
119 /* Don't use such catch. They cover our eyes from the exact exception location.
120 catch (Exception exc)
122 Fail("A2: Wrong exception type. " + exc.ToString());
125 //Constraint Already exists
126 try
128 col.Add(_constraint1);
129 #if NET_1_1
130 #else
131 Fail("B2: Failed to throw ArgumentException.");
132 #endif
133 col.Remove (_constraint1);
135 catch (ArgumentException) {
136 #if NET_1_1
137 #else
138 throw;
139 #endif
141 catch (AssertionException exc) {throw exc;}
142 catch
144 Fail("A3: Wrong exception type");
148 [Test]
149 public void Indexer()
151 Constraint c1 = new UniqueConstraint(_table.Columns[0]);
152 Constraint c2 = new UniqueConstraint(_table.Columns[1]);
154 c1.ConstraintName = "first";
155 c2.ConstraintName = "second";
158 _table.Constraints.Add(c1);
159 _table.Constraints.Add(c2);
161 AssertSame("A1", c1, _table.Constraints[0]);
162 AssertSame("A2", c2, _table.Constraints[1]);
164 AssertSame("A3", c1, _table.Constraints["first"]);
165 AssertSame("A4", c2, _table.Constraints["sEcond"]); //case insensitive
169 [Test]
170 public void IndexOf()
172 Constraint c1 = new UniqueConstraint(_table.Columns[0]);
173 Constraint c2 = new UniqueConstraint(_table.Columns[1]);
175 c1.ConstraintName = "first";
176 c2.ConstraintName = "second";
178 _table.Constraints.Add(c1);
179 _table.Constraints.Add(c2);
181 AssertEquals("A1", 0, _table.Constraints.IndexOf(c1));
182 AssertEquals("A2", 1, _table.Constraints.IndexOf(c2));
183 AssertEquals("A3", 0, _table.Constraints.IndexOf("first"));
184 AssertEquals("A4", 1, _table.Constraints.IndexOf("second"));
187 [Test]
188 public void Contains()
190 Constraint c1 = new UniqueConstraint(_table.Columns[0]);
191 Constraint c2 = new UniqueConstraint(_table.Columns[1]);
193 c1.ConstraintName = "first";
194 c2.ConstraintName = "second";
196 _table.Constraints.Add(c1);
198 Assert("A1", _table.Constraints.Contains(c1.ConstraintName)); //true
199 Assert("A2", _table.Constraints.Contains(c2.ConstraintName) == false); //doesn't contain
202 [Test]
203 public void IndexerFailures()
205 _table.Constraints.Add(new UniqueConstraint(_table.Columns[0]));
207 //This doesn't throw
208 AssertNull(_table.Constraints["notInCollection"]);
210 //Index too high
211 try
213 Constraint c = _table.Constraints[_table.Constraints.Count];
214 Fail("B1: Failed to throw IndexOutOfRangeException.");
216 catch (IndexOutOfRangeException) {}
217 catch (AssertionException exc) {throw exc;}
218 catch
220 Fail("A1: Wrong exception type");
223 //Index too low
224 try
226 Constraint c = _table.Constraints[-1];
227 Fail("B2: Failed to throw IndexOutOfRangeException.");
229 catch (IndexOutOfRangeException) {}
230 catch (AssertionException exc) {throw exc;}
231 catch
233 Fail("A2: Wrong exception type");
238 [Test]
239 public void AddFkException1()
241 DataSet ds = new DataSet();
242 ds.Tables.Add(_table);
243 _table2.TableName = "TestTable2";
244 ds.Tables.Add(_table2);
246 _table.Rows.Add(new object [] {1});
247 _table.Rows.Add(new object [] {1});
249 //FKC: can't create unique constraint because duplicate values already exist
252 ForeignKeyConstraint fkc = new ForeignKeyConstraint( _table.Columns[0],
253 _table2.Columns[0]);
255 _table2.Constraints.Add(fkc); //should throw
256 Fail("B1: Failed to throw ArgumentException.");
258 catch (ArgumentException) {}
259 catch (AssertionException exc) {throw exc;}
260 catch (Exception exc)
262 Fail("A1: Wrong Exception type. " + exc.ToString());
269 [Test]
270 public void AddFkException2()
272 //Foreign key rules only work when the tables
273 //are apart of the dataset
274 DataSet ds = new DataSet();
275 ds.Tables.Add(_table);
276 _table2.TableName = "TestTable2";
277 ds.Tables.Add(_table2);
279 _table.Rows.Add(new object [] {1});
281 // will need a matching parent value in
282 // _table
283 _table2.Rows.Add(new object [] {3});
286 //FKC: no matching parent value
289 ForeignKeyConstraint fkc = new ForeignKeyConstraint( _table.Columns[0],
290 _table2.Columns[0]);
292 _table2.Constraints.Add(fkc); //should throw
293 Fail("B1: Failed to throw ArgumentException.");
295 catch (ArgumentException) {}
296 catch (AssertionException exc) {throw exc;}
297 catch (Exception exc)
299 Fail("A1: Wrong Exception type. " + exc.ToString());
306 [Test]
307 public void AddUniqueExceptions()
311 //UC: can't create unique constraint because duplicate values already exist
314 _table.Rows.Add(new object [] {1});
315 _table.Rows.Add(new object [] {1});
316 UniqueConstraint uc = new UniqueConstraint( _table.Columns[0]);
318 _table.Constraints.Add(uc); //should throw
319 Fail("B1: Failed to throw ArgumentException.");
321 catch (ArgumentException) {}
322 catch (AssertionException exc) {throw exc;}
323 catch (Exception exc)
325 Fail("A1: Wrong Exception type. " + exc.ToString());
329 [Test]
330 //Tests AddRange (), CanRemove (), RemoveAt (), Remove (), Exceptions of Remove(), and Clear ()
331 public void AddRemoveTest ()
333 AddRange ();
334 // CanRemove (); This test is ignored
335 Remove ();
336 // RemoveAt (); This test is ignored
338 // This test is expected to be failed, so don't reuse it.
339 // RemoveExceptions ();
340 _table.Constraints.Remove (_table.Constraints [0]);
342 Clear ();
345 [Test]
346 public void AddRange()
348 _constraint1.ConstraintName = "UK1";
349 _constraint2.ConstraintName = "UK12";
351 ForeignKeyConstraint _constraint3 = new ForeignKeyConstraint ("FK2", _table.Columns [0],
352 _table2.Columns [0]);
353 UniqueConstraint _constraint4=new UniqueConstraint("UK2", _table2.Columns [1]);
355 // Add the constraints.
356 Constraint [] constraints = {_constraint1, _constraint2};
357 _table.Constraints.AddRange (constraints);
359 Constraint [] constraints1 = {_constraint3, _constraint4};
360 _table2.Constraints.AddRange (constraints1);
362 AssertEquals ("A1", "UK1", _table.Constraints [0].ConstraintName);
363 AssertEquals ("A2", "UK12", _table.Constraints [1].ConstraintName);
365 AssertEquals ("A3", "FK2", _table2.Constraints [0].ConstraintName);
366 AssertEquals ("A4", "UK2", _table2.Constraints [1].ConstraintName);
370 [Test]
371 public void TestAddRange2()
373 DataTable table = new DataTable ("Table");
374 DataColumn column1 = new DataColumn ("col1");
375 DataColumn column2 = new DataColumn ("col2");
376 DataColumn column3 = new DataColumn ("col3");
377 table.Columns.Add (column1);
378 table.Columns.Add (column2);
379 table.Columns.Add (column3);
380 string []columnNames = {"col1", "col2", "col3"};
382 Constraint []constraints = new Constraint[3];
383 constraints [0] = new UniqueConstraint ("Unique1",column1);
384 constraints [1] = new UniqueConstraint ("Unique2",column2);
385 constraints [2] = new UniqueConstraint ("Unique3", columnNames, true);
387 table.BeginInit();
388 //Console.WriteLine(table.InitStatus == DataTable.initStatus.BeginInit);
389 table.Constraints.AddRange (constraints);
391 //Check the table property of UniqueConstraint Object
392 try{
393 Assertion.AssertNull ("#01", constraints [2].Table);
395 catch (Exception e) {
396 Assertion.Assert ("#A02", "System.NullReferenceException".Equals (e.GetType().ToString()));
399 table.EndInit();
401 // After EndInit is called the constraints associated with most recent call to AddRange() must be
402 // added to the ConstraintCollection
403 Assertion.Assert ("#A03", constraints [2].Table.ToString().Equals ("Table"));
404 Assertion.Assert ("#A04", table.Constraints.Contains ("Unique1"));
405 Assertion.Assert ("#A05", table.Constraints.Contains ("Unique2"));
406 Assertion.Assert ("#A06", table.Constraints.Contains ("Unique3"));
412 [Test]
413 public void Clear()
415 try {
416 _table.Constraints.Clear (); //Clear all constraints
417 AssertEquals ("A1", 0, _table.Constraints.Count); //No constraints should remain
418 _table2.Constraints.Clear ();
419 AssertEquals ("A2", 0, _table2.Constraints.Count);
421 catch (Exception e) {
422 Console.WriteLine (e);
427 [Test]
428 [Ignore ("This never works on MS.NET (and it should not)")]
429 public void CanRemove()
431 AssertEquals ("A1", false, _table.Constraints.CanRemove (_table.Constraints [0]));
435 [Test]
436 public void CollectionChanged()
440 [Test]
441 [Ignore ("MS.NET fails this test (and it should fail)")]
442 public void RemoveAt()
444 _table2.Constraints.RemoveAt (1); //Remove constraint and again add it
445 AssertEquals ("A1", 1, _table2.Constraints.Count); UniqueConstraint _constraint4 = new UniqueConstraint ("UK2", _table2.Columns [1]);
446 // Add the constraints.
447 Constraint [] constraints = {_constraint4};
448 _table.Constraints.AddRange (constraints);
452 [Test]
453 [Ignore ("MS.NET fails this test (and it should fail)")]
454 public void Remove()
456 _table2.Constraints.Remove (_table2.Constraints [1]); //Remove constraint and again add it
457 AssertEquals ("A1", 1, _table2.Constraints.Count);
458 UniqueConstraint _constraint4 = new UniqueConstraint ("UK2", _table2.Columns [1]);
459 // Add the constraints.
460 Constraint [] constraints = {_constraint4};
461 _table2.Constraints.AddRange (constraints);
464 [Test]
465 public void RemoveExceptions()
467 try {
468 //Remove constraint that cannot be removed
469 _table.Constraints.Remove (_table.Constraints [0]);
470 Fail ("A1");
471 } catch (Exception e) {
472 AssertEquals ("A2", typeof (IndexOutOfRangeException), e.GetType ());