use std::path::PathBuf;
use std::sync::{Arc, Mutex};
use noesis_runtime::font_provider::{FontProvider, set_font_provider};
struct ObservedProvider {
bytes: std::collections::HashMap<(String, String), Vec<u8>>,
opens: Arc<Mutex<Vec<(String, String)>>>, #[allow(dead_code)]
scans: Arc<Mutex<Vec<String>>>,
current: Option<Vec<u8>>,
}
impl FontProvider for ObservedProvider {
fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
self
}
fn scan_folder(&mut self, folder_uri: &str, _register: &mut dyn FnMut(&str)) {
self.scans.lock().unwrap().push(folder_uri.to_string());
}
fn open_font(&mut self, folder_uri: &str, filename: &str) -> Option<&[u8]> {
self.opens
.lock()
.unwrap()
.push((folder_uri.to_string(), filename.to_string()));
let bytes = self
.bytes
.get(&(folder_uri.to_string(), filename.to_string()))?
.clone();
self.current = Some(bytes);
self.current.as_deref()
}
}
#[test]
fn register_font_round_trips_through_open_font() {
if let (Ok(name), Ok(key)) = (
std::env::var("NOESIS_LICENSE_NAME"),
std::env::var("NOESIS_LICENSE_KEY"),
) {
noesis_runtime::set_license(&name, &key);
}
noesis_runtime::init();
let sdk_dir =
std::env::var("NOESIS_SDK_DIR").expect("NOESIS_SDK_DIR not set; required for this test");
let mut bitter_path = PathBuf::from(sdk_dir);
bitter_path.push("Data/Fonts/Bitter-Regular.ttf");
let bitter_bytes = std::fs::read(&bitter_path)
.unwrap_or_else(|_| panic!("read failed: {}", bitter_path.display()));
let opens: Arc<Mutex<Vec<(String, String)>>> = Arc::default();
let scans: Arc<Mutex<Vec<String>>> = Arc::default();
let mut bytes_map = std::collections::HashMap::new();
bytes_map.insert(
("Fonts".to_string(), "Bitter-Regular.ttf".to_string()),
bitter_bytes,
);
let provider = ObservedProvider {
bytes: bytes_map,
opens: Arc::clone(&opens),
scans: Arc::clone(&scans),
current: None,
};
{
let registered = set_font_provider(provider);
assert!(
opens.lock().unwrap().is_empty(),
"open_font fired before any font lookup",
);
registered.register_font("Fonts", "Bitter-Regular.ttf");
let observed_opens = opens.lock().unwrap().clone();
assert!(
observed_opens
.iter()
.any(|(f, n)| f == "Fonts" && n == "Bitter-Regular.ttf"),
"register_font should have triggered open_font(\"Fonts\", \"Bitter-Regular.ttf\"); \
observed opens = {observed_opens:?}",
);
drop(registered);
}
noesis_runtime::shutdown();
}