#![allow(missing_docs)]
use noyalib::cst::parse_document;
use noyalib::{Mapping, Number, Value};
#[test]
fn detects_two_space_indent() {
let doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
assert_eq!(doc.indent_unit(), 2);
}
#[test]
fn detects_four_space_indent() {
let doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
assert_eq!(doc.indent_unit(), 4);
}
#[test]
fn detects_three_space_indent() {
let doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
assert_eq!(doc.indent_unit(), 3);
}
#[test]
fn flat_document_defaults_to_two() {
let doc = parse_document("a: 1\nb: 2\nc: 3\n").unwrap();
assert_eq!(doc.indent_unit(), 2);
}
#[test]
fn empty_document_defaults_to_two() {
let doc = parse_document("").unwrap();
assert_eq!(doc.indent_unit(), 2);
}
#[test]
fn comments_are_ignored_for_detection() {
let src = "\
# top
outer:
inner:
leaf: 1
";
let doc = parse_document(src).unwrap();
assert_eq!(doc.indent_unit(), 4);
}
#[test]
fn mixed_steps_picks_smallest() {
let src = "\
outer:
middle:
leaf: 1
";
let doc = parse_document(src).unwrap();
assert_eq!(doc.indent_unit(), 2);
}
#[test]
fn insert_scalar_into_two_space_file_uses_inline_form() {
let mut doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
doc.entry("metadata.labels")
.insert_value("replicas", &Value::Number(Number::Integer(3)))
.unwrap();
let out = doc.to_string();
assert!(out.contains(" replicas: 3"), "got:\n{out}");
}
#[test]
fn insert_scalar_into_four_space_file_uses_inline_form() {
let mut doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
doc.entry("metadata.labels")
.insert_value("replicas", &Value::Number(Number::Integer(3)))
.unwrap();
let out = doc.to_string();
assert!(
out.contains(" replicas: 3"),
"expected 8-space-indented sibling line, got:\n{out}"
);
}
#[test]
fn insert_nested_mapping_into_two_space_file_uses_two_space_inner_indent() {
let mut doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
let mut nested = Mapping::new();
let _ = nested.insert("cpu", Value::String("100m".into()));
let _ = nested.insert("memory", Value::String("128Mi".into()));
doc.entry("metadata")
.insert_value("resources", &Value::Mapping(nested))
.unwrap();
let out = doc.to_string();
assert!(
out.contains("\n resources:\n cpu:"),
"expected 'resources' at column 2, 'cpu' at column 4, got:\n{out}"
);
assert!(
out.contains("\n memory:"),
"expected 'memory' indented to column 4, got:\n{out}"
);
}
#[test]
fn insert_nested_mapping_into_four_space_file_uses_four_space_inner_indent() {
let mut doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
let mut nested = Mapping::new();
let _ = nested.insert("cpu", Value::String("100m".into()));
let _ = nested.insert("memory", Value::String("128Mi".into()));
doc.entry("metadata")
.insert_value("resources", &Value::Mapping(nested))
.unwrap();
let out = doc.to_string();
assert!(
out.contains("\n resources:\n cpu:"),
"expected 'resources' at column 4, 'cpu' at column 8, got:\n{out}"
);
assert!(
out.contains("\n memory:"),
"expected 'memory' at column 8, got:\n{out}"
);
}
#[test]
fn insert_keeps_existing_siblings_byte_faithful() {
let src = "\
# project metadata
metadata:
# label group
labels:
app: noyalib # the project
team: platform
";
let mut doc = parse_document(src).unwrap();
doc.entry("metadata.labels")
.insert_value("env", &Value::String("prod".into()))
.unwrap();
let out = doc.to_string();
assert!(out.contains("# project metadata"));
assert!(out.contains("# label group"));
assert!(out.contains("app: noyalib # the project"));
assert!(out.contains("team: platform"));
assert!(
out.contains(" env: prod"),
"new key must adopt 8-space indent, got:\n{out}"
);
}
#[test]
fn re_parsing_after_insert_value_succeeds() {
let mut doc = parse_document("metadata:\n labels:\n app: noyalib\n").unwrap();
let mut nested = Mapping::new();
let _ = nested.insert("cpu", Value::String("100m".into()));
doc.entry("metadata")
.insert_value("resources", &Value::Mapping(nested))
.unwrap();
let out = doc.to_string();
let again = parse_document(&out).unwrap();
assert_eq!(again.to_string(), out);
}