16855e09eSopenharmony_ciuse super::*;
26855e09eSopenharmony_ciuse crate::bytes::streaming::{tag, take};
36855e09eSopenharmony_ciuse crate::error::{Error, ErrorKind};
46855e09eSopenharmony_ciuse crate::internal::{Err, IResult, Needed};
56855e09eSopenharmony_ciuse crate::number::streaming::be_u16;
66855e09eSopenharmony_ci
76855e09eSopenharmony_ci#[test]
86855e09eSopenharmony_cifn single_element_tuples() {
96855e09eSopenharmony_ci  use crate::character::complete::alpha1;
106855e09eSopenharmony_ci  use crate::{error::ErrorKind, Err};
116855e09eSopenharmony_ci
126855e09eSopenharmony_ci  let mut parser = tuple((alpha1,));
136855e09eSopenharmony_ci  assert_eq!(parser("abc123def"), Ok(("123def", ("abc",))));
146855e09eSopenharmony_ci  assert_eq!(
156855e09eSopenharmony_ci    parser("123def"),
166855e09eSopenharmony_ci    Err(Err::Error(("123def", ErrorKind::Alpha)))
176855e09eSopenharmony_ci  );
186855e09eSopenharmony_ci}
196855e09eSopenharmony_ci
206855e09eSopenharmony_ci#[derive(PartialEq, Eq, Debug)]
216855e09eSopenharmony_cistruct B {
226855e09eSopenharmony_ci  a: u8,
236855e09eSopenharmony_ci  b: u8,
246855e09eSopenharmony_ci}
256855e09eSopenharmony_ci
266855e09eSopenharmony_ci#[derive(PartialEq, Eq, Debug)]
276855e09eSopenharmony_cistruct C {
286855e09eSopenharmony_ci  a: u8,
296855e09eSopenharmony_ci  b: Option<u8>,
306855e09eSopenharmony_ci}
316855e09eSopenharmony_ci
326855e09eSopenharmony_ci/*FIXME: convert code examples to new error management
336855e09eSopenharmony_ciuse util::{add_error_pattern, error_to_list, print_error};
346855e09eSopenharmony_ci
356855e09eSopenharmony_ci#[cfg(feature = "std")]
366855e09eSopenharmony_ci#[rustfmt::skip]
376855e09eSopenharmony_cifn error_to_string<P: Clone + PartialEq>(e: &Context<P, u32>) -> &'static str {
386855e09eSopenharmony_ci  let v: Vec<(P, ErrorKind<u32>)> = error_to_list(e);
396855e09eSopenharmony_ci  // do it this way if you can use slice patterns
406855e09eSopenharmony_ci  //match &v[..] {
416855e09eSopenharmony_ci  //  [ErrorKind::Custom(42), ErrorKind::Tag]                         => "missing `ijkl` tag",
426855e09eSopenharmony_ci  //  [ErrorKind::Custom(42), ErrorKind::Custom(128), ErrorKind::Tag] => "missing `mnop` tag after `ijkl`",
436855e09eSopenharmony_ci  //  _            => "unrecognized error"
446855e09eSopenharmony_ci  //}
456855e09eSopenharmony_ci
466855e09eSopenharmony_ci  let collected: Vec<ErrorKind<u32>> = v.iter().map(|&(_, ref e)| e.clone()).collect();
476855e09eSopenharmony_ci  if &collected[..] == [ErrorKind::Custom(42), ErrorKind::Tag] {
486855e09eSopenharmony_ci    "missing `ijkl` tag"
496855e09eSopenharmony_ci  } else if &collected[..] == [ErrorKind::Custom(42), ErrorKind::Custom(128), ErrorKind::Tag] {
506855e09eSopenharmony_ci    "missing `mnop` tag after `ijkl`"
516855e09eSopenharmony_ci  } else {
526855e09eSopenharmony_ci    "unrecognized error"
536855e09eSopenharmony_ci  }
546855e09eSopenharmony_ci}
556855e09eSopenharmony_ci
566855e09eSopenharmony_ci// do it this way if you can use box patterns
576855e09eSopenharmony_ci//use $crate::lib::std::str;
586855e09eSopenharmony_ci//fn error_to_string(e:Err) -> String
596855e09eSopenharmony_ci//  match e {
606855e09eSopenharmony_ci//    NodePosition(ErrorKind::Custom(42), i1, box Position(ErrorKind::Tag, i2)) => {
616855e09eSopenharmony_ci//      format!("missing `ijkl` tag, found '{}' instead", str::from_utf8(i2).unwrap())
626855e09eSopenharmony_ci//    },
636855e09eSopenharmony_ci//    NodePosition(ErrorKind::Custom(42), i1, box NodePosition(ErrorKind::Custom(128), i2,  box Position(ErrorKind::Tag, i3))) => {
646855e09eSopenharmony_ci//      format!("missing `mnop` tag after `ijkl`, found '{}' instead", str::from_utf8(i3).unwrap())
656855e09eSopenharmony_ci//    },
666855e09eSopenharmony_ci//    _ => "unrecognized error".to_string()
676855e09eSopenharmony_ci//  }
686855e09eSopenharmony_ci//}
696855e09eSopenharmony_ci*/
706855e09eSopenharmony_ci
716855e09eSopenharmony_ci#[test]
726855e09eSopenharmony_cifn complete() {
736855e09eSopenharmony_ci  use crate::bytes::complete::tag;
746855e09eSopenharmony_ci  fn err_test(i: &[u8]) -> IResult<&[u8], &[u8]> {
756855e09eSopenharmony_ci    let (i, _) = tag("ijkl")(i)?;
766855e09eSopenharmony_ci    tag("mnop")(i)
776855e09eSopenharmony_ci  }
786855e09eSopenharmony_ci  let a = &b"ijklmn"[..];
796855e09eSopenharmony_ci
806855e09eSopenharmony_ci  let res_a = err_test(a);
816855e09eSopenharmony_ci  assert_eq!(
826855e09eSopenharmony_ci    res_a,
836855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"mn"[..], ErrorKind::Tag)))
846855e09eSopenharmony_ci  );
856855e09eSopenharmony_ci}
866855e09eSopenharmony_ci
876855e09eSopenharmony_ci#[test]
886855e09eSopenharmony_cifn pair_test() {
896855e09eSopenharmony_ci  fn pair_abc_def(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> {
906855e09eSopenharmony_ci    pair(tag("abc"), tag("def"))(i)
916855e09eSopenharmony_ci  }
926855e09eSopenharmony_ci
936855e09eSopenharmony_ci  assert_eq!(
946855e09eSopenharmony_ci    pair_abc_def(&b"abcdefghijkl"[..]),
956855e09eSopenharmony_ci    Ok((&b"ghijkl"[..], (&b"abc"[..], &b"def"[..])))
966855e09eSopenharmony_ci  );
976855e09eSopenharmony_ci  assert_eq!(
986855e09eSopenharmony_ci    pair_abc_def(&b"ab"[..]),
996855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
1006855e09eSopenharmony_ci  );
1016855e09eSopenharmony_ci  assert_eq!(
1026855e09eSopenharmony_ci    pair_abc_def(&b"abcd"[..]),
1036855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(2)))
1046855e09eSopenharmony_ci  );
1056855e09eSopenharmony_ci  assert_eq!(
1066855e09eSopenharmony_ci    pair_abc_def(&b"xxx"[..]),
1076855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1086855e09eSopenharmony_ci  );
1096855e09eSopenharmony_ci  assert_eq!(
1106855e09eSopenharmony_ci    pair_abc_def(&b"xxxdef"[..]),
1116855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxxdef"[..], ErrorKind::Tag)))
1126855e09eSopenharmony_ci  );
1136855e09eSopenharmony_ci  assert_eq!(
1146855e09eSopenharmony_ci    pair_abc_def(&b"abcxxx"[..]),
1156855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1166855e09eSopenharmony_ci  );
1176855e09eSopenharmony_ci}
1186855e09eSopenharmony_ci
1196855e09eSopenharmony_ci#[test]
1206855e09eSopenharmony_cifn separated_pair_test() {
1216855e09eSopenharmony_ci  fn sep_pair_abc_def(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> {
1226855e09eSopenharmony_ci    separated_pair(tag("abc"), tag(","), tag("def"))(i)
1236855e09eSopenharmony_ci  }
1246855e09eSopenharmony_ci
1256855e09eSopenharmony_ci  assert_eq!(
1266855e09eSopenharmony_ci    sep_pair_abc_def(&b"abc,defghijkl"[..]),
1276855e09eSopenharmony_ci    Ok((&b"ghijkl"[..], (&b"abc"[..], &b"def"[..])))
1286855e09eSopenharmony_ci  );
1296855e09eSopenharmony_ci  assert_eq!(
1306855e09eSopenharmony_ci    sep_pair_abc_def(&b"ab"[..]),
1316855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
1326855e09eSopenharmony_ci  );
1336855e09eSopenharmony_ci  assert_eq!(
1346855e09eSopenharmony_ci    sep_pair_abc_def(&b"abc,d"[..]),
1356855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(2)))
1366855e09eSopenharmony_ci  );
1376855e09eSopenharmony_ci  assert_eq!(
1386855e09eSopenharmony_ci    sep_pair_abc_def(&b"xxx"[..]),
1396855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1406855e09eSopenharmony_ci  );
1416855e09eSopenharmony_ci  assert_eq!(
1426855e09eSopenharmony_ci    sep_pair_abc_def(&b"xxx,def"[..]),
1436855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx,def"[..], ErrorKind::Tag)))
1446855e09eSopenharmony_ci  );
1456855e09eSopenharmony_ci  assert_eq!(
1466855e09eSopenharmony_ci    sep_pair_abc_def(&b"abc,xxx"[..]),
1476855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1486855e09eSopenharmony_ci  );
1496855e09eSopenharmony_ci}
1506855e09eSopenharmony_ci
1516855e09eSopenharmony_ci#[test]
1526855e09eSopenharmony_cifn preceded_test() {
1536855e09eSopenharmony_ci  fn preceded_abcd_efgh(i: &[u8]) -> IResult<&[u8], &[u8]> {
1546855e09eSopenharmony_ci    preceded(tag("abcd"), tag("efgh"))(i)
1556855e09eSopenharmony_ci  }
1566855e09eSopenharmony_ci
1576855e09eSopenharmony_ci  assert_eq!(
1586855e09eSopenharmony_ci    preceded_abcd_efgh(&b"abcdefghijkl"[..]),
1596855e09eSopenharmony_ci    Ok((&b"ijkl"[..], &b"efgh"[..]))
1606855e09eSopenharmony_ci  );
1616855e09eSopenharmony_ci  assert_eq!(
1626855e09eSopenharmony_ci    preceded_abcd_efgh(&b"ab"[..]),
1636855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(2)))
1646855e09eSopenharmony_ci  );
1656855e09eSopenharmony_ci  assert_eq!(
1666855e09eSopenharmony_ci    preceded_abcd_efgh(&b"abcde"[..]),
1676855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(3)))
1686855e09eSopenharmony_ci  );
1696855e09eSopenharmony_ci  assert_eq!(
1706855e09eSopenharmony_ci    preceded_abcd_efgh(&b"xxx"[..]),
1716855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1726855e09eSopenharmony_ci  );
1736855e09eSopenharmony_ci  assert_eq!(
1746855e09eSopenharmony_ci    preceded_abcd_efgh(&b"xxxxdef"[..]),
1756855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxxxdef"[..], ErrorKind::Tag)))
1766855e09eSopenharmony_ci  );
1776855e09eSopenharmony_ci  assert_eq!(
1786855e09eSopenharmony_ci    preceded_abcd_efgh(&b"abcdxxx"[..]),
1796855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
1806855e09eSopenharmony_ci  );
1816855e09eSopenharmony_ci}
1826855e09eSopenharmony_ci
1836855e09eSopenharmony_ci#[test]
1846855e09eSopenharmony_cifn terminated_test() {
1856855e09eSopenharmony_ci  fn terminated_abcd_efgh(i: &[u8]) -> IResult<&[u8], &[u8]> {
1866855e09eSopenharmony_ci    terminated(tag("abcd"), tag("efgh"))(i)
1876855e09eSopenharmony_ci  }
1886855e09eSopenharmony_ci
1896855e09eSopenharmony_ci  assert_eq!(
1906855e09eSopenharmony_ci    terminated_abcd_efgh(&b"abcdefghijkl"[..]),
1916855e09eSopenharmony_ci    Ok((&b"ijkl"[..], &b"abcd"[..]))
1926855e09eSopenharmony_ci  );
1936855e09eSopenharmony_ci  assert_eq!(
1946855e09eSopenharmony_ci    terminated_abcd_efgh(&b"ab"[..]),
1956855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(2)))
1966855e09eSopenharmony_ci  );
1976855e09eSopenharmony_ci  assert_eq!(
1986855e09eSopenharmony_ci    terminated_abcd_efgh(&b"abcde"[..]),
1996855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(3)))
2006855e09eSopenharmony_ci  );
2016855e09eSopenharmony_ci  assert_eq!(
2026855e09eSopenharmony_ci    terminated_abcd_efgh(&b"xxx"[..]),
2036855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
2046855e09eSopenharmony_ci  );
2056855e09eSopenharmony_ci  assert_eq!(
2066855e09eSopenharmony_ci    terminated_abcd_efgh(&b"xxxxdef"[..]),
2076855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxxxdef"[..], ErrorKind::Tag)))
2086855e09eSopenharmony_ci  );
2096855e09eSopenharmony_ci  assert_eq!(
2106855e09eSopenharmony_ci    terminated_abcd_efgh(&b"abcdxxxx"[..]),
2116855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxxx"[..], ErrorKind::Tag)))
2126855e09eSopenharmony_ci  );
2136855e09eSopenharmony_ci}
2146855e09eSopenharmony_ci
2156855e09eSopenharmony_ci#[test]
2166855e09eSopenharmony_cifn delimited_test() {
2176855e09eSopenharmony_ci  fn delimited_abc_def_ghi(i: &[u8]) -> IResult<&[u8], &[u8]> {
2186855e09eSopenharmony_ci    delimited(tag("abc"), tag("def"), tag("ghi"))(i)
2196855e09eSopenharmony_ci  }
2206855e09eSopenharmony_ci
2216855e09eSopenharmony_ci  assert_eq!(
2226855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"abcdefghijkl"[..]),
2236855e09eSopenharmony_ci    Ok((&b"jkl"[..], &b"def"[..]))
2246855e09eSopenharmony_ci  );
2256855e09eSopenharmony_ci  assert_eq!(
2266855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"ab"[..]),
2276855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
2286855e09eSopenharmony_ci  );
2296855e09eSopenharmony_ci  assert_eq!(
2306855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"abcde"[..]),
2316855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
2326855e09eSopenharmony_ci  );
2336855e09eSopenharmony_ci  assert_eq!(
2346855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"abcdefgh"[..]),
2356855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
2366855e09eSopenharmony_ci  );
2376855e09eSopenharmony_ci  assert_eq!(
2386855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"xxx"[..]),
2396855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
2406855e09eSopenharmony_ci  );
2416855e09eSopenharmony_ci  assert_eq!(
2426855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"xxxdefghi"[..]),
2436855e09eSopenharmony_ci    Err(Err::Error(error_position!(
2446855e09eSopenharmony_ci      &b"xxxdefghi"[..],
2456855e09eSopenharmony_ci      ErrorKind::Tag
2466855e09eSopenharmony_ci    ),))
2476855e09eSopenharmony_ci  );
2486855e09eSopenharmony_ci  assert_eq!(
2496855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"abcxxxghi"[..]),
2506855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxxghi"[..], ErrorKind::Tag)))
2516855e09eSopenharmony_ci  );
2526855e09eSopenharmony_ci  assert_eq!(
2536855e09eSopenharmony_ci    delimited_abc_def_ghi(&b"abcdefxxx"[..]),
2546855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"xxx"[..], ErrorKind::Tag)))
2556855e09eSopenharmony_ci  );
2566855e09eSopenharmony_ci}
2576855e09eSopenharmony_ci
2586855e09eSopenharmony_ci#[test]
2596855e09eSopenharmony_cifn tuple_test() {
2606855e09eSopenharmony_ci  fn tuple_3(i: &[u8]) -> IResult<&[u8], (u16, &[u8], &[u8])> {
2616855e09eSopenharmony_ci    tuple((be_u16, take(3u8), tag("fg")))(i)
2626855e09eSopenharmony_ci  }
2636855e09eSopenharmony_ci
2646855e09eSopenharmony_ci  assert_eq!(
2656855e09eSopenharmony_ci    tuple_3(&b"abcdefgh"[..]),
2666855e09eSopenharmony_ci    Ok((&b"h"[..], (0x6162u16, &b"cde"[..], &b"fg"[..])))
2676855e09eSopenharmony_ci  );
2686855e09eSopenharmony_ci  assert_eq!(tuple_3(&b"abcd"[..]), Err(Err::Incomplete(Needed::new(1))));
2696855e09eSopenharmony_ci  assert_eq!(tuple_3(&b"abcde"[..]), Err(Err::Incomplete(Needed::new(2))));
2706855e09eSopenharmony_ci  assert_eq!(
2716855e09eSopenharmony_ci    tuple_3(&b"abcdejk"[..]),
2726855e09eSopenharmony_ci    Err(Err::Error(error_position!(&b"jk"[..], ErrorKind::Tag)))
2736855e09eSopenharmony_ci  );
2746855e09eSopenharmony_ci}
2756855e09eSopenharmony_ci
2766855e09eSopenharmony_ci#[test]
2776855e09eSopenharmony_cifn unit_type() {
2786855e09eSopenharmony_ci  assert_eq!(
2796855e09eSopenharmony_ci    tuple::<&'static str, (), Error<&'static str>, ()>(())("abxsbsh"),
2806855e09eSopenharmony_ci    Ok(("abxsbsh", ()))
2816855e09eSopenharmony_ci  );
2826855e09eSopenharmony_ci  assert_eq!(
2836855e09eSopenharmony_ci    tuple::<&'static str, (), Error<&'static str>, ()>(())("sdfjakdsas"),
2846855e09eSopenharmony_ci    Ok(("sdfjakdsas", ()))
2856855e09eSopenharmony_ci  );
2866855e09eSopenharmony_ci  assert_eq!(
2876855e09eSopenharmony_ci    tuple::<&'static str, (), Error<&'static str>, ()>(())(""),
2886855e09eSopenharmony_ci    Ok(("", ()))
2896855e09eSopenharmony_ci  );
2906855e09eSopenharmony_ci}
291