3 // Marek Habersack <grendel@twistedcode.net>
5 // Copyright (C) 2011 Novell, Inc. (http://novell.com/)
7 // Permission is hereby granted, free of charge, to any person obtaining
8 // a copy of this software and associated documentation files (the
9 // "Software"), to deal in the Software without restriction, including
10 // without limitation the rights to use, copy, modify, merge, publish,
11 // distribute, sublicense, and/or sell copies of the Software, and to
12 // permit persons to whom the Software is furnished to do so, subject to
13 // the following conditions:
15 // The above copyright notice and this permission notice shall be
16 // included in all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 using System.Collections.Generic;
28 using System.ComponentModel.DataAnnotations;
31 using NUnit.Framework;
32 using MonoTests.Common;
34 namespace MonoTests.System.ComponentModel.DataAnnotations
38 public class ValidatorTest
41 public void TryValidateObject_Object_ValidationContext_ICollection_01 ()
43 var dummy = new DummyNoAttributes ();
44 var ctx = new ValidationContext (dummy, null, null);
45 var results = new List<ValidationResult> ();
47 AssertExtensions.Throws<ArgumentNullException> (() => {
48 Validator.TryValidateObject (null, ctx, results);
51 AssertExtensions.Throws<ArgumentNullException> (() => {
52 Validator.TryValidateObject (dummy, null, results);
55 bool valid = Validator.TryValidateObject (dummy, ctx, null);
56 Assert.IsTrue (valid, "#A2-1");
57 Assert.IsTrue (results.Count == 0, "#A2-2");
61 public void TryValidateObject_Object_ValidationContext_ICollection_02 ()
63 var dummy = new Dummy ();
64 var ctx = new ValidationContext (dummy, null, null);
65 var results = new List<ValidationResult> ();
67 bool valid = Validator.TryValidateObject (dummy, ctx, results);
68 Assert.IsTrue (valid, "#A1-1");
69 Assert.AreEqual (0, results.Count, "#A1-2");
74 AssertExtensions.Throws<ArgumentException> (() => {
75 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
76 valid = Validator.TryValidateObject (dummy, ctx, results);
80 ctx = new ValidationContext (dummy, null, null);
81 valid = Validator.TryValidateObject (dummy, ctx, results);
82 Assert.IsTrue (valid, "#A3-1");
83 Assert.AreEqual (0, results.Count, "#A3-2");
85 // Required properties existence is validated
87 RequiredDummyField = null
89 ctx = new ValidationContext (dummy, null, null);
90 valid = Validator.TryValidateObject (dummy, ctx, results);
91 Assert.IsTrue (valid, "#A4-1");
92 Assert.AreEqual (0, results.Count, "#A4-2");
95 RequiredDummyProperty = null
97 ctx = new ValidationContext (dummy, null, null);
98 valid = Validator.TryValidateObject (dummy, ctx, results);
99 Assert.IsFalse (valid, "#A5-1");
100 Assert.AreEqual (1, results.Count, "#A5-2");
104 // validation attributes other than Required are ignored
108 ctx = new ValidationContext (dummy, null, null);
109 valid = Validator.TryValidateObject (dummy, ctx, results);
110 Assert.IsTrue (valid, "#A6-1");
111 Assert.AreEqual (0, results.Count, "#A6-2");
116 ctx = new ValidationContext (dummy, null, null);
117 valid = Validator.TryValidateObject (dummy, ctx, results);
118 Assert.IsTrue (valid, "#A7-1");
119 Assert.AreEqual (0, results.Count, "#A7-2");
122 FailValidation = true
124 ctx = new ValidationContext (dummy, null, null);
125 valid = Validator.TryValidateObject (dummy, ctx, results);
126 Assert.IsFalse (valid, "#A8-1");
127 Assert.AreEqual (1, results.Count, "#A8-2");
131 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_01 ()
133 var dummy = new DummyNoAttributes ();
134 var ctx = new ValidationContext (dummy, null, null);
135 var results = new List<ValidationResult> ();
137 AssertExtensions.Throws<ArgumentNullException> (() => {
138 Validator.TryValidateObject (null, ctx, results, false);
141 AssertExtensions.Throws<ArgumentNullException> (() => {
142 Validator.TryValidateObject (dummy, null, results, false);
145 bool valid = Validator.TryValidateObject (dummy, ctx, null, false);
146 Assert.IsTrue (valid, "#A2-1");
147 Assert.IsTrue (results.Count == 0, "#A2-2");
149 valid = Validator.TryValidateObject (dummy, ctx, null, true);
150 Assert.IsTrue (valid, "#A3-1");
151 Assert.IsTrue (results.Count == 0, "#A3-2");
155 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_02 ()
157 var dummy = new Dummy ();
158 var ctx = new ValidationContext (dummy, null, null);
159 var results = new List<ValidationResult> ();
161 bool valid = Validator.TryValidateObject (dummy, ctx, results, false);
162 Assert.IsTrue (valid, "#A1-1");
163 Assert.AreEqual (0, results.Count, "#A1-2");
165 valid = Validator.TryValidateObject (dummy, ctx, results, true);
166 Assert.IsTrue (valid, "#A1-3");
167 Assert.AreEqual (0, results.Count, "#A1-4");
172 AssertExtensions.Throws<ArgumentException> (() => {
173 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
174 valid = Validator.TryValidateObject (dummy, ctx, results, false);
177 AssertExtensions.Throws<ArgumentException> (() => {
178 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
179 valid = Validator.TryValidateObject (dummy, ctx, results, true);
182 // Fields are ignored
183 ctx = new ValidationContext (dummy, null, null);
184 valid = Validator.TryValidateObject (dummy, ctx, results, false);
185 Assert.IsTrue (valid, "#A3-1");
186 Assert.AreEqual (0, results.Count, "#A3-2");
188 valid = Validator.TryValidateObject (dummy, ctx, results, true);
189 Assert.IsTrue (valid, "#A3-3");
190 Assert.AreEqual (0, results.Count, "#A3-4");
193 RequiredDummyField = null
195 ctx = new ValidationContext (dummy, null, null);
196 valid = Validator.TryValidateObject (dummy, ctx, results, false);
197 Assert.IsTrue (valid, "#A4-1");
198 Assert.AreEqual (0, results.Count, "#A4-2");
200 valid = Validator.TryValidateObject (dummy, ctx, results, true);
201 Assert.IsTrue (valid, "#A4-3");
202 Assert.AreEqual (0, results.Count, "#A4-4");
204 // Required properties existence is validated
206 RequiredDummyProperty = null
208 ctx = new ValidationContext (dummy, null, null);
209 valid = Validator.TryValidateObject (dummy, ctx, results, false);
210 Assert.IsFalse (valid, "#A5-1");
211 Assert.AreEqual (1, results.Count, "#A5-2");
214 valid = Validator.TryValidateObject (dummy, ctx, results, true);
215 Assert.IsFalse (valid, "#A5-3");
216 Assert.AreEqual (1, results.Count, "#A5-4");
222 ctx = new ValidationContext (dummy, null, null);
223 valid = Validator.TryValidateObject (dummy, ctx, results, false);
224 Assert.IsTrue (valid, "#A6-1");
225 Assert.AreEqual (0, results.Count, "#A6-2");
227 // NameProperty is null, that causes the StringLength validator to skip its tests
228 valid = Validator.TryValidateObject (dummy, ctx, results, true);
229 Assert.IsTrue (valid, "#A6-3");
230 Assert.AreEqual (0, results.Count, "#A6-4");
232 dummy.NameProperty = "0";
233 valid = Validator.TryValidateObject (dummy, ctx, results, true);
234 Assert.IsFalse (valid, "#A6-5");
235 Assert.AreEqual (1, results.Count, "#A6-6");
238 dummy.NameProperty = "name too long (invalid value)";
239 valid = Validator.TryValidateObject (dummy, ctx, results, true);
240 Assert.IsFalse (valid, "#A6-7");
241 Assert.AreEqual (1, results.Count, "#A6-8");
247 ctx = new ValidationContext (dummy, null, null);
248 valid = Validator.TryValidateObject (dummy, ctx, results, false);
249 Assert.IsTrue (valid, "#A7-1");
250 Assert.AreEqual (0, results.Count, "#A7-2");
252 valid = Validator.TryValidateObject (dummy, ctx, results, true);
253 Assert.IsFalse (valid, "#A7-3");
254 Assert.AreEqual (1, results.Count, "#A7-4");
258 FailValidation = true
260 ctx = new ValidationContext (dummy, null, null);
261 valid = Validator.TryValidateObject (dummy, ctx, results, false);
262 Assert.IsFalse (valid, "#A8-1");
263 Assert.AreEqual (1, results.Count, "#A8-2");
266 valid = Validator.TryValidateObject (dummy, ctx, results, true);
267 Assert.IsFalse (valid, "#A8-3");
268 Assert.AreEqual (1, results.Count, "#A8-4");
271 var dummy2 = new DummyWithException ();
272 ctx = new ValidationContext (dummy2, null, null);
273 AssertExtensions.Throws<ApplicationException> (() => {
274 Validator.TryValidateObject (dummy2, ctx, results, true);
279 public void TryValidateProperty ()
281 var dummy = new DummyNoAttributes ();
282 var ctx = new ValidationContext (dummy, null, null) {
283 MemberName = "NameProperty"
285 var results = new List<ValidationResult> ();
287 AssertExtensions.Throws<ArgumentException> (() => {
288 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
289 // System.ArgumentException : The type 'DummyNoAttributes' does not contain a public property named 'NameProperty'.
290 // Parameter name: propertyName
292 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
293 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
294 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
295 // at MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty() in C:\Users\grendel\Documents\Visual Studio 2010\Projects\System.Web.Test\System.Web.Test\System.ComponentModel.DataAnnotations\ValidatorTest.cs:line 283
297 Validator.TryValidateProperty ("dummy", ctx, results);
299 Assert.AreEqual (0, results.Count, "#A1-2");
301 AssertExtensions.Throws<ArgumentNullException> (() => {
302 Validator.TryValidateProperty ("dummy", null, results);
305 var dummy2 = new Dummy ();
306 ctx = new ValidationContext (dummy2, null, null) {
307 MemberName = "NameProperty"
310 bool valid = Validator.TryValidateProperty (null, ctx, results);
311 Assert.IsTrue (valid, "#A1-3");
312 Assert.AreEqual (0, results.Count, "#A1-4");
314 ctx = new ValidationContext (dummy2, null, null) {
315 MemberName = "MinMaxProperty"
318 AssertExtensions.Throws<ArgumentException> (() => {
319 Validator.TryValidateProperty (null, ctx, results);
322 ctx = new ValidationContext (dummy2, null, null);
323 AssertExtensions.Throws<ArgumentNullException> (() => {
324 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
325 // System.ArgumentNullException : Value cannot be null.
326 // Parameter name: propertyName
328 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
329 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
330 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
331 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
332 // at MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty() in C:\Users\grendel\Documents\Visual Studio 2010\Projects\System.Web.Test\System.Web.Test\System.ComponentModel.DataAnnotations\ValidatorTest.cs:line 289
334 Validator.TryValidateProperty ("dummy", ctx, results);
336 Assert.AreEqual (0, results.Count, "#A2-2");
338 ctx = new ValidationContext (dummy2, null, null) {
339 MemberName = String.Empty
342 AssertExtensions.Throws<ArgumentNullException> (() => {
343 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
344 // System.ArgumentNullException : Value cannot be null.
345 // Parameter name: propertyName
347 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
348 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
349 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
350 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
351 // at MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty() in C:\Users\grendel\Documents\Visual Studio 2010\Projects\System.Web.Test\System.Web.Test\System.ComponentModel.DataAnnotations\ValidatorTest.cs:line 289
353 Validator.TryValidateProperty ("dummy", ctx, results);
355 Assert.AreEqual (0, results.Count, "#A2-2");
357 dummy2 = new Dummy ();
358 ctx = new ValidationContext (dummy2, null, null) {
359 MemberName = "NameProperty"
362 AssertExtensions.Throws<ArgumentException> (() => {
363 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
364 // System.ArgumentException : The value for property 'NameProperty' must be of type 'System.String'.
365 // Parameter name: value
367 // at System.ComponentModel.DataAnnotations.Validator.EnsureValidPropertyType(String propertyName, Type propertyType, Object value)
368 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
369 // at MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty() in C:\Users\grendel\Documents\Visual Studio 2010\Projects\System.Web.Test\System.Web.Test\System.ComponentModel.DataAnnotations\ValidatorTest.cs:line 315
371 Validator.TryValidateProperty (1234, ctx, results);
373 Assert.AreEqual (0, results.Count, "#A3-2");
375 dummy2 = new Dummy ();
376 ctx = new ValidationContext (dummy2, null, null) {
377 MemberName = "NameProperty"
380 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
381 Assert.IsFalse (valid, "#A4-1");
382 Assert.AreEqual (1, results.Count, "#A4-2");
385 valid = Validator.TryValidateProperty ("this value is way too long", ctx, results);
386 Assert.IsFalse (valid, "#A4-3");
387 Assert.AreEqual (1, results.Count, "#A4-4");
390 valid = Validator.TryValidateProperty ("good value", ctx, results);
391 Assert.IsTrue (valid, "#A4-5");
392 Assert.AreEqual (0, results.Count, "#A4-6");
394 dummy2 = new Dummy ();
395 ctx = new ValidationContext (dummy2, null, null) {
396 MemberName = "CustomValidatedProperty"
399 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
400 Assert.IsFalse (valid, "#A5-1");
401 Assert.AreEqual (1, results.Count, "#A5-2");
404 valid = Validator.TryValidateProperty ("fail", ctx, results);
405 Assert.IsFalse (valid, "#A5-3");
406 Assert.AreEqual (1, results.Count, "#A5-4");
409 valid = Validator.TryValidateProperty ("f", ctx, results);
410 Assert.IsFalse (valid, "#A5-5");
411 Assert.AreEqual (2, results.Count, "#A5-6");
414 valid = Validator.TryValidateProperty ("good value", ctx, results);
415 Assert.IsTrue (valid, "#A5-7");
416 Assert.AreEqual (0, results.Count, "#A5-8");
420 public void TryValidateValue_01 ()
422 var dummy = new DummyNoAttributes ();
423 var ctx = new ValidationContext (dummy, null, null) {
424 MemberName = "NameProperty"
426 var results = new List<ValidationResult> ();
427 var attributes = new List <ValidationAttribute> ();
429 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
430 Assert.IsTrue (valid, "#A1-1");
431 Assert.AreEqual (0, results.Count, "#A1-2");
433 AssertExtensions.Throws<ArgumentNullException> (() => {
434 Validator.TryValidateValue ("dummy", null, results, attributes);
437 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
438 Assert.IsTrue (valid, "#A3-1");
439 Assert.AreEqual (0, results.Count, "#A3-2");
441 AssertExtensions.Throws<ArgumentNullException> (() => {
442 Validator.TryValidateValue ("dummy", ctx, results, null);
447 public void TryValidateValue_02 ()
449 var dummy = new DummyNoAttributes ();
450 var ctx = new ValidationContext (dummy, null, null);
451 var results = new List<ValidationResult> ();
452 var log = new List<string> ();
453 var attributes = new List<ValidationAttribute> () {
454 new StringLengthAttributePoker (10, log) {
457 new RequiredAttributePoker (log)
460 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
461 Assert.IsFalse (valid, "#A1-1");
462 Assert.AreEqual (1, results.Count, "#A1-2");
463 Assert.AreEqual (1, log.Count, "#A1-3");
464 Assert.IsTrue (log [0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-4");
468 AssertExtensions.Throws<InvalidCastException> (() => {
469 // Thrown by StringValidatorAttribute
470 Validator.TryValidateValue (1234, ctx, results, attributes);
472 Assert.AreEqual (0, results.Count, "#A2-2");
473 Assert.AreEqual (2, log.Count, "#A2-3");
474 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-4");
475 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-5");
479 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
480 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
481 valid = Validator.TryValidateValue ("test", ctx, results, attributes);
482 Assert.IsFalse (valid, "#A3-1");
483 Assert.AreEqual (2, results.Count, "#A3-2");
484 Assert.AreEqual (2, log.Count, "#A3-3");
485 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-4");
486 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-5");
487 Assert.AreEqual ("ValueValidationMethod", results[0].ErrorMessage, "#A3-6");
488 Assert.AreEqual ("ValueValidationMethod", results[1].ErrorMessage, "#A3-7");
491 attributes.RemoveAt (2);
492 attributes.RemoveAt (2);
494 AssertExtensions.Throws<ArgumentNullException> (() => {
495 Validator.TryValidateValue ("dummy", null, results, attributes);
498 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
499 Assert.IsTrue (valid, "#B2-1");
500 Assert.AreEqual (0, results.Count, "#B2-2");
502 AssertExtensions.Throws<ArgumentNullException> (() => {
503 Validator.TryValidateValue ("dummy", ctx, results, null);
508 public void ValidateObject_Object_ValidationContext_01 ()
510 var dummy = new DummyNoAttributes ();
511 var ctx = new ValidationContext (dummy, null, null);
513 AssertExtensions.Throws<ArgumentNullException> (() => {
514 Validator.ValidateObject (null, ctx);
517 AssertExtensions.Throws<ArgumentNullException> (() => {
518 Validator.ValidateObject (dummy, null);
522 Validator.ValidateObject (dummy, ctx);
523 } catch (Exception ex) {
524 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
529 public void ValidateObject_Object_ValidationContext_02 ()
531 var dummy = new Dummy ();
532 var ctx = new ValidationContext (dummy, null, null);
535 Validator.ValidateObject (dummy, ctx);
536 } catch (Exception ex) {
537 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
543 AssertExtensions.Throws<ArgumentException> (() => {
544 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
545 Validator.ValidateObject (dummy, ctx);
548 // Fields are ignored
549 ctx = new ValidationContext (dummy, null, null);
551 Validator.ValidateObject (dummy, ctx);
552 } catch (Exception ex) {
553 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
557 RequiredDummyField = null
559 ctx = new ValidationContext (dummy, null, null);
561 Validator.ValidateObject (dummy, ctx);
562 } catch (Exception ex) {
563 Assert.Fail ("#A4 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
567 RequiredDummyProperty = null
569 ctx = new ValidationContext (dummy, null, null);
570 AssertExtensions.Throws<ValidationException> (() => {
571 Validator.ValidateObject (dummy, ctx);
574 // validation attributes other than Required are ignored
578 ctx = new ValidationContext (dummy, null, null);
580 Validator.ValidateObject (dummy, ctx);
581 } catch (Exception ex) {
582 Assert.Fail ("#A6 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
588 ctx = new ValidationContext (dummy, null, null);
590 Validator.ValidateObject (dummy, ctx);
591 } catch (Exception ex) {
592 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
596 FailValidation = true
598 ctx = new ValidationContext (dummy, null, null);
599 AssertExtensions.Throws<ValidationException> (() => {
600 Validator.ValidateObject (dummy, ctx);
603 var dummy2 = new DummyMultipleCustomValidators ();
604 ctx = new ValidationContext (dummy2, null, null);
606 Validator.ValidateObject (dummy2, ctx);
607 } catch (Exception ex) {
608 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
613 public void ValidateObject_Object_ValidationContext_Bool_01 ()
615 var dummy = new DummyNoAttributes ();
616 var ctx = new ValidationContext (dummy, null, null);
618 AssertExtensions.Throws<ArgumentNullException> (() => {
619 Validator.ValidateObject (null, ctx, false);
622 AssertExtensions.Throws<ArgumentNullException> (() => {
623 Validator.ValidateObject (dummy, null, false);
627 Validator.ValidateObject (dummy, ctx, false);
628 } catch (Exception ex) {
629 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
633 Validator.ValidateObject (dummy, ctx, true);
634 } catch (Exception ex) {
635 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
640 public void ValidateObject_Object_ValidationContext_Bool_02 ()
642 var dummy = new Dummy ();
643 var ctx = new ValidationContext (dummy, null, null);
646 Validator.ValidateObject (dummy, ctx, false);
647 } catch (Exception ex) {
648 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
652 Validator.ValidateObject (dummy, ctx, true);
653 } catch (Exception ex) {
654 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
660 AssertExtensions.Throws<ArgumentException> (() => {
661 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
662 Validator.ValidateObject (dummy, ctx, false);
665 AssertExtensions.Throws<ArgumentException> (() => {
666 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
667 Validator.ValidateObject (dummy, ctx, true);
670 // Fields are ignored
671 ctx = new ValidationContext (dummy, null, null);
673 Validator.ValidateObject (dummy, ctx, false);
674 } catch (Exception ex) {
675 Assert.Fail ("#A4-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
679 Validator.ValidateObject (dummy, ctx, true);
680 } catch (Exception ex) {
681 Assert.Fail ("#A4-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
685 RequiredDummyField = null
687 ctx = new ValidationContext (dummy, null, null);
689 Validator.ValidateObject (dummy, ctx, false);
690 } catch (Exception ex) {
691 Assert.Fail ("#A5-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
695 Validator.ValidateObject (dummy, ctx, true);
696 } catch (Exception ex) {
697 Assert.Fail ("#A5-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
700 // Required properties existence is validated
702 RequiredDummyProperty = null
704 ctx = new ValidationContext (dummy, null, null);
705 AssertExtensions.Throws<ValidationException> (() => {
706 Validator.ValidateObject (dummy, ctx, false);
709 AssertExtensions.Throws<ValidationException> (() => {
710 Validator.ValidateObject (dummy, ctx, true);
716 ctx = new ValidationContext (dummy, null, null);
718 Validator.ValidateObject (dummy, ctx, false);
719 } catch (Exception ex) {
720 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
723 // NameProperty is null, that causes the StringLength validator to skip its tests
725 Validator.ValidateObject (dummy, ctx, true);
726 } catch (Exception ex) {
727 Assert.Fail ("#A8 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
730 dummy.NameProperty = "0";
731 AssertExtensions.Throws<ValidationException> (() => {
732 Validator.ValidateObject (dummy, ctx, true);
735 dummy.NameProperty = "name too long (invalid value)";
736 AssertExtensions.Throws<ValidationException> (() => {
737 Validator.ValidateObject (dummy, ctx, true);
743 ctx = new ValidationContext (dummy, null, null);
745 Validator.ValidateObject (dummy, ctx, false);
746 } catch (Exception ex) {
747 Assert.Fail ("#A11 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
750 AssertExtensions.Throws<ValidationException> (() => {
751 Validator.ValidateObject (dummy, ctx, true);
755 FailValidation = true
757 ctx = new ValidationContext (dummy, null, null);
758 AssertExtensions.Throws<ValidationException> (() => {
759 Validator.ValidateObject (dummy, ctx, false);
762 AssertExtensions.Throws<ValidationException> (() => {
763 Validator.ValidateObject (dummy, ctx, true);
766 var dummy2 = new DummyWithException ();
767 ctx = new ValidationContext (dummy2, null, null);
768 AssertExtensions.Throws<ApplicationException> (() => {
769 Validator.ValidateObject (dummy2, ctx, true);
772 var dummy3 = new DummyMultipleCustomValidators ();
773 ctx = new ValidationContext (dummy3, null, null);
775 Validator.ValidateObject (dummy3, ctx, false);
776 } catch (Exception ex) {
777 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
781 Validator.ValidateObject (dummy3, ctx, true);
782 } catch (ValidationException ex) {
783 Assert.AreEqual ("FirstPropertyValidationMethod", ex.Message, "#A10");
784 } catch (Exception ex) {
785 Assert.Fail ("#A10 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
790 public void ValidateProperty ()
792 var dummy = new DummyNoAttributes ();
793 var ctx = new ValidationContext (dummy, null, null) {
794 MemberName = "NameProperty"
797 AssertExtensions.Throws<ArgumentException> (() => {
798 Validator.ValidateProperty ("dummy", ctx);
801 AssertExtensions.Throws<ArgumentNullException> (() => {
802 Validator.ValidateProperty ("dummy", null);
805 var dummy2 = new Dummy ();
806 ctx = new ValidationContext (dummy2, null, null) {
807 MemberName = "NameProperty"
811 Validator.ValidateProperty (null, ctx);
812 } catch (Exception ex) {
813 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
816 ctx = new ValidationContext (dummy2, null, null) {
817 MemberName = "MinMaxProperty"
820 AssertExtensions.Throws<ArgumentException> (() => {
821 Validator.ValidateProperty (null, ctx);
824 ctx = new ValidationContext (dummy2, null, null);
825 AssertExtensions.Throws<ArgumentNullException> (() => {
826 Validator.ValidateProperty ("dummy", ctx);
829 ctx = new ValidationContext (dummy2, null, null) {
830 MemberName = String.Empty
833 AssertExtensions.Throws<ArgumentNullException> (() => {
834 Validator.ValidateProperty ("dummy", ctx);
837 dummy2 = new Dummy ();
838 ctx = new ValidationContext (dummy2, null, null) {
839 MemberName = "NameProperty"
842 AssertExtensions.Throws<ArgumentException> (() => {
843 Validator.ValidateProperty (1234, ctx);
846 dummy2 = new Dummy ();
847 ctx = new ValidationContext (dummy2, null, null) {
848 MemberName = "NameProperty"
851 AssertExtensions.Throws<ValidationException> (() => {
852 Validator.ValidateProperty (String.Empty, ctx);
855 AssertExtensions.Throws<ValidationException> (() => {
856 Validator.ValidateProperty ("this value is way too long", ctx);
860 Validator.ValidateProperty ("good value", ctx);
861 } catch (Exception ex) {
862 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
865 dummy2 = new Dummy ();
866 ctx = new ValidationContext (dummy2, null, null) {
867 MemberName = "CustomValidatedProperty"
870 AssertExtensions.Throws<ValidationException> (() => {
871 Validator.ValidateProperty (String.Empty, ctx);
874 AssertExtensions.Throws<ValidationException> (() => {
875 Validator.ValidateProperty ("fail", ctx);
878 AssertExtensions.Throws<ValidationException> (() => {
879 Validator.ValidateProperty ("f", ctx);
883 Validator.ValidateProperty ("good value", ctx);
884 } catch (Exception ex) {
885 Assert.Fail ("#A13 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
890 public void ValidateValue_01 ()
892 var dummy = new DummyNoAttributes ();
893 var ctx = new ValidationContext (dummy, null, null) {
894 MemberName = "NameProperty"
896 var attributes = new List<ValidationAttribute> ();
899 Validator.ValidateValue (null, ctx, attributes);
900 } catch (Exception ex) {
901 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
904 AssertExtensions.Throws<ArgumentNullException> (() => {
905 Validator.ValidateValue ("dummy", null, attributes);
909 Validator.ValidateValue ("dummy", ctx, attributes);
910 } catch (Exception ex) {
911 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
914 AssertExtensions.Throws<ArgumentNullException> (() => {
915 Validator.ValidateValue ("dummy", ctx, null);
920 public void ValidateValue_02 ()
922 var dummy = new DummyNoAttributes ();
923 var ctx = new ValidationContext (dummy, null, null);
924 var log = new List<string> ();
925 var attributes = new List<ValidationAttribute> () {
926 new StringLengthAttributePoker (10, log) {
929 new RequiredAttributePoker (log)
932 AssertExtensions.Throws<ValidationException> (() => {
933 Validator.ValidateValue (null, ctx, attributes);
935 Assert.AreEqual (1, log.Count, "#A1-2");
936 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-3");
939 AssertExtensions.Throws<InvalidCastException> (() => {
940 // Thrown by StringValidatorAttribute
941 Validator.ValidateValue (1234, ctx, attributes);
943 Assert.AreEqual (2, log.Count, "#A2-2");
944 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-3");
945 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-4");
948 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
949 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
950 AssertExtensions.Throws<ValidationException> (() => {
951 Validator.ValidateValue ("test", ctx, attributes);
953 Assert.AreEqual (2, log.Count, "#A3-2");
954 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-3");
955 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-4");
957 attributes.RemoveAt (2);
958 attributes.RemoveAt (2);
960 AssertExtensions.Throws<ArgumentNullException> (() => {
961 Validator.ValidateValue ("dummy", null, attributes);
965 Validator.ValidateValue ("dummy", ctx, attributes);
966 } catch (Exception ex) {
967 Assert.Fail ("#B2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
970 AssertExtensions.Throws<ArgumentNullException> (() => {
971 Validator.ValidateValue ("dummy", ctx, null);
976 public void TryValidateValue_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
978 EntityMock entity = new EntityMock ();
979 ICollection<ValidationResult> result = new List<ValidationResult>();
981 ICollection<ValidationAttribute> attributes = new List<ValidationAttribute> ();
982 attributes.Add (new RequiredAttribute ());
985 bool isValid = Validator.TryValidateValue (null, new ValidationContext (entity, null, null) { MemberName = "Year" }, result, attributes);
987 Assert.IsFalse (isValid, "#A1-1");
988 Assert.AreEqual (1, result.Count, "#A1-2");
990 // Name = null, string
993 isValid = Validator.TryValidateValue (null, new ValidationContext (entity, null, null) { MemberName = "Name" }, result, attributes);
995 Assert.IsFalse (isValid, "#A2-1");
996 Assert.AreEqual (1, result.Count, "#A2-2");
998 // Name = string.Empty, string
1001 isValid = Validator.TryValidateValue (String.Empty, new ValidationContext (entity, null, null) { MemberName = "Name" }, result, attributes);
1003 Assert.IsFalse (isValid, "#A3-1");
1004 Assert.AreEqual (1, result.Count, "#A3-2");
1008 public void TryValidateProperty_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
1010 EntityMock entity = new EntityMock ();
1011 ICollection<ValidationResult> result = new List<ValidationResult> ();
1014 bool isValid = Validator.TryValidateProperty (null, new ValidationContext (entity, null, null) { MemberName = "Year" }, result);
1016 Assert.IsFalse (isValid, "#A1-1");
1017 Assert.AreEqual (1, result.Count, "#A1-2");
1019 // Name = null, string
1022 isValid = Validator.TryValidateProperty (null, new ValidationContext (entity, null, null) { MemberName = "Name" }, result);
1024 Assert.IsFalse (isValid, "#A2-1");
1025 Assert.AreEqual (1, result.Count, "#A2-2");
1027 // Name = string.Empty, string
1030 isValid = Validator.TryValidateProperty (String.Empty, new ValidationContext (entity, null, null) { MemberName = "Name" }, result);
1032 Assert.IsFalse (isValid, "#A3-1");
1033 Assert.AreEqual (1, result.Count, "#A3-2");
1037 public void TryValidateObject_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
1039 EntityMock entity = new EntityMock ();
1040 ICollection<ValidationResult> result = new List<ValidationResult> ();
1043 bool isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1045 Assert.IsFalse (isValid, "#A1-1");
1046 Assert.AreEqual (2, result.Count, "#A1-2");
1048 // Name = null, string
1051 isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1053 Assert.IsFalse (isValid, "#A2-1");
1054 Assert.AreEqual (2, result.Count, "#A2-2");
1056 // Name = string.Empty, string
1059 entity.Name = String.Empty;
1060 isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1062 Assert.IsFalse (isValid, "#A3-1");
1063 Assert.AreEqual (2, result.Count, "#A3-2");
1066 public static ValidationResult DummyValidationMethod (object o)
1068 var dummy = o as Dummy;
1070 return new ValidationResult ("Invalid DummyValidationMethod input - broken test?");
1072 if (dummy.FailValidation)
1073 return new ValidationResult ("Dummy validation failed.");
1074 return ValidationResult.Success;
1077 public static ValidationResult CustomValidatedPropertyValidationMethod (object o)
1079 var dummy = o as string;
1080 if (dummy != null && (dummy == "f" || dummy == "fail"))
1081 return new ValidationResult ("Dummy.CustomValidatedProperty validation failed.");
1082 return ValidationResult.Success;
1085 public static ValidationResult ValidationMethodException (object o)
1087 throw new ApplicationException ("SNAFU");
1090 public static ValidationResult ValueValidationMethod (object o, ValidationContext validationContext)
1092 return new ValidationResult ("ValueValidationMethod");
1095 public static ValidationResult FirstPropertyValidationMethod (object o, ValidationContext validationContext)
1097 return new ValidationResult ("FirstPropertyValidationMethod");
1100 public static ValidationResult SecondPropertyValidationMethod (object o, ValidationContext validationContext)
1102 return new ValidationResult ("SecondPropertyValidationMethod");
1105 public class RequiredAttributePoker : RequiredAttribute
1109 public RequiredAttributePoker (List<string> log)
1112 throw new ArgumentNullException ("log");
1116 public override bool IsValid (object value)
1118 log.Add ("RequiredAttributePoker.IsValid (object)");
1119 return base.IsValid (value);
1123 public class StringLengthAttributePoker : StringLengthAttribute
1127 public StringLengthAttributePoker (int maximumLength, List<string> log)
1128 : base (maximumLength)
1131 throw new ArgumentNullException ("log");
1135 public override bool IsValid (object value)
1137 log.Add ("StringLengthAttributePoker.IsValid (object)");
1138 return base.IsValid (value);
1142 class DummyNoAttributes
1145 [CustomValidation (typeof (ValidatorTest), "DummyValidationMethod")]
1148 [StringLength (10, MinimumLength=2)]
1149 public string NameField;
1152 public DummyNoAttributes RequiredDummyField;
1154 [StringLength (10, MinimumLength = 2)]
1155 public string NameProperty { get; set; }
1158 public DummyNoAttributes RequiredDummyProperty { get; set; }
1160 [global::System.ComponentModel.DataAnnotations.RangeAttribute ((int)1, (int)10)]
1161 public int MinMaxProperty { get; set; }
1163 [StringLength (10, MinimumLength = 2)]
1164 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1165 public string CustomValidatedProperty { get; set; }
1167 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1168 [StringLength (10, MinimumLength = 2)]
1169 public string AnotherCustomValidatedProperty { get; set; }
1171 public bool FailValidation { get; set; }
1176 NameProperty = "name";
1177 RequiredDummyField = new DummyNoAttributes ();
1178 RequiredDummyProperty = new DummyNoAttributes ();
1180 AnotherCustomValidatedProperty = "I'm valid";
1184 class DummyWithException
1186 [CustomValidation (typeof (ValidatorTest), "ValidationMethodException")]
1187 public string AnotherCustomValidatedProperty { get; set; }
1190 class DummyForValueValidation
1192 public string DummyNoAttributes;
1194 public DummyForValueValidation ()
1196 this.DummyNoAttributes = "I am valid";
1200 class DummyMultipleCustomValidators
1202 [CustomValidation (typeof (ValidatorTest), "FirstPropertyValidationMethod")]
1203 public string FirstProperty { get; set; }
1205 [CustomValidation (typeof (ValidatorTest), "SecondPropertyValidationMethod")]
1206 public string SecondProperty { get; set; }
1216 get { return _year; }
1223 private string _name;
1228 get { return _name; }