task_list_parser 0.1.5

A Rust-based parser for task lists with priority, status, date, and description fields.
Documentation
use anyhow::{anyhow, Ok};
use pest::Parser;
use task_list_parser::{Rule, TaskListGrammar};

#[cfg(test)]
mod tests {
    use super::*;

    mod date_tests {
        use std::any;

        use super::*;

        #[test]
        fn valid_date() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::date, "{2023-09-15}")?
                .next()
                .unwrap();
            assert_eq!(pair.as_str(), "{2023-09-15}");
            Ok(())
        }

        #[test]
        fn valid_year() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::year, "2022")?.next().unwrap();
            assert_eq!(pair.as_str(), "2022");
            Ok(())
        }

        #[test]
        fn invalid_year() {
            assert!(
                TaskListGrammar::parse(Rule::year, "123").is_err(),
                "Year with incorrect format should fail"
            );
        }

        #[test]
        fn invalid_date_format() {
            assert!(
                TaskListGrammar::parse(Rule::date, "{2023/09/15}").is_err(),
                "Date with incorrect format should fail"
            );
        }

        #[test]
        fn out_of_range_date() {
            assert!(
                TaskListGrammar::parse(Rule::date, "{2023-13-15}").is_err(),
                "Date with invalid month should fail"
            );
            assert!(
                TaskListGrammar::parse(Rule::date, "{2023-09-32}").is_err(),
                "Date with invalid day should fail"
            );
        }
    }

    mod priority_tests {
        use super::*;

        #[test]
        fn valid_priority() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::priority, "!!")?
                .next()
                .unwrap();
            assert_eq!(pair.as_str(), "!!");
            Ok(())
        }

        #[test]
        fn invalid_priority() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::priority, "!!!!")?
                .next()
                .unwrap();

            assert!(pair.as_str().len() <= 3);

            Ok(())
        }
    }

    mod title_tests {
        use super::*;

        #[test]
        fn valid_title() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::description, "Meeting with team")?
                .next()
                .unwrap();
            assert_eq!(pair.as_str(), "Meeting with team");
            Ok(())
        }

        #[test]
        fn empty_title() {
            assert!(
                TaskListGrammar::parse(Rule::description, "").is_err(),
                "Empty title should fail"
            );
        }
    }

    mod tags_tests {
        use super::*;

        #[test]
        fn valid_tags() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::tags, "#urgent #work")?
                .next()
                .unwrap();
            assert_eq!(pair.as_str(), "#urgent #work");
            Ok(())
        }

        #[test]
        fn invalid_tags_format() {
            assert!(TaskListGrammar::parse(Rule::tags, "urgent work").is_err());
        }
    }

    mod comment_tests {
        use super::*;

        #[test]
        fn valid_comment() -> anyhow::Result<()> {
            let pair = TaskListGrammar::parse(Rule::comment, "// This is a comment")?
                .next()
                .unwrap();
            assert_eq!(pair.as_str(), "// This is a comment");
            Ok(())
        }

        #[test]
        fn invalid_comment() {
            assert!(TaskListGrammar::parse(Rule::comment, "Comment").is_err());
        }
    }

    #[test]
    fn test_complete_task() -> anyhow::Result<()> {
        let task = "!! [ ] {2024-10-30} #work 2h Finish Rust parser project";
        let pair = TaskListGrammar::parse(Rule::task, task)?.next().unwrap();
        assert_eq!(pair.as_str(), task);
        Ok(())
    }

    #[test]
    fn test_task_with_missing_tags() {
        let task = "adwadasd";
        assert!(TaskListGrammar::parse(Rule::task, task).is_err());
    }
}