use vibesql_ast::Expression;
use vibesql_storage::Row;
use vibesql_types::SqlValue;
use super::*;
fn make_test_rows(values: Vec<i64>) -> Vec<Row> {
values.into_iter().map(|v| Row::new(vec![SqlValue::Integer(v)])).collect()
}
#[test]
fn test_count_star_window() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30, 40, 50]));
let frame = 0..5;
let result = evaluate_count_window(&partition, frame, None, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(5));
}
#[test]
fn test_count_window_with_frame() {
let partition = Partition::new(make_test_rows(vec![1, 2, 3, 4, 5]));
let frame = 1..4;
let result = evaluate_count_window(&partition, frame, None, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(3));
}
#[test]
fn test_count_expr_window() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30]));
let frame = 0..3;
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let result = evaluate_count_window(&partition, frame, Some(&expr), None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(3));
}
#[test]
fn test_sum_window_running_total() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30, 40, 50]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..3; let result = evaluate_sum_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(60));
}
#[test]
fn test_sum_window_moving() {
let partition = Partition::new(make_test_rows(vec![5, 10, 15, 20, 25]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 2..5;
let result = evaluate_sum_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(60)); }
#[test]
fn test_sum_window_empty_frame() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..0;
let result = evaluate_sum_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Null);
}
#[test]
fn test_avg_window_simple() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30, 40, 50]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..5;
let result = evaluate_avg_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Numeric(30.0));
}
#[test]
fn test_avg_window_moving() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30, 40, 50]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 1..4;
let result = evaluate_avg_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Numeric(30.0));
}
#[test]
fn test_avg_window_empty_frame() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..0;
let result = evaluate_avg_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Null);
}
#[test]
fn test_min_window_partition() {
let partition = Partition::new(make_test_rows(vec![50, 20, 80, 10, 40]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..5;
let result = evaluate_min_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(10));
}
#[test]
fn test_min_window_moving() {
let partition = Partition::new(make_test_rows(vec![50, 20, 80, 10, 40]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 1..4;
let result = evaluate_min_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(10));
}
#[test]
fn test_min_window_empty_frame() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..0;
let result = evaluate_min_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Null);
}
#[test]
fn test_max_window_partition() {
let partition = Partition::new(make_test_rows(vec![50, 20, 80, 10, 40]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..5;
let result = evaluate_max_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(80));
}
#[test]
fn test_max_window_moving() {
let partition = Partition::new(make_test_rows(vec![50, 20, 80, 10, 40]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 2..5;
let result = evaluate_max_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(80));
}
#[test]
fn test_max_window_empty_frame() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 0..0;
let result = evaluate_max_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Null);
}
#[test]
fn test_frame_at_partition_boundaries() {
let partition = Partition::new(make_test_rows(vec![10, 20, 30, 40, 50]));
let expr = Expression::ColumnRef(vibesql_ast::ColumnIdentifier::simple("0", false));
let frame = 3..10; let result = evaluate_sum_window(&partition, frame, &expr, None, evaluate_expression);
assert_eq!(result, SqlValue::Integer(90));
}