hco 0.0.0-1

LIB: Math and container utilities for Rust. Notice: study purpose, not production ready.
Documentation
pub mod lang;
pub mod chinese;

pub mod core;
pub mod en;
pub mod zh_cn;

pub use lang::*;
pub use chinese::*;
pub use core::*;

#[cfg(test)]
mod tests {
    use super::{
        Aspect,
        Clause,
        Tense,
    };

    #[test]
    fn render_english_and_chinese_transfer_sentence() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        let clause = Clause::new("person.alice", "verb.transfer")
            .recipient("person.bob")
            .object("object.book")
            .tense(Tense::Past);

        assert_eq!(
            en.render(&clause),
            "Alice gave Bob a book."
        );

        assert_eq!(
            zh.render(&clause),
            "Alice给了Bob一本书。"
        );
    }

    #[test]
    fn render_fly_sentence() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        let clause = Clause::new("person.alice", "verb.fly")
            .location("place.sky")
            .tense(Tense::Future)
            .aspect(Aspect::Progressive);

        assert_eq!(
            en.render(&clause),
            "Alice will be flying in the sky."
        );

        assert_eq!(
            zh.render(&clause),
            "Alice正在在天空中飞。"
        );
    }

    #[test]
    fn render_negative_sentence() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        let clause = Clause::new("person.bob", "verb.like")
            .object("animal.turkey")
            .negative();

        assert_eq!(
            en.render(&clause),
            "Bob does not like turkey."
        );

        assert_eq!(
            zh.render(&clause),
            "Bob不喜欢火鸡。"
        );
    }

    #[test]
    fn load_key_files() {
        let noun_keys = super::core::load_noun_keys();
        let verb_keys = super::core::load_verb_keys();

        assert!(noun_keys.iter().any(|x| x.key == "person.alice"));
        assert!(verb_keys.iter().any(|x| x.key == "verb.transfer"));
        assert!(noun_keys.iter().any(|x| x.key == "ui.username"));
        assert!(noun_keys.iter().any(|x| x.key == "state.invalid"));
        assert!(noun_keys.iter().any(|x| x.key == "connector.or"));
        assert!(noun_keys.iter().any(|x| x.key == "ui.remember_me"));
        assert!(verb_keys.iter().any(|x| x.key == "verb.exist"));
    }

    #[test]
    fn render_requested_file_not_found_sentence() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        let clause = Clause::new("web.requested_file", "verb.exist").negative();

        assert_eq!(
            en.render(&clause),
            "the file you requested does not exist."
        );

        assert_eq!(
            zh.render(&clause),
            "你请求的文件不存在。"
        );
    }

    #[test]
    fn website_localization_terms_are_available() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        assert_eq!(en.lang.noun("ui.username"), "username");
        assert_eq!(zh.lang.noun("ui.username"), "用户名");
        assert_eq!(en.lang.noun("ui.password"), "password");
        assert_eq!(zh.lang.noun("ui.password"), "密码");
        assert_eq!(en.lang.noun("ui.remember_me"), "Remember me");
        assert_eq!(zh.lang.noun("ui.remember_me"), "Remember me");
        assert_eq!(en.lang.noun("state.invalid"), "invalid");
        assert_eq!(zh.lang.noun("state.invalid"), "无效");
    }

    #[test]
    fn compose_username_or_password_invalid_sentence() {
        let en = super::en::load();
        let zh = super::zh_cn::load();

        let keys = [
            "ui.username",
            "connector.or",
            "ui.password",
            "connector.is",
            "state.invalid",
        ];

        assert_eq!(
            en.compose_sentence(&keys),
            "username or password is invalid."
        );
        assert_eq!(
            zh.compose_sentence(&keys),
            "用户名或密码无效。"
        );
    }
}