use std::path::{Path, PathBuf};
use std::process::Command;
fn bin() -> &'static str {
env!("CARGO_BIN_EXE_syntaqlite")
}
fn run(cmd: &mut Command, ctx: &str) {
let out = cmd
.output()
.unwrap_or_else(|e| panic!("{ctx}: spawn failed: {e}"));
assert!(
out.status.success(),
"{ctx} failed (exit={:?})\nstdout:\n{}\nstderr:\n{}",
out.status.code(),
String::from_utf8_lossy(&out.stdout),
String::from_utf8_lossy(&out.stderr),
);
}
fn shared_lib_path(dir: &Path, stem: &str) -> PathBuf {
let ext = if cfg!(target_os = "macos") {
"dylib"
} else {
"so"
};
dir.join(format!("lib{stem}.{ext}"))
}
#[test]
#[cfg_attr(
target_os = "windows",
ignore = "dlopen export model differs on Windows"
)]
fn omit_runtime_dialect_plugin_resolves_against_host() {
let tmp = tempfile::TempDir::new().expect("tempdir");
let amalg_dir = tmp.path();
run(
Command::new(bin())
.args([
"dialect",
"generate",
"--name",
"sqlite",
"--output-type",
"full",
])
.arg("--output-dir")
.arg(amalg_dir),
"syntaqlite dialect generate",
);
let src = amalg_dir.join("syntaqlite_sqlite.c");
assert!(
src.exists(),
"amalgamation source not written: {}",
src.display()
);
let lib = shared_lib_path(amalg_dir, "sqlite_dialect_plugin");
let mut cc = Command::new("cc");
cc.args(["-shared", "-fPIC", "-DSYNTAQLITE_OMIT_RUNTIME"])
.arg("-I")
.arg(amalg_dir)
.arg("-o")
.arg(&lib)
.arg(&src);
if cfg!(target_os = "macos") {
cc.args(["-Wl,-undefined,dynamic_lookup"]);
}
run(&mut cc, "cc -shared with -DSYNTAQLITE_OMIT_RUNTIME");
let out = Command::new(bin())
.arg("--dialect")
.arg(&lib)
.args(["--dialect-name", "sqlite", "fmt", "-e", "SELECT 1"])
.output()
.expect("spawn syntaqlite --dialect");
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(
out.status.success(),
"loading OMIT_RUNTIME dialect plugin failed — host likely lacks \
exported runtime hooks in .dynsym (see syntaqlite-cli/build.rs)\n\
stdout:\n{stdout}\nstderr:\n{stderr}",
);
assert!(
stdout.to_uppercase().contains("SELECT"),
"expected formatted SELECT in stdout; got:\n{stdout}",
);
}