mod common;
#[test]
fn strsim_threshold_exact_match() {
let sim = strsim::normalized_levenshtein("hello", "hello");
assert!(
(sim - 1.0).abs() < 1e-9,
"exact match should have sim=1.0, got {sim}"
);
}
#[test]
fn strsim_threshold_single_char_diff() {
let sim = strsim::normalized_levenshtein("hello", "hellp");
assert!(sim > 0.7, "1-char diff should be >0.7, got {sim}");
}
#[test]
fn strsim_threshold_completely_different() {
let sim = strsim::normalized_levenshtein("abc", "xyz");
assert!(sim < 0.1, "completely different should be <0.1, got {sim}");
}
#[test]
fn strsim_empty_vs_empty() {
let sim = strsim::normalized_levenshtein("", "");
assert!(
(sim - 1.0).abs() < 1e-9,
"empty vs empty should be 1.0, got {sim}"
);
}
#[test]
fn strsim_empty_vs_nonempty() {
let sim = strsim::normalized_levenshtein("", "x");
assert!(sim < 0.1, "empty vs nonempty should be near 0, got {sim}");
}
#[test]
fn heck_http_request_to_snake() {
use heck::ToSnakeCase;
assert_eq!("HTTPRequest".to_snake_case(), "http_request");
assert_eq!("HTTPSConnection".to_snake_case(), "https_connection");
}
#[test]
fn heck_user_id_to_kebab() {
use heck::ToKebabCase;
assert_eq!("UserID".to_kebab_case(), "user-id");
assert_eq!("user_id".to_kebab_case(), "user-id");
}
#[test]
fn heck_camel_to_pascal() {
use heck::ToUpperCamelCase;
assert_eq!(
"getHTTPResponseCode".to_upper_camel_case(),
"GetHttpResponseCode"
);
}
#[test]
fn heck_pascal_to_camel() {
use heck::ToLowerCamelCase;
assert_eq!(
"GetHttpResponseCode".to_lower_camel_case(),
"getHttpResponseCode"
);
}
#[test]
fn heck_pascal_to_screaming_snake() {
use heck::ToShoutySnakeCase;
assert_eq!(
"GetHTTPResponse".to_shouty_snake_case(),
"GET_HTTP_RESPONSE"
);
}
#[test]
fn heck_via_atomwrite_case_snake() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("a.txt");
std::fs::write(&f, "let HTTPSConnection = 1;\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"case",
f.to_str().unwrap(),
"--subvert",
"HTTPSConnection",
"https_connection",
"--to",
"snake",
])
.output()
.expect("case");
assert!(
output.status.success(),
"case failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(
content.contains("let https_connection = 1;"),
"snake_case: {content}"
);
}
#[test]
fn toml_edit_dotted_path_top_level() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "name = \"x\"\nversion = \"0.1.0\"\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"version",
"1.0.0",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(content.contains("version = \"1.0.0\""), "got: {content}");
}
#[test]
fn toml_edit_dotted_path_nested() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "[package]\nname = \"x\"\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"package.edition",
"2024",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(content.contains("edition = 2024"), "got: {content}");
}
#[test]
fn toml_edit_creates_intermediate_tables() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"a.b.c.d",
"deep",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(
content.contains("[a.b.c]"),
"intermediate tables: {content}"
);
assert!(content.contains("d = \"deep\""), "leaf value: {content}");
}
#[test]
fn toml_edit_preserves_comments() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(
&f,
"# Important comment\n[package]\n# section comment\nname = \"x\"\n",
)
.expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"package.name",
"y",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(
content.contains("# Important comment"),
"top-level comment preserved: {content}"
);
assert!(
content.contains("# section comment"),
"section comment preserved: {content}"
);
}
#[test]
fn toml_edit_value_coercion_int_via_set() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "[s]\nport = 8080\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"s.port",
"9090",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(content.contains("port = 9090"), "int coercion: {content}");
}
#[test]
fn toml_edit_value_coercion_float_via_set() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "[s]\nratio = 1.5\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"s.ratio",
"2.5",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(content.contains("ratio = 2.5"), "float coercion: {content}");
}
#[test]
fn toml_edit_value_coercion_bool_via_set() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "[f]\nenabled = false\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"f.enabled",
"true",
])
.output()
.expect("set");
assert!(
output.status.success(),
"set failed: {}",
String::from_utf8_lossy(&output.stderr)
);
let content = std::fs::read_to_string(&f).expect("read");
assert!(
content.contains("enabled = true"),
"bool coercion: {content}"
);
}
#[test]
fn toml_edit_key_with_space() {
let dir = tempfile::tempdir().expect("tempdir");
let workspace = dir.path().to_str().unwrap();
let f = dir.path().join("config.toml");
std::fs::write(&f, "[s]\n\"weird key\" = \"old\"\n").expect("write");
let output = common::atomwrite()
.args([
"--workspace",
workspace,
"set",
f.to_str().unwrap(),
"s.\"weird key\"",
"new",
])
.output()
.expect("set");
let _ = output;
let _ = std::fs::read_to_string(&f).expect("read");
}
#[test]
fn content_inspector_utf8_plain() {
let output = common::atomwrite()
.args(["--workspace", "/tmp", "hash", "/tmp"])
.output();
let _ = output;
}
#[test]
fn content_inspector_utf8_with_bom_classified_as_text() {
let dir = tempfile::tempdir().expect("tempdir");
let f = dir.path().join("utf8bom.txt");
std::fs::write(&f, [0xEF, 0xBB, 0xBF]).expect("write");
std::fs::write(&f, [0xEF, 0xBB, 0xBF, b'h', b'i']).expect("write");
let content = std::fs::read(&f).expect("read");
let ct = atomwrite::binary_detect::detect_content_type(&content);
assert_eq!(ct, atomwrite::binary_detect::ContentType::Utf8);
}
#[test]
fn content_inspector_binary_with_null_bytes() {
let mut data = vec![0u8; 100];
for (i, b) in data.iter_mut().enumerate() {
*b = (i % 256) as u8;
}
let ct = atomwrite::binary_detect::detect_content_type(&data);
assert!(matches!(
ct,
atomwrite::binary_detect::ContentType::Binary | atomwrite::binary_detect::ContentType::Utf8
));
}
#[test]
fn content_inspector_empty_is_utf8() {
let ct = atomwrite::binary_detect::detect_content_type(&[]);
assert!(!atomwrite::binary_detect::is_binary(&[]));
assert_eq!(ct, atomwrite::binary_detect::ContentType::Utf8);
}
#[test]
fn serde_yaml_parses_simple() {
let yaml = "name: test\nrules:\n - id: r1\n kind: function\n pattern: 'fn foo()'\n";
let parsed: serde_yaml::Value = serde_yaml::from_str(yaml).expect("parse");
assert_eq!(parsed["name"], "test");
assert!(parsed["rules"].is_sequence());
}
#[test]
fn serde_yaml_rejects_malformed() {
let bad = "name: test\n invalid indent: : :\n - oops\n";
let result: std::result::Result<serde_yaml::Value, _> = serde_yaml::from_str(bad);
assert!(result.is_err(), "malformed YAML should fail to parse");
}
#[test]
fn serde_yaml_missing_keys_works() {
let yaml = "name: test\n";
let parsed: serde_yaml::Value = serde_yaml::from_str(yaml).expect("parse");
assert!(parsed.get("rules").is_none());
}
#[test]
fn serde_yaml_empty_object() {
let yaml = "{}";
let parsed: serde_yaml::Value = serde_yaml::from_str(yaml).expect("parse");
assert!(parsed.is_mapping() || parsed.is_null());
}