#![cfg(feature = "sd")]
use eligo::{Backend, SdBackend};
fn backend_from_env(steps: usize) -> Option<SdBackend> {
let dir = std::env::var("ELIGO_SD_DIR").ok()?;
let tokenizer = std::env::var("ELIGO_SD_TOKENIZER").ok()?;
Some(SdBackend::from_dir(dir, tokenizer, steps, 7.5).expect("load SD backend"))
}
fn distinct_fraction(rgb: &[u8]) -> f32 {
let mut seen = [false; 256];
for &b in rgb {
seen[b as usize] = true;
}
seen.iter().filter(|&&s| s).count() as f32 / 256.0
}
#[test]
#[ignore = "needs real SD ONNX weights via ELIGO_SD_DIR / ELIGO_SD_TOKENIZER"]
fn generates_a_real_seed_dependent_image() {
let Some(backend) = backend_from_env(6) else {
eprintln!("skipping: ELIGO_SD_DIR / ELIGO_SD_TOKENIZER not set");
return;
};
let prompt = "a photograph of a red apple on a wooden table";
let a = backend.generate(prompt, 1).unwrap();
let again = backend.generate(prompt, 1).unwrap();
let b = backend.generate(prompt, 2).unwrap();
assert_eq!((a.width, a.height), (512, 512));
assert_eq!(a.rgb.len(), 512 * 512 * 3);
assert_eq!(a.rgb, again.rgb, "same seed should be deterministic");
assert_ne!(a.rgb, b.rgb, "different seeds should differ");
let frac = distinct_fraction(&a.rgb);
eprintln!("distinct byte fraction: {frac:.3}");
assert!(frac > 0.2, "image looks degenerate (distinct fraction {frac:.3})");
}