use super::fixtures::*;
#[test]
fn test_extract_from_current_date() {
let (evaluator, row) = setup_test();
let expr =
create_datetime_function("YEAR", vec![create_datetime_function("CURRENT_DATE", vec![])]);
let result = evaluator.eval(&expr, &row).unwrap();
match result {
vibesql_types::SqlValue::Integer(year) => {
assert!((2024..=2100).contains(&year), "Year should be reasonable: {}", year);
}
_ => panic!("YEAR should return Integer"),
}
}
#[test]
fn test_extract_from_current_timestamp() {
let (evaluator, row) = setup_test();
let expr = create_datetime_function("HOUR", vec![create_datetime_function("NOW", vec![])]);
let result = evaluator.eval(&expr, &row).unwrap();
match result {
vibesql_types::SqlValue::Integer(hour) => {
assert!((0..=23).contains(&hour), "Hour should be 0-23: {}", hour);
}
_ => panic!("HOUR should return Integer"),
}
}
#[test]
fn test_multiple_extractions() {
let (evaluator, row) = setup_test();
let timestamp = vibesql_types::SqlValue::Timestamp(TEST_TIMESTAMP_CHRISTMAS.parse().unwrap());
let year_expr = create_datetime_function("YEAR", vec![create_literal(timestamp.clone())]);
let year_result = evaluator.eval(&year_expr, &row).unwrap();
assert_eq!(year_result, vibesql_types::SqlValue::Integer(2024));
let month_expr = create_datetime_function("MONTH", vec![create_literal(timestamp.clone())]);
let month_result = evaluator.eval(&month_expr, &row).unwrap();
assert_eq!(month_result, vibesql_types::SqlValue::Integer(12));
let day_expr = create_datetime_function("DAY", vec![create_literal(timestamp.clone())]);
let day_result = evaluator.eval(&day_expr, &row).unwrap();
assert_eq!(day_result, vibesql_types::SqlValue::Integer(25));
let hour_expr = create_datetime_function("HOUR", vec![create_literal(timestamp.clone())]);
let hour_result = evaluator.eval(&hour_expr, &row).unwrap();
assert_eq!(hour_result, vibesql_types::SqlValue::Integer(23));
let minute_expr = create_datetime_function("MINUTE", vec![create_literal(timestamp.clone())]);
let minute_result = evaluator.eval(&minute_expr, &row).unwrap();
assert_eq!(minute_result, vibesql_types::SqlValue::Integer(59));
let second_expr = create_datetime_function("SECOND", vec![create_literal(timestamp)]);
let second_result = evaluator.eval(&second_expr, &row).unwrap();
assert_eq!(second_result, vibesql_types::SqlValue::Integer(58));
}