#![cfg(feature = "pyo3")]
use pyo3::Python;
use uni_plugin::{Capability, CapabilitySet, PluginId, PluginRegistrar, PluginRegistry};
use uni_plugin_conformance::run_against_plugin;
use uni_plugin_pyo3::{PyPluginHandle, PythonPluginLoader};
const PYTHON_SRC: &str = r#"
db.set_plugin_id("ai.example.conformance")
db.set_version("1.0.0")
@db.scalar_fn("noop", args=["float"], returns="float", determinism="pure")
def noop(x):
return x
@db.scalar_fn("twice", args=["float"], returns="float", determinism="pure")
def twice(x):
return x * 2.0
"#;
#[test]
fn conformance_suite_passes_on_python_plugin() {
Python::initialize();
let loader = PythonPluginLoader::with_default_plugin_id("ai.example.conformance");
let caps = CapabilitySet::from_iter_of([Capability::ScalarFn]);
let outcome = Python::attach(|py| {
let registry = PluginRegistry::new();
let mut registrar =
PluginRegistrar::new(PluginId::new("ai.example.conformance"), &caps, ®istry);
let outcome = loader
.load(
py,
PYTHON_SRC,
"ai.example.conformance",
&mut registrar,
&caps,
)
.expect("load python plugin");
registrar.commit_to_registry().expect("commit");
outcome
});
let handle = PyPluginHandle::new(outcome);
let report = run_against_plugin(&handle);
assert_eq!(report.checks.len(), 6, "expected 6 probes");
for c in &report.checks {
assert!(c.passed, "probe `{}` failed: {}", c.id, c.detail);
}
}
#[test]
fn conformance_probes_have_stable_ids() {
Python::initialize();
let loader = PythonPluginLoader::with_default_plugin_id("ai.example.idstable");
let caps = CapabilitySet::from_iter_of([Capability::ScalarFn]);
let outcome = Python::attach(|py| {
let registry = PluginRegistry::new();
let mut registrar =
PluginRegistrar::new(PluginId::new("ai.example.idstable"), &caps, ®istry);
let src = r#"
db.set_plugin_id("ai.example.idstable")
db.set_version("0.1.0")
@db.scalar_fn("x", args=["float"], returns="float", determinism="pure")
def x(v):
return v
"#;
loader
.load(py, src, "ai.example.idstable", &mut registrar, &caps)
.expect("load")
});
let handle = PyPluginHandle::new(outcome);
let report = run_against_plugin(&handle);
let ids: Vec<&str> = report.checks.iter().map(|c| c.id.as_str()).collect();
assert!(ids.contains(&"manifest.parse"));
assert!(ids.contains(&"manifest.id_format"));
assert!(ids.contains(&"abi.in_range"));
assert!(ids.contains(&"capabilities.declared"));
assert!(ids.contains(&"registration.commit"));
assert!(ids.contains(&"registration.idempotent"));
}