use splice::ingest::cpp::{extract_cpp_symbols, CppSymbolKind};
use std::path::Path;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_simple_function() {
let source = b"int foo() { return 42; }\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "foo");
assert_eq!(symbols[0].kind, CppSymbolKind::Function);
assert_eq!(symbols[0].namespace_path, "");
assert!(!symbols[0].is_template);
}
#[test]
fn test_extract_function_with_parameters() {
let source = b"int add(int a, int b) { return a + b; }\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "add");
assert_eq!(symbols[0].kind, CppSymbolKind::Function);
assert_eq!(symbols[0].parameters, vec!["a", "b"]);
}
#[test]
fn test_extract_class_definition() {
let source = b"class MyClass {\npublic:\n void method();\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "MyClass");
assert_eq!(symbols[0].kind, CppSymbolKind::Class);
}
#[test]
fn test_extract_struct_definition() {
let source = b"struct Point {\n int x;\n int y;\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "Point");
assert_eq!(symbols[0].kind, CppSymbolKind::Struct);
}
#[test]
fn test_extract_namespace_definition() {
let source = b"namespace utils {\n void helper();\n}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 2);
assert_eq!(symbols[0].name, "utils");
assert_eq!(symbols[0].kind, CppSymbolKind::Namespace);
assert_eq!(symbols[1].name, "helper");
assert_eq!(symbols[1].namespace_path, "utils");
}
#[test]
fn test_extract_enum_definition() {
let source = b"enum Color { Red, Green, Blue };\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "Color");
assert_eq!(symbols[0].kind, CppSymbolKind::Enum);
}
#[test]
fn test_extract_enum_class_definition() {
let source = b"enum class Color { Red, Green, Blue };\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "Color");
assert_eq!(symbols[0].kind, CppSymbolKind::Enum);
}
#[test]
fn test_extract_class_with_method() {
let source = b"class Baz {\npublic:\n void method() {}\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(!symbols.is_empty());
assert_eq!(symbols[0].name, "Baz");
assert_eq!(symbols[0].kind, CppSymbolKind::Class);
}
#[test]
fn test_extract_nested_class() {
let source = b"class Outer {\npublic:\n class Inner {\n public:\n void method() {}\n };\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(symbols.len() >= 2);
assert_eq!(symbols[0].name, "Outer");
assert_eq!(symbols[0].kind, CppSymbolKind::Class);
assert_eq!(symbols[1].name, "Inner");
assert_eq!(symbols[1].kind, CppSymbolKind::Class);
assert_eq!(symbols[1].namespace_path, "Outer");
}
#[test]
fn test_extract_template_function() {
let source = b"template<typename T>\nT max(T a, T b) { return a > b ? a : b; }\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "max");
assert_eq!(symbols[0].kind, CppSymbolKind::TemplateFunction);
assert!(symbols[0].is_template);
}
#[test]
fn test_extract_template_class() {
let source = b"template<typename T>\nclass Vector {\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "Vector");
assert_eq!(symbols[0].kind, CppSymbolKind::TemplateClass);
assert!(symbols[0].is_template);
}
#[test]
fn test_extract_multiple_functions() {
let source = b"void foo() {}\nvoid bar() {}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 2);
assert_eq!(symbols[0].name, "foo");
assert_eq!(symbols[1].name, "bar");
}
#[test]
fn test_extract_function_in_namespace() {
let source = b"namespace utils {\n void helper() {}\n}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(symbols.len() >= 2);
assert_eq!(symbols[0].name, "utils");
assert_eq!(symbols[0].kind, CppSymbolKind::Namespace);
assert_eq!(symbols[1].name, "helper");
assert_eq!(symbols[1].namespace_path, "utils");
}
#[test]
fn test_cpp_symbol_has_byte_span() {
let source = b"void foo() {}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert!(symbols[0].byte_start < symbols[0].byte_end);
assert_eq!(symbols[0].byte_start, 0); }
#[test]
fn test_extract_class_with_multiple_methods() {
let source = b"class Calculator {\npublic:\n int add(int a, int b);\n int sub(int a, int b);\n};\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(!symbols.is_empty());
assert_eq!(symbols[0].name, "Calculator");
assert_eq!(symbols[0].kind, CppSymbolKind::Class);
}
#[test]
fn test_extract_namespace_with_nested_class() {
let source = b"namespace std {\n template<typename T>\n class vector {\n };\n}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(symbols.len() >= 2);
assert_eq!(symbols[0].name, "std");
assert_eq!(symbols[0].kind, CppSymbolKind::Namespace);
assert_eq!(symbols[1].name, "vector");
assert_eq!(symbols[1].kind, CppSymbolKind::TemplateClass);
assert_eq!(symbols[1].namespace_path, "std");
}
#[test]
fn test_extract_empty_source() {
let source = b"int x;\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 0);
}
#[test]
fn test_extract_function_returns_void() {
let source = b"void func() {}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert_eq!(symbols.len(), 1);
assert_eq!(symbols[0].name, "func");
assert_eq!(symbols[0].kind, CppSymbolKind::Function);
}
#[test]
fn test_fully_qualified_name() {
let source = b"namespace ns {\n class MyClass {\n public:\n void method();\n };\n}\n";
let symbols =
extract_cpp_symbols(Path::new("/tmp/test.cpp"), source).expect("Failed to parse");
assert!(symbols.len() >= 2);
assert_eq!(symbols[0].name, "ns");
assert_eq!(symbols[0].fully_qualified, "ns");
assert_eq!(symbols[1].name, "MyClass");
assert_eq!(symbols[1].fully_qualified, "ns::MyClass");
}
}