use super::*;
#[test]
fn test_count_production_lines_simple() {
let source = "fn main() {\n println!(\"hello\");\n}\n";
assert_eq!(count_production_lines(source), 3);
}
#[test]
fn test_count_production_lines_with_test_module() {
let source = "fn main() {}\n\n#[cfg(test)]\nmod tests {\n #[test]\n fn test_it() {}\n}\n";
assert_eq!(count_production_lines(source), 1);
}
#[test]
fn test_count_production_lines_skips_comments() {
let source = "// This is a comment\nfn foo() {}\n// Another comment\nfn bar() {}\n";
assert_eq!(count_production_lines(source), 2);
}
#[test]
fn test_count_production_lines_skips_blanks() {
let source = "\n\nfn foo() {}\n\n\nfn bar() {}\n\n";
assert_eq!(count_production_lines(source), 2);
}
#[test]
fn test_count_production_lines_stops_on_single_line_cfg_test() {
let source = "fn main() {}\n#[cfg(test)] mod tests { fn t() {} fn u() {} }\n";
assert_eq!(
count_production_lines(source),
1,
"single-line `#[cfg(test)] mod tests` must terminate counting"
);
}
#[test]
fn test_count_production_lines_stops_on_cfg_test_with_trailing_whitespace() {
let source = "fn main() {}\n#[cfg(test)] \nmod tests { fn t() {} }\n";
assert_eq!(count_production_lines(source), 1);
}
#[test]
fn test_count_production_lines_skips_block_comment() {
let source = "\
/*
* A multi-line block comment.
* Spans several lines.
*/
fn foo() {}
";
assert_eq!(
count_production_lines(source),
1,
"only `fn foo() {{}}` is production"
);
}
#[test]
fn test_count_production_lines_skips_single_line_block_comment() {
let source = "/* header */\nfn foo() {}\nfn bar() {}\n";
assert_eq!(count_production_lines(source), 2);
}
#[test]
fn test_count_production_lines_counts_deref_starting_lines() {
let source = "\
fn write(p: &mut i32) {
*p = 42;
*p += 1;
}
";
assert_eq!(count_production_lines(source), 4);
}
#[test]
fn test_count_production_lines_counts_code_before_block_comment() {
let source = "fn foo() {\n let x = 1; /* note */\n}\n";
assert_eq!(count_production_lines(source), 3);
}
#[test]
fn test_count_production_lines_counts_code_after_inline_block_comment() {
let source = "fn foo() {\n /* note */ let x = 1;\n}\n";
assert_eq!(count_production_lines(source), 3);
}
#[test]
fn test_count_production_lines_skips_pure_inline_block_comment() {
let source = "fn foo() {\n /* note */\n}\n";
assert_eq!(count_production_lines(source), 2);
}
#[test]
fn test_count_production_lines_handles_nested_block_comments() {
let source = "\
/* outer
/* inner */
still outer */
fn foo() {}
";
assert_eq!(
count_production_lines(source),
1,
"nested block comments must track depth, not a boolean flag"
);
}
#[test]
fn test_count_production_lines_nested_block_closes_properly() {
let source = "/* a /* b */ c */ fn bar() {}\n";
assert_eq!(count_production_lines(source), 1);
}
#[test]
fn test_count_production_lines_skips_line_with_two_block_comments() {
let source = "fn foo() {}\n/* a */ /* b */\nfn bar() {}\n";
assert_eq!(
count_production_lines(source),
2,
"a whitespace-separated double block comment is not production code"
);
}
#[test]
fn test_count_production_lines_empty() {
assert_eq!(count_production_lines(""), 0);
}