11using System ;
22using FluentAssertions ;
3+ using Light . GuardClauses . ExceptionFactory ;
34using Light . GuardClauses . Exceptions ;
45using Xunit ;
56
@@ -41,9 +42,9 @@ public static void EmptyGuardsCaptureCallerExpressions()
4142 spanAct . Should ( ) . Throw < EmptyCollectionException > ( ) . WithParameterName ( "emptySpan" ) ;
4243 readOnlySpanAct . Should ( ) . Throw < EmptyCollectionException > ( ) . WithParameterName ( "emptyReadOnlySpan" ) ;
4344 ( ( Action ) ( ( ) => emptyMemory . MustNotBeEmpty ( ) ) ) . Should ( ) . Throw < EmptyCollectionException > ( )
44- . WithParameterName ( nameof ( emptyMemory ) ) ;
45+ . WithParameterName ( nameof ( emptyMemory ) ) ;
4546 ( ( Action ) ( ( ) => emptyReadOnlyMemory . MustNotBeEmpty ( ) ) ) . Should ( ) . Throw < EmptyCollectionException > ( )
46- . WithParameterName ( nameof ( emptyReadOnlyMemory ) ) ;
47+ . WithParameterName ( nameof ( emptyReadOnlyMemory ) ) ;
4748 }
4849
4950 [ Fact ]
@@ -55,6 +56,22 @@ public static void EmptyGuardFactoriesReceiveEveryShape()
5556 Test . CustomMemoryException ( ReadOnlyMemory < int > . Empty , ( value , factory ) => value . MustNotBeEmpty ( factory ) ) ;
5657 }
5758
59+ [ Fact ]
60+ public static void NonEmptyFactoriesDoNotThrowForEveryValidShape ( )
61+ {
62+ var array = new [ ] { 1 , 2 } ;
63+ var span = array . AsSpan ( ) ;
64+ ReadOnlySpan < int > readOnlySpan = array ;
65+ var memory = array . AsMemory ( ) ;
66+ ReadOnlyMemory < int > readOnlyMemory = array ;
67+ ReadOnlySpanExceptionFactory < int > factory = _ => new ( "The factory should not be invoked." ) ;
68+
69+ ( span . MustNotBeEmpty ( factory ) == span ) . Should ( ) . BeTrue ( ) ;
70+ ( readOnlySpan . MustNotBeEmpty ( factory ) == readOnlySpan ) . Should ( ) . BeTrue ( ) ;
71+ memory . MustNotBeEmpty ( factory ) . Should ( ) . Be ( memory ) ;
72+ readOnlyMemory . MustNotBeEmpty ( factory ) . Should ( ) . Be ( readOnlyMemory ) ;
73+ }
74+
5875 [ Fact ]
5976 public static void RangedLengthGuardsPreserveBoundariesAndShapes ( )
6077 {
@@ -81,14 +98,44 @@ public static void RangedLengthGuardsPreserveBoundariesAndShapes()
8198 public static void RangedLengthFactoriesReceiveEveryShape ( )
8299 {
83100 var invalidRange = Range . InclusiveBetween ( 2 , 3 ) ;
84- Test . CustomSpanException ( Span < int > . Empty , invalidRange ,
85- ( value , range , factory ) => value . MustHaveLengthIn ( range , factory ) ) ;
86- Test . CustomSpanException ( ReadOnlySpan < int > . Empty , invalidRange ,
87- ( value , range , factory ) => value . MustHaveLengthIn ( range , factory ) ) ;
88- Test . CustomMemoryException ( Memory < int > . Empty , invalidRange ,
89- ( value , range , factory ) => value . MustHaveLengthIn ( range , factory ) ) ;
90- Test . CustomMemoryException ( ReadOnlyMemory < int > . Empty , invalidRange ,
91- ( value , range , factory ) => value . MustHaveLengthIn ( range , factory ) ) ;
101+ Test . CustomSpanException (
102+ Span < int > . Empty ,
103+ invalidRange ,
104+ ( value , range , factory ) => value . MustHaveLengthIn ( range , factory )
105+ ) ;
106+ Test . CustomSpanException (
107+ ReadOnlySpan < int > . Empty ,
108+ invalidRange ,
109+ ( value , range , factory ) => value . MustHaveLengthIn ( range , factory )
110+ ) ;
111+ Test . CustomMemoryException (
112+ Memory < int > . Empty ,
113+ invalidRange ,
114+ ( value , range , factory ) => value . MustHaveLengthIn ( range , factory )
115+ ) ;
116+ Test . CustomMemoryException (
117+ ReadOnlyMemory < int > . Empty ,
118+ invalidRange ,
119+ ( value , range , factory ) => value . MustHaveLengthIn ( range , factory )
120+ ) ;
121+ }
122+
123+ [ Fact ]
124+ public static void RangedLengthFactoriesDoNotThrowForEveryValidShape ( )
125+ {
126+ var array = new [ ] { 1 , 2 , 3 } ;
127+ var validRange = Range . InclusiveBetween ( 3 , 3 ) ;
128+ var span = array . AsSpan ( ) ;
129+ ReadOnlySpan < int > readOnlySpan = array ;
130+ var memory = array . AsMemory ( ) ;
131+ ReadOnlyMemory < int > readOnlyMemory = array ;
132+ ReadOnlySpanExceptionFactory < int , Range < int > > factory =
133+ ( _ , _ ) => new ( "The factory should not be invoked." ) ;
134+
135+ ( span . MustHaveLengthIn ( validRange , factory ) == span ) . Should ( ) . BeTrue ( ) ;
136+ ( readOnlySpan . MustHaveLengthIn ( validRange , factory ) == readOnlySpan ) . Should ( ) . BeTrue ( ) ;
137+ memory . MustHaveLengthIn ( validRange , factory ) . Should ( ) . Be ( memory ) ;
138+ readOnlyMemory . MustHaveLengthIn ( validRange , factory ) . Should ( ) . Be ( readOnlyMemory ) ;
92139 }
93140
94141 [ Fact ]
@@ -112,8 +159,22 @@ public static void MemoryExactLengthFailuresSupportMessagesExpressionsAndFactori
112159 . WithParameterName ( nameof ( memory ) )
113160 . WithMessage ( "*custom*" ) ;
114161 Test . CustomMemoryException ( memory , 1 , ( value , length , factory ) => value . MustHaveLength ( length , factory ) ) ;
115- Test . CustomMemoryException ( readOnlyMemory , 1 ,
116- ( value , length , factory ) => value . MustHaveLength ( length , factory ) ) ;
162+ Test . CustomMemoryException (
163+ readOnlyMemory ,
164+ 1 ,
165+ ( value , length , factory ) => value . MustHaveLength ( length , factory )
166+ ) ;
167+ }
168+
169+ [ Fact ]
170+ public static void MemoryExactLengthFactoriesDoNotThrowForValidLengths ( )
171+ {
172+ var memory = new [ ] { 1 , 2 } . AsMemory ( ) ;
173+ ReadOnlyMemory < int > readOnlyMemory = memory ;
174+ ReadOnlySpanExceptionFactory < int , int > factory = ( _ , _ ) => new ( "The factory should not be invoked." ) ;
175+
176+ memory . MustHaveLength ( 2 , factory ) . Should ( ) . Be ( memory ) ;
177+ readOnlyMemory . MustHaveLength ( 2 , factory ) . Should ( ) . Be ( readOnlyMemory ) ;
117178 }
118179
119180 [ Fact ]
@@ -152,16 +213,40 @@ public static void EmptyAndWhitespaceFailuresUseExistingStringExceptions()
152213 . WithMessage ( "*custom*" ) ;
153214 }
154215
216+ [ Fact ]
217+ public static void WhitespaceFactoriesDoNotThrowForEveryValidShape ( )
218+ {
219+ var characters = " a" . ToCharArray ( ) ;
220+ var span = characters . AsSpan ( ) ;
221+ ReadOnlySpan < char > readOnlySpan = characters ;
222+ var memory = characters . AsMemory ( ) ;
223+ ReadOnlyMemory < char > readOnlyMemory = characters ;
224+ ReadOnlySpanExceptionFactory < char > factory = _ => new ( "The factory should not be invoked." ) ;
225+
226+ ( span . MustNotBeEmptyOrWhiteSpace ( factory ) == span ) . Should ( ) . BeTrue ( ) ;
227+ ( readOnlySpan . MustNotBeEmptyOrWhiteSpace ( factory ) == readOnlySpan ) . Should ( ) . BeTrue ( ) ;
228+ memory . MustNotBeEmptyOrWhiteSpace ( factory ) . Should ( ) . Be ( memory ) ;
229+ readOnlyMemory . MustNotBeEmptyOrWhiteSpace ( factory ) . Should ( ) . Be ( readOnlyMemory ) ;
230+ }
231+
155232 [ Fact ]
156233 public static void WhitespaceFactoriesReceiveEveryShape ( )
157234 {
158- Test . CustomSpanException ( " " . ToCharArray ( ) . AsSpan ( ) ,
159- ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory ) ) ;
160- Test . CustomSpanException ( ( ReadOnlySpan < char > ) " " . ToCharArray ( ) ,
161- ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory ) ) ;
162- Test . CustomMemoryException ( " " . ToCharArray ( ) . AsMemory ( ) ,
163- ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory ) ) ;
164- Test . CustomMemoryException ( ( ReadOnlyMemory < char > ) " " . ToCharArray ( ) ,
165- ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory ) ) ;
235+ Test . CustomSpanException (
236+ " " . ToCharArray ( ) . AsSpan ( ) ,
237+ ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory )
238+ ) ;
239+ Test . CustomSpanException (
240+ ( ReadOnlySpan < char > ) " " . ToCharArray ( ) ,
241+ ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory )
242+ ) ;
243+ Test . CustomMemoryException (
244+ " " . ToCharArray ( ) . AsMemory ( ) ,
245+ ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory )
246+ ) ;
247+ Test . CustomMemoryException (
248+ ( ReadOnlyMemory < char > ) " " . ToCharArray ( ) ,
249+ ( value , factory ) => value . MustNotBeEmptyOrWhiteSpace ( factory )
250+ ) ;
166251 }
167252}
0 commit comments