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