Files
designcraft/crates/ui-egui/tests/it/native_job_lifetime_control.rs
T

46 lines
2.3 KiB
Rust

//! Own a real native Job across last close. This does not run the asynchronous worker.
use std::sync::Arc;
use designcraft_doc::StoryId;
use designcraft_engine::Session;
use designcraft_geom::Affine;
use designcraft_render::RenderOptions;
use designcraft_ui_egui::render_worker::Job;
use serde_json::json;
#[test]
fn real_job_keeps_retired_cache_until_its_last_owner_drops() {
let mut session = Session::new();
session.execute("file.new", &json!({"pages": 1})).unwrap();
let frame = session.execute("frame.create", &json!({"rect": [36, 36, 220, 320], "content": "text", "text": "Job source A."})).unwrap();
let sid = StoryId(frame["story"].as_u64().unwrap());
let initial = session.cache.get(&session.doc().unwrap().doc, sid, None);
drop(initial);
let end = session.doc().unwrap().doc.story(sid).unwrap().text.len();
session.execute("text.select", &json!({"story": sid.0, "anchor": end, "focus": end})).unwrap();
session.execute("text.insert", &json!({"text": " Edited B."})).unwrap();
let current = session.cache.get(&session.doc().unwrap().doc, sid, None);
drop(current);
let doc = session.doc().unwrap().doc.clone();
let source = Arc::downgrade(doc.stories.get(&sid).unwrap());
let document = Arc::downgrade(&doc);
let styles = Arc::downgrade(&doc.styles);
let old_cache = Arc::downgrade(&session.cache);
let job = Job { token: 1, doc, cache: session.cache.clone(), placed: vec![], w: 1, h: 1, view: Affine::IDENTITY, opts: RenderOptions::default() };
session.execute("file.close", &json!({})).unwrap();
assert!(session.documents().is_empty());
assert!(!Arc::ptr_eq(&session.cache, &job.cache), "memory prerequisite: idle session must retire the old cache");
assert!(source.upgrade().is_some() && document.upgrade().is_some() && old_cache.upgrade().is_some());
// A late job may continue to write its retired cache. It cannot refill the idle one.
job.cache.clear();
let late = job.cache.get(&job.doc, sid, None);
assert!(session.cache.composed_for(&job.doc, sid).is_none());
drop(late);
drop(job);
assert!(old_cache.upgrade().is_none(), "no other owner was manufactured by this control");
assert!(source.upgrade().is_none() && document.upgrade().is_none() && styles.upgrade().is_none());
}