#[cfg(test)]
mod tests {
use crate::syntax::parser::{CodeChunk, SyntaxParser};
use crate::syntax::yaml::YamlParser;
use anyhow::Result;
fn create_parser() -> YamlParser {
YamlParser::new()
}
fn assert_chunk(
chunk: &CodeChunk,
expected_content_trimmed: &str,
expected_start: usize,
expected_end: usize,
expected_element: &str,
) {
assert_eq!(chunk.content.trim(), expected_content_trimmed.trim());
assert_eq!(chunk.start_line, expected_start);
assert_eq!(chunk.end_line, expected_end);
assert_eq!(chunk.language, "yaml");
assert_eq!(chunk.element_type, expected_element);
assert!(!chunk.file_path.is_empty());
}
#[test]
fn test_parse_single_document_no_separator() -> Result<()> {
let code = r#"
name: Example Project
version: 1.0
dependencies:
- requests
- numpy
"#;
let mut parser = create_parser();
let chunks = parser.parse(code, "test.yaml")?;
assert!(chunks.len() == 1 || chunks.len() == 2, "Expected 1 or 2 chunks, found {}", chunks.len());
assert!(!chunks.is_empty(), "Expected at least one chunk");
assert_chunk(&chunks[0], code, 2, 7, "document");
Ok(())
}
#[test]
fn test_parse_multiple_documents_with_separator() -> Result<()> {
let code = r#"
# Document 1
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
---
# Document 2
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
"#;
let mut parser = create_parser();
let chunks = parser.parse(code, "test.yml")?;
assert_eq!(chunks.len(), 1, "Expected 1 chunk due to grammar issue, found {}", chunks.len());
let doc2_content = "---\n# Document 2\napiVersion: v1\nkind: Service\nmetadata:\n name: my-service\nspec:\n ports:\n - port: 80";
assert_chunk(&chunks[0], doc2_content, 8, 17, "document");
Ok(())
}
#[test]
fn test_parse_document_with_leading_content() -> Result<()> {
let code = r#"
# Optional leading comment
%TAG !yaml! tag:yaml.org,2002:
---
key: value
list:
- item1
- item2
"#;
let mut parser = create_parser();
let chunks = parser.parse(code, "test.yaml")?;
assert_eq!(chunks.len(), 1);
assert_chunk(&chunks[0], "%TAG !yaml! tag:yaml.org,2002:\n---\nkey: value\nlist:\n - item1\n - item2", 3, 9, "document"); Ok(())
}
#[test]
fn test_parse_empty_input_yaml() -> Result<()> {
let code = "";
let mut parser = create_parser();
let chunks = parser.parse(code, "test.yaml")?;
assert!(chunks.is_empty());
Ok(())
}
#[test]
fn test_parse_comments_only_yaml() -> Result<()> {
let code = r#"
# This is a yaml comment
# Another comment
"#;
let mut parser = create_parser();
let chunks = parser.parse(code, "test.yaml")?;
assert_eq!(chunks.len(), 1);
assert_chunk(&chunks[0], code, 1, 4, "document");
Ok(())
}
}