use super::classify::QueryClassifier;
use super::intent::QueryIntent;
#[test]
fn test_pascal_identifier_alone_is_definition() {
assert_eq!(
QueryClassifier::classify("QueryClassifier intent classification"),
QueryIntent::Definition
);
}
#[test]
fn test_camel_case_with_extra_words_is_definition() {
assert_eq!(
QueryClassifier::classify("CodeIndexer pipeline"),
QueryIntent::Definition
);
}
#[test]
fn test_pascal_identifier_loses_to_conceptual_verb() {
assert_eq!(
QueryClassifier::classify("how does QueryClassifier work"),
QueryIntent::Conceptual
);
}
#[test]
fn test_standalone_enum_is_definition() {
assert_eq!(
QueryClassifier::classify("enum for reservation status"),
QueryIntent::Definition
);
}
#[test]
fn test_leading_acronym_with_digits_is_definition() {
assert_eq!(
QueryClassifier::classify("BM25Index lookup"),
QueryIntent::Definition
);
}
#[test]
fn test_leading_acronym_io_error_is_definition() {
assert_eq!(
QueryClassifier::classify("IOError handling path"),
QueryIntent::Definition
);
}
#[test]
fn test_leading_acronym_url_parser_is_definition() {
assert_eq!(
QueryClassifier::classify("URLParser implementation"),
QueryIntent::Definition
);
}
#[test]
fn test_bm25_alone_is_definition_via_pascal_fallback() {
assert_eq!(
QueryClassifier::classify("BM25 ranking"),
QueryIntent::Definition
);
}
#[test]
fn test_pure_acronym_now_triggers_definition() {
assert_eq!(
QueryClassifier::classify("API endpoints"),
QueryIntent::Definition
);
assert_eq!(
QueryClassifier::classify("TODO items"),
QueryIntent::BugDebt
);
}
#[test]
fn test_short_nl_query_not_forced_conceptual() {
let result = QueryClassifier::classify("reservation booking flow");
assert_ne!(result, QueryIntent::Conceptual);
}
#[test]
fn test_single_snake_case_is_definition() {
assert_eq!(
QueryClassifier::classify("apply_archive_downrank"),
QueryIntent::Definition
);
assert_eq!(
QueryClassifier::classify("is_default_doc_excluded"),
QueryIntent::Definition
);
assert_eq!(
QueryClassifier::classify("get_call_chain"),
QueryIntent::Definition
);
}
#[test]
fn test_bare_snake_identifier_with_digits_is_definition() {
assert_eq!(
QueryClassifier::classify("bm25_search"),
QueryIntent::Definition
);
assert_eq!(
QueryClassifier::classify("parse_v2_response"),
QueryIntent::Definition
);
}
#[test]
fn test_multi_word_with_snake_does_not_match_snake_branch() {
assert_eq!(
QueryClassifier::classify("the payment_processor retries failed attempts five times"),
QueryIntent::Unknown
);
}
#[test]
fn test_acronym_struct_hint_is_definition() {
assert_eq!(
QueryClassifier::classify("BM25 index"),
QueryIntent::Definition
);
assert_eq!(
QueryClassifier::classify("RRF fusion"),
QueryIntent::Definition
);
assert_eq!(QueryClassifier::classify("ORT"), QueryIntent::Definition);
assert_eq!(QueryClassifier::classify("HNSW"), QueryIntent::Definition);
}
#[test]
fn test_multi_word_acronym_with_nl_words_is_conceptual() {
assert_eq!(
QueryClassifier::classify("HNSW vector similarity search"),
QueryIntent::Conceptual
);
assert_eq!(
QueryClassifier::classify("RRF fusion algorithm explanation"),
QueryIntent::Conceptual
);
}
#[test]
fn test_four_word_lowercase_is_conceptual() {
assert_eq!(
QueryClassifier::classify("axum middleware concurrency limiter"),
QueryIntent::Conceptual
);
assert_eq!(
QueryClassifier::classify("redb persistence write transaction"),
QueryIntent::Conceptual
);
assert_eq!(
QueryClassifier::classify("embed batch async worker pool"),
QueryIntent::Conceptual
);
assert_eq!(
QueryClassifier::classify("Louvain community detection modularity"),
QueryIntent::Conceptual
);
}
#[test]
fn test_screaming_snake_brusilov_epoch_is_definition() {
assert_eq!(
QueryClassifier::classify("BRUSILOV_EPOCH"),
QueryIntent::Definition
);
}
#[test]
fn test_screaming_snake_max_batch_size_is_definition() {
assert_eq!(
QueryClassifier::classify("MAX_BATCH_SIZE"),
QueryIntent::Definition
);
}
#[test]
fn test_screaming_snake_foo_bar_baz_is_definition() {
assert_eq!(
QueryClassifier::classify("FOO_BAR_BAZ"),
QueryIntent::Definition
);
}
#[test]
fn test_screaming_snake_is_default_doc_excluded_is_definition() {
assert_eq!(
QueryClassifier::classify("IS_DEFAULT_DOC_EXCLUDED"),
QueryIntent::Definition
);
}
#[test]
fn test_screaming_snake_does_not_change_multiword_query() {
assert_eq!(
QueryClassifier::classify("HNSW vector similarity"),
QueryIntent::Unknown
);
}
#[test]
fn test_regular_snake_case_unaffected_by_scream_rule() {
assert_eq!(
QueryClassifier::classify("authenticate_user"),
QueryIntent::Definition
);
}
#[test]
fn test_fn_authenticate_unaffected_by_scream_rule() {
assert_eq!(
QueryClassifier::classify("fn authenticate"),
QueryIntent::Definition
);
}
#[test]
fn test_lowercase_mixed_words_unaffected_by_scream_rule() {
assert_eq!(
QueryClassifier::classify("reservation booking flow"),
QueryIntent::Unknown
);
}
#[test]
fn test_canonical_benchmark_at_least_12_of_14_classified() {
let queries: &[&str] = &[
"SearchMode",
"WalkOptions",
"apply_archive_downrank",
"is_default_doc_excluded",
"get_call_chain",
"symbol graph BFS expansion",
"Louvain community detection modularity",
"axum middleware concurrency limiter",
"redb persistence write transaction",
"embed batch async worker pool",
"chunker AST tree-sitter code split",
"HNSW vector similarity search",
"install via cargo",
"what is BM25",
];
let non_unknown = queries
.iter()
.filter(|q| QueryClassifier::classify(q) != QueryIntent::Unknown)
.count();
assert!(
non_unknown >= 12,
"expected ≥12/14 queries to classify as non-Unknown; got {non_unknown}/14. \
Per-query intents: {:?}",
queries
.iter()
.map(|q| (*q, QueryClassifier::classify(q)))
.collect::<Vec<_>>()
);
}