@@ -171,5 +171,93 @@ public void TestMaxLengths()
171171 assertEquals ( VIntUtils . MaxVInt32Length , EncodeVInt32 ( - 1 ) . Length ) ;
172172 assertEquals ( VIntUtils . MaxVInt64Length , EncodeVInt64 ( long . MaxValue ) . Length ) ;
173173 }
174+
175+ #if DEBUG
176+
177+ [ TestCase ( 0 ) ]
178+ [ TestCase ( 1 ) ]
179+ [ TestCase ( 127 ) ]
180+ [ TestCase ( 128 ) ]
181+ [ TestCase ( 16383 ) ]
182+ [ TestCase ( 16384 ) ]
183+ [ TestCase ( 2097151 ) ]
184+ [ TestCase ( 2097152 ) ]
185+ [ TestCase ( 268435455 ) ]
186+ [ TestCase ( int . MaxValue ) ]
187+ [ TestCase ( - 1 ) ]
188+ [ LuceneNetSpecific ]
189+ public void TestReadVInt32_DebugAssertRequiresCompleteSpan ( int value )
190+ {
191+ byte [ ] encoded = EncodeVInt32 ( value ) ;
192+
193+ // Every prefix shorter than the encoded value should assert.
194+ for ( int length = 0 ; length < encoded . Length ; length ++ )
195+ {
196+ Assert . Throws ( Lucene . ExceptionExtensions . DebugAssertExceptionType , ( ) =>
197+ {
198+ VIntUtils . TryReadVInt32 ( encoded . AsSpan ( 0 , length ) , out _ , out _ ) ;
199+ } , $ "Expected { Lucene . ExceptionExtensions . DebugAssertExceptionType . AssemblyQualifiedName } for value { value } with span length { length } .") ;
200+ }
201+
202+ // The exact encoded length should succeed.
203+ {
204+ Assert . DoesNotThrow ( ( ) =>
205+ {
206+ bool ok = VIntUtils . TryReadVInt32 ( encoded , out int result , out int count ) ;
207+
208+ assertTrue ( ok ) ;
209+ assertEquals ( value , result ) ;
210+ assertEquals ( encoded . Length , count ) ;
211+ } ) ;
212+ }
213+ }
214+
215+ [ TestCase ( 0L ) ]
216+ [ TestCase ( 1L ) ]
217+ [ TestCase ( 127L ) ]
218+ [ TestCase ( 128L ) ]
219+ [ TestCase ( 16383L ) ]
220+ [ TestCase ( 16384L ) ]
221+ [ TestCase ( 2097151L ) ]
222+ [ TestCase ( 2097152L ) ]
223+ [ TestCase ( 268435455L ) ]
224+ [ TestCase ( 268435456L ) ]
225+ [ TestCase ( 34359738367L ) ]
226+ [ TestCase ( 34359738368L ) ]
227+ [ TestCase ( 4398046511103L ) ]
228+ [ TestCase ( 4398046511104L ) ]
229+ [ TestCase ( 562949953421311L ) ]
230+ [ TestCase ( 562949953421312L ) ]
231+ [ TestCase ( 72057594037927935L ) ]
232+ [ TestCase ( 72057594037927936L ) ]
233+ [ TestCase ( long . MaxValue ) ]
234+ [ LuceneNetSpecific ]
235+ public void TestReadVInt64_DebugAssertRequiresCompleteSpan ( long value )
236+ {
237+ byte [ ] encoded = EncodeVInt64 ( value ) ;
238+
239+ // Every prefix shorter than the encoded value should assert.
240+ for ( int length = 0 ; length < encoded . Length ; length ++ )
241+ {
242+ Assert . Throws ( Lucene . ExceptionExtensions . DebugAssertExceptionType , ( ) =>
243+ {
244+ VIntUtils . TryReadVInt64 ( encoded . AsSpan ( 0 , length ) , out _ , out _ ) ;
245+ } , $ "Expected { Lucene . ExceptionExtensions . DebugAssertExceptionType . AssemblyQualifiedName } for value { value } with span length { length } .") ;
246+ }
247+
248+ // The exact encoded length should succeed.
249+ {
250+ Assert . DoesNotThrow ( ( ) =>
251+ {
252+ bool ok = VIntUtils . TryReadVInt64 ( encoded , out long result , out int count ) ;
253+
254+ assertTrue ( ok ) ;
255+ assertEquals ( value , result ) ;
256+ assertEquals ( encoded . Length , count ) ;
257+ } ) ;
258+ }
259+ }
260+
261+ #endif
174262 }
175263}
0 commit comments