use spg_engine::{Engine, QueryResult};
use spg_storage::Value;
fn one_value(eng: &mut Engine, sql: &str) -> Value {
match eng.execute(sql).unwrap() {
QueryResult::Rows { rows, .. } => rows.into_iter().next().unwrap().values[0].clone(),
_ => panic!("expected Rows"),
}
}
#[test]
fn encode_hex_round_trip() {
let mut eng = Engine::new();
let v = one_value(&mut eng, "SELECT encode('hello', 'hex')");
assert_eq!(v, Value::Text("68656c6c6f".to_string()));
let v2 = one_value(&mut eng, "SELECT decode('68656c6c6f', 'hex')");
assert_eq!(v2, Value::Text("hello".to_string()));
}
#[test]
fn encode_base64_round_trip() {
let mut eng = Engine::new();
let v = one_value(&mut eng, "SELECT encode('Hello, World!', 'base64')");
assert_eq!(v, Value::Text("SGVsbG8sIFdvcmxkIQ==".to_string()));
let v2 = one_value(
&mut eng,
"SELECT decode('SGVsbG8sIFdvcmxkIQ==', 'base64')",
);
assert_eq!(v2, Value::Text("Hello, World!".to_string()));
}
#[test]
fn encode_base64url_alphabet_differs_from_std() {
let mut eng = Engine::new();
let v_std = one_value(&mut eng, "SELECT encode('hello?>', 'base64')");
let v_url = one_value(&mut eng, "SELECT encode('hello?>', 'base64url')");
match (v_std, v_url) {
(Value::Text(_s_std), Value::Text(s_url)) => {
assert!(!s_url.contains('+'), "url alphabet has no +");
assert!(!s_url.contains('/'), "url alphabet has no /");
}
_ => panic!("expected text"),
}
}
#[test]
fn encode_base32hex_round_trip() {
let mut eng = Engine::new();
let v = one_value(&mut eng, "SELECT encode('foo', 'base32hex')");
assert_eq!(v, Value::Text("CPNMU===".to_string()));
let v2 = one_value(&mut eng, "SELECT decode('CPNMU===', 'base32hex')");
assert_eq!(v2, Value::Text("foo".to_string()));
}
#[test]
fn encode_null_propagates() {
let mut eng = Engine::new();
let v = one_value(&mut eng, "SELECT encode(NULL, 'hex')");
assert_eq!(v, Value::Null);
let v2 = one_value(&mut eng, "SELECT decode('68', NULL)");
assert_eq!(v2, Value::Null);
}
#[test]
fn encode_unknown_format_errors() {
let mut eng = Engine::new();
let r = eng.execute("SELECT encode('x', 'rot13')");
assert!(r.is_err(), "rot13 isn't a supported encode format");
}
#[test]
fn error_on_null_returns_value_when_non_null() {
let mut eng = Engine::new();
let v = one_value(&mut eng, "SELECT error_on_null(42)");
assert!(matches!(v, Value::Int(42) | Value::BigInt(42)));
let v2 = one_value(&mut eng, "SELECT error_on_null('abc')");
assert_eq!(v2, Value::Text("abc".to_string()));
}
#[test]
fn error_on_null_errors_on_null() {
let mut eng = Engine::new();
let r = eng.execute("SELECT error_on_null(NULL)");
assert!(r.is_err(), "error_on_null(NULL) must error");
let msg = format!("{:?}", r.err().unwrap());
assert!(msg.contains("error_on_null"), "error mentions function name");
}