use crate::color::Color;
use crate::widgets::rich_text::commands::RichCommand;
use crate::widgets::rich_text::model::{Block, InlineStyle, RichDoc, TextRun};
use super::core::RichEditCore;
fn colored(text: &str, color: Color) -> TextRun {
TextRun::new(
text,
InlineStyle {
text_color: Some(color),
..Default::default()
},
)
}
#[test]
fn preview_dirty_tracks_document_mutation() {
let red = Color::rgb(1.0, 0.0, 0.0);
let blue = Color::rgb(0.0, 0.0, 1.0);
let doc = RichDoc::from_blocks(vec![Block::from_run(colored("hello", red))]);
let mut core = RichEditCore::new(doc, 16.0);
core.select_all();
core.begin_preview();
assert!(!core.is_preview_dirty(), "a just-opened preview is not dirty");
core.exec(&RichCommand::SetTextColor(blue));
assert!(core.is_preview_dirty(), "a previewing colour exec marks dirty");
core.commit_preview();
assert!(!core.is_preview_dirty(), "commit clears the dirty flag");
core.begin_preview();
assert!(!core.is_preview_dirty(), "reopened session starts clean again");
core.cancel_preview();
assert!(!core.is_preview_dirty(), "cancel clears the dirty flag");
}
#[test]
fn dirty_clickaway_commits_one_undo_step() {
let red = Color::rgb(1.0, 0.0, 0.0);
let blue = Color::rgb(0.0, 0.0, 1.0);
let doc = RichDoc::from_blocks(vec![Block::from_run(colored("hello", red))]);
let mut core = RichEditCore::new(doc, 16.0);
core.select_all();
core.feed_undo(0.0); assert!(!core.can_undo());
core.begin_preview();
core.exec(&RichCommand::SetTextColor(blue));
core.feed_undo(0.1);
assert!(core.is_preview_dirty());
core.commit_preview();
core.feed_undo(3.0);
core.feed_undo(4.5);
assert!(core.can_undo(), "a committed click-away change is undoable");
assert!(core.undo());
assert_eq!(core.common_style_of_selection().text_color, Some(Some(red)));
assert!(!core.can_undo(), "click-away commit is a single undo step");
}
#[test]
fn clean_clickaway_leaves_no_undo_entry() {
let red = Color::rgb(1.0, 0.0, 0.0);
let doc = RichDoc::from_blocks(vec![Block::from_run(colored("hello", red))]);
let mut core = RichEditCore::new(doc, 16.0);
core.select_all();
core.feed_undo(0.0);
core.begin_preview();
assert!(!core.is_preview_dirty());
core.cancel_preview();
core.feed_undo(3.0);
core.feed_undo(4.5);
assert!(!core.can_undo(), "an untouched click-away leaves no undo entry");
assert_eq!(core.common_style_of_selection().text_color, Some(Some(red)));
}