summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nom/src/str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/nom/src/str.rs')
-rw-r--r--third_party/rust/nom/src/str.rs494
1 files changed, 494 insertions, 0 deletions
diff --git a/third_party/rust/nom/src/str.rs b/third_party/rust/nom/src/str.rs
new file mode 100644
index 0000000000..71fb1a4aa1
--- /dev/null
+++ b/third_party/rust/nom/src/str.rs
@@ -0,0 +1,494 @@
+#[cfg(test)]
+mod test {
+ use crate::{Err, error::ErrorKind, IResult};
+
+ #[test]
+ fn tagtr_succeed() {
+ const INPUT: &str = "Hello World!";
+ const TAG: &str = "Hello";
+ fn test(input: &str) -> IResult<&str, &str> {
+ tag!(input, TAG)
+ }
+
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == " World!",
+ "Parser `tag` consumed leftover input."
+ );
+ assert!(
+ output == TAG,
+ "Parser `tag` doesn't return the tag it matched on success. \
+ Expected `{}`, got `{}`.",
+ TAG,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `tag` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn tagtr_incomplete() {
+ const INPUT: &str = "Hello";
+ const TAG: &str = "Hello World!";
+
+ let res: IResult<_,_,(_, ErrorKind)> = tag!(INPUT, TAG);
+ match res {
+ Err(Err::Incomplete(_)) => (),
+ other => {
+ panic!(
+ "Parser `tag` didn't require more input when it should have. \
+ Got `{:?}`.",
+ other
+ );
+ }
+ };
+ }
+
+ #[test]
+ fn tagtr_error() {
+ const INPUT: &str = "Hello World!";
+ const TAG: &str = "Random"; // TAG must be closer than INPUT.
+
+ let res: IResult<_,_,(_, ErrorKind)> = tag!(INPUT, TAG);
+ match res {
+ Err(Err::Error(_)) => (),
+ other => {
+ panic!(
+ "Parser `tag` didn't fail when it should have. Got `{:?}`.`",
+ other
+ );
+ }
+ };
+ }
+
+ #[test]
+ fn take_s_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+
+ let res: IResult<_,_,(_, ErrorKind)> = take!(INPUT, 9);
+ match res {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_s` consumed leftover input. Leftover `{}`.",
+ extra
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_s` doens't return the string it consumed on success. Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_s` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_until_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇ∂áƒƭèř";
+ const FIND: &str = "ÂßÇ∂";
+ const CONSUMED: &str = "βèƒôřè";
+ const LEFTOVER: &str = "ÂßÇ∂áƒƭèř";
+
+ let res: IResult<_,_,(_, ErrorKind)> = take_until!(INPUT, FIND);
+ match res {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_until`\
+ consumed leftover input. Leftover `{}`.",
+ extra
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_until`\
+ doens't return the string it consumed on success. Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_until` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_s_incomplete() {
+ const INPUT: &str = "βèƒôřèÂßÇá";
+
+ let res: IResult<_,_,(_, ErrorKind)> = take!(INPUT, 13);
+ match res {
+ Err(Err::Incomplete(_)) => (),
+ other => panic!(
+ "Parser `take` didn't require more input when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ }
+ }
+
+ use crate::internal::Needed;
+
+ fn is_alphabetic(c: char) -> bool {
+ (c as u8 >= 0x41 && c as u8 <= 0x5A) || (c as u8 >= 0x61 && c as u8 <= 0x7A)
+ }
+
+ #[test]
+ fn take_while() {
+ named!(f<&str,&str>, take_while!(is_alphabetic));
+ let a = "";
+ let b = "abcd";
+ let c = "abcd123";
+ let d = "123";
+
+ assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::Size(1))));
+ assert_eq!(f(&b[..]), Err(Err::Incomplete(Needed::Size(1))));
+ assert_eq!(f(&c[..]), Ok((&d[..], &b[..])));
+ assert_eq!(f(&d[..]), Ok((&d[..], &a[..])));
+ }
+
+ #[test]
+ fn take_while1() {
+ named!(f<&str,&str>, take_while1!(is_alphabetic));
+ let a = "";
+ let b = "abcd";
+ let c = "abcd123";
+ let d = "123";
+
+ assert_eq!(f(&a[..]), Err(Err::Incomplete(Needed::Size(1))));
+ assert_eq!(f(&b[..]), Err(Err::Incomplete(Needed::Size(1))));
+ assert_eq!(f(&c[..]), Ok((&"123"[..], &b[..])));
+ assert_eq!(
+ f(&d[..]),
+ Err(Err::Error(error_position!(&d[..], ErrorKind::TakeWhile1)))
+ );
+ }
+
+ #[test]
+ fn take_till_s_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+ fn till_s(c: char) -> bool {
+ c == 'á'
+ }
+ fn test(input: &str) -> IResult<&str, &str> {
+ take_till!(input, till_s)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_till` consumed leftover input."
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_till` doesn't return the string it consumed on success. \
+ Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_till` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_while_succeed_none() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const CONSUMED: &str = "";
+ const LEFTOVER: &str = "βèƒôřèÂßÇáƒƭèř";
+ fn while_s(c: char) -> bool {
+ c == '9'
+ }
+ fn test(input: &str) -> IResult<&str, &str> {
+ take_while!(input, while_s)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_while` consumed leftover input."
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_while` doesn't return the string it consumed on success. \
+ Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_while` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn is_not_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const AVOID: &str = "£úçƙ¥á";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+ fn test(input: &str) -> IResult<&str, &str> {
+ is_not!(input, AVOID)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `is_not` consumed leftover input. Leftover `{}`.",
+ extra
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `is_not` doens't return the string it consumed on success. Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `is_not` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_while_succeed_some() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+ fn while_s(c: char) -> bool {
+ c == 'β' || c == 'è' || c == 'ƒ' || c == 'ô' || c == 'ř' || c == 'è' || c == 'Â' || c == 'ß' || c == 'Ç'
+ }
+ fn test(input: &str) -> IResult<&str, &str> {
+ take_while!(input, while_s)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_while` consumed leftover input."
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_while` doesn't return the string it consumed on success. \
+ Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_while` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn is_not_fail() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const AVOID: &str = "βúçƙ¥";
+ fn test(input: &str) -> IResult<&str, &str> {
+ is_not!(input, AVOID)
+ }
+ match test(INPUT) {
+ Err(Err::Error(_)) => (),
+ other => panic!(
+ "Parser `is_not` didn't fail when it should have. Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_while1_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+ fn while1_s(c: char) -> bool {
+ c == 'β' || c == 'è' || c == 'ƒ' || c == 'ô' || c == 'ř' || c == 'è' || c == 'Â' || c == 'ß' || c == 'Ç'
+ }
+ fn test(input: &str) -> IResult<&str, &str> {
+ take_while1!(input, while1_s)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `take_while1` consumed leftover input."
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `take_while1` doesn't return the string it consumed on success. \
+ Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `take_while1` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_until_incomplete() {
+ const INPUT: &str = "βèƒôřè";
+ const FIND: &str = "βèƒôřèÂßÇ";
+
+ let res: IResult<_,_,(_, ErrorKind)> = take_until!(INPUT, FIND);
+ match res {
+ Err(Err::Incomplete(_)) => (),
+ other => panic!(
+ "Parser `take_until` didn't require more input when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn is_a_succeed() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const MATCH: &str = "βèƒôřèÂßÇ";
+ const CONSUMED: &str = "βèƒôřèÂßÇ";
+ const LEFTOVER: &str = "áƒƭèř";
+ fn test(input: &str) -> IResult<&str, &str> {
+ is_a!(input, MATCH)
+ }
+ match test(INPUT) {
+ Ok((extra, output)) => {
+ assert!(
+ extra == LEFTOVER,
+ "Parser `is_a` consumed leftover input. Leftover `{}`.",
+ extra
+ );
+ assert!(
+ output == CONSUMED,
+ "Parser `is_a` doens't return the string it consumed on success. Expected `{}`, got `{}`.",
+ CONSUMED,
+ output
+ );
+ }
+ other => panic!(
+ "Parser `is_a` didn't succeed when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_while1_fail() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ fn while1_s(c: char) -> bool {
+ c == '9'
+ }
+ fn test(input: &str) -> IResult<&str, &str> {
+ take_while1!(input, while1_s)
+ }
+ match test(INPUT) {
+ Err(Err::Error(_)) => (),
+ other => panic!(
+ "Parser `take_while1` didn't fail when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn is_a_fail() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const MATCH: &str = "Ûñℓúçƙ¥";
+ fn test(input: &str) -> IResult<&str, &str> {
+ is_a!(input, MATCH)
+ }
+ match test(INPUT) {
+ Err(Err::Error(_)) => (),
+ other => panic!(
+ "Parser `is_a` didn't fail when it should have. Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ fn take_until_error() {
+ const INPUT: &str = "βèƒôřèÂßÇáƒƭèř";
+ const FIND: &str = "Ráñδô₥";
+
+ let res: IResult<_,_,(_, ErrorKind)> = take_until!(INPUT, FIND);
+ match res {
+ Err(Err::Incomplete(_)) => (),
+ other => panic!(
+ "Parser `take_until` didn't fail when it should have. \
+ Got `{:?}`.",
+ other
+ ),
+ };
+ }
+
+ #[test]
+ #[cfg(feature = "alloc")]
+ fn recognize_is_a() {
+ let a = "aabbab";
+ let b = "ababcd";
+
+ named!(f <&str,&str>, recognize!(many1!(complete!(alt!( tag!("a") | tag!("b") )))));
+
+ assert_eq!(f(&a[..]), Ok((&a[6..], &a[..])));
+ assert_eq!(f(&b[..]), Ok((&b[4..], &b[..4])));
+ }
+
+ #[test]
+ fn utf8_indexing() {
+ named!(dot(&str) -> &str,
+ tag!(".")
+ );
+
+ let _ = dot("點");
+ }
+
+ #[cfg(feature = "alloc")]
+ #[test]
+ fn case_insensitive() {
+ named!(test<&str,&str>, tag_no_case!("ABcd"));
+ assert_eq!(test("aBCdefgh"), Ok(("efgh", "aBCd")));
+ assert_eq!(test("abcdefgh"), Ok(("efgh", "abcd")));
+ assert_eq!(test("ABCDefgh"), Ok(("efgh", "ABCD")));
+
+ named!(test2<&str,&str>, tag_no_case!("ABcd"));
+ assert_eq!(test2("aBCdefgh"), Ok(("efgh", "aBCd")));
+ assert_eq!(test2("abcdefgh"), Ok(("efgh", "abcd")));
+ assert_eq!(test2("ABCDefgh"), Ok(("efgh", "ABCD")));
+ }
+}