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;
29 using System.ComponentModel.Design;
32 using NUnit.Framework;
33 using MonoTests.Common;
35 namespace MonoTests.System.ComponentModel.DataAnnotations
39 public class ValidatorTest
42 public void TryValidateObject_Object_ValidationContext_ICollection_01 ()
44 var dummy = new DummyNoAttributes ();
45 var ctx = new ValidationContext (dummy, null, null);
46 var results = new List<ValidationResult> ();
48 AssertExtensions.Throws<ArgumentNullException> (() => {
49 Validator.TryValidateObject (null, ctx, results);
52 AssertExtensions.Throws<ArgumentNullException> (() => {
53 Validator.TryValidateObject (dummy, null, results);
56 bool valid = Validator.TryValidateObject (dummy, ctx, null);
57 Assert.IsTrue (valid, "#A2-1");
58 Assert.IsTrue (results.Count == 0, "#A2-2");
62 public void TryValidateObject_Object_ValidationContext_ICollection_02 ()
64 var dummy = new Dummy ();
65 var ctx = new ValidationContext (dummy, null, null);
66 var results = new List<ValidationResult> ();
68 bool valid = Validator.TryValidateObject (dummy, ctx, results);
69 Assert.IsTrue (valid, "#A1-1");
70 Assert.AreEqual (0, results.Count, "#A1-2");
75 AssertExtensions.Throws<ArgumentException> (() => {
76 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
77 valid = Validator.TryValidateObject (dummy, ctx, results);
81 ctx = new ValidationContext (dummy, null, null);
82 valid = Validator.TryValidateObject (dummy, ctx, results);
83 Assert.IsTrue (valid, "#A3-1");
84 Assert.AreEqual (0, results.Count, "#A3-2");
86 // Required properties existence is validated
88 RequiredDummyField = null
90 ctx = new ValidationContext (dummy, null, null);
91 valid = Validator.TryValidateObject (dummy, ctx, results);
92 Assert.IsTrue (valid, "#A4-1");
93 Assert.AreEqual (0, results.Count, "#A4-2");
96 RequiredDummyProperty = null
98 ctx = new ValidationContext (dummy, null, null);
99 valid = Validator.TryValidateObject (dummy, ctx, results);
100 Assert.IsFalse (valid, "#A5-1");
101 Assert.AreEqual (1, results.Count, "#A5-2");
105 // validation attributes other than Required are ignored
109 ctx = new ValidationContext (dummy, null, null);
110 valid = Validator.TryValidateObject (dummy, ctx, results);
111 Assert.IsTrue (valid, "#A6-1");
112 Assert.AreEqual (0, results.Count, "#A6-2");
117 ctx = new ValidationContext (dummy, null, null);
118 valid = Validator.TryValidateObject (dummy, ctx, results);
119 Assert.IsTrue (valid, "#A7-1");
120 Assert.AreEqual (0, results.Count, "#A7-2");
123 FailValidation = true
125 ctx = new ValidationContext (dummy, null, null);
126 valid = Validator.TryValidateObject (dummy, ctx, results);
127 Assert.IsFalse (valid, "#A8-1");
128 Assert.AreEqual (1, results.Count, "#A8-2");
132 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_01 ()
134 var dummy = new DummyNoAttributes ();
135 var ctx = new ValidationContext (dummy, null, null);
136 var results = new List<ValidationResult> ();
138 AssertExtensions.Throws<ArgumentNullException> (() => {
139 Validator.TryValidateObject (null, ctx, results, false);
142 AssertExtensions.Throws<ArgumentNullException> (() => {
143 Validator.TryValidateObject (dummy, null, results, false);
146 bool valid = Validator.TryValidateObject (dummy, ctx, null, false);
147 Assert.IsTrue (valid, "#A2-1");
148 Assert.IsTrue (results.Count == 0, "#A2-2");
150 valid = Validator.TryValidateObject (dummy, ctx, null, true);
151 Assert.IsTrue (valid, "#A3-1");
152 Assert.IsTrue (results.Count == 0, "#A3-2");
156 public void TryValidateObject_Object_ValidationContext_ICollection_Bool_02 ()
158 var dummy = new Dummy ();
159 var ctx = new ValidationContext (dummy, null, null);
160 var results = new List<ValidationResult> ();
162 bool valid = Validator.TryValidateObject (dummy, ctx, results, false);
163 Assert.IsTrue (valid, "#A1-1");
164 Assert.AreEqual (0, results.Count, "#A1-2");
166 valid = Validator.TryValidateObject (dummy, ctx, results, true);
167 Assert.IsTrue (valid, "#A1-3");
168 Assert.AreEqual (0, results.Count, "#A1-4");
173 AssertExtensions.Throws<ArgumentException> (() => {
174 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
175 valid = Validator.TryValidateObject (dummy, ctx, results, false);
178 AssertExtensions.Throws<ArgumentException> (() => {
179 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
180 valid = Validator.TryValidateObject (dummy, ctx, results, true);
183 // Fields are ignored
184 ctx = new ValidationContext (dummy, null, null);
185 valid = Validator.TryValidateObject (dummy, ctx, results, false);
186 Assert.IsTrue (valid, "#A3-1");
187 Assert.AreEqual (0, results.Count, "#A3-2");
189 valid = Validator.TryValidateObject (dummy, ctx, results, true);
190 Assert.IsTrue (valid, "#A3-3");
191 Assert.AreEqual (0, results.Count, "#A3-4");
194 RequiredDummyField = null
196 ctx = new ValidationContext (dummy, null, null);
197 valid = Validator.TryValidateObject (dummy, ctx, results, false);
198 Assert.IsTrue (valid, "#A4-1");
199 Assert.AreEqual (0, results.Count, "#A4-2");
201 valid = Validator.TryValidateObject (dummy, ctx, results, true);
202 Assert.IsTrue (valid, "#A4-3");
203 Assert.AreEqual (0, results.Count, "#A4-4");
205 // Required properties existence is validated
207 RequiredDummyProperty = null
209 ctx = new ValidationContext (dummy, null, null);
210 valid = Validator.TryValidateObject (dummy, ctx, results, false);
211 Assert.IsFalse (valid, "#A5-1");
212 Assert.AreEqual (1, results.Count, "#A5-2");
215 valid = Validator.TryValidateObject (dummy, ctx, results, true);
216 Assert.IsFalse (valid, "#A5-3");
217 Assert.AreEqual (1, results.Count, "#A5-4");
223 ctx = new ValidationContext (dummy, null, null);
224 valid = Validator.TryValidateObject (dummy, ctx, results, false);
225 Assert.IsTrue (valid, "#A6-1");
226 Assert.AreEqual (0, results.Count, "#A6-2");
228 // NameProperty is null, that causes the StringLength validator to skip its tests
229 valid = Validator.TryValidateObject (dummy, ctx, results, true);
230 Assert.IsTrue (valid, "#A6-3");
231 Assert.AreEqual (0, results.Count, "#A6-4");
233 dummy.NameProperty = "0";
234 valid = Validator.TryValidateObject (dummy, ctx, results, true);
235 Assert.IsFalse (valid, "#A6-5");
236 Assert.AreEqual (1, results.Count, "#A6-6");
239 dummy.NameProperty = "name too long (invalid value)";
240 valid = Validator.TryValidateObject (dummy, ctx, results, true);
241 Assert.IsFalse (valid, "#A6-7");
242 Assert.AreEqual (1, results.Count, "#A6-8");
248 ctx = new ValidationContext (dummy, null, null);
249 valid = Validator.TryValidateObject (dummy, ctx, results, false);
250 Assert.IsTrue (valid, "#A7-1");
251 Assert.AreEqual (0, results.Count, "#A7-2");
253 valid = Validator.TryValidateObject (dummy, ctx, results, true);
254 Assert.IsFalse (valid, "#A7-3");
255 Assert.AreEqual (1, results.Count, "#A7-4");
259 FailValidation = true
261 ctx = new ValidationContext (dummy, null, null);
262 valid = Validator.TryValidateObject (dummy, ctx, results, false);
263 Assert.IsFalse (valid, "#A8-1");
264 Assert.AreEqual (1, results.Count, "#A8-2");
267 valid = Validator.TryValidateObject (dummy, ctx, results, true);
268 Assert.IsFalse (valid, "#A8-3");
269 Assert.AreEqual (1, results.Count, "#A8-4");
272 var dummy2 = new DummyWithException ();
273 ctx = new ValidationContext (dummy2, null, null);
274 AssertExtensions.Throws<ApplicationException> (() => {
275 Validator.TryValidateObject (dummy2, ctx, results, true);
280 public void TryValidateProperty ()
282 var dummy = new DummyNoAttributes ();
283 var ctx = new ValidationContext (dummy, null, null) {
284 MemberName = "NameProperty"
286 var results = new List<ValidationResult> ();
288 AssertExtensions.Throws<ArgumentException> (() => {
289 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
290 // System.ArgumentException : The type 'DummyNoAttributes' does not contain a public property named 'NameProperty'.
291 // Parameter name: propertyName
293 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
294 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
295 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
296 // 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
298 Validator.TryValidateProperty ("dummy", ctx, results);
300 Assert.AreEqual (0, results.Count, "#A1-2");
302 AssertExtensions.Throws<ArgumentNullException> (() => {
303 Validator.TryValidateProperty ("dummy", null, results);
306 var dummy2 = new Dummy ();
307 ctx = new ValidationContext (dummy2, null, null) {
308 MemberName = "NameProperty"
311 bool valid = Validator.TryValidateProperty (null, ctx, results);
312 Assert.IsTrue (valid, "#A1-3");
313 Assert.AreEqual (0, results.Count, "#A1-4");
315 ctx = new ValidationContext (dummy2, null, null) {
316 MemberName = "MinMaxProperty"
319 AssertExtensions.Throws<ArgumentException> (() => {
320 Validator.TryValidateProperty (null, ctx, results);
323 ctx = new ValidationContext (dummy2, null, null);
324 AssertExtensions.Throws<ArgumentNullException> (() => {
325 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
326 // System.ArgumentNullException : Value cannot be null.
327 // Parameter name: propertyName
329 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
330 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
331 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
332 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
333 // 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
335 Validator.TryValidateProperty ("dummy", ctx, results);
337 Assert.AreEqual (0, results.Count, "#A2-2");
339 ctx = new ValidationContext (dummy2, null, null) {
340 MemberName = String.Empty
343 AssertExtensions.Throws<ArgumentNullException> (() => {
344 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
345 // System.ArgumentNullException : Value cannot be null.
346 // Parameter name: propertyName
348 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.TryGetPropertyStoreItem(String propertyName, PropertyStoreItem& item)
349 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.TypeStoreItem.GetPropertyStoreItem(String propertyName)
350 // at System.ComponentModel.DataAnnotations.ValidationAttributeStore.GetPropertyType(ValidationContext validationContext)
351 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
352 // 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
354 Validator.TryValidateProperty ("dummy", ctx, results);
356 Assert.AreEqual (0, results.Count, "#A2-2");
358 dummy2 = new Dummy ();
359 ctx = new ValidationContext (dummy2, null, null) {
360 MemberName = "NameProperty"
363 AssertExtensions.Throws<ArgumentException> (() => {
364 // MonoTests.System.ComponentModel.DataAnnotations.ValidatorTest.TryValidateProperty:
365 // System.ArgumentException : The value for property 'NameProperty' must be of type 'System.String'.
366 // Parameter name: value
368 // at System.ComponentModel.DataAnnotations.Validator.EnsureValidPropertyType(String propertyName, Type propertyType, Object value)
369 // at System.ComponentModel.DataAnnotations.Validator.TryValidateProperty(Object value, ValidationContext validationContext, ICollection`1 validationResults)
370 // 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
372 Validator.TryValidateProperty (1234, ctx, results);
374 Assert.AreEqual (0, results.Count, "#A3-2");
376 dummy2 = new Dummy ();
377 ctx = new ValidationContext (dummy2, null, null) {
378 MemberName = "NameProperty"
381 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
382 Assert.IsFalse (valid, "#A4-1");
383 Assert.AreEqual (1, results.Count, "#A4-2");
386 valid = Validator.TryValidateProperty ("this value is way too long", ctx, results);
387 Assert.IsFalse (valid, "#A4-3");
388 Assert.AreEqual (1, results.Count, "#A4-4");
391 valid = Validator.TryValidateProperty ("good value", ctx, results);
392 Assert.IsTrue (valid, "#A4-5");
393 Assert.AreEqual (0, results.Count, "#A4-6");
395 dummy2 = new Dummy ();
396 ctx = new ValidationContext (dummy2, null, null) {
397 MemberName = "CustomValidatedProperty"
400 valid = Validator.TryValidateProperty (String.Empty, ctx, results);
401 Assert.IsFalse (valid, "#A5-1");
402 Assert.AreEqual (1, results.Count, "#A5-2");
405 valid = Validator.TryValidateProperty ("fail", ctx, results);
406 Assert.IsFalse (valid, "#A5-3");
407 Assert.AreEqual (1, results.Count, "#A5-4");
410 valid = Validator.TryValidateProperty ("f", ctx, results);
411 Assert.IsFalse (valid, "#A5-5");
412 Assert.AreEqual (2, results.Count, "#A5-6");
415 valid = Validator.TryValidateProperty ("good value", ctx, results);
416 Assert.IsTrue (valid, "#A5-7");
417 Assert.AreEqual (0, results.Count, "#A5-8");
421 public void TryValidateValue_01 ()
423 var dummy = new DummyNoAttributes ();
424 var ctx = new ValidationContext (dummy, null, null) {
425 MemberName = "NameProperty"
427 var results = new List<ValidationResult> ();
428 var attributes = new List <ValidationAttribute> ();
430 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
431 Assert.IsTrue (valid, "#A1-1");
432 Assert.AreEqual (0, results.Count, "#A1-2");
434 AssertExtensions.Throws<ArgumentNullException> (() => {
435 Validator.TryValidateValue ("dummy", null, results, attributes);
438 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
439 Assert.IsTrue (valid, "#A3-1");
440 Assert.AreEqual (0, results.Count, "#A3-2");
442 AssertExtensions.Throws<ArgumentNullException> (() => {
443 Validator.TryValidateValue ("dummy", ctx, results, null);
448 public void TryValidateValue_02 ()
450 var dummy = new DummyNoAttributes ();
451 var ctx = new ValidationContext (dummy, null, null);
452 var results = new List<ValidationResult> ();
453 var log = new List<string> ();
454 var attributes = new List<ValidationAttribute> () {
455 new StringLengthAttributePoker (10, log) {
458 new RequiredAttributePoker (log)
461 bool valid = Validator.TryValidateValue (null, ctx, results, attributes);
462 Assert.IsFalse (valid, "#A1-1");
463 Assert.AreEqual (1, results.Count, "#A1-2");
464 Assert.AreEqual (1, log.Count, "#A1-3");
465 Assert.IsTrue (log [0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-4");
469 AssertExtensions.Throws<InvalidCastException> (() => {
470 // Thrown by StringValidatorAttribute
471 Validator.TryValidateValue (1234, ctx, results, attributes);
473 Assert.AreEqual (0, results.Count, "#A2-2");
474 Assert.AreEqual (2, log.Count, "#A2-3");
475 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-4");
476 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-5");
480 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
481 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
482 valid = Validator.TryValidateValue ("test", ctx, results, attributes);
483 Assert.IsFalse (valid, "#A3-1");
484 Assert.AreEqual (2, results.Count, "#A3-2");
485 Assert.AreEqual (2, log.Count, "#A3-3");
486 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-4");
487 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-5");
488 Assert.AreEqual ("ValueValidationMethod", results[0].ErrorMessage, "#A3-6");
489 Assert.AreEqual ("ValueValidationMethod", results[1].ErrorMessage, "#A3-7");
492 attributes.RemoveAt (2);
493 attributes.RemoveAt (2);
495 AssertExtensions.Throws<ArgumentNullException> (() => {
496 Validator.TryValidateValue ("dummy", null, results, attributes);
499 valid = Validator.TryValidateValue ("dummy", ctx, null, attributes);
500 Assert.IsTrue (valid, "#B2-1");
501 Assert.AreEqual (0, results.Count, "#B2-2");
503 AssertExtensions.Throws<ArgumentNullException> (() => {
504 Validator.TryValidateValue ("dummy", ctx, results, null);
509 public void ValidateObject_Object_ValidationContext_01 ()
511 var dummy = new DummyNoAttributes ();
512 var ctx = new ValidationContext (dummy, null, null);
514 AssertExtensions.Throws<ArgumentNullException> (() => {
515 Validator.ValidateObject (null, ctx);
518 AssertExtensions.Throws<ArgumentNullException> (() => {
519 Validator.ValidateObject (dummy, null);
523 Validator.ValidateObject (dummy, ctx);
524 } catch (Exception ex) {
525 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
530 public void ValidateObject_Object_ValidationContext_02 ()
532 var dummy = new Dummy ();
533 var ctx = new ValidationContext (dummy, null, null);
536 Validator.ValidateObject (dummy, ctx);
537 } catch (Exception ex) {
538 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
544 AssertExtensions.Throws<ArgumentException> (() => {
545 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
546 Validator.ValidateObject (dummy, ctx);
549 // Fields are ignored
550 ctx = new ValidationContext (dummy, null, null);
552 Validator.ValidateObject (dummy, ctx);
553 } catch (Exception ex) {
554 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
558 RequiredDummyField = null
560 ctx = new ValidationContext (dummy, null, null);
562 Validator.ValidateObject (dummy, ctx);
563 } catch (Exception ex) {
564 Assert.Fail ("#A4 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
568 RequiredDummyProperty = null
570 ctx = new ValidationContext (dummy, null, null);
571 AssertExtensions.Throws<ValidationException> (() => {
572 Validator.ValidateObject (dummy, ctx);
575 // validation attributes other than Required are ignored
579 ctx = new ValidationContext (dummy, null, null);
581 Validator.ValidateObject (dummy, ctx);
582 } catch (Exception ex) {
583 Assert.Fail ("#A6 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
589 ctx = new ValidationContext (dummy, null, null);
591 Validator.ValidateObject (dummy, ctx);
592 } catch (Exception ex) {
593 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
597 FailValidation = true
599 ctx = new ValidationContext (dummy, null, null);
600 AssertExtensions.Throws<ValidationException> (() => {
601 Validator.ValidateObject (dummy, ctx);
604 var dummy2 = new DummyMultipleCustomValidators ();
605 ctx = new ValidationContext (dummy2, null, null);
607 Validator.ValidateObject (dummy2, ctx);
608 } catch (Exception ex) {
609 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
614 public void ValidateObject_Object_ValidationContext_Bool_01 ()
616 var dummy = new DummyNoAttributes ();
617 var ctx = new ValidationContext (dummy, null, null);
619 AssertExtensions.Throws<ArgumentNullException> (() => {
620 Validator.ValidateObject (null, ctx, false);
623 AssertExtensions.Throws<ArgumentNullException> (() => {
624 Validator.ValidateObject (dummy, null, false);
628 Validator.ValidateObject (dummy, ctx, false);
629 } catch (Exception ex) {
630 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
634 Validator.ValidateObject (dummy, ctx, true);
635 } catch (Exception ex) {
636 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
641 public void ValidateObject_Object_ValidationContext_Bool_02 ()
643 var dummy = new Dummy ();
644 var ctx = new ValidationContext (dummy, null, null);
647 Validator.ValidateObject (dummy, ctx, false);
648 } catch (Exception ex) {
649 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
653 Validator.ValidateObject (dummy, ctx, true);
654 } catch (Exception ex) {
655 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
661 AssertExtensions.Throws<ArgumentException> (() => {
662 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
663 Validator.ValidateObject (dummy, ctx, false);
666 AssertExtensions.Throws<ArgumentException> (() => {
667 // The instance provided must match the ObjectInstance on the ValidationContext supplied.
668 Validator.ValidateObject (dummy, ctx, true);
671 // Fields are ignored
672 ctx = new ValidationContext (dummy, null, null);
674 Validator.ValidateObject (dummy, ctx, false);
675 } catch (Exception ex) {
676 Assert.Fail ("#A4-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
680 Validator.ValidateObject (dummy, ctx, true);
681 } catch (Exception ex) {
682 Assert.Fail ("#A4-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
686 RequiredDummyField = null
688 ctx = new ValidationContext (dummy, null, null);
690 Validator.ValidateObject (dummy, ctx, false);
691 } catch (Exception ex) {
692 Assert.Fail ("#A5-1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
696 Validator.ValidateObject (dummy, ctx, true);
697 } catch (Exception ex) {
698 Assert.Fail ("#A5-2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
701 // Required properties existence is validated
703 RequiredDummyProperty = null
705 ctx = new ValidationContext (dummy, null, null);
706 AssertExtensions.Throws<ValidationException> (() => {
707 Validator.ValidateObject (dummy, ctx, false);
710 AssertExtensions.Throws<ValidationException> (() => {
711 Validator.ValidateObject (dummy, ctx, true);
717 ctx = new ValidationContext (dummy, null, null);
719 Validator.ValidateObject (dummy, ctx, false);
720 } catch (Exception ex) {
721 Assert.Fail ("#A7 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
724 // NameProperty is null, that causes the StringLength validator to skip its tests
726 Validator.ValidateObject (dummy, ctx, true);
727 } catch (Exception ex) {
728 Assert.Fail ("#A8 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
731 dummy.NameProperty = "0";
732 AssertExtensions.Throws<ValidationException> (() => {
733 Validator.ValidateObject (dummy, ctx, true);
736 dummy.NameProperty = "name too long (invalid value)";
737 AssertExtensions.Throws<ValidationException> (() => {
738 Validator.ValidateObject (dummy, ctx, true);
744 ctx = new ValidationContext (dummy, null, null);
746 Validator.ValidateObject (dummy, ctx, false);
747 } catch (Exception ex) {
748 Assert.Fail ("#A11 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
751 AssertExtensions.Throws<ValidationException> (() => {
752 Validator.ValidateObject (dummy, ctx, true);
756 FailValidation = true
758 ctx = new ValidationContext (dummy, null, null);
759 AssertExtensions.Throws<ValidationException> (() => {
760 Validator.ValidateObject (dummy, ctx, false);
763 AssertExtensions.Throws<ValidationException> (() => {
764 Validator.ValidateObject (dummy, ctx, true);
767 var dummy2 = new DummyWithException ();
768 ctx = new ValidationContext (dummy2, null, null);
769 AssertExtensions.Throws<ApplicationException> (() => {
770 Validator.ValidateObject (dummy2, ctx, true);
773 var dummy3 = new DummyMultipleCustomValidators ();
774 ctx = new ValidationContext (dummy3, null, null);
776 Validator.ValidateObject (dummy3, ctx, false);
777 } catch (Exception ex) {
778 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
782 Validator.ValidateObject (dummy3, ctx, true);
783 } catch (ValidationException ex) {
784 Assert.AreEqual ("FirstPropertyValidationMethod", ex.Message, "#A10");
785 } catch (Exception ex) {
786 Assert.Fail ("#A10 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
791 public void ValidateProperty ()
793 var dummy = new DummyNoAttributes ();
794 var ctx = new ValidationContext (dummy, null, null) {
795 MemberName = "NameProperty"
798 AssertExtensions.Throws<ArgumentException> (() => {
799 Validator.ValidateProperty ("dummy", ctx);
802 AssertExtensions.Throws<ArgumentNullException> (() => {
803 Validator.ValidateProperty ("dummy", null);
806 var dummy2 = new Dummy ();
807 ctx = new ValidationContext (dummy2, null, null) {
808 MemberName = "NameProperty"
812 Validator.ValidateProperty (null, ctx);
813 } catch (Exception ex) {
814 Assert.Fail ("#A2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
817 ctx = new ValidationContext (dummy2, null, null) {
818 MemberName = "MinMaxProperty"
821 AssertExtensions.Throws<ArgumentException> (() => {
822 Validator.ValidateProperty (null, ctx);
825 ctx = new ValidationContext (dummy2, null, null);
826 AssertExtensions.Throws<ArgumentNullException> (() => {
827 Validator.ValidateProperty ("dummy", ctx);
830 ctx = new ValidationContext (dummy2, null, null) {
831 MemberName = String.Empty
834 AssertExtensions.Throws<ArgumentNullException> (() => {
835 Validator.ValidateProperty ("dummy", ctx);
838 dummy2 = new Dummy ();
839 ctx = new ValidationContext (dummy2, null, null) {
840 MemberName = "NameProperty"
843 AssertExtensions.Throws<ArgumentException> (() => {
844 Validator.ValidateProperty (1234, ctx);
847 dummy2 = new Dummy ();
848 ctx = new ValidationContext (dummy2, null, null) {
849 MemberName = "NameProperty"
852 AssertExtensions.Throws<ValidationException> (() => {
853 Validator.ValidateProperty (String.Empty, ctx);
856 AssertExtensions.Throws<ValidationException> (() => {
857 Validator.ValidateProperty ("this value is way too long", ctx);
861 Validator.ValidateProperty ("good value", ctx);
862 } catch (Exception ex) {
863 Assert.Fail ("#A9 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
866 dummy2 = new Dummy ();
867 ctx = new ValidationContext (dummy2, null, null) {
868 MemberName = "CustomValidatedProperty"
871 AssertExtensions.Throws<ValidationException> (() => {
872 Validator.ValidateProperty (String.Empty, ctx);
875 AssertExtensions.Throws<ValidationException> (() => {
876 Validator.ValidateProperty ("fail", ctx);
879 AssertExtensions.Throws<ValidationException> (() => {
880 Validator.ValidateProperty ("f", ctx);
884 Validator.ValidateProperty ("good value", ctx);
885 } catch (Exception ex) {
886 Assert.Fail ("#A13 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
891 public void ValidateValue_01 ()
893 var dummy = new DummyNoAttributes ();
894 var ctx = new ValidationContext (dummy, null, null) {
895 MemberName = "NameProperty"
897 var attributes = new List<ValidationAttribute> ();
900 Validator.ValidateValue (null, ctx, attributes);
901 } catch (Exception ex) {
902 Assert.Fail ("#A1 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
905 AssertExtensions.Throws<ArgumentNullException> (() => {
906 Validator.ValidateValue ("dummy", null, attributes);
910 Validator.ValidateValue ("dummy", ctx, attributes);
911 } catch (Exception ex) {
912 Assert.Fail ("#A3 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
915 AssertExtensions.Throws<ArgumentNullException> (() => {
916 Validator.ValidateValue ("dummy", ctx, null);
921 public void ValidateValue_02 ()
923 var dummy = new DummyNoAttributes ();
924 var ctx = new ValidationContext (dummy, null, null);
925 var log = new List<string> ();
926 var attributes = new List<ValidationAttribute> () {
927 new StringLengthAttributePoker (10, log) {
930 new RequiredAttributePoker (log)
933 AssertExtensions.Throws<ValidationException> (() => {
934 Validator.ValidateValue (null, ctx, attributes);
936 Assert.AreEqual (1, log.Count, "#A1-2");
937 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A1-3");
940 AssertExtensions.Throws<InvalidCastException> (() => {
941 // Thrown by StringValidatorAttribute
942 Validator.ValidateValue (1234, ctx, attributes);
944 Assert.AreEqual (2, log.Count, "#A2-2");
945 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A2-3");
946 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A2-4");
949 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
950 attributes.Add (new CustomValidationAttribute (typeof (ValidatorTest), "ValueValidationMethod"));
951 AssertExtensions.Throws<ValidationException> (() => {
952 Validator.ValidateValue ("test", ctx, attributes);
954 Assert.AreEqual (2, log.Count, "#A3-2");
955 Assert.IsTrue (log[0].StartsWith ("RequiredAttributePoker.IsValid (object)"), "#A3-3");
956 Assert.IsTrue (log[1].StartsWith ("StringLengthAttributePoker.IsValid (object)"), "#A3-4");
958 attributes.RemoveAt (2);
959 attributes.RemoveAt (2);
961 AssertExtensions.Throws<ArgumentNullException> (() => {
962 Validator.ValidateValue ("dummy", null, attributes);
966 Validator.ValidateValue ("dummy", ctx, attributes);
967 } catch (Exception ex) {
968 Assert.Fail ("#B2 (exception {0} thrown: {1})", ex.GetType (), ex.Message);
971 AssertExtensions.Throws<ArgumentNullException> (() => {
972 Validator.ValidateValue ("dummy", ctx, null);
976 public static ValidationResult DummyValidationMethod (object o)
978 var dummy = o as Dummy;
980 return new ValidationResult ("Invalid DummyValidationMethod input - broken test?");
982 if (dummy.FailValidation)
983 return new ValidationResult ("Dummy validation failed.");
984 return ValidationResult.Success;
987 public static ValidationResult CustomValidatedPropertyValidationMethod (object o)
989 var dummy = o as string;
990 if (dummy != null && (dummy == "f" || dummy == "fail"))
991 return new ValidationResult ("Dummy.CustomValidatedProperty validation failed.");
992 return ValidationResult.Success;
995 public static ValidationResult ValidationMethodException (object o)
997 throw new ApplicationException ("SNAFU");
1000 public static ValidationResult ValueValidationMethod (object o, ValidationContext validationContext)
1002 return new ValidationResult ("ValueValidationMethod");
1005 public static ValidationResult FirstPropertyValidationMethod (object o, ValidationContext validationContext)
1007 return new ValidationResult ("FirstPropertyValidationMethod");
1010 public static ValidationResult SecondPropertyValidationMethod (object o, ValidationContext validationContext)
1012 return new ValidationResult ("SecondPropertyValidationMethod");
1015 public class RequiredAttributePoker : RequiredAttribute
1019 public RequiredAttributePoker (List<string> log)
1022 throw new ArgumentNullException ("log");
1026 public override bool IsValid (object value)
1028 log.Add ("RequiredAttributePoker.IsValid (object)");
1029 return base.IsValid (value);
1033 public class StringLengthAttributePoker : StringLengthAttribute
1037 public StringLengthAttributePoker (int maximumLength, List<string> log)
1038 : base (maximumLength)
1041 throw new ArgumentNullException ("log");
1045 public override bool IsValid (object value)
1047 log.Add ("StringLengthAttributePoker.IsValid (object)");
1048 return base.IsValid (value);
1052 class DummyNoAttributes
1055 [CustomValidation (typeof (ValidatorTest), "DummyValidationMethod")]
1058 [StringLength (10, MinimumLength=2)]
1059 public string NameField;
1062 public DummyNoAttributes RequiredDummyField;
1064 [StringLength (10, MinimumLength = 2)]
1065 public string NameProperty { get; set; }
1068 public DummyNoAttributes RequiredDummyProperty { get; set; }
1070 [global::System.ComponentModel.DataAnnotations.RangeAttribute ((int)1, (int)10)]
1071 public int MinMaxProperty { get; set; }
1073 [StringLength (10, MinimumLength = 2)]
1074 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1075 public string CustomValidatedProperty { get; set; }
1077 [CustomValidation (typeof (ValidatorTest), "CustomValidatedPropertyValidationMethod")]
1078 [StringLength (10, MinimumLength = 2)]
1079 public string AnotherCustomValidatedProperty { get; set; }
1081 public bool FailValidation { get; set; }
1086 NameProperty = "name";
1087 RequiredDummyField = new DummyNoAttributes ();
1088 RequiredDummyProperty = new DummyNoAttributes ();
1090 AnotherCustomValidatedProperty = "I'm valid";
1094 class DummyWithException
1096 [CustomValidation (typeof (ValidatorTest), "ValidationMethodException")]
1097 public string AnotherCustomValidatedProperty { get; set; }
1100 class DummyForValueValidation
1102 public string DummyNoAttributes;
1104 public DummyForValueValidation ()
1106 this.DummyNoAttributes = "I am valid";
1110 class DummyMultipleCustomValidators
1112 [CustomValidation (typeof (ValidatorTest), "FirstPropertyValidationMethod")]
1113 public string FirstProperty { get; set; }
1115 [CustomValidation (typeof (ValidatorTest), "SecondPropertyValidationMethod")]
1116 public string SecondProperty { get; set; }