@@ -285,6 +285,23 @@ public void CopyConstructor_CopiesModelStateData()
285285 Assert . Equal ( entry . ValidationState , actual . ValidationState ) ;
286286 }
287287
288+ [ Fact ]
289+ public void TryAddModelException_Succeeds ( )
290+ {
291+ // Arrange
292+ var dictionary = new ModelStateDictionary ( ) ;
293+ var exception = new TestException ( ) ;
294+
295+ // Act
296+ dictionary . TryAddModelException ( "some key" , exception ) ;
297+
298+ // Assert
299+ var kvp = Assert . Single ( dictionary ) ;
300+ Assert . Equal ( "some key" , kvp . Key ) ;
301+ var error = Assert . Single ( kvp . Value . Errors ) ;
302+ Assert . Same ( exception , error . Exception ) ;
303+ }
304+
288305 [ Fact ]
289306 public void AddModelErrorCreatesModelStateIfNotPresent ( )
290307 {
@@ -695,13 +712,15 @@ public void AddModelError_WithErrorString_AddsTooManyModelErrors_WhenMaxErrorsIs
695712 } ;
696713 var provider = new EmptyModelMetadataProvider ( ) ;
697714 var metadata = provider . GetMetadataForProperty ( typeof ( string ) , nameof ( string . Length ) ) ;
715+
716+ // Act
698717 dictionary . AddModelError ( "key1" , "error1" ) ;
699718 dictionary . AddModelError ( "key2" , new Exception ( ) , metadata ) ;
700719 dictionary . AddModelError ( "key3" , new Exception ( ) , metadata ) ;
701720 dictionary . AddModelError ( "key4" , "error4" ) ;
702721 dictionary . AddModelError ( "key5" , "error5" ) ;
703722
704- // Act and Assert
723+ // Assert
705724 Assert . True ( dictionary . HasReachedMaxErrors ) ;
706725 Assert . Equal ( 5 , dictionary . ErrorCount ) ;
707726 var error = Assert . Single ( dictionary [ string . Empty ] . Errors ) ;
@@ -712,6 +731,35 @@ public void AddModelError_WithErrorString_AddsTooManyModelErrors_WhenMaxErrorsIs
712731 Assert . DoesNotContain ( "key5" , dictionary . Keys ) ;
713732 }
714733
734+ [ Fact ]
735+ public void TryAddModelException_ReturnsFalse_AndAddsMaxModelErrorMessage ( )
736+ {
737+ // Arrange
738+ var expected = "The maximum number of allowed model errors has been reached." ;
739+ var dictionary = new ModelStateDictionary
740+ {
741+ MaxAllowedErrors = 3
742+ } ;
743+
744+ // Act and Assert
745+ var result = dictionary . TryAddModelError ( "key1" , "error1" ) ;
746+ Assert . True ( result ) ;
747+
748+ result = dictionary . TryAddModelException ( "key2" , new Exception ( ) ) ;
749+ Assert . True ( result ) ;
750+
751+ result = dictionary . TryAddModelException ( "key3" , new Exception ( ) ) ;
752+ Assert . False ( result ) ;
753+
754+ Assert . Equal ( 3 , dictionary . Count ) ;
755+ var error = Assert . Single ( dictionary [ string . Empty ] . Errors ) ;
756+ Assert . IsType < TooManyModelErrorsException > ( error . Exception ) ;
757+ Assert . Equal ( expected , error . Exception . Message ) ;
758+
759+ // TooManyModelErrorsException added instead of key3 exception.
760+ Assert . DoesNotContain ( "key3" , dictionary . Keys ) ;
761+ }
762+
715763 [ Fact ]
716764 public void TryAddModelError_WithErrorString_ReturnsFalse_AndAddsMaxModelErrorMessage ( )
717765 {
@@ -864,6 +912,21 @@ public void ModelStateDictionary_HasReachedMaxErrors(int errorCount, bool expect
864912 Assert . Equal ( expected , canAdd ) ;
865913 }
866914
915+ [ Fact ]
916+ public void ModelStateDictionary_ReturnExceptionMessage_WhenModelStateNotSet ( )
917+ {
918+ // Arrange
919+ var dictionary = new ModelStateDictionary ( ) ;
920+ var exception = new FormatException ( "The supplied value is invalid for Length." ) ;
921+
922+ // Act
923+ dictionary . TryAddModelException ( "key" , exception ) ;
924+
925+ // Assert
926+ var error = Assert . Single ( dictionary [ "key" ] . Errors ) ;
927+ Assert . Same ( exception , error . Exception ) ;
928+ }
929+
867930 [ Fact ]
868931 public void ModelStateDictionary_ReturnGenericErrorMessage_WhenModelStateNotSet ( )
869932 {
@@ -933,6 +996,22 @@ public void ModelStateDictionary_AddsCustomErrorMessage_WhenModelStateNotSet_Wit
933996 Assert . Equal ( expected , error . ErrorMessage ) ;
934997 }
935998
999+ [ Fact ]
1000+ public void TryAddModelException_ReturnExceptionMessage_WhenModelStateSet ( )
1001+ {
1002+ // Arrange
1003+ var dictionary = new ModelStateDictionary ( ) ;
1004+ dictionary . SetModelValue ( "key" , new string [ ] { "some value" } , "some value" ) ;
1005+ var exception = new FormatException ( "The value 'some value' is not valid for Length." ) ;
1006+
1007+ // Act
1008+ dictionary . TryAddModelException ( "key" , exception ) ;
1009+
1010+ // Assert
1011+ var error = Assert . Single ( dictionary [ "key" ] . Errors ) ;
1012+ Assert . Same ( exception , error . Exception ) ;
1013+ }
1014+
9361015 [ Fact ]
9371016 public void ModelStateDictionary_ReturnSpecificErrorMessage_WhenModelStateSet ( )
9381017 {
@@ -1022,6 +1101,23 @@ public void ModelStateDictionary_NoErrorMessage_ForUnrecognizedException()
10221101 Assert . Empty ( error . ErrorMessage ) ;
10231102 }
10241103
1104+ [ Fact ]
1105+ public void TryAddModelException_AddsErrorMessage_ForInputFormatterException ( )
1106+ {
1107+ // Arrange
1108+ var dictionary = new ModelStateDictionary ( ) ;
1109+ var exception = new InputFormatterException ( "This is an InputFormatterException." ) ;
1110+
1111+ // Act
1112+ dictionary . TryAddModelException ( "key" , exception ) ;
1113+
1114+ // Assert
1115+ var entry = Assert . Single ( dictionary ) ;
1116+ Assert . Equal ( "key" , entry . Key ) ;
1117+ var error = Assert . Single ( entry . Value . Errors ) ;
1118+ Assert . Same ( exception , error . Exception ) ;
1119+ }
1120+
10251121 [ Fact ]
10261122 public void ModelStateDictionary_AddsErrorMessage_ForInputFormatterException ( )
10271123 {
@@ -1371,4 +1467,14 @@ private class OptionsAccessor : IOptions<MvcOptions>
13711467 public MvcOptions Value { get ; } = new MvcOptions ( ) ;
13721468 }
13731469 }
1470+
1471+ internal class TestException : Exception
1472+ {
1473+ public TestException ( )
1474+ {
1475+ Message = "This is a test exception" ;
1476+ }
1477+
1478+ public override string Message { get ; }
1479+ }
13741480}
0 commit comments