1 use super::*;
2
3 #[cfg(feature = "std")]
4 use proptest::prelude::*;
5
6 use crate::ascii::Caseless;
7 use crate::combinator::delimited;
8 use crate::error::ErrMode;
9 use crate::error::ErrorKind;
10 use crate::error::InputError;
11 use crate::error::Needed;
12 use crate::stream::AsChar;
13 use crate::token::tag;
14 use crate::unpeek;
15 use crate::IResult;
16 use crate::Parser;
17 use crate::Partial;
18
19 #[test]
complete_take_while_m_n_utf8_all_matching()20 fn complete_take_while_m_n_utf8_all_matching() {
21 let result: IResult<&str, &str> =
22 take_while(1..=4, |c: char| c.is_alphabetic()).parse_peek("øn");
23 assert_eq!(result, Ok(("", "øn")));
24 }
25
26 #[test]
complete_take_while_m_n_utf8_all_matching_substring()27 fn complete_take_while_m_n_utf8_all_matching_substring() {
28 let result: IResult<&str, &str> = take_while(1, |c: char| c.is_alphabetic()).parse_peek("øn");
29 assert_eq!(result, Ok(("n", "ø")));
30 }
31
32 #[cfg(feature = "std")]
model_complete_take_while_m_n( m: usize, n: usize, valid: usize, input: &str, ) -> IResult<&str, &str>33 fn model_complete_take_while_m_n(
34 m: usize,
35 n: usize,
36 valid: usize,
37 input: &str,
38 ) -> IResult<&str, &str> {
39 if n < m {
40 Err(crate::error::ErrMode::from_error_kind(
41 &input,
42 crate::error::ErrorKind::Slice,
43 ))
44 } else if m <= valid {
45 let offset = n.min(valid);
46 Ok((&input[offset..], &input[0..offset]))
47 } else {
48 Err(crate::error::ErrMode::from_error_kind(
49 &input,
50 crate::error::ErrorKind::Slice,
51 ))
52 }
53 }
54
55 #[cfg(feature = "std")]
56 proptest! {
57 #[test]
58 #[cfg_attr(miri, ignore)] // See https://github.com/AltSysrq/proptest/issues/253
59 fn complete_take_while_m_n_bounds(m in 0..20usize, n in 0..20usize, valid in 0..20usize, invalid in 0..20usize) {
60 let input = format!("{:a<valid$}{:b<invalid$}", "", "", valid=valid, invalid=invalid);
61 let expected = model_complete_take_while_m_n(m, n, valid, &input);
62 if m <= n {
63 let actual = take_while(m..=n, |c: char| c == 'a').parse_peek(input.as_str());
64 assert_eq!(expected, actual);
65 }
66 }
67 }
68
69 #[test]
complete_take_until()70 fn complete_take_until() {
71 fn take_until_5_10(i: &str) -> IResult<&str, &str> {
72 take_until(5..=8, "end").parse_peek(i)
73 }
74 assert_eq!(
75 take_until_5_10("end"),
76 Err(ErrMode::Backtrack(error_position!(
77 &"end",
78 ErrorKind::Slice
79 )))
80 );
81 assert_eq!(
82 take_until_5_10("1234end"),
83 Err(ErrMode::Backtrack(error_position!(
84 &"1234end",
85 ErrorKind::Slice
86 )))
87 );
88 assert_eq!(take_until_5_10("12345end"), Ok(("end", "12345")));
89 assert_eq!(take_until_5_10("123456end"), Ok(("end", "123456")));
90 assert_eq!(take_until_5_10("12345678end"), Ok(("end", "12345678")));
91 assert_eq!(
92 take_until_5_10("123456789end"),
93 Err(ErrMode::Backtrack(error_position!(
94 &"123456789end",
95 ErrorKind::Slice
96 )))
97 );
98 }
99
100 #[test]
partial_any_str()101 fn partial_any_str() {
102 use super::any;
103 assert_eq!(
104 any::<_, InputError<Partial<&str>>>.parse_peek(Partial::new("Ә")),
105 Ok((Partial::new(""), 'Ә'))
106 );
107 }
108
109 #[test]
partial_one_of_test()110 fn partial_one_of_test() {
111 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, u8> {
112 one_of(['a', 'b']).parse_peek(i)
113 }
114
115 let a = &b"abcd"[..];
116 assert_eq!(f(Partial::new(a)), Ok((Partial::new(&b"bcd"[..]), b'a')));
117
118 let b = &b"cde"[..];
119 assert_eq!(
120 f(Partial::new(b)),
121 Err(ErrMode::Backtrack(error_position!(
122 &Partial::new(b),
123 ErrorKind::Verify
124 )))
125 );
126
127 fn utf8(i: Partial<&str>) -> IResult<Partial<&str>, char> {
128 one_of(['+', '\u{FF0B}']).parse_peek(i)
129 }
130
131 assert!(utf8(Partial::new("+")).is_ok());
132 assert!(utf8(Partial::new("\u{FF0B}")).is_ok());
133 }
134
135 #[test]
char_byteslice()136 fn char_byteslice() {
137 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, u8> {
138 'c'.parse_peek(i)
139 }
140
141 let a = &b"abcd"[..];
142 assert_eq!(
143 f(Partial::new(a)),
144 Err(ErrMode::Backtrack(error_position!(
145 &Partial::new(a),
146 ErrorKind::Verify
147 )))
148 );
149
150 let b = &b"cde"[..];
151 assert_eq!(f(Partial::new(b)), Ok((Partial::new(&b"de"[..]), b'c')));
152 }
153
154 #[test]
char_str()155 fn char_str() {
156 fn f(i: Partial<&str>) -> IResult<Partial<&str>, char> {
157 'c'.parse_peek(i)
158 }
159
160 let a = "abcd";
161 assert_eq!(
162 f(Partial::new(a)),
163 Err(ErrMode::Backtrack(error_position!(
164 &Partial::new(a),
165 ErrorKind::Verify
166 )))
167 );
168
169 let b = "cde";
170 assert_eq!(f(Partial::new(b)), Ok((Partial::new("de"), 'c')));
171 }
172
173 #[test]
partial_none_of_test()174 fn partial_none_of_test() {
175 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, u8> {
176 none_of(['a', 'b']).parse_peek(i)
177 }
178
179 let a = &b"abcd"[..];
180 assert_eq!(
181 f(Partial::new(a)),
182 Err(ErrMode::Backtrack(error_position!(
183 &Partial::new(a),
184 ErrorKind::Verify
185 )))
186 );
187
188 let b = &b"cde"[..];
189 assert_eq!(f(Partial::new(b)), Ok((Partial::new(&b"de"[..]), b'c')));
190 }
191
192 #[test]
partial_is_a()193 fn partial_is_a() {
194 fn a_or_b(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
195 take_while(1.., ['a', 'b']).parse_peek(i)
196 }
197
198 let a = Partial::new(&b"abcd"[..]);
199 assert_eq!(a_or_b(a), Ok((Partial::new(&b"cd"[..]), &b"ab"[..])));
200
201 let b = Partial::new(&b"bcde"[..]);
202 assert_eq!(a_or_b(b), Ok((Partial::new(&b"cde"[..]), &b"b"[..])));
203
204 let c = Partial::new(&b"cdef"[..]);
205 assert_eq!(
206 a_or_b(c),
207 Err(ErrMode::Backtrack(error_position!(&c, ErrorKind::Slice)))
208 );
209
210 let d = Partial::new(&b"bacdef"[..]);
211 assert_eq!(a_or_b(d), Ok((Partial::new(&b"cdef"[..]), &b"ba"[..])));
212 }
213
214 #[test]
partial_is_not()215 fn partial_is_not() {
216 fn a_or_b(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
217 take_till(1.., ['a', 'b']).parse_peek(i)
218 }
219
220 let a = Partial::new(&b"cdab"[..]);
221 assert_eq!(a_or_b(a), Ok((Partial::new(&b"ab"[..]), &b"cd"[..])));
222
223 let b = Partial::new(&b"cbde"[..]);
224 assert_eq!(a_or_b(b), Ok((Partial::new(&b"bde"[..]), &b"c"[..])));
225
226 let c = Partial::new(&b"abab"[..]);
227 assert_eq!(
228 a_or_b(c),
229 Err(ErrMode::Backtrack(error_position!(&c, ErrorKind::Slice)))
230 );
231
232 let d = Partial::new(&b"cdefba"[..]);
233 assert_eq!(a_or_b(d), Ok((Partial::new(&b"ba"[..]), &b"cdef"[..])));
234
235 let e = Partial::new(&b"e"[..]);
236 assert_eq!(a_or_b(e), Err(ErrMode::Incomplete(Needed::new(1))));
237 }
238
239 #[test]
partial_take_until_incomplete()240 fn partial_take_until_incomplete() {
241 fn y(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
242 take_until(0.., "end").parse_peek(i)
243 }
244 assert_eq!(
245 y(Partial::new(&b"nd"[..])),
246 Err(ErrMode::Incomplete(Needed::Unknown))
247 );
248 assert_eq!(
249 y(Partial::new(&b"123"[..])),
250 Err(ErrMode::Incomplete(Needed::Unknown))
251 );
252 assert_eq!(
253 y(Partial::new(&b"123en"[..])),
254 Err(ErrMode::Incomplete(Needed::Unknown))
255 );
256 }
257
258 #[test]
partial_take_until_incomplete_s()259 fn partial_take_until_incomplete_s() {
260 fn ys(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
261 take_until(0.., "end").parse_peek(i)
262 }
263 assert_eq!(
264 ys(Partial::new("123en")),
265 Err(ErrMode::Incomplete(Needed::Unknown))
266 );
267 }
268
269 #[test]
partial_recognize()270 fn partial_recognize() {
271 use crate::ascii::{
272 alpha1 as alpha, alphanumeric1 as alphanumeric, digit1 as digit, hex_digit1 as hex_digit,
273 multispace1 as multispace, oct_digit1 as oct_digit, space1 as space,
274 };
275
276 fn x(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
277 delimited("<!--", take(5_usize), "-->")
278 .recognize()
279 .parse_peek(i)
280 }
281 let r = x(Partial::new(&b"<!-- abc --> aaa"[..]));
282 assert_eq!(r, Ok((Partial::new(&b" aaa"[..]), &b"<!-- abc -->"[..])));
283
284 let semicolon = &b";"[..];
285
286 fn ya(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
287 alpha.recognize().parse_peek(i)
288 }
289 let ra = ya(Partial::new(&b"abc;"[..]));
290 assert_eq!(ra, Ok((Partial::new(semicolon), &b"abc"[..])));
291
292 fn yd(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
293 digit.recognize().parse_peek(i)
294 }
295 let rd = yd(Partial::new(&b"123;"[..]));
296 assert_eq!(rd, Ok((Partial::new(semicolon), &b"123"[..])));
297
298 fn yhd(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
299 hex_digit.recognize().parse_peek(i)
300 }
301 let rhd = yhd(Partial::new(&b"123abcDEF;"[..]));
302 assert_eq!(rhd, Ok((Partial::new(semicolon), &b"123abcDEF"[..])));
303
304 fn yod(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
305 oct_digit.recognize().parse_peek(i)
306 }
307 let rod = yod(Partial::new(&b"1234567;"[..]));
308 assert_eq!(rod, Ok((Partial::new(semicolon), &b"1234567"[..])));
309
310 fn yan(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
311 alphanumeric.recognize().parse_peek(i)
312 }
313 let ran = yan(Partial::new(&b"123abc;"[..]));
314 assert_eq!(ran, Ok((Partial::new(semicolon), &b"123abc"[..])));
315
316 fn ys(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
317 space.recognize().parse_peek(i)
318 }
319 let rs = ys(Partial::new(&b" \t;"[..]));
320 assert_eq!(rs, Ok((Partial::new(semicolon), &b" \t"[..])));
321
322 fn yms(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
323 multispace.recognize().parse_peek(i)
324 }
325 let rms = yms(Partial::new(&b" \t\r\n;"[..]));
326 assert_eq!(rms, Ok((Partial::new(semicolon), &b" \t\r\n"[..])));
327 }
328
329 #[test]
partial_take_while0()330 fn partial_take_while0() {
331 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
332 take_while(0.., AsChar::is_alpha).parse_peek(i)
333 }
334 let a = &b""[..];
335 let b = &b"abcd"[..];
336 let c = &b"abcd123"[..];
337 let d = &b"123"[..];
338
339 assert_eq!(f(Partial::new(a)), Err(ErrMode::Incomplete(Needed::new(1))));
340 assert_eq!(f(Partial::new(b)), Err(ErrMode::Incomplete(Needed::new(1))));
341 assert_eq!(f(Partial::new(c)), Ok((Partial::new(d), b)));
342 assert_eq!(f(Partial::new(d)), Ok((Partial::new(d), a)));
343 }
344
345 #[test]
partial_take_while1()346 fn partial_take_while1() {
347 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
348 take_while(1.., AsChar::is_alpha).parse_peek(i)
349 }
350 let a = &b""[..];
351 let b = &b"abcd"[..];
352 let c = &b"abcd123"[..];
353 let d = &b"123"[..];
354
355 assert_eq!(f(Partial::new(a)), Err(ErrMode::Incomplete(Needed::new(1))));
356 assert_eq!(f(Partial::new(b)), Err(ErrMode::Incomplete(Needed::new(1))));
357 assert_eq!(f(Partial::new(c)), Ok((Partial::new(&b"123"[..]), b)));
358 assert_eq!(
359 f(Partial::new(d)),
360 Err(ErrMode::Backtrack(error_position!(
361 &Partial::new(d),
362 ErrorKind::Slice
363 )))
364 );
365 }
366
367 #[test]
partial_take_while_m_n()368 fn partial_take_while_m_n() {
369 fn x(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
370 take_while(2..=4, AsChar::is_alpha).parse_peek(i)
371 }
372 let a = &b""[..];
373 let b = &b"a"[..];
374 let c = &b"abc"[..];
375 let d = &b"abc123"[..];
376 let e = &b"abcde"[..];
377 let f = &b"123"[..];
378
379 assert_eq!(x(Partial::new(a)), Err(ErrMode::Incomplete(Needed::new(2))));
380 assert_eq!(x(Partial::new(b)), Err(ErrMode::Incomplete(Needed::new(1))));
381 assert_eq!(x(Partial::new(c)), Err(ErrMode::Incomplete(Needed::new(1))));
382 assert_eq!(x(Partial::new(d)), Ok((Partial::new(&b"123"[..]), c)));
383 assert_eq!(
384 x(Partial::new(e)),
385 Ok((Partial::new(&b"e"[..]), &b"abcd"[..]))
386 );
387 assert_eq!(
388 x(Partial::new(f)),
389 Err(ErrMode::Backtrack(error_position!(
390 &Partial::new(f),
391 ErrorKind::Slice
392 )))
393 );
394 }
395
396 #[test]
partial_take_till0()397 fn partial_take_till0() {
398 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
399 take_till(0.., AsChar::is_alpha).parse_peek(i)
400 }
401 let a = &b""[..];
402 let b = &b"abcd"[..];
403 let c = &b"123abcd"[..];
404 let d = &b"123"[..];
405
406 assert_eq!(f(Partial::new(a)), Err(ErrMode::Incomplete(Needed::new(1))));
407 assert_eq!(
408 f(Partial::new(b)),
409 Ok((Partial::new(&b"abcd"[..]), &b""[..]))
410 );
411 assert_eq!(
412 f(Partial::new(c)),
413 Ok((Partial::new(&b"abcd"[..]), &b"123"[..]))
414 );
415 assert_eq!(f(Partial::new(d)), Err(ErrMode::Incomplete(Needed::new(1))));
416 }
417
418 #[test]
partial_take_till1()419 fn partial_take_till1() {
420 fn f(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
421 take_till(1.., AsChar::is_alpha).parse_peek(i)
422 }
423 let a = &b""[..];
424 let b = &b"abcd"[..];
425 let c = &b"123abcd"[..];
426 let d = &b"123"[..];
427
428 assert_eq!(f(Partial::new(a)), Err(ErrMode::Incomplete(Needed::new(1))));
429 assert_eq!(
430 f(Partial::new(b)),
431 Err(ErrMode::Backtrack(error_position!(
432 &Partial::new(b),
433 ErrorKind::Slice
434 )))
435 );
436 assert_eq!(
437 f(Partial::new(c)),
438 Ok((Partial::new(&b"abcd"[..]), &b"123"[..]))
439 );
440 assert_eq!(f(Partial::new(d)), Err(ErrMode::Incomplete(Needed::new(1))));
441 }
442
443 #[test]
partial_take_while_utf8()444 fn partial_take_while_utf8() {
445 fn f(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
446 take_while(0.., |c| c != '點').parse_peek(i)
447 }
448
449 assert_eq!(
450 f(Partial::new("")),
451 Err(ErrMode::Incomplete(Needed::new(1)))
452 );
453 assert_eq!(
454 f(Partial::new("abcd")),
455 Err(ErrMode::Incomplete(Needed::new(1)))
456 );
457 assert_eq!(f(Partial::new("abcd點")), Ok((Partial::new("點"), "abcd")));
458 assert_eq!(
459 f(Partial::new("abcd點a")),
460 Ok((Partial::new("點a"), "abcd"))
461 );
462
463 fn g(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
464 take_while(0.., |c| c == '點').parse_peek(i)
465 }
466
467 assert_eq!(
468 g(Partial::new("")),
469 Err(ErrMode::Incomplete(Needed::new(1)))
470 );
471 assert_eq!(g(Partial::new("點abcd")), Ok((Partial::new("abcd"), "點")));
472 assert_eq!(
473 g(Partial::new("點點點a")),
474 Ok((Partial::new("a"), "點點點"))
475 );
476 }
477
478 #[test]
partial_take_till0_utf8()479 fn partial_take_till0_utf8() {
480 fn f(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
481 take_till(0.., |c| c == '點').parse_peek(i)
482 }
483
484 assert_eq!(
485 f(Partial::new("")),
486 Err(ErrMode::Incomplete(Needed::new(1)))
487 );
488 assert_eq!(
489 f(Partial::new("abcd")),
490 Err(ErrMode::Incomplete(Needed::new(1)))
491 );
492 assert_eq!(f(Partial::new("abcd點")), Ok((Partial::new("點"), "abcd")));
493 assert_eq!(
494 f(Partial::new("abcd點a")),
495 Ok((Partial::new("點a"), "abcd"))
496 );
497
498 fn g(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
499 take_till(0.., |c| c != '點').parse_peek(i)
500 }
501
502 assert_eq!(
503 g(Partial::new("")),
504 Err(ErrMode::Incomplete(Needed::new(1)))
505 );
506 assert_eq!(g(Partial::new("點abcd")), Ok((Partial::new("abcd"), "點")));
507 assert_eq!(
508 g(Partial::new("點點點a")),
509 Ok((Partial::new("a"), "點點點"))
510 );
511 }
512
513 #[test]
partial_take_utf8()514 fn partial_take_utf8() {
515 fn f(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
516 take(3_usize).parse_peek(i)
517 }
518
519 assert_eq!(
520 f(Partial::new("")),
521 Err(ErrMode::Incomplete(Needed::Unknown))
522 );
523 assert_eq!(
524 f(Partial::new("ab")),
525 Err(ErrMode::Incomplete(Needed::Unknown))
526 );
527 assert_eq!(
528 f(Partial::new("點")),
529 Err(ErrMode::Incomplete(Needed::Unknown))
530 );
531 assert_eq!(f(Partial::new("ab點cd")), Ok((Partial::new("cd"), "ab點")));
532 assert_eq!(f(Partial::new("a點bcd")), Ok((Partial::new("cd"), "a點b")));
533 assert_eq!(f(Partial::new("a點b")), Ok((Partial::new(""), "a點b")));
534
535 fn g(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
536 take_while(0.., |c| c == '點').parse_peek(i)
537 }
538
539 assert_eq!(
540 g(Partial::new("")),
541 Err(ErrMode::Incomplete(Needed::new(1)))
542 );
543 assert_eq!(g(Partial::new("點abcd")), Ok((Partial::new("abcd"), "點")));
544 assert_eq!(
545 g(Partial::new("點點點a")),
546 Ok((Partial::new("a"), "點點點"))
547 );
548 }
549
550 #[test]
partial_take_while_m_n_utf8_fixed()551 fn partial_take_while_m_n_utf8_fixed() {
552 fn parser(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
553 take_while(1, |c| c == 'A' || c == '').parse_peek(i)
554 }
555 assert_eq!(parser(Partial::new("A!")), Ok((Partial::new("!"), "A")));
556 assert_eq!(parser(Partial::new("!")), Ok((Partial::new("!"), "")));
557 }
558
559 #[test]
partial_take_while_m_n_utf8_range()560 fn partial_take_while_m_n_utf8_range() {
561 fn parser(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
562 take_while(1..=2, |c| c == 'A' || c == '').parse_peek(i)
563 }
564 assert_eq!(parser(Partial::new("A!")), Ok((Partial::new("!"), "A")));
565 assert_eq!(parser(Partial::new("!")), Ok((Partial::new("!"), "")));
566 }
567
568 #[test]
partial_take_while_m_n_utf8_full_match_fixed()569 fn partial_take_while_m_n_utf8_full_match_fixed() {
570 fn parser(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
571 take_while(1, |c: char| c.is_alphabetic()).parse_peek(i)
572 }
573 assert_eq!(parser(Partial::new("øn")), Ok((Partial::new("n"), "ø")));
574 }
575
576 #[test]
partial_take_while_m_n_utf8_full_match_range()577 fn partial_take_while_m_n_utf8_full_match_range() {
578 fn parser(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
579 take_while(1..=2, |c: char| c.is_alphabetic()).parse_peek(i)
580 }
581 assert_eq!(parser(Partial::new("øn")), Ok((Partial::new(""), "øn")));
582 }
583
584 #[test]
585 #[cfg(feature = "std")]
partial_recognize_take_while0()586 fn partial_recognize_take_while0() {
587 fn x(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
588 take_while(0.., AsChar::is_alphanum).parse_peek(i)
589 }
590 fn y(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
591 unpeek(x).recognize().parse_peek(i)
592 }
593 assert_eq!(
594 x(Partial::new(&b"ab."[..])),
595 Ok((Partial::new(&b"."[..]), &b"ab"[..]))
596 );
597 assert_eq!(
598 y(Partial::new(&b"ab."[..])),
599 Ok((Partial::new(&b"."[..]), &b"ab"[..]))
600 );
601 }
602
603 #[cfg(feature = "alloc")]
604 #[test]
partial_case_insensitive()605 fn partial_case_insensitive() {
606 fn test(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
607 tag(Caseless("ABcd")).parse_peek(i)
608 }
609 assert_eq!(
610 test(Partial::new(&b"aBCdefgh"[..])),
611 Ok((Partial::new(&b"efgh"[..]), &b"aBCd"[..]))
612 );
613 assert_eq!(
614 test(Partial::new(&b"abcdefgh"[..])),
615 Ok((Partial::new(&b"efgh"[..]), &b"abcd"[..]))
616 );
617 assert_eq!(
618 test(Partial::new(&b"ABCDefgh"[..])),
619 Ok((Partial::new(&b"efgh"[..]), &b"ABCD"[..]))
620 );
621 assert_eq!(
622 test(Partial::new(&b"ab"[..])),
623 Err(ErrMode::Incomplete(Needed::new(2)))
624 );
625 assert_eq!(
626 test(Partial::new(&b"Hello"[..])),
627 Err(ErrMode::Backtrack(error_position!(
628 &Partial::new(&b"Hello"[..]),
629 ErrorKind::Tag
630 )))
631 );
632 assert_eq!(
633 test(Partial::new(&b"Hel"[..])),
634 Err(ErrMode::Backtrack(error_position!(
635 &Partial::new(&b"Hel"[..]),
636 ErrorKind::Tag
637 )))
638 );
639
640 fn test2(i: Partial<&str>) -> IResult<Partial<&str>, &str> {
641 tag(Caseless("ABcd")).parse_peek(i)
642 }
643 assert_eq!(
644 test2(Partial::new("aBCdefgh")),
645 Ok((Partial::new("efgh"), "aBCd"))
646 );
647 assert_eq!(
648 test2(Partial::new("abcdefgh")),
649 Ok((Partial::new("efgh"), "abcd"))
650 );
651 assert_eq!(
652 test2(Partial::new("ABCDefgh")),
653 Ok((Partial::new("efgh"), "ABCD"))
654 );
655 assert_eq!(
656 test2(Partial::new("ab")),
657 Err(ErrMode::Incomplete(Needed::new(2)))
658 );
659 assert_eq!(
660 test2(Partial::new("Hello")),
661 Err(ErrMode::Backtrack(error_position!(
662 &Partial::new("Hello"),
663 ErrorKind::Tag
664 )))
665 );
666 assert_eq!(
667 test2(Partial::new("Hel")),
668 Err(ErrMode::Backtrack(error_position!(
669 &Partial::new("Hel"),
670 ErrorKind::Tag
671 )))
672 );
673 }
674
675 #[test]
partial_tag_fixed_size_array()676 fn partial_tag_fixed_size_array() {
677 fn test(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
678 tag([0x42]).parse_peek(i)
679 }
680 fn test2(i: Partial<&[u8]>) -> IResult<Partial<&[u8]>, &[u8]> {
681 tag(&[0x42]).parse_peek(i)
682 }
683 let input = Partial::new(&[0x42, 0x00][..]);
684 assert_eq!(test(input), Ok((Partial::new(&b"\x00"[..]), &b"\x42"[..])));
685 assert_eq!(test2(input), Ok((Partial::new(&b"\x00"[..]), &b"\x42"[..])));
686 }
687