use toolu_orm_core::dialect::Dialect;
use toolu_orm_core::expr::Expr;
use toolu_orm_core::value::Value;
#[test]
fn sqlite_comparison_uses_question_mark() {
let expr = Expr::raw("name = ?", vec![Value::Text("alice".to_owned())]);
let (sql, params) = expr.to_sql_fragment_for(1, Dialect::Sqlite);
assert_eq!(sql, "name = ?1");
assert_eq!(params, vec![Value::Text("alice".to_owned())]);
}
#[test]
fn postgres_comparison_uses_dollar_sign() {
let expr = Expr::raw("name = ?", vec![Value::Text("alice".to_owned())]);
let (sql, params) = expr.to_sql_fragment_for(1, Dialect::Postgres);
assert_eq!(sql, "name = $1");
assert_eq!(params, vec![Value::Text("alice".to_owned())]);
}
#[test]
fn sqlite_multiple_params_sequential() {
let expr = Expr::raw(
"a = ? AND b = ?",
vec![Value::Integer(1), Value::Text("x".to_owned())],
);
let (sql, params) = expr.to_sql_fragment_for(1, Dialect::Sqlite);
assert_eq!(sql, "a = ?1 AND b = ?2");
assert_eq!(params.len(), 2);
}
#[test]
fn postgres_multiple_params_sequential() {
let expr = Expr::raw(
"a = ? AND b = ?",
vec![Value::Integer(1), Value::Text("x".to_owned())],
);
let (sql, params) = expr.to_sql_fragment_for(1, Dialect::Postgres);
assert_eq!(sql, "a = $1 AND b = $2");
assert_eq!(params.len(), 2);
}
#[test]
fn sqlite_respects_start_offset() {
let expr = Expr::raw("x = ?", vec![Value::Integer(42)]);
let (sql, _) = expr.to_sql_fragment_for(5, Dialect::Sqlite);
assert_eq!(sql, "x = ?5");
}
#[test]
fn postgres_respects_start_offset() {
let expr = Expr::raw("x = ?", vec![Value::Integer(42)]);
let (sql, _) = expr.to_sql_fragment_for(5, Dialect::Postgres);
assert_eq!(sql, "x = $5");
}
#[test]
fn to_sql_fragment_delegates_to_current() {
let expr = Expr::raw("x = ?", vec![Value::Integer(1)]);
let (via_default, _) = expr.to_sql_fragment(1);
let (via_explicit, _) = expr.to_sql_fragment_for(1, Dialect::CURRENT);
assert_eq!(via_default, via_explicit);
}
#[test]
fn postgres_no_params_no_substitution() {
let expr = Expr::raw("1 = 1", vec![]);
let (sql, params) = expr.to_sql_fragment_for(1, Dialect::Postgres);
assert_eq!(sql, "1 = 1");
assert!(params.is_empty());
}