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
37 public class ValidatorTest
40 public void TryValidateObject_Object_ValidationContext_ICollection_01 ()
42 var dummy = new DummyNoAttributes ();
43 var ctx = new ValidationContext (dummy, null, null);
44 var results = new List<ValidationResult> ();
46 AssertExtensions.Throws<ArgumentNullException> (() => {
47 Validator.TryValidateObject (null, ctx, results);
50 AssertExtensions.Throws<ArgumentNullException> (() => {
51 Validator.TryValidateObject (dummy, null, results);
54 bool valid = Validator.TryValidateObject (dummy, ctx, null);
55 Assert.IsTrue (valid, "#A2-1");
56 Assert.IsTrue (results.Count == 0, "#A2-2");
60 public void TryValidateObject_Object_ValidationContext_ICollection_02 ()
62 var dummy = new Dummy ();
63 var ctx = new ValidationContext (dummy, null, null);
64 var results = new List<ValidationResult> ();
66 bool valid = Validator.TryValidateObject (dummy, ctx, results);
67 Assert.IsTrue (valid, "#A1-1");
68 Assert.AreEqual (0, results.Count, "#A1-2");
73 AssertExtensions.Throws<ArgumentException> (() => {
74 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
75 valid = Validator.TryValidateObject (dummy, ctx, results);
79 ctx = new ValidationContext (dummy, null, null);
80 valid = Validator.TryValidateObject (dummy, ctx, results);
81 Assert.IsTrue (valid, "#A3-1");
82 Assert.AreEqual (0, results.Count, "#A3-2");
84 // Required properties existence is validated
86 RequiredDummyField = null
88 ctx = new ValidationContext (dummy, null, null);
89 valid = Validator.TryValidateObject (dummy, ctx, results);
90 Assert.IsTrue (valid, "#A4-1");
91 Assert.AreEqual (0, results.Count, "#A4-2");
94 RequiredDummyProperty = null
96 ctx = new ValidationContext (dummy, null, null);
97 valid = Validator.TryValidateObject (dummy, ctx, results);
98 Assert.IsFalse (valid, "#A5-1");
99 Assert.AreEqual (1, results.Count, "#A5-2");
103 // validation attributes other than Required are ignored
107 ctx = new ValidationContext (dummy, null, null);
108 valid = Validator.TryValidateObject (dummy, ctx, results);
109 Assert.IsTrue (valid, "#A6-1");
110 Assert.AreEqual (0, results.Count, "#A6-2");
115 ctx = new ValidationContext (dummy, null, null);
116 valid = Validator.TryValidateObject (dummy, ctx, results);
117 Assert.IsTrue (valid, "#A7-1");
118 Assert.AreEqual (0, results.Count, "#A7-2");
121 FailValidation = true
123 ctx = new ValidationContext (dummy, null, null);
124 valid = Validator.TryValidateObject (dummy, ctx, results);
125 Assert.IsFalse (valid, "#A8-1");
126 Assert.AreEqual (1, results.Count, "#A8-2");
130 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_01 ()
132 var dummy = new DummyNoAttributes ();
133 var ctx = new ValidationContext (dummy, null, null);
134 var results = new List<ValidationResult> ();
136 AssertExtensions.Throws<ArgumentNullException> (() => {
137 Validator.TryValidateObject (null, ctx, results, false);
140 AssertExtensions.Throws<ArgumentNullException> (() => {
141 Validator.TryValidateObject (dummy, null, results, false);
144 bool valid = Validator.TryValidateObject (dummy, ctx, null, false);
145 Assert.IsTrue (valid, "#A2-1");
146 Assert.IsTrue (results.Count == 0, "#A2-2");
148 valid = Validator.TryValidateObject (dummy, ctx, null, true);
149 Assert.IsTrue (valid, "#A3-1");
150 Assert.IsTrue (results.Count == 0, "#A3-2");
154 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_02 ()
156 var dummy = new Dummy ();
157 var ctx = new ValidationContext (dummy, null, null);
158 var results = new List<ValidationResult> ();
160 bool valid = Validator.TryValidateObject (dummy, ctx, results, false);
161 Assert.IsTrue (valid, "#A1-1");
162 Assert.AreEqual (0, results.Count, "#A1-2");
164 valid = Validator.TryValidateObject (dummy, ctx, results, true);
165 Assert.IsTrue (valid, "#A1-3");
166 Assert.AreEqual (0, results.Count, "#A1-4");
171 AssertExtensions.Throws<ArgumentException> (() => {
172 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
173 valid = Validator.TryValidateObject (dummy, ctx, results, false);
176 AssertExtensions.Throws<ArgumentException> (() => {
177 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
178 valid = Validator.TryValidateObject (dummy, ctx, results, true);
181 // Fields are ignored
182 ctx = new ValidationContext (dummy, null, null);
183 valid = Validator.TryValidateObject (dummy, ctx, results, false);
184 Assert.IsTrue (valid, "#A3-1");
185 Assert.AreEqual (0, results.Count, "#A3-2");
187 valid = Validator.TryValidateObject (dummy, ctx, results, true);
188 Assert.IsTrue (valid, "#A3-3");
189 Assert.AreEqual (0, results.Count, "#A3-4");
192 RequiredDummyField = null
194 ctx = new ValidationContext (dummy, null, null);
195 valid = Validator.TryValidateObject (dummy, ctx, results, false);
196 Assert.IsTrue (valid, "#A4-1");
197 Assert.AreEqual (0, results.Count, "#A4-2");
199 valid = Validator.TryValidateObject (dummy, ctx, results, true);
200 Assert.IsTrue (valid, "#A4-3");
201 Assert.AreEqual (0, results.Count, "#A4-4");
203 // Required properties existence is validated
205 RequiredDummyProperty = null
207 ctx = new ValidationContext (dummy, null, null);
208 valid = Validator.TryValidateObject (dummy, ctx, results, false);
209 Assert.IsFalse (valid, "#A5-1");
210 Assert.AreEqual (1, results.Count, "#A5-2");
213 valid = Validator.TryValidateObject (dummy, ctx, results, true);
214 Assert.IsFalse (valid, "#A5-3");
215 Assert.AreEqual (1, results.Count, "#A5-4");
221 ctx = new ValidationContext (dummy, null, null);
222 valid = Validator.TryValidateObject (dummy, ctx, results, false);
223 Assert.IsTrue (valid, "#A6-1");
224 Assert.AreEqual (0, results.Count, "#A6-2");
226 // NameProperty is null, that causes the StringLength validator to skip its tests
227 valid = Validator.TryValidateObject (dummy, ctx, results, true);
228 Assert.IsTrue (valid, "#A6-3");
229 Assert.AreEqual (0, results.Count, "#A6-4");
231 dummy.NameProperty = "0";
232 valid = Validator.TryValidateObject (dummy, ctx, results, true);
233 Assert.IsFalse (valid, "#A6-5");
234 Assert.AreEqual (1, results.Count, "#A6-6");
237 dummy.NameProperty = "name too long (invalid value)";
238 valid = Validator.TryValidateObject (dummy, ctx, results, true);
239 Assert.IsFalse (valid, "#A6-7");
240 Assert.AreEqual (1, results.Count, "#A6-8");
246 ctx = new ValidationContext (dummy, null, null);
247 valid = Validator.TryValidateObject (dummy, ctx, results, false);
248 Assert.IsTrue (valid, "#A7-1");
249 Assert.AreEqual (0, results.Count, "#A7-2");
251 valid = Validator.TryValidateObject (dummy, ctx, results, true);
252 Assert.IsFalse (valid, "#A7-3");
253 Assert.AreEqual (1, results.Count, "#A7-4");
257 FailValidation = true
259 ctx = new ValidationContext (dummy, null, null);
260 valid = Validator.TryValidateObject (dummy, ctx, results, false);
261 Assert.IsFalse (valid, "#A8-1");
262 Assert.AreEqual (1, results.Count, "#A8-2");
265 valid = Validator.TryValidateObject (dummy, ctx, results, true);
266 Assert.IsFalse (valid, "#A8-3");
267 Assert.AreEqual (1, results.Count, "#A8-4");
270 var dummy2 = new DummyWithException ();
271 ctx = new ValidationContext (dummy2, null, null);
272 AssertExtensions.Throws<ApplicationException> (() => {
273 Validator.TryValidateObject (dummy2, ctx, results, true);
278 public void TryValidateProperty ()
280 var dummy = new DummyNoAttributes ();
281 var ctx = new ValidationContext (dummy, null, null) {
282 MemberName = "NameProperty"
284 var results = new List<ValidationResult> ();
286 AssertExtensions.Throws<ArgumentException> (() => {
287 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
288 // System.ArgumentException : The type 'DummyNoAttributes' does not contain a public property named 'NameProperty'.
289 // Parameter name: propertyName
291 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
292 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
293 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
294 // 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
296 Validator.TryValidateProperty ("dummy", ctx, results);
298 Assert.AreEqual (0, results.Count, "#A1-2");
300 AssertExtensions.Throws<ArgumentNullException> (() => {
301 Validator.TryValidateProperty ("dummy", null, results);
304 var dummy2 = new Dummy ();
305 ctx = new ValidationContext (dummy2, null, null) {
306 MemberName = "NameProperty"
309 bool valid = Validator.TryValidateProperty (null, ctx, results);
310 Assert.IsTrue (valid, "#A1-3");
311 Assert.AreEqual (0, results.Count, "#A1-4");
313 ctx = new ValidationContext (dummy2, null, null) {
314 MemberName = "MinMaxProperty"
317 AssertExtensions.Throws<ArgumentException> (() => {
318 Validator.TryValidateProperty (null, ctx, results);
321 ctx = new ValidationContext (dummy2, null, null);
322 AssertExtensions.Throws<ArgumentNullException> (() => {
323 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
324 // System.ArgumentNullException : Value cannot be null.
325 // Parameter name: propertyName
327 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
328 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
329 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
330 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
331 // 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
333 Validator.TryValidateProperty ("dummy", ctx, results);
335 Assert.AreEqual (0, results.Count, "#A2-2");
337 ctx = new ValidationContext (dummy2, null, null) {
338 MemberName = String.Empty
341 AssertExtensions.Throws<ArgumentNullException> (() => {
342 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
343 // System.ArgumentNullException : Value cannot be null.
344 // Parameter name: propertyName
346 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
347 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
348 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
349 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
350 // 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
352 Validator.TryValidateProperty ("dummy", ctx, results);
354 Assert.AreEqual (0, results.Count, "#A2-2");
356 dummy2 = new Dummy ();
357 ctx = new ValidationContext (dummy2, null, null) {
358 MemberName = "NameProperty"
361 AssertExtensions.Throws<ArgumentException> (() => {
362 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
363 // System.ArgumentException : The value for property 'NameProperty' must be of type 'System.String'.
364 // Parameter name: value
366 // at System.ComponentModel.DataAnnotations.Validator.EnsureValidPropertyType(String propertyName, Type propertyType, Object value)
367 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
368 // 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
370 Validator.TryValidateProperty (1234, ctx, results);
372 Assert.AreEqual (0, results.Count, "#A3-2");
374 dummy2 = new Dummy ();
375 ctx = new ValidationContext (dummy2, null, null) {
376 MemberName = "NameProperty"
379 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
380 Assert.IsFalse (valid, "#A4-1");
381 Assert.AreEqual (1, results.Count, "#A4-2");
384 valid = Validator.TryValidateProperty ("this value is way too long", ctx, results);
385 Assert.IsFalse (valid, "#A4-3");
386 Assert.AreEqual (1, results.Count, "#A4-4");
389 valid = Validator.TryValidateProperty ("good value", ctx, results);
390 Assert.IsTrue (valid, "#A4-5");
391 Assert.AreEqual (0, results.Count, "#A4-6");
393 dummy2 = new Dummy ();
394 ctx = new ValidationContext (dummy2, null, null) {
395 MemberName = "CustomValidatedProperty"
398 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
399 Assert.IsFalse (valid, "#A5-1");
400 Assert.AreEqual (1, results.Count, "#A5-2");
403 valid = Validator.TryValidateProperty ("fail", ctx, results);
404 Assert.IsFalse (valid, "#A5-3");
405 Assert.AreEqual (1, results.Count, "#A5-4");
408 valid = Validator.TryValidateProperty ("f", ctx, results);
409 Assert.IsFalse (valid, "#A5-5");
410 Assert.AreEqual (2, results.Count, "#A5-6");
413 valid = Validator.TryValidateProperty ("good value", ctx, results);
414 Assert.IsTrue (valid, "#A5-7");
415 Assert.AreEqual (0, results.Count, "#A5-8");
419 public void TryValidateValue_01 ()
421 var dummy = new DummyNoAttributes ();
422 var ctx = new ValidationContext (dummy, null, null) {
423 MemberName = "NameProperty"
425 var results = new List<ValidationResult> ();
426 var attributes = new List <ValidationAttribute> ();
428 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
429 Assert.IsTrue (valid, "#A1-1");
430 Assert.AreEqual (0, results.Count, "#A1-2");
432 AssertExtensions.Throws<ArgumentNullException> (() => {
433 Validator.TryValidateValue ("dummy", null, results, attributes);
436 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
437 Assert.IsTrue (valid, "#A3-1");
438 Assert.AreEqual (0, results.Count, "#A3-2");
440 AssertExtensions.Throws<ArgumentNullException> (() => {
441 Validator.TryValidateValue ("dummy", ctx, results, null);
446 public void TryValidateValue_02 ()
448 var dummy = new DummyNoAttributes ();
449 var ctx = new ValidationContext (dummy, null, null);
450 var results = new List<ValidationResult> ();
451 var log = new List<string> ();
452 var attributes = new List<ValidationAttribute> () {
453 new StringLengthAttributePoker (10, log) {
456 new RequiredAttributePoker (log)
459 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
460 Assert.IsFalse (valid, "#A1-1");
461 Assert.AreEqual (1, results.Count, "#A1-2");
462 Assert.AreEqual (1, log.Count, "#A1-3");
463 Assert.IsTrue (log [0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-4");
467 AssertExtensions.Throws<InvalidCastException> (() => {
468 // Thrown by StringValidatorAttribute
469 Validator.TryValidateValue (1234, ctx, results, attributes);
471 Assert.AreEqual (0, results.Count, "#A2-2");
472 Assert.AreEqual (2, log.Count, "#A2-3");
473 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-4");
474 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-5");
478 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
479 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
480 valid = Validator.TryValidateValue ("test", ctx, results, attributes);
481 Assert.IsFalse (valid, "#A3-1");
482 Assert.AreEqual (2, results.Count, "#A3-2");
483 Assert.AreEqual (2, log.Count, "#A3-3");
484 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-4");
485 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-5");
486 Assert.AreEqual ("ValueValidationMethod", results[0].ErrorMessage, "#A3-6");
487 Assert.AreEqual ("ValueValidationMethod", results[1].ErrorMessage, "#A3-7");
490 attributes.RemoveAt (2);
491 attributes.RemoveAt (2);
493 AssertExtensions.Throws<ArgumentNullException> (() => {
494 Validator.TryValidateValue ("dummy", null, results, attributes);
497 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
498 Assert.IsTrue (valid, "#B2-1");
499 Assert.AreEqual (0, results.Count, "#B2-2");
501 AssertExtensions.Throws<ArgumentNullException> (() => {
502 Validator.TryValidateValue ("dummy", ctx, results, null);
507 public void ValidateObject_Object_ValidationContext_01 ()
509 var dummy = new DummyNoAttributes ();
510 var ctx = new ValidationContext (dummy, null, null);
512 AssertExtensions.Throws<ArgumentNullException> (() => {
513 Validator.ValidateObject (null, ctx);
516 AssertExtensions.Throws<ArgumentNullException> (() => {
517 Validator.ValidateObject (dummy, null);
521 Validator.ValidateObject (dummy, ctx);
522 } catch (Exception ex) {
523 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
528 public void ValidateObject_Object_ValidationContext_02 ()
530 var dummy = new Dummy ();
531 var ctx = new ValidationContext (dummy, null, null);
534 Validator.ValidateObject (dummy, ctx);
535 } catch (Exception ex) {
536 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
542 AssertExtensions.Throws<ArgumentException> (() => {
543 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
544 Validator.ValidateObject (dummy, ctx);
547 // Fields are ignored
548 ctx = new ValidationContext (dummy, null, null);
550 Validator.ValidateObject (dummy, ctx);
551 } catch (Exception ex) {
552 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
556 RequiredDummyField = null
558 ctx = new ValidationContext (dummy, null, null);
560 Validator.ValidateObject (dummy, ctx);
561 } catch (Exception ex) {
562 Assert.Fail ("#A4 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
566 RequiredDummyProperty = null
568 ctx = new ValidationContext (dummy, null, null);
569 AssertExtensions.Throws<ValidationException> (() => {
570 Validator.ValidateObject (dummy, ctx);
573 // validation attributes other than Required are ignored
577 ctx = new ValidationContext (dummy, null, null);
579 Validator.ValidateObject (dummy, ctx);
580 } catch (Exception ex) {
581 Assert.Fail ("#A6 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
587 ctx = new ValidationContext (dummy, null, null);
589 Validator.ValidateObject (dummy, ctx);
590 } catch (Exception ex) {
591 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
595 FailValidation = true
597 ctx = new ValidationContext (dummy, null, null);
598 AssertExtensions.Throws<ValidationException> (() => {
599 Validator.ValidateObject (dummy, ctx);
602 var dummy2 = new DummyMultipleCustomValidators ();
603 ctx = new ValidationContext (dummy2, null, null);
605 Validator.ValidateObject (dummy2, ctx);
606 } catch (Exception ex) {
607 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
612 public void ValidateObject_Object_ValidationContext_Bool_01 ()
614 var dummy = new DummyNoAttributes ();
615 var ctx = new ValidationContext (dummy, null, null);
617 AssertExtensions.Throws<ArgumentNullException> (() => {
618 Validator.ValidateObject (null, ctx, false);
621 AssertExtensions.Throws<ArgumentNullException> (() => {
622 Validator.ValidateObject (dummy, null, false);
626 Validator.ValidateObject (dummy, ctx, false);
627 } catch (Exception ex) {
628 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
632 Validator.ValidateObject (dummy, ctx, true);
633 } catch (Exception ex) {
634 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
639 public void ValidateObject_Object_ValidationContext_Bool_02 ()
641 var dummy = new Dummy ();
642 var ctx = new ValidationContext (dummy, null, null);
645 Validator.ValidateObject (dummy, ctx, false);
646 } catch (Exception ex) {
647 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
651 Validator.ValidateObject (dummy, ctx, true);
652 } catch (Exception ex) {
653 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
659 AssertExtensions.Throws<ArgumentException> (() => {
660 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
661 Validator.ValidateObject (dummy, ctx, false);
664 AssertExtensions.Throws<ArgumentException> (() => {
665 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
666 Validator.ValidateObject (dummy, ctx, true);
669 // Fields are ignored
670 ctx = new ValidationContext (dummy, null, null);
672 Validator.ValidateObject (dummy, ctx, false);
673 } catch (Exception ex) {
674 Assert.Fail ("#A4-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
678 Validator.ValidateObject (dummy, ctx, true);
679 } catch (Exception ex) {
680 Assert.Fail ("#A4-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
684 RequiredDummyField = null
686 ctx = new ValidationContext (dummy, null, null);
688 Validator.ValidateObject (dummy, ctx, false);
689 } catch (Exception ex) {
690 Assert.Fail ("#A5-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
694 Validator.ValidateObject (dummy, ctx, true);
695 } catch (Exception ex) {
696 Assert.Fail ("#A5-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
699 // Required properties existence is validated
701 RequiredDummyProperty = null
703 ctx = new ValidationContext (dummy, null, null);
704 AssertExtensions.Throws<ValidationException> (() => {
705 Validator.ValidateObject (dummy, ctx, false);
708 AssertExtensions.Throws<ValidationException> (() => {
709 Validator.ValidateObject (dummy, ctx, true);
715 ctx = new ValidationContext (dummy, null, null);
717 Validator.ValidateObject (dummy, ctx, false);
718 } catch (Exception ex) {
719 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
722 // NameProperty is null, that causes the StringLength validator to skip its tests
724 Validator.ValidateObject (dummy, ctx, true);
725 } catch (Exception ex) {
726 Assert.Fail ("#A8 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
729 dummy.NameProperty = "0";
730 AssertExtensions.Throws<ValidationException> (() => {
731 Validator.ValidateObject (dummy, ctx, true);
734 dummy.NameProperty = "name too long (invalid value)";
735 AssertExtensions.Throws<ValidationException> (() => {
736 Validator.ValidateObject (dummy, ctx, true);
742 ctx = new ValidationContext (dummy, null, null);
744 Validator.ValidateObject (dummy, ctx, false);
745 } catch (Exception ex) {
746 Assert.Fail ("#A11 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
749 AssertExtensions.Throws<ValidationException> (() => {
750 Validator.ValidateObject (dummy, ctx, true);
754 FailValidation = true
756 ctx = new ValidationContext (dummy, null, null);
757 AssertExtensions.Throws<ValidationException> (() => {
758 Validator.ValidateObject (dummy, ctx, false);
761 AssertExtensions.Throws<ValidationException> (() => {
762 Validator.ValidateObject (dummy, ctx, true);
765 var dummy2 = new DummyWithException ();
766 ctx = new ValidationContext (dummy2, null, null);
767 AssertExtensions.Throws<ApplicationException> (() => {
768 Validator.ValidateObject (dummy2, ctx, true);
771 var dummy3 = new DummyMultipleCustomValidators ();
772 ctx = new ValidationContext (dummy3, null, null);
774 Validator.ValidateObject (dummy3, ctx, false);
775 } catch (Exception ex) {
776 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
780 Validator.ValidateObject (dummy3, ctx, true);
781 } catch (ValidationException ex) {
782 Assert.AreEqual ("FirstPropertyValidationMethod", ex.Message, "#A10");
783 } catch (Exception ex) {
784 Assert.Fail ("#A10 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
789 public void ValidateProperty ()
791 var dummy = new DummyNoAttributes ();
792 var ctx = new ValidationContext (dummy, null, null) {
793 MemberName = "NameProperty"
796 AssertExtensions.Throws<ArgumentException> (() => {
797 Validator.ValidateProperty ("dummy", ctx);
800 AssertExtensions.Throws<ArgumentNullException> (() => {
801 Validator.ValidateProperty ("dummy", null);
804 var dummy2 = new Dummy ();
805 ctx = new ValidationContext (dummy2, null, null) {
806 MemberName = "NameProperty"
810 Validator.ValidateProperty (null, ctx);
811 } catch (Exception ex) {
812 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
815 ctx = new ValidationContext (dummy2, null, null) {
816 MemberName = "MinMaxProperty"
819 AssertExtensions.Throws<ArgumentException> (() => {
820 Validator.ValidateProperty (null, ctx);
823 ctx = new ValidationContext (dummy2, null, null);
824 AssertExtensions.Throws<ArgumentNullException> (() => {
825 Validator.ValidateProperty ("dummy", ctx);
828 ctx = new ValidationContext (dummy2, null, null) {
829 MemberName = String.Empty
832 AssertExtensions.Throws<ArgumentNullException> (() => {
833 Validator.ValidateProperty ("dummy", ctx);
836 dummy2 = new Dummy ();
837 ctx = new ValidationContext (dummy2, null, null) {
838 MemberName = "NameProperty"
841 AssertExtensions.Throws<ArgumentException> (() => {
842 Validator.ValidateProperty (1234, ctx);
845 dummy2 = new Dummy ();
846 ctx = new ValidationContext (dummy2, null, null) {
847 MemberName = "NameProperty"
850 AssertExtensions.Throws<ValidationException> (() => {
851 Validator.ValidateProperty (String.Empty, ctx);
854 AssertExtensions.Throws<ValidationException> (() => {
855 Validator.ValidateProperty ("this value is way too long", ctx);
859 Validator.ValidateProperty ("good value", ctx);
860 } catch (Exception ex) {
861 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
864 dummy2 = new Dummy ();
865 ctx = new ValidationContext (dummy2, null, null) {
866 MemberName = "CustomValidatedProperty"
869 AssertExtensions.Throws<ValidationException> (() => {
870 Validator.ValidateProperty (String.Empty, ctx);
873 AssertExtensions.Throws<ValidationException> (() => {
874 Validator.ValidateProperty ("fail", ctx);
877 AssertExtensions.Throws<ValidationException> (() => {
878 Validator.ValidateProperty ("f", ctx);
882 Validator.ValidateProperty ("good value", ctx);
883 } catch (Exception ex) {
884 Assert.Fail ("#A13 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
889 public void ValidateValue_01 ()
891 var dummy = new DummyNoAttributes ();
892 var ctx = new ValidationContext (dummy, null, null) {
893 MemberName = "NameProperty"
895 var attributes = new List<ValidationAttribute> ();
898 Validator.ValidateValue (null, ctx, attributes);
899 } catch (Exception ex) {
900 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
903 AssertExtensions.Throws<ArgumentNullException> (() => {
904 Validator.ValidateValue ("dummy", null, attributes);
908 Validator.ValidateValue ("dummy", ctx, attributes);
909 } catch (Exception ex) {
910 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
913 AssertExtensions.Throws<ArgumentNullException> (() => {
914 Validator.ValidateValue ("dummy", ctx, null);
919 public void ValidateValue_02 ()
921 var dummy = new DummyNoAttributes ();
922 var ctx = new ValidationContext (dummy, null, null);
923 var log = new List<string> ();
924 var attributes = new List<ValidationAttribute> () {
925 new StringLengthAttributePoker (10, log) {
928 new RequiredAttributePoker (log)
931 AssertExtensions.Throws<ValidationException> (() => {
932 Validator.ValidateValue (null, ctx, attributes);
934 Assert.AreEqual (1, log.Count, "#A1-2");
935 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-3");
938 AssertExtensions.Throws<InvalidCastException> (() => {
939 // Thrown by StringValidatorAttribute
940 Validator.ValidateValue (1234, ctx, attributes);
942 Assert.AreEqual (2, log.Count, "#A2-2");
943 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-3");
944 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-4");
947 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
948 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
949 AssertExtensions.Throws<ValidationException> (() => {
950 Validator.ValidateValue ("test", ctx, attributes);
952 Assert.AreEqual (2, log.Count, "#A3-2");
953 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-3");
954 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-4");
956 attributes.RemoveAt (2);
957 attributes.RemoveAt (2);
959 AssertExtensions.Throws<ArgumentNullException> (() => {
960 Validator.ValidateValue ("dummy", null, attributes);
964 Validator.ValidateValue ("dummy", ctx, attributes);
965 } catch (Exception ex) {
966 Assert.Fail ("#B2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
969 AssertExtensions.Throws<ArgumentNullException> (() => {
970 Validator.ValidateValue ("dummy", ctx, null);
975 public void TryValidateValue_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
977 EntityMock entity = new EntityMock ();
978 ICollection<ValidationResult> result = new List<ValidationResult>();
980 ICollection<ValidationAttribute> attributes = new List<ValidationAttribute> ();
981 attributes.Add (new RequiredAttribute ());
984 bool isValid = Validator.TryValidateValue (null, new ValidationContext (entity, null, null) { MemberName = "Year" }, result, attributes);
986 Assert.IsFalse (isValid, "#A1-1");
987 Assert.AreEqual (1, result.Count, "#A1-2");
989 // Name = null, string
992 isValid = Validator.TryValidateValue (null, new ValidationContext (entity, null, null) { MemberName = "Name" }, result, attributes);
994 Assert.IsFalse (isValid, "#A2-1");
995 Assert.AreEqual (1, result.Count, "#A2-2");
997 // Name = string.Empty, string
1000 isValid = Validator.TryValidateValue (String.Empty, new ValidationContext (entity, null, null) { MemberName = "Name" }, result, attributes);
1002 Assert.IsFalse (isValid, "#A3-1");
1003 Assert.AreEqual (1, result.Count, "#A3-2");
1007 public void TryValidateProperty_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
1009 EntityMock entity = new EntityMock ();
1010 ICollection<ValidationResult> result = new List<ValidationResult> ();
1013 bool isValid = Validator.TryValidateProperty (null, new ValidationContext (entity, null, null) { MemberName = "Year" }, result);
1015 Assert.IsFalse (isValid, "#A1-1");
1016 Assert.AreEqual (1, result.Count, "#A1-2");
1018 // Name = null, string
1021 isValid = Validator.TryValidateProperty (null, new ValidationContext (entity, null, null) { MemberName = "Name" }, result);
1023 Assert.IsFalse (isValid, "#A2-1");
1024 Assert.AreEqual (1, result.Count, "#A2-2");
1026 // Name = string.Empty, string
1029 isValid = Validator.TryValidateProperty (String.Empty, new ValidationContext (entity, null, null) { MemberName = "Name" }, result);
1031 Assert.IsFalse (isValid, "#A3-1");
1032 Assert.AreEqual (1, result.Count, "#A3-2");
1036 public void TryValidateObject_Throws_ValidationException_When_Property_Is_NullableAndRequired_And_Value_Is_Null ()
1038 EntityMock entity = new EntityMock ();
1039 ICollection<ValidationResult> result = new List<ValidationResult> ();
1042 bool isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1044 Assert.IsFalse (isValid, "#A1-1");
1045 Assert.AreEqual (2, result.Count, "#A1-2");
1047 // Name = null, string
1050 isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1052 Assert.IsFalse (isValid, "#A2-1");
1053 Assert.AreEqual (2, result.Count, "#A2-2");
1055 // Name = string.Empty, string
1058 entity.Name = String.Empty;
1059 isValid = Validator.TryValidateObject (entity, new ValidationContext (entity, null, null), result);
1061 Assert.IsFalse (isValid, "#A3-1");
1062 Assert.AreEqual (2, result.Count, "#A3-2");
1065 public static ValidationResult DummyValidationMethod (object o)
1067 var dummy = o as Dummy;
1069 return new ValidationResult ("Invalid DummyValidationMethod input - broken test?");
1071 if (dummy.FailValidation)
1072 return new ValidationResult ("Dummy validation failed.");
1073 return ValidationResult.Success;
1076 public static ValidationResult CustomValidatedPropertyValidationMethod (object o)
1078 var dummy = o as string;
1079 if (dummy != null && (dummy == "f" || dummy == "fail"))
1080 return new ValidationResult ("Dummy.CustomValidatedProperty validation failed.");
1081 return ValidationResult.Success;
1084 public static ValidationResult ValidationMethodException (object o)
1086 throw new ApplicationException ("SNAFU");
1089 public static ValidationResult ValueValidationMethod (object o, ValidationContext validationContext)
1091 return new ValidationResult ("ValueValidationMethod");
1094 public static ValidationResult FirstPropertyValidationMethod (object o, ValidationContext validationContext)
1096 return new ValidationResult ("FirstPropertyValidationMethod");
1099 public static ValidationResult SecondPropertyValidationMethod (object o, ValidationContext validationContext)
1101 return new ValidationResult ("SecondPropertyValidationMethod");
1104 public class RequiredAttributePoker : RequiredAttribute
1108 public RequiredAttributePoker (List<string> log)
1111 throw new ArgumentNullException ("log");
1115 public override bool IsValid (object value)
1117 log.Add ("RequiredAttributePoker.IsValid (object)");
1118 return base.IsValid (value);
1122 public class StringLengthAttributePoker : StringLengthAttribute
1126 public StringLengthAttributePoker (int maximumLength, List<string> log)
1127 : base (maximumLength)
1130 throw new ArgumentNullException ("log");
1134 public override bool IsValid (object value)
1136 log.Add ("StringLengthAttributePoker.IsValid (object)");
1137 return base.IsValid (value);
1141 class DummyNoAttributes
1144 [CustomValidation (typeof (ValidatorTest), "DummyValidationMethod")]
1147 [StringLength (10, MinimumLength=2)]
1148 public string NameField;
1151 public DummyNoAttributes RequiredDummyField;
1153 [StringLength (10, MinimumLength = 2)]
1154 public string NameProperty { get; set; }
1157 public DummyNoAttributes RequiredDummyProperty { get; set; }
1159 [global::System.ComponentModel.DataAnnotations.RangeAttribute ((int)1, (int)10)]
1160 public int MinMaxProperty { get; set; }
1162 [StringLength (10, MinimumLength = 2)]
1163 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1164 public string CustomValidatedProperty { get; set; }
1166 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1167 [StringLength (10, MinimumLength = 2)]
1168 public string AnotherCustomValidatedProperty { get; set; }
1170 public bool FailValidation { get; set; }
1175 NameProperty = "name";
1176 RequiredDummyField = new DummyNoAttributes ();
1177 RequiredDummyProperty = new DummyNoAttributes ();
1179 AnotherCustomValidatedProperty = "I'm valid";
1183 class DummyWithException
1185 [CustomValidation (typeof (ValidatorTest), "ValidationMethodException")]
1186 public string AnotherCustomValidatedProperty { get; set; }
1189 class DummyForValueValidation
1191 public string DummyNoAttributes;
1193 public DummyForValueValidation ()
1195 this.DummyNoAttributes = "I am valid";
1199 class DummyMultipleCustomValidators
1201 [CustomValidation (typeof (ValidatorTest), "FirstPropertyValidationMethod")]
1202 public string FirstProperty { get; set; }
1204 [CustomValidation (typeof (ValidatorTest), "SecondPropertyValidationMethod")]
1205 public string SecondProperty { get; set; }
1215 get { return _year; }
1222 private string _name;
1227 get { return _name; }