mirror of
https://github.com/storytold/designcraft.git
synced 2026-10-31 05:36:46 -06:00
Integration: test warichu on a drop cap paragraph's first line
#280 (warichu) places its run after the line is broken; #83 (drop caps, on next) splices the drop cap into the first line and gives the caret its own metrics. The test checks that they combine: the drop cap keeps its position and size, the note stacks after it and the line closes up, the caret takes the drop cap, row and parent metrics in turn, clicks land on each row, and a selection over both gets the drop cap's band and one per row. It passes on the merge; no code change was needed.
This commit is contained in:
@@ -2163,6 +2163,41 @@ fn tab_beside_a_drop_cap_is_measured_from_the_drop_cap() {
|
||||
assert!(right + word + 4.0 > lines[0].x1, "line 2's first word ({word} pt) fits after line 1's end at {right} (edge {})", lines[0].x1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn warichu_on_a_drop_cap_line_leaves_the_drop_cap_alone() {
|
||||
let text = format!("WABCDEFGH {LOREM}");
|
||||
let (mut d, sid, _) = drop_doc(&text, drop_cap(3, 1));
|
||||
let plain = compose_story(&d, sid, &ComposeOptions::default());
|
||||
let plain_dc = plain.frames[0].lines[0].glyphs[0].clone();
|
||||
// A plain drop cap line has no stacked rows: one selection band, caret on the line.
|
||||
let pl = &plain.frames[0].lines[0];
|
||||
assert_eq!(highlight_quads(pl, 0, 12, false).len(), 1);
|
||||
assert_eq!(caret(&plain, 1).map(|c| (c.2, c.3)), Some((pl.baseline, pl.ascent)));
|
||||
d.story_mut(sid).unwrap().format_chars(1..9, |f| {
|
||||
f.over.warichu = Some(true);
|
||||
f.over.warichu_alignment = Some(designcraft_doc::cjk::WarichuAlignment::Left);
|
||||
});
|
||||
let cs = compose_story(&d, sid, &ComposeOptions::default());
|
||||
let l = &cs.frames[0].lines[0];
|
||||
let dc = &l.glyphs[0];
|
||||
assert_eq!((dc.byte, dc.x, dc.y, dc.sy), (0, plain_dc.x, plain_dc.y, plain_dc.sy), "the drop cap is not part of the note");
|
||||
let at = |byte: usize| l.glyphs.iter().find(|g| g.byte == byte && g.len > 0).unwrap();
|
||||
let (top, bot, after) = (at(1), at(5), at(10));
|
||||
assert!(bot.y - top.y > 1.0, "the note is stacked in two rows");
|
||||
assert!(top.x >= dc.x + dc.adv - 1e-6, "the note starts after the drop cap");
|
||||
assert!((after.x - (at(8).x + at(8).adv + at(9).adv)).abs() < 1e-3, "the line closes up after the note");
|
||||
// The caret: in the drop cap as tall as it, on a note row that row's baseline, after the
|
||||
// note the parent line's.
|
||||
let dc_box = l.drop_cap.unwrap();
|
||||
assert_eq!(caret(&cs, 0).map(|c| c.2), Some(dc_box.baseline));
|
||||
assert!((caret(&cs, 1).unwrap().2 - (l.baseline + top.y)).abs() < 1e-6);
|
||||
assert_eq!(caret(&cs, 10).map(|c| (c.2, c.3)), Some((l.baseline, l.ascent)));
|
||||
let click = |g: &PlacedGlyph| hit(&cs, 0, designcraft_geom::Point::new(g.x + g.adv * 0.25, l.baseline + g.y)).unwrap();
|
||||
assert_eq!((click(top), click(bot), click(after)), (1, 5, 10));
|
||||
// Selecting the drop cap and the note: the drop cap's band and one per row.
|
||||
assert_eq!(highlight_quads(l, 0, 9, false).len(), 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn drop_cap_of_two_characters_as_a_local_override() {
|
||||
let (d, sid, _) = drop_doc(LOREM, drop_cap(2, 2));
|
||||
|
||||
Reference in New Issue
Block a user