use crate::*; macro_rules!is_some(($exp:expr, $val:expr)=>{assert_eq!($exp, Ok(Some($val)))};); macro_rules!is_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"))); is_some!(sym_peek("\n :view/transport"), ":view/transport"); assert!(is_whitespace(' ')); assert!(!is_key_start(' ')); assert!(is_key_start('f')); is_some!(key_seek_start("foo"), 0); is_some!(key_seek_start("foo "), 0); is_some!(key_seek_start(" foo "), 1); is_some!(key_seek_length(&" foo "[1..]), 3); is_some!(key_seek("foo"), (0, 3)); is_some!(key_peek("foo"), "foo"); is_some!(key_seek("foo "), (0, 3)); is_some!(key_peek("foo "), "foo"); is_some!(key_seek(" foo "), (1, 3)); is_some!(key_peek(" foo "), "foo"); is_err!("(foo)".key()); is_err!("foo".exp()); is_some!("(foo)".exp(), "foo"); is_some!("(foo)".head(), "(foo)"); is_none!("(foo)".tail()); is_some!("(foo bar baz)".exp(), "foo bar baz"); is_some!("(foo bar baz)".head(), "(foo bar baz)"); is_none!("(foo bar baz)".tail()); is_some!("(foo bar baz)".exp().head(), "foo"); is_some!("(foo bar baz)".exp().tail(), "bar baz"); is_some!("(foo bar baz)".exp().tail().head(), "bar"); is_some!("(foo bar baz)".exp().tail().tail(), "baz"); is_err!("foo".exp()); is_some!("foo".key(), "foo"); is_some!(" foo".key(), "foo"); is_some!(" foo ".key(), "foo"); is_some!(" foo ".head(), "foo"); //assert_eq!(" foo ".head().head(), Ok(None)); is_none!(" foo ".head().tail()); is_none!(" foo ".tail()); is_none!(" foo ".tail().head()); is_none!(" foo ".tail().tail()); 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)); is_some!(" (foo) (bar) ".tail(), " (bar) "); is_some!(" (foo) (bar) ".tail().head(), "(bar)"); is_some!(" (foo) (bar) ".tail().head().head(), "(bar)"); is_some!(" (foo) (bar) ".tail().head().exp(), "bar"); is_some!(" (foo) (bar) ".tail().head().exp().head(), "bar"); is_some!(" (foo bar baz) ".head(), "(foo bar baz)"); is_some!(" (foo bar baz) ".head().head(), "(foo bar baz)"); is_some!(" (foo bar baz) ".exp(), "foo bar baz"); is_some!(" (foo bar baz) ".exp().head(), "foo"); is_some!(" (foo bar baz) ".exp().tail(), "bar baz"); is_some!(" (foo bar baz) ".exp().tail().head(), "bar"); is_some!(" (foo bar baz) ".exp().tail().tail(), "baz"); is_none!(" (foo bar baz) ".tail()); Ok(()) }