#![cfg(feature = "std")]
use graphitesql::{Connection, Value};
use std::process::Command;
fn sqlite3_available() -> bool {
Command::new("sqlite3").arg("--version").output().is_ok()
}
fn text(c: &Connection, sql: &str) -> String {
match c.query(sql).unwrap().rows.remove(0).remove(0) {
Value::Text(s) => s,
other => panic!("expected text, got {other:?} for {sql}"),
}
}
#[test]
fn trailing_percent_is_literal() {
let c = Connection::open_memory().unwrap();
assert_eq!(text(&c, "SELECT printf('%')"), "%");
assert_eq!(text(&c, "SELECT printf('abc%')"), "abc%");
assert_eq!(text(&c, "SELECT printf('a%')"), "a%");
assert_eq!(text(&c, "SELECT printf('%', 1)"), "%");
assert_eq!(text(&c, "SELECT format('%')"), "%");
assert_eq!(text(&c, "SELECT printf('%d%', 5)"), "5%");
}
#[test]
fn other_percent_forms_unchanged() {
let c = Connection::open_memory().unwrap();
assert_eq!(text(&c, "SELECT printf('%%')"), "%");
assert_eq!(text(&c, "SELECT printf('100%% done')"), "100% done");
assert_eq!(text(&c, "SELECT printf('x%5')"), "x");
assert_eq!(text(&c, "SELECT printf('a%-')"), "a");
assert_eq!(text(&c, "SELECT printf('%d', 5)"), "5");
}
#[test]
fn matches_sqlite_cli() {
if !sqlite3_available() {
eprintln!("sqlite3 CLI not found; skipping");
return;
}
let g = env!("CARGO_BIN_EXE_graphitesql");
let run = |bin: &str, sql: &str| -> String {
let out = Command::new(bin).arg(":memory:").arg(sql).output().unwrap();
String::from_utf8_lossy(&out.stdout).trim_end().to_string()
};
for sql in [
"SELECT printf('%')",
"SELECT printf('abc%')",
"SELECT printf('a%')",
"SELECT printf('%', 1)",
"SELECT format('%')",
"SELECT printf('%d%', 5)",
"SELECT printf('%%')",
"SELECT printf('100%% done')",
"SELECT printf('x%5')",
"SELECT printf('a%-')",
"SELECT printf('%d', 5)",
"SELECT printf('')",
] {
assert_eq!(run("sqlite3", sql), run(g, sql), "for {sql}");
}
}