251 lines · 6.0 KB · Rust
RawDownload
mod get {    use bstr::BString;     use crate::file::mutable::value::init_config;     fn config_get(input: &str) -> BString {        let mut file: git_config::File = input.parse().unwrap();        file.raw_value_mut("a", None, "k").unwrap().get().unwrap().into_owned()    }     #[test]    fn empty() {        assert_eq!(config_get("[a] k"), "");    }     #[test]    fn single_line_before_comment() {        assert_eq!(config_get("[a] k = hello there ; comment"), "hello there");    }     #[test]    fn quoted_single_line_before_comment() {        assert_eq!(config_get("[a] k = \" hello\tthere \"; comment"), " hello\tthere ");    }     #[test]    fn multi_line_before_comment() {        assert_eq!(config_get("[a] k = a\\\n  b\\\n  c ; comment"), "a  b  c");    }     #[test]    fn value_is_correct() -> crate::Result {        let mut config = init_config();         let value = config.raw_value_mut("core", None, "a")?;        assert_eq!(&*value.get()?, "b100");        Ok(())    }} mod set_string {    use crate::file::mutable::value::init_config;     fn assert_set_string(expected: &str) {        let nl = git_config::File::default().detect_newline_style().to_string();        for input in [            "[a] k = v",            "[a] k = ",            "[a] k =",            "[a] k =$nl",            "[a] k ",            "[a] k$nl",            "[a] k",        ] {            let mut file: git_config::File = input.replace("$nl", &nl).parse().unwrap();            let mut v = file.raw_value_mut("a", None, "k").unwrap();            v.set_string(expected);             assert_eq!(v.get().unwrap().as_ref(), expected);             let file_string = file.to_string();            let file: git_config::File = match file_string.parse() {                Ok(f) => f,                Err(err) => panic!("{:?} failed with: {}", file_string, err),            };            assert_eq!(                file.raw_value("a", None, "k").expect("present").as_ref(),                expected,                "{file_string:?}"            );        }    }     #[test]    fn empty() {        assert_set_string("");    }     #[test]    fn just_whitespace() {        assert_set_string("\t ");    }     #[test]    fn leading_whitespace_causes_double_quotes() {        assert_set_string(" v");    }     #[test]    fn single_line() {        assert_set_string("hello world");    }     #[test]    fn starts_with_whitespace() {        assert_set_string("\ta");        assert_set_string(" a");    }     #[test]    fn ends_with_whitespace() {        assert_set_string("a\t");        assert_set_string("a ");    }     #[test]    fn quotes_and_backslashes() {        assert_set_string(r#""hello"\"there"\\\b\x"#);    }     #[test]    fn multi_line() {        assert_set_string("a\nb   \n\t   c");    }     #[test]    fn comment_included() {        assert_set_string(";hello ");        assert_set_string(" # hello");        assert_set_string("value then seemingly # comment");    }     #[test]    fn simple_value_and_empty_string() -> crate::Result {        let mut config = init_config();         let mut value = config.raw_value_mut("core", None, "a")?;        value.set_string("hello world");        assert_eq!(            config.to_string(),            r#"[core]            a=hello world        [core]            c=d            e=f"#,        );         let mut value = config.raw_value_mut("core", None, "e")?;        value.set_string(String::new());        assert_eq!(            config.to_string(),            r#"[core]            a=hello world        [core]            c=d            e="#,        );        Ok(())    }} mod delete {    use super::init_config;     #[test]    fn single_line_value() -> crate::Result {        let mut config = init_config();         let mut value = config.raw_value_mut("core", None, "a")?;        value.delete();        assert_eq!(            config.to_string(),            "[core]\n            \n        [core]\n            c=d\n            e=f\n",        );         let mut value = config.raw_value_mut("core", None, "c")?;        value.delete();        assert_eq!(            config.to_string(),            "[core]\n            \n        [core]\n            \n            e=f\n",        );        Ok(())    }     #[test]    fn get_value_after_deleted() -> crate::Result {        let mut config = init_config();         let mut value = config.raw_value_mut("core", None, "a")?;        value.delete();        assert!(value.get().is_err());        Ok(())    }     #[test]    fn set_string_after_deleted() -> crate::Result {        let mut config = init_config();         let mut value = config.raw_value_mut("core", None, "a")?;        value.delete();        value.set_string("hello world");        assert_eq!(            config.to_string(),            r#"[core]            a=hello world        [core]            c=d            e=f"#,        );        Ok(())    }     #[test]    fn idempotency() -> crate::Result {        let mut config = init_config();         let mut value = config.raw_value_mut("core", None, "a")?;        for _ in 0..3 {            value.delete();        }        assert_eq!(            config.to_string(),            "[core]\n            \n        [core]\n            c=d\n            e=f\n"        );        Ok(())    }     #[test]    fn multi_line_value() -> crate::Result {        let mut config: git_config::File = r#"[core]            a=b"100"\c\b        [core]            c=d            e=f"#            .parse()?;        let mut value = config.raw_value_mut("core", None, "a")?;        assert_eq!(&*value.get()?, "b100cb");        value.delete();        assert_eq!(            config.to_string(),            "[core]\n            \n        [core]\n            c=d\n            e=f\n"        );        Ok(())    }} fn init_config() -> git_config::File<'static> {    git_config::File::try_from(        r#"[core]            a=b"100"        [core]            c=d            e=f"#,    )    .unwrap()}