@@ -29,6 +29,10 @@ impl<B: Buf> BufList<B> {
2929
3030impl < B : Buf > Buf for BufList < B > {
3131 fn remaining ( & self ) -> usize {
32+ debug_assert_eq ! (
33+ self . len,
34+ self . bufs. iter( ) . map( Buf :: remaining) . sum:: <usize >( )
35+ ) ;
3236 self . len
3337 }
3438
@@ -106,3 +110,155 @@ impl<B: Buf> Buf for BufList<B> {
106110 bufs. freeze ( )
107111 }
108112}
113+
114+ #[ cfg( test) ]
115+ mod tests {
116+ #[ cfg( feature = "std" ) ]
117+ use std:: io;
118+
119+ use bytes:: { buf:: Chain , Buf } ;
120+
121+ use super :: BufList ;
122+
123+ #[ test]
124+ fn series ( ) {
125+ let mut bufs = BufList :: < Chain < & [ u8 ] , & [ u8 ] > > :: new ( ) ;
126+ // empty
127+ assert_eq ! ( bufs. remaining( ) , 0 ) ;
128+ assert ! ( !bufs. has_remaining( ) ) ;
129+ assert_eq ! ( bufs. chunk( ) , & [ 0u8 ; 0 ] ) ;
130+ #[ cfg( feature = "std" ) ]
131+ {
132+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
133+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 0 ) ;
134+ assert ! ( vectors. iter( ) . all( |vector| vector. is_empty( ) ) ) ;
135+ }
136+
137+ // first push
138+ bufs. push ( [ 0u8 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] . chain ( & [ 8u8 , 9 , 10 , 11 ] ) ) ;
139+ assert_eq ! ( bufs. remaining( ) , 12 ) ;
140+ assert ! ( bufs. has_remaining( ) ) ;
141+ assert_eq ! ( bufs. chunk( ) , & [ 0u8 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
142+ #[ cfg( feature = "std" ) ]
143+ {
144+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
145+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 2 ) ;
146+ assert_eq ! ( & * vectors[ 0 ] , & [ 0u8 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
147+ assert_eq ! ( & * vectors[ 1 ] , & [ 8u8 , 9 , 10 , 11 ] ) ;
148+ assert ! ( vectors[ 2 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
149+ }
150+
151+ // partially read the first buf
152+ bufs. advance ( 4 ) ;
153+ assert_eq ! ( bufs. remaining( ) , 8 ) ;
154+ assert ! ( bufs. has_remaining( ) ) ;
155+ assert_eq ! ( bufs. chunk( ) , & [ 4u8 , 5 , 6 , 7 ] ) ;
156+ #[ cfg( feature = "std" ) ]
157+ {
158+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
159+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 2 ) ;
160+ assert_eq ! ( & * vectors[ 0 ] , & [ 4u8 , 5 , 6 , 7 ] ) ;
161+ assert_eq ! ( & * vectors[ 1 ] , & [ 8u8 , 9 , 10 , 11 ] ) ;
162+ assert ! ( vectors[ 2 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
163+ }
164+
165+ // second push
166+ bufs. push ( [ 12u8 , 13 , 14 , 15 , 16 , 17 ] . chain ( & [ 18u8 , 19 , 20 ] ) ) ;
167+ assert_eq ! ( bufs. remaining( ) , 17 ) ;
168+ assert ! ( bufs. has_remaining( ) ) ;
169+ assert_eq ! ( bufs. chunk( ) , & [ 4u8 , 5 , 6 , 7 ] ) ;
170+ #[ cfg( feature = "std" ) ]
171+ {
172+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
173+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 4 ) ;
174+ assert_eq ! ( & * vectors[ 0 ] , & [ 4u8 , 5 , 6 , 7 ] ) ;
175+ assert_eq ! ( & * vectors[ 1 ] , & [ 8u8 , 9 , 10 , 11 ] ) ;
176+ assert_eq ! ( & * vectors[ 2 ] , & [ 12u8 , 13 , 14 , 15 , 16 , 17 ] ) ;
177+ assert_eq ! ( & * vectors[ 3 ] , & [ 18u8 , 19 , 20 ] ) ;
178+ assert ! ( vectors[ 4 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
179+ }
180+
181+ // read remaining first buf and part of second buf
182+ bufs. advance ( 6 ) ;
183+ assert_eq ! ( bufs. remaining( ) , 11 ) ;
184+ assert ! ( bufs. has_remaining( ) ) ;
185+ assert_eq ! ( bufs. chunk( ) , & [ 10u8 , 11 ] ) ;
186+ #[ cfg( feature = "std" ) ]
187+ {
188+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
189+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 3 ) ;
190+ assert_eq ! ( & * vectors[ 0 ] , & [ 10u8 , 11 ] ) ;
191+ assert_eq ! ( & * vectors[ 1 ] , & [ 12u8 , 13 , 14 , 15 , 16 , 17 ] ) ;
192+ assert_eq ! ( & * vectors[ 2 ] , & [ 18u8 , 19 , 20 ] ) ;
193+ assert ! ( vectors[ 3 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
194+ }
195+
196+ // third push
197+ bufs. push ( [ 21u8 , 22 , 23 , 24 ] . chain ( & [ 25u8 , 26 , 27 ] ) ) ;
198+ assert_eq ! ( bufs. remaining( ) , 18 ) ;
199+ assert ! ( bufs. has_remaining( ) ) ;
200+ assert_eq ! ( bufs. chunk( ) , & [ 10u8 , 11 ] ) ;
201+ #[ cfg( feature = "std" ) ]
202+ {
203+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
204+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 5 ) ;
205+ assert_eq ! ( & * vectors[ 0 ] , & [ 10u8 , 11 ] ) ;
206+ assert_eq ! ( & * vectors[ 1 ] , & [ 12u8 , 13 , 14 , 15 , 16 , 17 ] ) ;
207+ assert_eq ! ( & * vectors[ 2 ] , & [ 18u8 , 19 , 20 ] ) ;
208+ assert_eq ! ( & * vectors[ 3 ] , & [ 21u8 , 22 , 23 , 24 ] ) ;
209+ assert_eq ! ( & * vectors[ 4 ] , & [ 25u8 , 26 , 27 ] ) ;
210+ assert ! ( vectors[ 5 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
211+ }
212+
213+ // read part of second buf
214+ let buf = bufs. copy_to_bytes ( 1 ) ;
215+ assert_eq ! ( & * buf, & [ 10u8 ] ) ;
216+ assert_eq ! ( bufs. remaining( ) , 17 ) ;
217+ assert ! ( bufs. has_remaining( ) ) ;
218+ assert_eq ! ( bufs. chunk( ) , & [ 11u8 ] ) ;
219+ #[ cfg( feature = "std" ) ]
220+ {
221+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
222+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 5 ) ;
223+ assert_eq ! ( & * vectors[ 0 ] , & [ 11u8 ] ) ;
224+ assert_eq ! ( & * vectors[ 1 ] , & [ 12u8 , 13 , 14 , 15 , 16 , 17 ] ) ;
225+ assert_eq ! ( & * vectors[ 2 ] , & [ 18u8 , 19 , 20 ] ) ;
226+ assert_eq ! ( & * vectors[ 3 ] , & [ 21u8 , 22 , 23 , 24 ] ) ;
227+ assert_eq ! ( & * vectors[ 4 ] , & [ 25u8 , 26 , 27 ] ) ;
228+ assert ! ( vectors[ 5 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
229+ }
230+
231+ // read remaining second buf and part of third buf
232+ let buf = bufs. copy_to_bytes ( 4 ) ;
233+ assert_eq ! ( & * buf, & [ 11u8 , 12 , 13 , 14 ] ) ;
234+ assert_eq ! ( bufs. remaining( ) , 13 ) ;
235+ assert ! ( bufs. has_remaining( ) ) ;
236+ assert_eq ! ( bufs. chunk( ) , & [ 15u8 , 16 , 17 ] ) ;
237+ #[ cfg( feature = "std" ) ]
238+ {
239+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
240+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 4 ) ;
241+ assert_eq ! ( & * vectors[ 0 ] , & [ 15u8 , 16 , 17 ] ) ;
242+ assert_eq ! ( & * vectors[ 1 ] , & [ 18u8 , 19 , 20 ] ) ;
243+ assert_eq ! ( & * vectors[ 2 ] , & [ 21u8 , 22 , 23 , 24 ] ) ;
244+ assert_eq ! ( & * vectors[ 3 ] , & [ 25u8 , 26 , 27 ] ) ;
245+ assert ! ( vectors[ 4 ..] . iter( ) . all( |vector| vector. is_empty( ) ) ) ;
246+ }
247+
248+ // read remaining
249+ let buf = bufs. copy_to_bytes ( 13 ) ;
250+ assert_eq ! (
251+ & * buf,
252+ & [ 15u8 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 ]
253+ ) ;
254+ assert_eq ! ( bufs. remaining( ) , 0 ) ;
255+ assert ! ( !bufs. has_remaining( ) ) ;
256+ assert_eq ! ( bufs. chunk( ) , & [ 0u8 ; 0 ] ) ;
257+ #[ cfg( feature = "std" ) ]
258+ {
259+ let mut vectors = [ io:: IoSlice :: new ( & [ ] ) ; 64 ] ;
260+ assert_eq ! ( bufs. chunks_vectored( & mut vectors) , 0 ) ;
261+ assert ! ( vectors. iter( ) . all( |vector| vector. is_empty( ) ) ) ;
262+ }
263+ }
264+ }
0 commit comments