use super::reduce::reduce_ansi_codes;
use super::types::AnsiToken;
pub fn undo_ansi_codes(codes: &[AnsiToken]) -> Vec<AnsiToken> {
let mut reduced = reduce_ansi_codes(codes);
reduced.reverse();
reduced
.into_iter()
.map(|code| AnsiToken {
code: code.end_code.clone(),
end_code: code.end_code,
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use crate::text::ansi_tokenize::ansi_codes::get_end_code;
fn tok(code: &str) -> AnsiToken {
AnsiToken {
end_code: get_end_code(code),
code: code.into(),
}
}
#[test]
fn undo_single_code() {
let codes = vec![tok("\x1B[31m")];
let undo = undo_ansi_codes(&codes);
assert_eq!(undo.len(), 1);
assert_eq!(undo[0].code, "\x1B[39m");
}
#[test]
fn undo_multiple_codes_reversed() {
let codes = vec![tok("\x1B[1m"), tok("\x1B[3m"), tok("\x1B[31m")];
let undo = undo_ansi_codes(&codes);
assert_eq!(undo.len(), 3);
assert_eq!(undo[0].code, "\x1B[39m"); assert_eq!(undo[1].code, "\x1B[23m"); assert_eq!(undo[2].code, "\x1B[22m"); }
#[test]
fn undo_empty_is_empty() {
let undo = undo_ansi_codes(&[]);
assert!(undo.is_empty());
}
}