#![cfg(feature = "std")]
use graphitesql::{Connection, Value};
fn val(c: &Connection, sql: &str) -> Value {
c.query(sql).unwrap().rows[0][0].clone()
}
#[test]
fn unistr_decodes_escapes() {
let c = Connection::open_memory().unwrap();
assert_eq!(
val(&c, "SELECT unistr('a\\u00e9b')"),
Value::Text("aéb".into())
);
assert_eq!(
val(&c, r"SELECT unistr('\U0001F600')"),
Value::Text("😀".into())
);
assert_eq!(
val(&c, r"SELECT unistr('back\\slash')"),
Value::Text(r"back\slash".into())
);
assert_eq!(val(&c, "SELECT unistr(123)"), Value::Text("123".into()));
assert_eq!(val(&c, "SELECT unistr(NULL)"), Value::Null);
assert_eq!(
val(&c, "SELECT unistr('\\u00e9') = char(233)"),
Value::Integer(1)
);
}
#[test]
fn unistr_rejects_bad_escapes() {
let c = Connection::open_memory().unwrap();
for bad in [r"SELECT unistr('trailing\u')", r"SELECT unistr('a\nb')"] {
assert!(c.query(bad).is_err(), "{bad} should error");
}
}
#[test]
fn unistr_quote_matches_quote_except_for_control_chars() {
let c = Connection::open_memory().unwrap();
assert_eq!(
val(&c, "SELECT unistr_quote('café')"),
Value::Text("'café'".into())
);
assert_eq!(
val(&c, "SELECT unistr_quote('a''b')"),
Value::Text("'a''b'".into())
);
assert_eq!(
val(&c, "SELECT unistr_quote('a' || char(9) || 'b')"),
Value::Text("unistr('a\\u0009b')".into())
);
assert_eq!(
val(&c, "SELECT unistr_quote(NULL)"),
Value::Text("NULL".into())
);
assert_eq!(
val(&c, "SELECT unistr_quote(123)"),
Value::Text("123".into())
);
assert_eq!(
val(&c, "SELECT unistr_quote(x'4142')"),
Value::Text("X'4142'".into())
);
}
#[test]
fn subtype_is_zero() {
let c = Connection::open_memory().unwrap();
for q in [
"SELECT subtype(1)",
"SELECT subtype(NULL)",
"SELECT subtype('x')",
] {
assert_eq!(val(&c, q), Value::Integer(0), "{q}");
}
}