use std::str::FromStr;
use yaml_edit::YamlFile;
#[test]
fn test_flow_sequence_with_comments() {
let yaml = "[a, # comment\n b]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
let doc = parsed.document().unwrap();
let seq = doc.as_sequence().unwrap();
assert_eq!(seq.len(), 2);
}
#[test]
fn test_flow_mapping_with_comments() {
let yaml = "{key1: value1, # comment\n key2: value2}";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
let doc = parsed.document().unwrap();
let map = doc.as_mapping().unwrap();
assert_eq!(map.len(), 2);
}
#[test]
fn test_multiple_comments_in_flow() {
let yaml = "[a, # c1\n b, # c2\n c]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
let doc = parsed.document().unwrap();
let seq = doc.as_sequence().unwrap();
assert_eq!(seq.len(), 3);
}
#[test]
fn test_comment_before_closing_bracket() {
let yaml = "[a, b # comment\n]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_comment_after_colon() {
let yaml = "{key: # comment\n value}";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_comment_after_opening_bracket() {
let yaml = "[# comment\na, b]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_comment_after_opening_brace() {
let yaml = "{# comment\nkey: value}";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_comment_immediately_after_comma() {
let yaml = "[a,# comment\nb]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_nested_flow_with_comments() {
let yaml = "[[a,# c1\nb],# c2\nc]";
let parsed = YamlFile::from_str(yaml).unwrap();
assert_eq!(parsed.to_string(), yaml);
}
#[test]
fn test_multiline_flow_with_comments() {
let yaml = r#"flow_sequence: [
item1, # Comment 1
item2, # Comment 2
item3 # Comment 3
]
flow_mapping: {
key1: value1, # Comment A
key2: value2, # Comment B
key3: value3 # Comment C
}"#;
let parsed = YamlFile::from_str(yaml).unwrap();
let output = parsed.to_string();
assert_eq!(output, yaml);
let doc = parsed.document().unwrap();
let root = doc.as_mapping().unwrap();
assert_eq!(root.len(), 2);
}
#[test]
fn test_yaml_spec_example_with_flow_comments() {
let yaml = r#"Flow style: [ # Leading spaces
By two, # in flow style
Also by two, # are neither
Still by two # content nor
] # indentation."#;
let parsed = YamlFile::from_str(yaml).unwrap();
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_flow_comments_api_access() {
let yaml = r#"flow_sequence: [
item1, # Comment 1
item2, # Comment 2
item3 # Comment 3
]
flow_mapping: {
key1: value1, # Comment A
key2: value2, # Comment B
key3: value3 # Comment C
}"#;
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let root = doc.as_mapping().unwrap();
let seq_value = root
.get("flow_sequence")
.expect("Should have flow_sequence key");
let seq = seq_value
.as_sequence()
.expect("flow_sequence should be a sequence");
assert_eq!(seq.len(), 3);
let items: Vec<String> = seq
.values()
.map(|item| item.as_scalar().unwrap().as_string())
.collect();
assert_eq!(items[0], "item1");
assert_eq!(items[1], "item2");
assert_eq!(items[2], "item3");
let map_value = root
.get("flow_mapping")
.expect("Should have flow_mapping key");
let map = map_value
.as_mapping()
.expect("flow_mapping should be a mapping");
assert_eq!(map.len(), 3);
let val1 = map.get("key1").expect("Should have key1");
assert_eq!(val1.as_scalar().unwrap().as_string(), "value1");
let val2 = map.get("key2").expect("Should have key2");
assert_eq!(val2.as_scalar().unwrap().as_string(), "value2");
let val3 = map.get("key3").expect("Should have key3");
assert_eq!(val3.as_scalar().unwrap().as_string(), "value3");
}
#[test]
fn test_comment_with_only_whitespace() {
let yaml = "key: value # \n";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let key_val = mapping.get("key").unwrap();
assert_eq!(key_val.as_scalar().unwrap().as_string(), "value");
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_comment_at_eof_no_trailing_newline() {
let yaml = "key: value\n# Final comment";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let key_val = mapping.get("key").unwrap();
assert_eq!(key_val.as_scalar().unwrap().as_string(), "value");
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_hash_inside_quoted_strings() {
let yaml = "text: \"This is # not a comment\"\n";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let text_val = mapping.get("text").unwrap();
assert_eq!(
text_val.as_scalar().unwrap().as_string(),
"This is # not a comment"
);
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_comment_with_unicode_emoji() {
let yaml = "key: value # 🎉 important! 日本語\n";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let key_val = mapping.get("key").unwrap();
assert_eq!(key_val.as_scalar().unwrap().as_string(), "value");
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_multiple_hash_characters() {
let yaml = "key: value ## comment ### more\n";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let key_val = mapping.get("key").unwrap();
assert_eq!(key_val.as_scalar().unwrap().as_string(), "value");
let output = parsed.to_string();
assert_eq!(output, yaml);
}
#[test]
fn test_comment_after_directive() {
let yaml = "%YAML 1.2 # this is a comment\n---\nkey: value\n";
let parsed = YamlFile::from_str(yaml).unwrap();
let doc = parsed.document().unwrap();
let mapping = doc.as_mapping().unwrap();
let key_val = mapping.get("key").unwrap();
assert_eq!(key_val.as_scalar().unwrap().as_string(), "value");
let output = parsed.to_string();
assert_eq!(output, yaml);
}