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&egrave;DEF;"[..]),
2096855e09eSopenharmony_ci    Ok((&b";"[..], String::from("abèDEF")))
2106855e09eSopenharmony_ci  );
2116855e09eSopenharmony_ci  assert_eq!(
2126855e09eSopenharmony_ci    esc2(&b"ab&egrave;D&agrave;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&egrave;DEF;"), Ok((";", String::from("abèDEF"))));
2616855e09eSopenharmony_ci  assert_eq!(
2626855e09eSopenharmony_ci    esc2("ab&egrave;D&agrave;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