use sqrust_core::FileContext;
use sqrust_core::Rule;
use sqrust_rules::structure::aggregate_star::AggregateStar;
fn ctx(src: &str) -> FileContext {
FileContext::from_source(src, "test.sql")
}
fn check(sql: &str) -> Vec<sqrust_core::Diagnostic> {
let c = ctx(sql);
AggregateStar.check(&c)
}
#[test]
fn rule_name_is_correct() {
assert_eq!(AggregateStar.name(), "Structure/AggregateStar");
}
#[test]
fn sum_star_violation() {
let diags = check("SELECT SUM(*) FROM t");
assert_eq!(diags.len(), 1);
}
#[test]
fn avg_star_violation() {
let diags = check("SELECT AVG(*) FROM t");
assert_eq!(diags.len(), 1);
}
#[test]
fn min_star_violation() {
let diags = check("SELECT MIN(*) FROM t");
assert_eq!(diags.len(), 1);
}
#[test]
fn max_star_violation() {
let diags = check("SELECT MAX(*) FROM t");
assert_eq!(diags.len(), 1);
}
#[test]
fn count_star_no_violation() {
let diags = check("SELECT COUNT(*) FROM t");
assert!(diags.is_empty(), "COUNT(*) should not be flagged");
}
#[test]
fn sum_column_no_violation() {
let diags = check("SELECT SUM(amount) FROM t");
assert!(diags.is_empty());
}
#[test]
fn sum_star_case_insensitive() {
let diags = check("SELECT sum(*) FROM t");
assert_eq!(diags.len(), 1);
}
#[test]
fn multiple_violations() {
let diags = check("SELECT SUM(*), AVG(*) FROM t");
assert_eq!(diags.len(), 2);
}
#[test]
fn sum_star_message_content() {
let diags = check("SELECT SUM(*) FROM t");
assert_eq!(diags.len(), 1);
assert!(
diags[0].message.contains("SUM"),
"message should mention SUM: {}",
diags[0].message
);
}
#[test]
fn sum_star_in_string_no_violation() {
let diags = check("SELECT 'SUM(*) example' FROM t");
assert!(diags.is_empty(), "SUM(*) inside string should not be flagged");
}
#[test]
fn sum_star_in_comment_no_violation() {
let diags = check("-- SUM(*)\nSELECT a FROM t");
assert!(diags.is_empty(), "SUM(*) inside comment should not be flagged");
}
#[test]
fn parse_error_still_scans() {
let diags = check("SELECT SUM(*) FROM @@invalid_token");
assert_eq!(diags.len(), 1);
}
#[test]
fn line_col_nonzero() {
let diags = check("SELECT SUM(*) FROM t");
assert_eq!(diags.len(), 1);
assert!(diags[0].line >= 1, "line should be >= 1");
assert!(diags[0].col >= 1, "col should be >= 1");
}
#[test]
fn stddev_star_violation() {
let diags = check("SELECT STDDEV(*) FROM t");
assert_eq!(diags.len(), 1);
}