#![cfg(feature = "std")]
use graphitesql::{Connection, Value};
use std::process::Command;
fn sqlite3_available() -> bool {
Command::new("sqlite3").arg("--version").output().is_ok()
}
fn graphite_ok(sql: &str) -> bool {
Connection::open_memory().unwrap().query(sql).is_ok()
}
fn sqlite_ok(sql: &str) -> bool {
Command::new("sqlite3")
.arg(":memory:")
.arg(sql)
.output()
.unwrap()
.status
.success()
}
#[test]
fn second_argument_must_be_a_float_literal_in_range() {
let c = Connection::open_memory().unwrap();
for sql in [
"SELECT likelihood(5, 0.5)",
"SELECT likelihood(5, 0.0)",
"SELECT likelihood(5, 1.0)",
"SELECT likelihood(5, .5)",
"SELECT likelihood(5, 0.5e0)",
"SELECT likelihood(5, 1e0)",
"SELECT likelihood(5, (0.5))",
] {
assert_eq!(
c.query(sql).unwrap().rows.remove(0).remove(0),
Value::Integer(5),
"{sql} should return its first argument"
);
}
for sql in [
"SELECT likelihood(5, 0)",
"SELECT likelihood(5, 1)",
"SELECT likelihood(5, 2)",
"SELECT likelihood(5, 1.5)",
"SELECT likelihood(5, -0.1)",
"SELECT likelihood(5, 'x')",
"SELECT likelihood(5, 0.5+0.1)",
"SELECT likelihood(5, abs(0.5))",
] {
let err = c
.query(sql)
.unwrap_err()
.to_string()
.trim_start_matches("error: ")
.to_string();
assert_eq!(
err, "second argument to likelihood() must be a constant between 0.0 and 1.0",
"unexpected message for {sql}"
);
}
}
#[test]
fn likelihood_passes_a_column_through_unchanged() {
let mut c = Connection::open_memory().unwrap();
c.execute("CREATE TABLE t(a)").unwrap();
c.execute("INSERT INTO t VALUES(10),(20),(30)").unwrap();
let rows = c
.query("SELECT likelihood(a, 0.25) FROM t ORDER BY a")
.unwrap();
assert_eq!(
rows.rows,
vec![
vec![Value::Integer(10)],
vec![Value::Integer(20)],
vec![Value::Integer(30)],
]
);
assert!(c.query("SELECT likelihood(a, 2) FROM t").is_err());
}
#[test]
fn matches_sqlite_cli() {
if !sqlite3_available() {
eprintln!("sqlite3 CLI not found; skipping");
return;
}
for sql in [
"SELECT likelihood(5, 0.5)",
"SELECT likelihood(5, 0.0)",
"SELECT likelihood(5, 1.0)",
"SELECT likelihood(5, .5)",
"SELECT likelihood(5, 0.5e0)",
"SELECT likelihood(5, (0.5))",
"SELECT likelihood(5, 0)",
"SELECT likelihood(5, 1)",
"SELECT likelihood(5, 2)",
"SELECT likelihood(5, 1.5)",
"SELECT likelihood(5, -0.1)",
"SELECT likelihood(5, 'x')",
"SELECT likelihood(5, 0.5+0.1)",
] {
assert_eq!(
graphite_ok(sql),
sqlite_ok(sql),
"graphite/sqlite disagree on: {sql}"
);
}
}