16855e09eSopenharmony_ciuse crate::character::is_alphabetic; 26855e09eSopenharmony_ciuse crate::character::streaming::{ 36855e09eSopenharmony_ci alpha1 as alpha, alphanumeric1 as alphanumeric, digit1 as digit, hex_digit1 as hex_digit, 46855e09eSopenharmony_ci multispace1 as multispace, oct_digit1 as oct_digit, space1 as space, 56855e09eSopenharmony_ci}; 66855e09eSopenharmony_ciuse crate::error::ErrorKind; 76855e09eSopenharmony_ciuse crate::internal::{Err, IResult, Needed}; 86855e09eSopenharmony_ci#[cfg(feature = "alloc")] 96855e09eSopenharmony_ciuse crate::{ 106855e09eSopenharmony_ci branch::alt, 116855e09eSopenharmony_ci bytes::complete::{escaped, escaped_transform, tag}, 126855e09eSopenharmony_ci combinator::{map, value}, 136855e09eSopenharmony_ci lib::std::string::String, 146855e09eSopenharmony_ci lib::std::vec::Vec, 156855e09eSopenharmony_ci}; 166855e09eSopenharmony_ci 176855e09eSopenharmony_ci#[test] 186855e09eSopenharmony_cifn is_a() { 196855e09eSopenharmony_ci use crate::bytes::streaming::is_a; 206855e09eSopenharmony_ci 216855e09eSopenharmony_ci fn a_or_b(i: &[u8]) -> IResult<&[u8], &[u8]> { 226855e09eSopenharmony_ci is_a("ab")(i) 236855e09eSopenharmony_ci } 246855e09eSopenharmony_ci 256855e09eSopenharmony_ci let a = &b"abcd"[..]; 266855e09eSopenharmony_ci assert_eq!(a_or_b(a), Ok((&b"cd"[..], &b"ab"[..]))); 276855e09eSopenharmony_ci 286855e09eSopenharmony_ci let b = &b"bcde"[..]; 296855e09eSopenharmony_ci assert_eq!(a_or_b(b), Ok((&b"cde"[..], &b"b"[..]))); 306855e09eSopenharmony_ci 316855e09eSopenharmony_ci let c = &b"cdef"[..]; 326855e09eSopenharmony_ci assert_eq!( 336855e09eSopenharmony_ci a_or_b(c), 346855e09eSopenharmony_ci Err(Err::Error(error_position!(c, ErrorKind::IsA))) 356855e09eSopenharmony_ci ); 366855e09eSopenharmony_ci 376855e09eSopenharmony_ci let d = &b"bacdef"[..]; 386855e09eSopenharmony_ci assert_eq!(a_or_b(d), Ok((&b"cdef"[..], &b"ba"[..]))); 396855e09eSopenharmony_ci} 406855e09eSopenharmony_ci 416855e09eSopenharmony_ci#[test] 426855e09eSopenharmony_cifn is_not() { 436855e09eSopenharmony_ci use crate::bytes::streaming::is_not; 446855e09eSopenharmony_ci 456855e09eSopenharmony_ci fn a_or_b(i: &[u8]) -> IResult<&[u8], &[u8]> { 466855e09eSopenharmony_ci is_not("ab")(i) 476855e09eSopenharmony_ci } 486855e09eSopenharmony_ci 496855e09eSopenharmony_ci let a = &b"cdab"[..]; 506855e09eSopenharmony_ci assert_eq!(a_or_b(a), Ok((&b"ab"[..], &b"cd"[..]))); 516855e09eSopenharmony_ci 526855e09eSopenharmony_ci let b = &b"cbde"[..]; 536855e09eSopenharmony_ci assert_eq!(a_or_b(b), Ok((&b"bde"[..], &b"c"[..]))); 546855e09eSopenharmony_ci 556855e09eSopenharmony_ci let c = &b"abab"[..]; 566855e09eSopenharmony_ci assert_eq!( 576855e09eSopenharmony_ci a_or_b(c), 586855e09eSopenharmony_ci Err(Err::Error(error_position!(c, ErrorKind::IsNot))) 596855e09eSopenharmony_ci ); 606855e09eSopenharmony_ci 616855e09eSopenharmony_ci let d = &b"cdefba"[..]; 626855e09eSopenharmony_ci assert_eq!(a_or_b(d), Ok((&b"ba"[..], &b"cdef"[..]))); 636855e09eSopenharmony_ci 646855e09eSopenharmony_ci let e = &b"e"[..]; 656855e09eSopenharmony_ci assert_eq!(a_or_b(e), Err(Err::Incomplete(Needed::new(1)))); 666855e09eSopenharmony_ci} 676855e09eSopenharmony_ci 686855e09eSopenharmony_ci#[cfg(feature = "alloc")] 696855e09eSopenharmony_ci#[allow(unused_variables)] 706855e09eSopenharmony_ci#[test] 716855e09eSopenharmony_cifn escaping() { 726855e09eSopenharmony_ci use crate::character::streaming::one_of; 736855e09eSopenharmony_ci 746855e09eSopenharmony_ci fn esc(i: &[u8]) -> IResult<&[u8], &[u8]> { 756855e09eSopenharmony_ci escaped(alpha, '\\', one_of("\"n\\"))(i) 766855e09eSopenharmony_ci } 776855e09eSopenharmony_ci assert_eq!(esc(&b"abcd;"[..]), Ok((&b";"[..], &b"abcd"[..]))); 786855e09eSopenharmony_ci assert_eq!(esc(&b"ab\\\"cd;"[..]), Ok((&b";"[..], &b"ab\\\"cd"[..]))); 796855e09eSopenharmony_ci assert_eq!(esc(&b"\\\"abcd;"[..]), Ok((&b";"[..], &b"\\\"abcd"[..]))); 806855e09eSopenharmony_ci assert_eq!(esc(&b"\\n;"[..]), Ok((&b";"[..], &b"\\n"[..]))); 816855e09eSopenharmony_ci assert_eq!(esc(&b"ab\\\"12"[..]), Ok((&b"12"[..], &b"ab\\\""[..]))); 826855e09eSopenharmony_ci assert_eq!( 836855e09eSopenharmony_ci esc(&b"AB\\"[..]), 846855e09eSopenharmony_ci Err(Err::Error(error_position!( 856855e09eSopenharmony_ci &b"AB\\"[..], 866855e09eSopenharmony_ci ErrorKind::Escaped 876855e09eSopenharmony_ci ))) 886855e09eSopenharmony_ci ); 896855e09eSopenharmony_ci assert_eq!( 906855e09eSopenharmony_ci esc(&b"AB\\A"[..]), 916855e09eSopenharmony_ci Err(Err::Error(error_node_position!( 926855e09eSopenharmony_ci &b"AB\\A"[..], 936855e09eSopenharmony_ci ErrorKind::Escaped, 946855e09eSopenharmony_ci error_position!(&b"A"[..], ErrorKind::OneOf) 956855e09eSopenharmony_ci ))) 966855e09eSopenharmony_ci ); 976855e09eSopenharmony_ci 986855e09eSopenharmony_ci fn esc2(i: &[u8]) -> IResult<&[u8], &[u8]> { 996855e09eSopenharmony_ci escaped(digit, '\\', one_of("\"n\\"))(i) 1006855e09eSopenharmony_ci } 1016855e09eSopenharmony_ci assert_eq!(esc2(&b"12\\nnn34"[..]), Ok((&b"nn34"[..], &b"12\\n"[..]))); 1026855e09eSopenharmony_ci} 1036855e09eSopenharmony_ci 1046855e09eSopenharmony_ci#[cfg(feature = "alloc")] 1056855e09eSopenharmony_ci#[test] 1066855e09eSopenharmony_cifn escaping_str() { 1076855e09eSopenharmony_ci use crate::character::streaming::one_of; 1086855e09eSopenharmony_ci 1096855e09eSopenharmony_ci fn esc(i: &str) -> IResult<&str, &str> { 1106855e09eSopenharmony_ci escaped(alpha, '\\', one_of("\"n\\"))(i) 1116855e09eSopenharmony_ci } 1126855e09eSopenharmony_ci assert_eq!(esc("abcd;"), Ok((";", "abcd"))); 1136855e09eSopenharmony_ci assert_eq!(esc("ab\\\"cd;"), Ok((";", "ab\\\"cd"))); 1146855e09eSopenharmony_ci assert_eq!(esc("\\\"abcd;"), Ok((";", "\\\"abcd"))); 1156855e09eSopenharmony_ci assert_eq!(esc("\\n;"), Ok((";", "\\n"))); 1166855e09eSopenharmony_ci assert_eq!(esc("ab\\\"12"), Ok(("12", "ab\\\""))); 1176855e09eSopenharmony_ci assert_eq!( 1186855e09eSopenharmony_ci esc("AB\\"), 1196855e09eSopenharmony_ci Err(Err::Error(error_position!("AB\\", ErrorKind::Escaped))) 1206855e09eSopenharmony_ci ); 1216855e09eSopenharmony_ci assert_eq!( 1226855e09eSopenharmony_ci esc("AB\\A"), 1236855e09eSopenharmony_ci Err(Err::Error(error_node_position!( 1246855e09eSopenharmony_ci "AB\\A", 1256855e09eSopenharmony_ci ErrorKind::Escaped, 1266855e09eSopenharmony_ci error_position!("A", ErrorKind::OneOf) 1276855e09eSopenharmony_ci ))) 1286855e09eSopenharmony_ci ); 1296855e09eSopenharmony_ci 1306855e09eSopenharmony_ci fn esc2(i: &str) -> IResult<&str, &str> { 1316855e09eSopenharmony_ci escaped(digit, '\\', one_of("\"n\\"))(i) 1326855e09eSopenharmony_ci } 1336855e09eSopenharmony_ci assert_eq!(esc2("12\\nnn34"), Ok(("nn34", "12\\n"))); 1346855e09eSopenharmony_ci 1356855e09eSopenharmony_ci fn esc3(i: &str) -> IResult<&str, &str> { 1366855e09eSopenharmony_ci escaped(alpha, '\u{241b}', one_of("\"n"))(i) 1376855e09eSopenharmony_ci } 1386855e09eSopenharmony_ci assert_eq!(esc3("ab␛ncd;"), Ok((";", "ab␛ncd"))); 1396855e09eSopenharmony_ci} 1406855e09eSopenharmony_ci 1416855e09eSopenharmony_ci#[cfg(feature = "alloc")] 1426855e09eSopenharmony_cifn to_s(i: Vec<u8>) -> String { 1436855e09eSopenharmony_ci String::from_utf8_lossy(&i).into_owned() 1446855e09eSopenharmony_ci} 1456855e09eSopenharmony_ci 1466855e09eSopenharmony_ci#[cfg(feature = "alloc")] 1476855e09eSopenharmony_ci#[test] 1486855e09eSopenharmony_cifn escape_transform() { 1496855e09eSopenharmony_ci fn esc(i: &[u8]) -> IResult<&[u8], String> { 1506855e09eSopenharmony_ci map( 1516855e09eSopenharmony_ci escaped_transform( 1526855e09eSopenharmony_ci alpha, 1536855e09eSopenharmony_ci '\\', 1546855e09eSopenharmony_ci alt(( 1556855e09eSopenharmony_ci value(&b"\\"[..], tag("\\")), 1566855e09eSopenharmony_ci value(&b"\""[..], tag("\"")), 1576855e09eSopenharmony_ci value(&b"\n"[..], tag("n")), 1586855e09eSopenharmony_ci )), 1596855e09eSopenharmony_ci ), 1606855e09eSopenharmony_ci to_s, 1616855e09eSopenharmony_ci )(i) 1626855e09eSopenharmony_ci } 1636855e09eSopenharmony_ci 1646855e09eSopenharmony_ci assert_eq!(esc(&b"abcd;"[..]), Ok((&b";"[..], String::from("abcd")))); 1656855e09eSopenharmony_ci assert_eq!( 1666855e09eSopenharmony_ci esc(&b"ab\\\"cd;"[..]), 1676855e09eSopenharmony_ci Ok((&b";"[..], String::from("ab\"cd"))) 1686855e09eSopenharmony_ci ); 1696855e09eSopenharmony_ci assert_eq!( 1706855e09eSopenharmony_ci esc(&b"\\\"abcd;"[..]), 1716855e09eSopenharmony_ci Ok((&b";"[..], String::from("\"abcd"))) 1726855e09eSopenharmony_ci ); 1736855e09eSopenharmony_ci assert_eq!(esc(&b"\\n;"[..]), Ok((&b";"[..], String::from("\n")))); 1746855e09eSopenharmony_ci assert_eq!( 1756855e09eSopenharmony_ci esc(&b"ab\\\"12"[..]), 1766855e09eSopenharmony_ci Ok((&b"12"[..], String::from("ab\""))) 1776855e09eSopenharmony_ci ); 1786855e09eSopenharmony_ci assert_eq!( 1796855e09eSopenharmony_ci esc(&b"AB\\"[..]), 1806855e09eSopenharmony_ci Err(Err::Error(error_position!( 1816855e09eSopenharmony_ci &b"\\"[..], 1826855e09eSopenharmony_ci ErrorKind::EscapedTransform 1836855e09eSopenharmony_ci ))) 1846855e09eSopenharmony_ci ); 1856855e09eSopenharmony_ci assert_eq!( 1866855e09eSopenharmony_ci esc(&b"AB\\A"[..]), 1876855e09eSopenharmony_ci Err(Err::Error(error_node_position!( 1886855e09eSopenharmony_ci &b"AB\\A"[..], 1896855e09eSopenharmony_ci ErrorKind::EscapedTransform, 1906855e09eSopenharmony_ci error_position!(&b"A"[..], ErrorKind::Tag) 1916855e09eSopenharmony_ci ))) 1926855e09eSopenharmony_ci ); 1936855e09eSopenharmony_ci 1946855e09eSopenharmony_ci fn esc2(i: &[u8]) -> IResult<&[u8], String> { 1956855e09eSopenharmony_ci map( 1966855e09eSopenharmony_ci escaped_transform( 1976855e09eSopenharmony_ci alpha, 1986855e09eSopenharmony_ci '&', 1996855e09eSopenharmony_ci alt(( 2006855e09eSopenharmony_ci value("è".as_bytes(), tag("egrave;")), 2016855e09eSopenharmony_ci value("à".as_bytes(), tag("agrave;")), 2026855e09eSopenharmony_ci )), 2036855e09eSopenharmony_ci ), 2046855e09eSopenharmony_ci to_s, 2056855e09eSopenharmony_ci )(i) 2066855e09eSopenharmony_ci } 2076855e09eSopenharmony_ci assert_eq!( 2086855e09eSopenharmony_ci esc2(&b"abèDEF;"[..]), 2096855e09eSopenharmony_ci Ok((&b";"[..], String::from("abèDEF"))) 2106855e09eSopenharmony_ci ); 2116855e09eSopenharmony_ci assert_eq!( 2126855e09eSopenharmony_ci esc2(&b"abèDàEF;"[..]), 2136855e09eSopenharmony_ci Ok((&b";"[..], String::from("abèDàEF"))) 2146855e09eSopenharmony_ci ); 2156855e09eSopenharmony_ci} 2166855e09eSopenharmony_ci 2176855e09eSopenharmony_ci#[cfg(feature = "std")] 2186855e09eSopenharmony_ci#[test] 2196855e09eSopenharmony_cifn escape_transform_str() { 2206855e09eSopenharmony_ci fn esc(i: &str) -> IResult<&str, String> { 2216855e09eSopenharmony_ci escaped_transform( 2226855e09eSopenharmony_ci alpha, 2236855e09eSopenharmony_ci '\\', 2246855e09eSopenharmony_ci alt(( 2256855e09eSopenharmony_ci value("\\", tag("\\")), 2266855e09eSopenharmony_ci value("\"", tag("\"")), 2276855e09eSopenharmony_ci value("\n", tag("n")), 2286855e09eSopenharmony_ci )), 2296855e09eSopenharmony_ci )(i) 2306855e09eSopenharmony_ci } 2316855e09eSopenharmony_ci 2326855e09eSopenharmony_ci assert_eq!(esc("abcd;"), Ok((";", String::from("abcd")))); 2336855e09eSopenharmony_ci assert_eq!(esc("ab\\\"cd;"), Ok((";", String::from("ab\"cd")))); 2346855e09eSopenharmony_ci assert_eq!(esc("\\\"abcd;"), Ok((";", String::from("\"abcd")))); 2356855e09eSopenharmony_ci assert_eq!(esc("\\n;"), Ok((";", String::from("\n")))); 2366855e09eSopenharmony_ci assert_eq!(esc("ab\\\"12"), Ok(("12", String::from("ab\"")))); 2376855e09eSopenharmony_ci assert_eq!( 2386855e09eSopenharmony_ci esc("AB\\"), 2396855e09eSopenharmony_ci Err(Err::Error(error_position!( 2406855e09eSopenharmony_ci "\\", 2416855e09eSopenharmony_ci ErrorKind::EscapedTransform 2426855e09eSopenharmony_ci ))) 2436855e09eSopenharmony_ci ); 2446855e09eSopenharmony_ci assert_eq!( 2456855e09eSopenharmony_ci esc("AB\\A"), 2466855e09eSopenharmony_ci Err(Err::Error(error_node_position!( 2476855e09eSopenharmony_ci "AB\\A", 2486855e09eSopenharmony_ci ErrorKind::EscapedTransform, 2496855e09eSopenharmony_ci error_position!("A", ErrorKind::Tag) 2506855e09eSopenharmony_ci ))) 2516855e09eSopenharmony_ci ); 2526855e09eSopenharmony_ci 2536855e09eSopenharmony_ci fn esc2(i: &str) -> IResult<&str, String> { 2546855e09eSopenharmony_ci escaped_transform( 2556855e09eSopenharmony_ci alpha, 2566855e09eSopenharmony_ci '&', 2576855e09eSopenharmony_ci alt((value("è", tag("egrave;")), value("à", tag("agrave;")))), 2586855e09eSopenharmony_ci )(i) 2596855e09eSopenharmony_ci } 2606855e09eSopenharmony_ci assert_eq!(esc2("abèDEF;"), Ok((";", String::from("abèDEF")))); 2616855e09eSopenharmony_ci assert_eq!( 2626855e09eSopenharmony_ci esc2("abèDàEF;"), 2636855e09eSopenharmony_ci Ok((";", String::from("abèDàEF"))) 2646855e09eSopenharmony_ci ); 2656855e09eSopenharmony_ci 2666855e09eSopenharmony_ci fn esc3(i: &str) -> IResult<&str, String> { 2676855e09eSopenharmony_ci escaped_transform( 2686855e09eSopenharmony_ci alpha, 2696855e09eSopenharmony_ci '␛', 2706855e09eSopenharmony_ci alt((value("\0", tag("0")), value("\n", tag("n")))), 2716855e09eSopenharmony_ci )(i) 2726855e09eSopenharmony_ci } 2736855e09eSopenharmony_ci assert_eq!(esc3("a␛0bc␛n"), Ok(("", String::from("a\0bc\n")))); 2746855e09eSopenharmony_ci} 2756855e09eSopenharmony_ci 2766855e09eSopenharmony_ci#[test] 2776855e09eSopenharmony_cifn take_until_incomplete() { 2786855e09eSopenharmony_ci use crate::bytes::streaming::take_until; 2796855e09eSopenharmony_ci fn y(i: &[u8]) -> IResult<&[u8], &[u8]> { 2806855e09eSopenharmony_ci take_until("end")(i) 2816855e09eSopenharmony_ci } 2826855e09eSopenharmony_ci assert_eq!(y(&b"nd"[..]), Err(Err::Incomplete(Needed::Unknown))); 2836855e09eSopenharmony_ci assert_eq!(y(&b"123"[..]), Err(Err::Incomplete(Needed::Unknown))); 2846855e09eSopenharmony_ci assert_eq!(y(&b"123en"[..]), Err(Err::Incomplete(Needed::Unknown))); 2856855e09eSopenharmony_ci} 2866855e09eSopenharmony_ci 2876855e09eSopenharmony_ci#[test] 2886855e09eSopenharmony_cifn take_until_incomplete_s() { 2896855e09eSopenharmony_ci use crate::bytes::streaming::take_until; 2906855e09eSopenharmony_ci fn ys(i: &str) -> IResult<&str, &str> { 2916855e09eSopenharmony_ci take_until("end")(i) 2926855e09eSopenharmony_ci } 2936855e09eSopenharmony_ci assert_eq!(ys("123en"), Err(Err::Incomplete(Needed::Unknown))); 2946855e09eSopenharmony_ci} 2956855e09eSopenharmony_ci 2966855e09eSopenharmony_ci#[test] 2976855e09eSopenharmony_cifn recognize() { 2986855e09eSopenharmony_ci use crate::bytes::streaming::{tag, take}; 2996855e09eSopenharmony_ci use crate::combinator::recognize; 3006855e09eSopenharmony_ci use crate::sequence::delimited; 3016855e09eSopenharmony_ci 3026855e09eSopenharmony_ci fn x(i: &[u8]) -> IResult<&[u8], &[u8]> { 3036855e09eSopenharmony_ci recognize(delimited(tag("<!--"), take(5_usize), tag("-->")))(i) 3046855e09eSopenharmony_ci } 3056855e09eSopenharmony_ci let r = x(&b"<!-- abc --> aaa"[..]); 3066855e09eSopenharmony_ci assert_eq!(r, Ok((&b" aaa"[..], &b"<!-- abc -->"[..]))); 3076855e09eSopenharmony_ci 3086855e09eSopenharmony_ci let semicolon = &b";"[..]; 3096855e09eSopenharmony_ci 3106855e09eSopenharmony_ci fn ya(i: &[u8]) -> IResult<&[u8], &[u8]> { 3116855e09eSopenharmony_ci recognize(alpha)(i) 3126855e09eSopenharmony_ci } 3136855e09eSopenharmony_ci let ra = ya(&b"abc;"[..]); 3146855e09eSopenharmony_ci assert_eq!(ra, Ok((semicolon, &b"abc"[..]))); 3156855e09eSopenharmony_ci 3166855e09eSopenharmony_ci fn yd(i: &[u8]) -> IResult<&[u8], &[u8]> { 3176855e09eSopenharmony_ci recognize(digit)(i) 3186855e09eSopenharmony_ci } 3196855e09eSopenharmony_ci let rd = yd(&b"123;"[..]); 3206855e09eSopenharmony_ci assert_eq!(rd, Ok((semicolon, &b"123"[..]))); 3216855e09eSopenharmony_ci 3226855e09eSopenharmony_ci fn yhd(i: &[u8]) -> IResult<&[u8], &[u8]> { 3236855e09eSopenharmony_ci recognize(hex_digit)(i) 3246855e09eSopenharmony_ci } 3256855e09eSopenharmony_ci let rhd = yhd(&b"123abcDEF;"[..]); 3266855e09eSopenharmony_ci assert_eq!(rhd, Ok((semicolon, &b"123abcDEF"[..]))); 3276855e09eSopenharmony_ci 3286855e09eSopenharmony_ci fn yod(i: &[u8]) -> IResult<&[u8], &[u8]> { 3296855e09eSopenharmony_ci recognize(oct_digit)(i) 3306855e09eSopenharmony_ci } 3316855e09eSopenharmony_ci let rod = yod(&b"1234567;"[..]); 3326855e09eSopenharmony_ci assert_eq!(rod, Ok((semicolon, &b"1234567"[..]))); 3336855e09eSopenharmony_ci 3346855e09eSopenharmony_ci fn yan(i: &[u8]) -> IResult<&[u8], &[u8]> { 3356855e09eSopenharmony_ci recognize(alphanumeric)(i) 3366855e09eSopenharmony_ci } 3376855e09eSopenharmony_ci let ran = yan(&b"123abc;"[..]); 3386855e09eSopenharmony_ci assert_eq!(ran, Ok((semicolon, &b"123abc"[..]))); 3396855e09eSopenharmony_ci 3406855e09eSopenharmony_ci fn ys(i: &[u8]) -> IResult<&[u8], &[u8]> { 3416855e09eSopenharmony_ci recognize(space)(i) 3426855e09eSopenharmony_ci } 3436855e09eSopenharmony_ci let rs = ys(&b" \t;"[..]); 3446855e09eSopenharmony_ci assert_eq!(rs, Ok((semicolon, &b" \t"[..]))); 3456855e09eSopenharmony_ci 3466855e09eSopenharmony_ci fn yms(i: &[u8]) -> IResult<&[u8], &[u8]> { 3476855e09eSopenharmony_ci recognize(multispace)(i) 3486855e09eSopenharmony_ci } 3496855e09eSopenharmony_ci let rms = yms(&b" \t\r\n;"[..]); 3506855e09eSopenharmony_ci assert_eq!(rms, Ok((semicolon, &b" \t\r\n"[..]))); 3516855e09eSopenharmony_ci} 3526855e09eSopenharmony_ci 3536855e09eSopenharmony_ci#[test] 3546855e09eSopenharmony_cifn take_while() { 3556855e09eSopenharmony_ci use crate::bytes::streaming::take_while; 3566855e09eSopenharmony_ci 3576855e09eSopenharmony_ci fn f(i: &[u8]) -> IResult<&[u8], &[u8]> { 3586855e09eSopenharmony_ci take_while(is_alphabetic)(i) 3596855e09eSopenharmony_ci } 3606855e09eSopenharmony_ci let a = b""; 3616855e09eSopenharmony_ci let b = b"abcd"; 3626855e09eSopenharmony_ci let c = b"abcd123"; 3636855e09eSopenharmony_ci let d = b"123"; 3646855e09eSopenharmony_ci 3656855e09eSopenharmony_ci assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::new(1)))); 3666855e09eSopenharmony_ci assert_eq!(f(&b[..]), Err(Err::Incomplete(Needed::new(1)))); 3676855e09eSopenharmony_ci assert_eq!(f(&c[..]), Ok((&d[..], &b[..]))); 3686855e09eSopenharmony_ci assert_eq!(f(&d[..]), Ok((&d[..], &a[..]))); 3696855e09eSopenharmony_ci} 3706855e09eSopenharmony_ci 3716855e09eSopenharmony_ci#[test] 3726855e09eSopenharmony_cifn take_while1() { 3736855e09eSopenharmony_ci use crate::bytes::streaming::take_while1; 3746855e09eSopenharmony_ci 3756855e09eSopenharmony_ci fn f(i: &[u8]) -> IResult<&[u8], &[u8]> { 3766855e09eSopenharmony_ci take_while1(is_alphabetic)(i) 3776855e09eSopenharmony_ci } 3786855e09eSopenharmony_ci let a = b""; 3796855e09eSopenharmony_ci let b = b"abcd"; 3806855e09eSopenharmony_ci let c = b"abcd123"; 3816855e09eSopenharmony_ci let d = b"123"; 3826855e09eSopenharmony_ci 3836855e09eSopenharmony_ci assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::new(1)))); 3846855e09eSopenharmony_ci assert_eq!(f(&b[..]), Err(Err::Incomplete(Needed::new(1)))); 3856855e09eSopenharmony_ci assert_eq!(f(&c[..]), Ok((&b"123"[..], &b[..]))); 3866855e09eSopenharmony_ci assert_eq!( 3876855e09eSopenharmony_ci f(&d[..]), 3886855e09eSopenharmony_ci Err(Err::Error(error_position!(&d[..], ErrorKind::TakeWhile1))) 3896855e09eSopenharmony_ci ); 3906855e09eSopenharmony_ci} 3916855e09eSopenharmony_ci 3926855e09eSopenharmony_ci#[test] 3936855e09eSopenharmony_cifn take_while_m_n() { 3946855e09eSopenharmony_ci use crate::bytes::streaming::take_while_m_n; 3956855e09eSopenharmony_ci 3966855e09eSopenharmony_ci fn x(i: &[u8]) -> IResult<&[u8], &[u8]> { 3976855e09eSopenharmony_ci take_while_m_n(2, 4, is_alphabetic)(i) 3986855e09eSopenharmony_ci } 3996855e09eSopenharmony_ci let a = b""; 4006855e09eSopenharmony_ci let b = b"a"; 4016855e09eSopenharmony_ci let c = b"abc"; 4026855e09eSopenharmony_ci let d = b"abc123"; 4036855e09eSopenharmony_ci let e = b"abcde"; 4046855e09eSopenharmony_ci let f = b"123"; 4056855e09eSopenharmony_ci 4066855e09eSopenharmony_ci assert_eq!(x(&a[..]), Err(Err::Incomplete(Needed::new(2)))); 4076855e09eSopenharmony_ci assert_eq!(x(&b[..]), Err(Err::Incomplete(Needed::new(1)))); 4086855e09eSopenharmony_ci assert_eq!(x(&c[..]), Err(Err::Incomplete(Needed::new(1)))); 4096855e09eSopenharmony_ci assert_eq!(x(&d[..]), Ok((&b"123"[..], &c[..]))); 4106855e09eSopenharmony_ci assert_eq!(x(&e[..]), Ok((&b"e"[..], &b"abcd"[..]))); 4116855e09eSopenharmony_ci assert_eq!( 4126855e09eSopenharmony_ci x(&f[..]), 4136855e09eSopenharmony_ci Err(Err::Error(error_position!(&f[..], ErrorKind::TakeWhileMN))) 4146855e09eSopenharmony_ci ); 4156855e09eSopenharmony_ci} 4166855e09eSopenharmony_ci 4176855e09eSopenharmony_ci#[test] 4186855e09eSopenharmony_cifn take_till() { 4196855e09eSopenharmony_ci use crate::bytes::streaming::take_till; 4206855e09eSopenharmony_ci 4216855e09eSopenharmony_ci fn f(i: &[u8]) -> IResult<&[u8], &[u8]> { 4226855e09eSopenharmony_ci take_till(is_alphabetic)(i) 4236855e09eSopenharmony_ci } 4246855e09eSopenharmony_ci let a = b""; 4256855e09eSopenharmony_ci let b = b"abcd"; 4266855e09eSopenharmony_ci let c = b"123abcd"; 4276855e09eSopenharmony_ci let d = b"123"; 4286855e09eSopenharmony_ci 4296855e09eSopenharmony_ci assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::new(1)))); 4306855e09eSopenharmony_ci assert_eq!(f(&b[..]), Ok((&b"abcd"[..], &b""[..]))); 4316855e09eSopenharmony_ci assert_eq!(f(&c[..]), Ok((&b"abcd"[..], &b"123"[..]))); 4326855e09eSopenharmony_ci assert_eq!(f(&d[..]), Err(Err::Incomplete(Needed::new(1)))); 4336855e09eSopenharmony_ci} 4346855e09eSopenharmony_ci 4356855e09eSopenharmony_ci#[test] 4366855e09eSopenharmony_cifn take_till1() { 4376855e09eSopenharmony_ci use crate::bytes::streaming::take_till1; 4386855e09eSopenharmony_ci 4396855e09eSopenharmony_ci fn f(i: &[u8]) -> IResult<&[u8], &[u8]> { 4406855e09eSopenharmony_ci take_till1(is_alphabetic)(i) 4416855e09eSopenharmony_ci } 4426855e09eSopenharmony_ci let a = b""; 4436855e09eSopenharmony_ci let b = b"abcd"; 4446855e09eSopenharmony_ci let c = b"123abcd"; 4456855e09eSopenharmony_ci let d = b"123"; 4466855e09eSopenharmony_ci 4476855e09eSopenharmony_ci assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::new(1)))); 4486855e09eSopenharmony_ci assert_eq!( 4496855e09eSopenharmony_ci f(&b[..]), 4506855e09eSopenharmony_ci Err(Err::Error(error_position!(&b[..], ErrorKind::TakeTill1))) 4516855e09eSopenharmony_ci ); 4526855e09eSopenharmony_ci assert_eq!(f(&c[..]), Ok((&b"abcd"[..], &b"123"[..]))); 4536855e09eSopenharmony_ci assert_eq!(f(&d[..]), Err(Err::Incomplete(Needed::new(1)))); 4546855e09eSopenharmony_ci} 4556855e09eSopenharmony_ci 4566855e09eSopenharmony_ci#[test] 4576855e09eSopenharmony_cifn take_while_utf8() { 4586855e09eSopenharmony_ci use crate::bytes::streaming::take_while; 4596855e09eSopenharmony_ci 4606855e09eSopenharmony_ci fn f(i: &str) -> IResult<&str, &str> { 4616855e09eSopenharmony_ci take_while(|c| c != '點')(i) 4626855e09eSopenharmony_ci } 4636855e09eSopenharmony_ci 4646855e09eSopenharmony_ci assert_eq!(f(""), Err(Err::Incomplete(Needed::new(1)))); 4656855e09eSopenharmony_ci assert_eq!(f("abcd"), Err(Err::Incomplete(Needed::new(1)))); 4666855e09eSopenharmony_ci assert_eq!(f("abcd點"), Ok(("點", "abcd"))); 4676855e09eSopenharmony_ci assert_eq!(f("abcd點a"), Ok(("點a", "abcd"))); 4686855e09eSopenharmony_ci 4696855e09eSopenharmony_ci fn g(i: &str) -> IResult<&str, &str> { 4706855e09eSopenharmony_ci take_while(|c| c == '點')(i) 4716855e09eSopenharmony_ci } 4726855e09eSopenharmony_ci 4736855e09eSopenharmony_ci assert_eq!(g(""), Err(Err::Incomplete(Needed::new(1)))); 4746855e09eSopenharmony_ci assert_eq!(g("點abcd"), Ok(("abcd", "點"))); 4756855e09eSopenharmony_ci assert_eq!(g("點點點a"), Ok(("a", "點點點"))); 4766855e09eSopenharmony_ci} 4776855e09eSopenharmony_ci 4786855e09eSopenharmony_ci#[test] 4796855e09eSopenharmony_cifn take_till_utf8() { 4806855e09eSopenharmony_ci use crate::bytes::streaming::take_till; 4816855e09eSopenharmony_ci 4826855e09eSopenharmony_ci fn f(i: &str) -> IResult<&str, &str> { 4836855e09eSopenharmony_ci take_till(|c| c == '點')(i) 4846855e09eSopenharmony_ci } 4856855e09eSopenharmony_ci 4866855e09eSopenharmony_ci assert_eq!(f(""), Err(Err::Incomplete(Needed::new(1)))); 4876855e09eSopenharmony_ci assert_eq!(f("abcd"), Err(Err::Incomplete(Needed::new(1)))); 4886855e09eSopenharmony_ci assert_eq!(f("abcd點"), Ok(("點", "abcd"))); 4896855e09eSopenharmony_ci assert_eq!(f("abcd點a"), Ok(("點a", "abcd"))); 4906855e09eSopenharmony_ci 4916855e09eSopenharmony_ci fn g(i: &str) -> IResult<&str, &str> { 4926855e09eSopenharmony_ci take_till(|c| c != '點')(i) 4936855e09eSopenharmony_ci } 4946855e09eSopenharmony_ci 4956855e09eSopenharmony_ci assert_eq!(g(""), Err(Err::Incomplete(Needed::new(1)))); 4966855e09eSopenharmony_ci assert_eq!(g("點abcd"), Ok(("abcd", "點"))); 4976855e09eSopenharmony_ci assert_eq!(g("點點點a"), Ok(("a", "點點點"))); 4986855e09eSopenharmony_ci} 4996855e09eSopenharmony_ci 5006855e09eSopenharmony_ci#[test] 5016855e09eSopenharmony_cifn take_utf8() { 5026855e09eSopenharmony_ci use crate::bytes::streaming::{take, take_while}; 5036855e09eSopenharmony_ci 5046855e09eSopenharmony_ci fn f(i: &str) -> IResult<&str, &str> { 5056855e09eSopenharmony_ci take(3_usize)(i) 5066855e09eSopenharmony_ci } 5076855e09eSopenharmony_ci 5086855e09eSopenharmony_ci assert_eq!(f(""), Err(Err::Incomplete(Needed::Unknown))); 5096855e09eSopenharmony_ci assert_eq!(f("ab"), Err(Err::Incomplete(Needed::Unknown))); 5106855e09eSopenharmony_ci assert_eq!(f("點"), Err(Err::Incomplete(Needed::Unknown))); 5116855e09eSopenharmony_ci assert_eq!(f("ab點cd"), Ok(("cd", "ab點"))); 5126855e09eSopenharmony_ci assert_eq!(f("a點bcd"), Ok(("cd", "a點b"))); 5136855e09eSopenharmony_ci assert_eq!(f("a點b"), Ok(("", "a點b"))); 5146855e09eSopenharmony_ci 5156855e09eSopenharmony_ci fn g(i: &str) -> IResult<&str, &str> { 5166855e09eSopenharmony_ci take_while(|c| c == '點')(i) 5176855e09eSopenharmony_ci } 5186855e09eSopenharmony_ci 5196855e09eSopenharmony_ci assert_eq!(g(""), Err(Err::Incomplete(Needed::new(1)))); 5206855e09eSopenharmony_ci assert_eq!(g("點abcd"), Ok(("abcd", "點"))); 5216855e09eSopenharmony_ci assert_eq!(g("點點點a"), Ok(("a", "點點點"))); 5226855e09eSopenharmony_ci} 5236855e09eSopenharmony_ci 5246855e09eSopenharmony_ci#[test] 5256855e09eSopenharmony_cifn take_while_m_n_utf8() { 5266855e09eSopenharmony_ci use crate::bytes::streaming::take_while_m_n; 5276855e09eSopenharmony_ci 5286855e09eSopenharmony_ci fn parser(i: &str) -> IResult<&str, &str> { 5296855e09eSopenharmony_ci take_while_m_n(1, 1, |c| c == 'A' || c == '')(i) 5306855e09eSopenharmony_ci } 5316855e09eSopenharmony_ci assert_eq!(parser("A!"), Ok(("!", "A"))); 5326855e09eSopenharmony_ci assert_eq!(parser("!"), Ok(("!", ""))); 5336855e09eSopenharmony_ci} 5346855e09eSopenharmony_ci 5356855e09eSopenharmony_ci#[test] 5366855e09eSopenharmony_cifn take_while_m_n_utf8_full_match() { 5376855e09eSopenharmony_ci use crate::bytes::streaming::take_while_m_n; 5386855e09eSopenharmony_ci 5396855e09eSopenharmony_ci fn parser(i: &str) -> IResult<&str, &str> { 5406855e09eSopenharmony_ci take_while_m_n(1, 1, |c: char| c.is_alphabetic())(i) 5416855e09eSopenharmony_ci } 5426855e09eSopenharmony_ci assert_eq!(parser("øn"), Ok(("n", "ø"))); 5436855e09eSopenharmony_ci} 5446855e09eSopenharmony_ci 5456855e09eSopenharmony_ci#[test] 5466855e09eSopenharmony_ci#[cfg(feature = "std")] 5476855e09eSopenharmony_cifn recognize_take_while() { 5486855e09eSopenharmony_ci use crate::bytes::streaming::take_while; 5496855e09eSopenharmony_ci use crate::character::is_alphanumeric; 5506855e09eSopenharmony_ci use crate::combinator::recognize; 5516855e09eSopenharmony_ci 5526855e09eSopenharmony_ci fn x(i: &[u8]) -> IResult<&[u8], &[u8]> { 5536855e09eSopenharmony_ci take_while(is_alphanumeric)(i) 5546855e09eSopenharmony_ci } 5556855e09eSopenharmony_ci fn y(i: &[u8]) -> IResult<&[u8], &[u8]> { 5566855e09eSopenharmony_ci recognize(x)(i) 5576855e09eSopenharmony_ci } 5586855e09eSopenharmony_ci assert_eq!(x(&b"ab."[..]), Ok((&b"."[..], &b"ab"[..]))); 5596855e09eSopenharmony_ci println!("X: {:?}", x(&b"ab"[..])); 5606855e09eSopenharmony_ci assert_eq!(y(&b"ab."[..]), Ok((&b"."[..], &b"ab"[..]))); 5616855e09eSopenharmony_ci} 5626855e09eSopenharmony_ci 5636855e09eSopenharmony_ci#[test] 5646855e09eSopenharmony_cifn length_bytes() { 5656855e09eSopenharmony_ci use crate::{bytes::streaming::tag, multi::length_data, number::streaming::le_u8}; 5666855e09eSopenharmony_ci 5676855e09eSopenharmony_ci fn x(i: &[u8]) -> IResult<&[u8], &[u8]> { 5686855e09eSopenharmony_ci length_data(le_u8)(i) 5696855e09eSopenharmony_ci } 5706855e09eSopenharmony_ci assert_eq!(x(b"\x02..>>"), Ok((&b">>"[..], &b".."[..]))); 5716855e09eSopenharmony_ci assert_eq!(x(b"\x02.."), Ok((&[][..], &b".."[..]))); 5726855e09eSopenharmony_ci assert_eq!(x(b"\x02."), Err(Err::Incomplete(Needed::new(1)))); 5736855e09eSopenharmony_ci assert_eq!(x(b"\x02"), Err(Err::Incomplete(Needed::new(2)))); 5746855e09eSopenharmony_ci 5756855e09eSopenharmony_ci fn y(i: &[u8]) -> IResult<&[u8], &[u8]> { 5766855e09eSopenharmony_ci let (i, _) = tag("magic")(i)?; 5776855e09eSopenharmony_ci length_data(le_u8)(i) 5786855e09eSopenharmony_ci } 5796855e09eSopenharmony_ci assert_eq!(y(b"magic\x02..>>"), Ok((&b">>"[..], &b".."[..]))); 5806855e09eSopenharmony_ci assert_eq!(y(b"magic\x02.."), Ok((&[][..], &b".."[..]))); 5816855e09eSopenharmony_ci assert_eq!(y(b"magic\x02."), Err(Err::Incomplete(Needed::new(1)))); 5826855e09eSopenharmony_ci assert_eq!(y(b"magic\x02"), Err(Err::Incomplete(Needed::new(2)))); 5836855e09eSopenharmony_ci} 5846855e09eSopenharmony_ci 5856855e09eSopenharmony_ci#[cfg(feature = "alloc")] 5866855e09eSopenharmony_ci#[test] 5876855e09eSopenharmony_cifn case_insensitive() { 5886855e09eSopenharmony_ci use crate::bytes::streaming::tag_no_case; 5896855e09eSopenharmony_ci 5906855e09eSopenharmony_ci fn test(i: &[u8]) -> IResult<&[u8], &[u8]> { 5916855e09eSopenharmony_ci tag_no_case("ABcd")(i) 5926855e09eSopenharmony_ci } 5936855e09eSopenharmony_ci assert_eq!(test(&b"aBCdefgh"[..]), Ok((&b"efgh"[..], &b"aBCd"[..]))); 5946855e09eSopenharmony_ci assert_eq!(test(&b"abcdefgh"[..]), Ok((&b"efgh"[..], &b"abcd"[..]))); 5956855e09eSopenharmony_ci assert_eq!(test(&b"ABCDefgh"[..]), Ok((&b"efgh"[..], &b"ABCD"[..]))); 5966855e09eSopenharmony_ci assert_eq!(test(&b"ab"[..]), Err(Err::Incomplete(Needed::new(2)))); 5976855e09eSopenharmony_ci assert_eq!( 5986855e09eSopenharmony_ci test(&b"Hello"[..]), 5996855e09eSopenharmony_ci Err(Err::Error(error_position!(&b"Hello"[..], ErrorKind::Tag))) 6006855e09eSopenharmony_ci ); 6016855e09eSopenharmony_ci assert_eq!( 6026855e09eSopenharmony_ci test(&b"Hel"[..]), 6036855e09eSopenharmony_ci Err(Err::Error(error_position!(&b"Hel"[..], ErrorKind::Tag))) 6046855e09eSopenharmony_ci ); 6056855e09eSopenharmony_ci 6066855e09eSopenharmony_ci fn test2(i: &str) -> IResult<&str, &str> { 6076855e09eSopenharmony_ci tag_no_case("ABcd")(i) 6086855e09eSopenharmony_ci } 6096855e09eSopenharmony_ci assert_eq!(test2("aBCdefgh"), Ok(("efgh", "aBCd"))); 6106855e09eSopenharmony_ci assert_eq!(test2("abcdefgh"), Ok(("efgh", "abcd"))); 6116855e09eSopenharmony_ci assert_eq!(test2("ABCDefgh"), Ok(("efgh", "ABCD"))); 6126855e09eSopenharmony_ci assert_eq!(test2("ab"), Err(Err::Incomplete(Needed::new(2)))); 6136855e09eSopenharmony_ci assert_eq!( 6146855e09eSopenharmony_ci test2("Hello"), 6156855e09eSopenharmony_ci Err(Err::Error(error_position!(&"Hello"[..], ErrorKind::Tag))) 6166855e09eSopenharmony_ci ); 6176855e09eSopenharmony_ci assert_eq!( 6186855e09eSopenharmony_ci test2("Hel"), 6196855e09eSopenharmony_ci Err(Err::Error(error_position!(&"Hel"[..], ErrorKind::Tag))) 6206855e09eSopenharmony_ci ); 6216855e09eSopenharmony_ci} 6226855e09eSopenharmony_ci 6236855e09eSopenharmony_ci#[test] 6246855e09eSopenharmony_cifn tag_fixed_size_array() { 6256855e09eSopenharmony_ci use crate::bytes::streaming::tag; 6266855e09eSopenharmony_ci 6276855e09eSopenharmony_ci fn test(i: &[u8]) -> IResult<&[u8], &[u8]> { 6286855e09eSopenharmony_ci tag([0x42])(i) 6296855e09eSopenharmony_ci } 6306855e09eSopenharmony_ci fn test2(i: &[u8]) -> IResult<&[u8], &[u8]> { 6316855e09eSopenharmony_ci tag(&[0x42])(i) 6326855e09eSopenharmony_ci } 6336855e09eSopenharmony_ci let input = [0x42, 0x00]; 6346855e09eSopenharmony_ci assert_eq!(test(&input), Ok((&b"\x00"[..], &b"\x42"[..]))); 6356855e09eSopenharmony_ci assert_eq!(test2(&input), Ok((&b"\x00"[..], &b"\x42"[..]))); 6366855e09eSopenharmony_ci} 637