use dry4rust::code_unit::CodeUnitKind;
use std::collections::BTreeSet;
#[test]
fn code_unit_kind_debug_names_the_variant() {
assert_eq!(format!("{:?}", CodeUnitKind::Method), "Method");
assert_eq!(format!("{:?}", CodeUnitKind::ImplBlock), "ImplBlock");
}
#[test]
fn code_unit_kind_distinguishes_functions_from_closures() {
assert_ne!(CodeUnitKind::Function, CodeUnitKind::Closure);
assert_eq!(CodeUnitKind::Function, CodeUnitKind::Function);
}
#[test]
fn display_gives_no_two_kinds_the_same_name() {
let every_kind = [
CodeUnitKind::Function,
CodeUnitKind::Method,
CodeUnitKind::Closure,
CodeUnitKind::Class,
CodeUnitKind::ImplBlock,
CodeUnitKind::TraitImplBlock,
CodeUnitKind::IfBranch,
CodeUnitKind::MatchArm,
CodeUnitKind::LoopBody,
CodeUnitKind::Block,
];
let names: BTreeSet<String> = every_kind.iter().map(ToString::to_string).collect();
assert_eq!(
names.len(),
every_kind.len(),
"a report that calls two kinds the same thing cannot be acted on"
);
}
#[test]
fn display_names_every_kind_the_way_a_report_should_read() {
let every_kind = [
(CodeUnitKind::Function, "function"),
(CodeUnitKind::Method, "method"),
(CodeUnitKind::Closure, "closure"),
(CodeUnitKind::Class, "class"),
(CodeUnitKind::ImplBlock, "impl block"),
(CodeUnitKind::TraitImplBlock, "trait impl block"),
(CodeUnitKind::IfBranch, "if branch"),
(CodeUnitKind::MatchArm, "match arm"),
(CodeUnitKind::LoopBody, "loop body"),
(CodeUnitKind::Block, "block"),
];
let rendered: Vec<String> = every_kind.iter().map(|(k, _)| k.to_string()).collect();
let expected: Vec<&str> = every_kind.iter().map(|(_, name)| *name).collect();
assert_eq!(
rendered, expected,
"these strings are what a user reads in a report, so they are a \
contract rather than a detail"
);
}