use slate_framework::{AnyElement, Div, HeadlessApp, Text};
#[test]
fn cache_entry_survives_when_accessed_each_frame() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
for _ in 0..10 {
let text = Text::new("Keep me alive").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render");
}
assert_eq!(app.text_shaping_cache_len(), 1);
assert_eq!(app.text_shaping_cache_hits(), 9); }
#[test]
fn cache_entry_survives_one_frame_gap() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
let text = Text::new("Cached text").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render");
assert_eq!(app.text_shaping_cache_len(), 1);
let div = Div::new();
let _img = app.render(AnyElement::new(div)).expect("render div");
assert_eq!(app.text_shaping_cache_len(), 1);
}
#[test]
fn cache_entry_survives_two_frame_gap() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
let text = Text::new("Cached text").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render");
assert_eq!(app.text_shaping_cache_len(), 1);
for _ in 0..2 {
let div = Div::new();
let _img = app.render(AnyElement::new(div)).expect("render div");
}
assert_eq!(app.text_shaping_cache_len(), 0);
}
#[test]
fn cache_entry_dropped_after_three_frame_gap() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
let text = Text::new("Will be garbage collected").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render");
assert_eq!(app.text_shaping_cache_len(), 1);
for _ in 0..3 {
let div = Div::new();
let _img = app.render(AnyElement::new(div)).expect("render div");
}
assert_eq!(app.text_shaping_cache_len(), 0);
}
#[test]
fn cache_entry_reaccessed_before_gc_survives() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
let text = Text::new("Survivor").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render 0");
assert_eq!(app.text_shaping_cache_len(), 1);
let div = Div::new();
let _img = app.render(AnyElement::new(div)).expect("render 1");
assert_eq!(app.text_shaping_cache_len(), 1);
let text = Text::new("Survivor").font_size(14.0);
let _img = app.render(AnyElement::new(text)).expect("render 2");
assert_eq!(app.text_shaping_cache_len(), 1);
assert_eq!(app.text_shaping_cache_hits(), 1);
for _ in 0..2 {
let div = Div::new();
let _img = app.render(AnyElement::new(div)).expect("render div");
}
assert_eq!(app.text_shaping_cache_len(), 0);
}
#[test]
fn single_position_cache_replacement() {
let mut app = HeadlessApp::new(200, 50).expect("headless app");
let text_a = Text::new("Text A").font_size(14.0);
let _img = app.render(AnyElement::new(text_a)).expect("render A");
assert_eq!(app.text_shaping_cache_len(), 1);
assert_eq!(app.text_shaping_cache_misses(), 1);
let text_b = Text::new("Text B").font_size(14.0);
let _img = app.render(AnyElement::new(text_b)).expect("render B");
assert_eq!(app.text_shaping_cache_len(), 1);
assert_eq!(app.text_shaping_cache_misses(), 2);
let text_b = Text::new("Text B").font_size(14.0);
let _img = app.render(AnyElement::new(text_b)).expect("render B again");
assert_eq!(app.text_shaping_cache_hits(), 1);
let text_a = Text::new("Text A").font_size(14.0);
let _img = app.render(AnyElement::new(text_a)).expect("render A again");
assert_eq!(app.text_shaping_cache_misses(), 3);
assert_eq!(app.text_shaping_cache_len(), 1);
}