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()}
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()
}