use crate::*; macro_rules!is_ok_some(($exp:expr, $val:expr)=>{assert_eq!($exp, Ok(Some($val)))};); macro_rules!is_ok_none(($exp:expr)=>{assert_eq!($exp, Ok(None))};); macro_rules!is_err(($exp:expr)=>{assert!($exp.is_err())}; ($exp:expr, $err:expr)=>{assert_eq!($exp, Err($err))};); #[test] fn test_exp () -> Result<(), DslError> { let e0 = DslError::Unexpected('a'); let e1 = DslError::Unexpected('('); let e2 = DslError::Unexpected('b'); let e3 = DslError::Unexpected('d'); let check = |src: &str, key, exp, head, tail|{ assert_eq!(src.key(), key, "{src}"); assert_eq!(src.exp(), exp, "{src}"); assert_eq!(src.head(), head, "{src}"); assert_eq!(src.tail(), tail, "{src}"); }; check("a", Ok(Some("a")), Err(e0), Ok(Some("a")), Ok(None)); check("(a)", Err(e1), Ok(Some("a")), Ok(Some("(a)")), Ok(None)); check("a b c", Err(e2), Err(e0), Ok(Some("a")), Ok(Some("b c"))); check("(a b c)", Err(e1), Ok(Some("a b c")), Ok(Some("(a b c)")), Ok(None)); check("(a b c) d e f", Err(e1), Err(e3), Ok(Some("(a b c)")), Ok(Some("d e f"))); check("a (b c d) e f", Err(e1), Err(e0), Ok(Some("a")), Ok(Some("(b c d) e f"))); assert!(is_whitespace(' ')); assert!(!is_key_start(' ')); assert!(is_key_start('f')); is_ok_some!(key_seek_start("foo"), 0); is_ok_some!(key_seek_start("foo "), 0); is_ok_some!(key_seek_start(" foo "), 1); is_ok_some!(key_seek_length(&" foo "[1..]), 3); is_ok_some!(key_seek("foo"), (0, 3)); is_ok_some!(key_peek("foo"), "foo"); is_ok_some!(key_seek("foo "), (0, 3)); is_ok_some!(key_peek("foo "), "foo"); is_ok_some!(key_seek(" foo "), (1, 3)); is_ok_some!(key_peek(" foo "), "foo"); is_err!("(foo)".key()); is_err!("foo".exp()); is_ok_some!("(foo)".exp(), "foo"); is_ok_some!("(foo)".head(), "(foo)"); is_ok_none!("(foo)".tail()); is_ok_some!("(foo bar baz)".exp(), "foo bar baz"); is_ok_some!("(foo bar baz)".head(), "(foo bar baz)"); is_ok_none!("(foo bar baz)".tail()); is_ok_some!("(foo bar baz)".exp().head(), "foo"); is_ok_some!("(foo bar baz)".exp().tail(), "bar baz"); is_ok_some!("(foo bar baz)".exp().tail().head(), "bar"); is_ok_some!("(foo bar baz)".exp().tail().tail(), "baz"); is_ok_none!("foo".exp()); is_ok_some!("foo".key(), "foo"); is_ok_some!(" foo".key(), "foo"); is_ok_some!(" foo ".key(), "foo"); assert_eq!(" foo ".head(), Ok(Some("foo"))); //assert_eq!(" foo ".head().head(), Ok(None)); assert_eq!(" foo ".head().tail(), Ok(None)); assert_eq!(" foo ".tail(), Ok(None)); assert_eq!(" foo ".tail().head(), Ok(None)); assert_eq!(" foo ".tail().tail(), Ok(None)); assert_eq!(" foo bar ".head(), Ok(Some("foo"))); //assert_eq!(" foo bar ".head().head(), Ok(None)); assert_eq!(" foo bar ".head().tail(), Ok(None)); assert_eq!(" foo bar ".tail(), Ok(Some("bar"))); assert_eq!(" foo bar ".tail().head(), Ok(Some("bar"))); assert_eq!(" foo bar ".tail().tail(), Ok(None)); assert_eq!(" (foo) ".head(), Ok(Some("(foo)"))); //assert_eq!(" (foo) ".head().head(), Ok(Some("foo"))); //assert_eq!(" (foo) ".head().head().head(), Ok(None)); assert_eq!(" (foo) ".tail(), Ok(None)); assert_eq!(" (foo) (bar) ".head(), Ok(Some("(foo)"))); //assert_eq!(" (foo) (bar) ".head().head(), Ok(Some("foo"))); //assert_eq!(" (foo) (bar) ".head().head().head(), Ok(None)); assert_eq!(" (foo) (bar) ".tail(), Ok(Some("(bar)"))); assert_eq!(" (foo bar baz) ".head(), Ok(Some("(foo bar baz)"))); assert_eq!(" (foo bar baz) ".head().head(), Ok(Some("foo"))); assert_eq!(" (foo bar baz) ".head().tail(), Ok(Some("bar baz"))); assert_eq!(" (foo bar baz) ".head().tail().head(), Ok(Some("bar"))); assert_eq!(" (foo bar baz) ".head().tail().tail(), Ok(Some("baz"))); Ok(()) }