use spg_engine::{Engine, QueryResult};
fn first(e: &mut Engine, sql: &str) -> spg_storage::Value<'static> {
let r = e
.execute(sql)
.unwrap_or_else(|err| panic!("{sql}: {err:?}"));
let QueryResult::Rows { rows, .. } = r else {
panic!("expected Rows");
};
rows[0].values[0].clone()
}
#[test]
fn setseed_returns_void() {
let mut e = Engine::new();
assert!(matches!(
first(&mut e, "SELECT setseed(0.5)"),
spg_storage::Value::Text(ref s) if s.is_empty()
));
assert!(matches!(
first(&mut e, "SELECT setseed(0.5) IS NULL"),
spg_storage::Value::Bool(false)
));
}
#[test]
fn setseed_makes_random_reproducible() {
let mut e = Engine::new();
let mut reproduced = false;
for _ in 0..8 {
let _ = e.execute("SELECT setseed(0.42)").unwrap();
let a = match first(&mut e, "SELECT random()") {
spg_storage::Value::Float(f) => f,
other => panic!("got {other:?}"),
};
let _ = e.execute("SELECT setseed(0.42)").unwrap();
let b = match first(&mut e, "SELECT random()") {
spg_storage::Value::Float(f) => f,
other => panic!("got {other:?}"),
};
if a.to_bits() == b.to_bits() {
reproduced = true;
break;
}
}
assert!(
reproduced,
"setseed(0.42) never reproduced the same random() draw in 8 attempts"
);
}
#[test]
fn setseed_out_of_range_errors() {
let mut e = Engine::new();
assert!(e.execute("SELECT setseed(2.0)").is_err());
assert!(e.execute("SELECT setseed(-2.0)").is_err());
}
#[test]
fn setseed_null_passthrough() {
let mut e = Engine::new();
assert!(matches!(
first(&mut e, "SELECT setseed(NULL::float)"),
spg_storage::Value::Null
));
}