@@ -2,7 +2,7 @@ use http::HttpTryFrom;
2
2
3
3
use mime:: { self , Mime } ;
4
4
5
- use util:: QualityValue ;
5
+ use { util:: QualityValue , Header } ;
6
6
7
7
fn qitem ( mime : Mime ) -> QualityValue < Mime > {
8
8
QualityValue :: new ( mime, Default :: default ( ) )
@@ -84,10 +84,10 @@ fn qitem(mime: Mime) -> QualityValue<Mime> {
84
84
/// ])
85
85
/// );
86
86
/// ```
87
- #[ derive( Debug ) ]
87
+ #[ derive( Debug , PartialEq , Eq ) ]
88
88
pub struct Accept ( pub Vec < QualityValue < Mime > > ) ;
89
89
90
- impl :: Header for Accept {
90
+ impl Header for Accept {
91
91
fn name ( ) -> & ' static :: HeaderName {
92
92
& :: http:: header:: ACCEPT
93
93
}
@@ -141,3 +141,76 @@ impl Accept {
141
141
Accept ( vec ! [ qitem( mime:: IMAGE_STAR ) ] )
142
142
}
143
143
}
144
+
145
+ #[ cfg( test) ]
146
+ mod tests {
147
+ use super :: * ;
148
+
149
+ use {
150
+ http:: HeaderValue ,
151
+ mime:: { TEXT_HTML , TEXT_PLAIN , TEXT_PLAIN_UTF_8 } ,
152
+ } ;
153
+
154
+ use util:: Quality ;
155
+
156
+ macro_rules! test_header {
157
+ ( $name: ident, $input: expr, $expected: expr) => {
158
+ #[ test]
159
+ fn $name( ) {
160
+ assert_eq!(
161
+ Accept :: decode(
162
+ & mut $input
163
+ . into_iter( )
164
+ . map( |s| HeaderValue :: from_bytes( s) . unwrap( ) )
165
+ . collect:: <Vec <_>>( )
166
+ . iter( )
167
+ )
168
+ . ok( ) ,
169
+ $expected,
170
+ ) ;
171
+ }
172
+ } ;
173
+ }
174
+
175
+ // Tests from the RFC
176
+ test_header ! (
177
+ test1,
178
+ vec![ b"audio/*; q=0.2, audio/basic" ] ,
179
+ Some ( Accept ( vec![
180
+ QualityValue :: new( "audio/*" . parse( ) . unwrap( ) , Quality :: from( 200 ) ) ,
181
+ qitem( "audio/basic" . parse( ) . unwrap( ) ) ,
182
+ ] ) )
183
+ ) ;
184
+ test_header ! (
185
+ test2,
186
+ vec![ b"text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c" ] ,
187
+ Some ( Accept ( vec![
188
+ QualityValue :: new( TEXT_PLAIN , Quality :: from( 500 ) ) ,
189
+ qitem( TEXT_HTML ) ,
190
+ QualityValue :: new( "text/x-dvi" . parse( ) . unwrap( ) , Quality :: from( 800 ) ) ,
191
+ qitem( "text/x-c" . parse( ) . unwrap( ) ) ,
192
+ ] ) )
193
+ ) ;
194
+ // Custom tests
195
+ test_header ! (
196
+ test3,
197
+ vec![ b"text/plain; charset=utf-8" ] ,
198
+ Some ( Accept ( vec![ qitem( TEXT_PLAIN_UTF_8 ) , ] ) )
199
+ ) ;
200
+ test_header ! (
201
+ test4,
202
+ vec![ b"text/plain; charset=utf-8; q=0.5" ] ,
203
+ Some ( Accept ( vec![ QualityValue :: new(
204
+ TEXT_PLAIN_UTF_8 ,
205
+ Quality :: from( 500 )
206
+ ) , ] ) )
207
+ ) ;
208
+
209
+ #[ test]
210
+ #[ ignore]
211
+ fn test_fuzzing1 ( ) {
212
+ let raw = HeaderValue :: from_static ( "chunk#;e" ) ;
213
+ let header = Accept :: decode ( & mut Some ( & raw ) . into_iter ( ) ) ;
214
+ assert ! ( header. is_ok( ) ) ;
215
+ }
216
+ }
0 commit comments