use toolu_orm_core::column::{BigInt, Integer, Real, SmallInt};
use toolu_orm_core::query_column::{Column, CommonOps, NumericOps};
use toolu_orm_core::value::Value;
#[test]
fn integer_column_gt_produces_correct_sql() {
let col: Column<Integer> = Column::new("users", "age");
let expr = col.gt(18);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""users"."age" > ?1"#);
assert_eq!(params, vec![Value::from(18i32)]);
}
#[test]
fn column_between_produces_correct_sql() {
let col: Column<Integer> = Column::new("products", "price");
let expr = col.between(10, 100);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""products"."price" BETWEEN ?1 AND ?2"#);
assert_eq!(params, vec![Value::from(10i32), Value::from(100i32)]);
}
#[test]
fn integer_column_lt_produces_correct_sql() {
let col: Column<Integer> = Column::new("products", "stock");
let expr = col.lt(10);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""products"."stock" < ?1"#);
assert_eq!(params, vec![Value::from(10i32)]);
}
#[test]
fn integer_column_lte_produces_correct_sql() {
let col: Column<Integer> = Column::new("products", "stock");
let expr = col.lte(10);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""products"."stock" <= ?1"#);
assert_eq!(params, vec![Value::from(10i32)]);
}
#[test]
fn integer_column_gte_produces_correct_sql() {
let col: Column<Integer> = Column::new("users", "age");
let expr = col.gte(18);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""users"."age" >= ?1"#);
assert_eq!(params, vec![Value::from(18i32)]);
}
#[test]
fn real_column_gt_produces_correct_sql() {
let col: Column<Real> = Column::new("products", "price");
let expr = col.gt(9.99f64);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""products"."price" > ?1"#);
assert_eq!(params, vec![Value::from(9.99f64)]);
}
#[test]
fn bigint_column_has_numeric_ops() {
let col: Column<BigInt> = Column::new("stats", "count");
let expr = col.gt(1000i64);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""stats"."count" > ?1"#);
assert_eq!(params, vec![Value::from(1000i64)]);
}
#[test]
fn smallint_column_has_numeric_ops() {
let col: Column<SmallInt> = Column::new("settings", "priority");
let expr = col.lt(10i32);
let (sql, params) = expr.to_sql_fragment(1);
assert_eq!(sql, r#""settings"."priority" < ?1"#);
assert_eq!(params, vec![Value::from(10i32)]);
}
#[test]
fn to_sql_fragment_respects_start_offset() {
let col: Column<Integer> = Column::new("items", "qty");
let expr = col.gt(5);
let (sql, params) = expr.to_sql_fragment(3);
assert_eq!(sql, r#""items"."qty" > ?3"#);
assert_eq!(params, vec![Value::from(5i32)]);
}
#[test]
fn nested_and_respects_start_offset() {
use toolu_orm_core::column::Text;
let col_a: Column<Text> = Column::new("t", "a");
let col_b: Column<Integer> = Column::new("t", "b");
let combined = col_a.eq("x").and(col_b.gt(0));
let (sql, params) = combined.to_sql_fragment(5);
assert_eq!(sql, r#"("t"."a" = ?5 AND "t"."b" > ?6)"#);
assert_eq!(params, vec![Value::from("x"), Value::from(0i32)]);
}