use super::input::{open, saved}; use super::*; /// How long a command may take to report. const SETTLE: std::time::Duration = std::time::Duration::from_secs(3); #[test] fn text_and_paragraph_formatting_land_in_the_file() { if install().is_none() { eprintln!("SKIP: no pinned LOK build"); return; } let (dir, mut worker, doc) = open(FODT); click(&mut worker, &doc, 150, 150); worker .run(&doc, "edit.select_all", &[]) .expect("select all"); for (id, values) in [ ("format.superscript", vec![]), ("format.color", vec!["16711680"]), ("format.highlight", vec!["65280"]), ("paragraph.center", vec![]), ("paragraph.spacing_15", vec![]), ("paragraph.indent", vec![]), ("list.numbering", vec![]), ] { worker .run(&doc, id, &values) .unwrap_or_else(|error| panic!("{id}: {error}")); } let text = saved(&dir, &mut worker, &doc, "out.fodt"); for mark in [ "style:text-position=\"super", "fo:color=\"#ff0000\"", "fo:background-color=\"#00ff00\"", "fo:text-align=\"center\"", "fo:line-height=\"150%\"", "(seen: &'a Events, uno: &str) -> Option<&'a str> { seen.states .iter() .rev() .find(|(name, _)| name == uno) .map(|(_, value)| value.as_str()) } #[test] fn mixed_selections_report_dont_care() { if install().is_none() { eprintln!("SKIP: no pinned LOK build"); return; } let (_dir, mut worker, doc) = open(FODT); click(&mut worker, &doc, 150, 150); for key in "One".chars() { worker.post_key(&doc, key as u32, 0).expect("a key"); } worker .run(&doc, "format.style", &["Heading 1", "ParagraphStyles"]) .expect("a heading"); worker.post_key(&doc, 0, 1029).expect("end"); worker.post_key(&doc, 13, 1280).expect("enter"); for key in "Two".chars() { worker.post_key(&doc, key as u32, 0).expect("a key"); } worker .post_key(&doc, 0, 1028 | 0x1000) .expect("select the word"); worker .run(&doc, "format.style", &["Emphasis", "CharacterStyles"]) .expect("emphasis"); worker .run(&doc, "edit.select_all", &[]) .expect("select all"); let names = [ ".uno:Italic", ".uno:CharStyle", ".uno:StyleApply", ".uno:ULSpacing", ]; let seen = poll_until(&mut worker, &doc, &Events::default(), SETTLE, |seen| { names .iter() .all(|name| state(seen, name) == Some(crate::MIXED)) }); for name in names { assert_eq!(state(&seen, name), Some(crate::MIXED), "{name} is mixed"); } } #[test] fn character_styles_mix_their_attributes() { if install().is_none() { eprintln!("SKIP: no pinned LOK build"); return; } let (_dir, mut worker, doc) = open(FODT); click(&mut worker, &doc, 150, 150); for key in "Alpha Beta".chars() { worker.post_key(&doc, key as u32, 0).expect("a key"); } worker.post_key(&doc, 0, 1028).expect("home"); for _ in 0..5 { worker.post_key(&doc, 0, 1027 | 0x1000).expect("select"); } worker .run(&doc, "format.style", &["Source Text", "CharacterStyles"]) .expect("a monospace style"); worker.post_key(&doc, 0, 1029).expect("end"); for _ in 0..4 { worker.post_key(&doc, 0, 1026 | 0x1000).expect("select"); } worker .run( &doc, "format.style", &["Strong Emphasis", "CharacterStyles"], ) .expect("a bold style"); worker .run(&doc, "edit.select_all", &[]) .expect("select all"); let names = [".uno:CharFontName", ".uno:Bold", ".uno:CharStyle"]; let seen = poll_until(&mut worker, &doc, &Events::default(), SETTLE, |seen| { names .iter() .all(|name| state(seen, name) == Some(crate::MIXED)) }); for name in names { assert_eq!(state(&seen, name), Some(crate::MIXED), "{name} is mixed"); } }