use crap4rust::analysis::complexity::cognitive_complexity;
use syn::Block;
use syn::parse_file;
fn parse_fn_block(source: &str) -> Block {
let source = format!("fn f() {{ {} }}", source);
let file = parse_file(&source).expect("parse source");
let item_fn = match &file.items[0] {
syn::Item::Fn(f) => f,
_ => panic!("expected function"),
};
(*item_fn.block).clone()
}
#[test]
fn empty_function_returns_zero() {
let block = parse_fn_block("");
let score = cognitive_complexity(&block);
assert_eq!(score, 0);
}
#[test]
fn for_loop_scores_one() {
let block = parse_fn_block("for _ in 0..10 { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn if_with_logical_and_condition_scores_two() {
let block = parse_fn_block("if a && b { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 2);
}
#[test]
fn if_with_logical_and_or_condition_scores_three() {
let block = parse_fn_block("if a && b || c { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 3);
}
#[test]
fn loop_scores_one() {
let block = parse_fn_block("loop { break; }");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn match_guard_with_logical_and_condition_scores_two() {
let block = parse_fn_block("match x { n if a && b => 1, _ => 0 };");
let score = cognitive_complexity(&block);
assert_eq!(score, 2);
}
#[test]
fn match_three_arms_scores_one() {
let block = parse_fn_block("match x { 1 => {}, 2 => {}, 3 => {} }");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn nested_if_scores_three() {
let block = parse_fn_block("if x { if y { } }");
let score = cognitive_complexity(&block);
assert_eq!(score, 3);
}
#[test]
fn single_if_scores_one() {
let block = parse_fn_block("if x { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn try_block_scores_one() {
let block = parse_fn_block("let _ = try { 1 };");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn while_loop_scores_one() {
let block = parse_fn_block("while true { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 1);
}
#[test]
fn while_with_bare_condition_matches_logical_condition_base_cost() {
let bare = parse_fn_block("while a { }");
let logical = parse_fn_block("while a && b { }");
let bare_score = cognitive_complexity(&bare);
let logical_score = cognitive_complexity(&logical);
assert_eq!(logical_score - bare_score, 1);
}
#[test]
fn while_with_logical_and_condition_scores_two() {
let block = parse_fn_block("while a && b { }");
let score = cognitive_complexity(&block);
assert_eq!(score, 2);
}