Skip to content

Commit cffdb71

Browse files
committed
feat: add more testcases
1 parent d906831 commit cffdb71

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "configparser"
3-
version = "3.1.0"
3+
version = "3.2.0"
44
authors = ["QEDK <[email protected]>"]
55
edition = "2021"
66
description = "A simple configuration parsing utility with no dependencies that allows you to parse INI and ini-style syntax. You can use this to write Rust programs which can be customized by end users easily."
@@ -20,6 +20,9 @@ indexmap = { version = "^2.9", optional = true }
2020
tokio = { version = "^1.44", optional = true, features = ["fs"] }
2121
serde = { version = "^1.0", optional = true }
2222

23+
[features]
24+
serde = ["dep:serde", "indexmap/serde"]
25+
2326
[dev-dependencies]
2427
tokio = { version = "^1.44", features = ["fs", "macros", "rt-multi-thread"] }
2528
serde_json = { version = "^1.0" }

tests/test.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,3 +708,58 @@ fn serde_indexmap_roundtrip() -> Result<(), Box<dyn Error>> {
708708
);
709709
Ok(())
710710
}
711+
712+
#[test]
713+
#[cfg(feature = "serde")]
714+
fn serde_multiline_roundtrip() -> Result<(), Box<dyn Error>> {
715+
// 1. Build a case-sensitive Ini with multiline enabled
716+
let mut orig = Ini::new();
717+
orig.set_multiline(true);
718+
719+
// 2. Load the multiline fixture
720+
let map1 = orig.load("tests/test_multiline.ini")?;
721+
// 3. Capture the Key3 value before Serde
722+
let before = orig.get("Section", "Key3").unwrap();
723+
724+
// 4. Serialize to JSON and back
725+
let json = serde_json::to_string(&orig)?;
726+
let mut deser: Ini = serde_json::from_str(&json)?;
727+
728+
// 5. Re-enable multiline on the deserialized Ini
729+
deser.set_multiline(true);
730+
let after = deser.get("Section", "Key3").unwrap();
731+
732+
// 6. The entire map should match and Key3 must survive intact
733+
let map2 = deser.get_map().unwrap();
734+
assert_eq!(map1, map2);
735+
assert_eq!(after, before);
736+
737+
Ok(())
738+
}
739+
740+
#[test]
741+
#[cfg(feature = "serde")]
742+
fn serde_case_sensitive_roundtrip() -> Result<(), Box<dyn Error>> {
743+
// 1. Load in case-sensitive mode
744+
let mut orig = Ini::new_cs();
745+
let map1 = orig.load("tests/test.ini")?;
746+
// 2. Check that mixed-case keys work, lowercase doesn't
747+
let v1 = orig.get("default", "defaultvalues").unwrap();
748+
assert!(orig.get("default", "DefaultValues").is_none());
749+
750+
// 3. Serde round-trip
751+
let json = serde_json::to_string(&orig)?;
752+
let deser_plain: Ini = serde_json::from_str(&json)?;
753+
let map2 = deser_plain.get_map().unwrap();
754+
755+
// 4. Reconstruct a case-sensitive Ini and inject the map
756+
let mut deser_cs = Ini::new_cs();
757+
*deser_cs.get_mut_map() = map2;
758+
759+
// 5. Assert the exact-case key still exists and lowercase still fails
760+
let v2 = deser_cs.get("default", "defaultvalues").unwrap();
761+
assert_eq!(v2, v1);
762+
assert!(deser_cs.get("default", "DefaultValues").is_none());
763+
764+
Ok(())
765+
}

0 commit comments

Comments
 (0)