#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportAction {
ImportAndRepaint,
ScrubOnly,
}
pub fn import_action(mode: Option<&str>, has_payload: bool) -> Option<ImportAction> {
let mode = mode?;
if mode == "1" && has_payload {
Some(ImportAction::ImportAndRepaint)
} else {
Some(ImportAction::ScrubOnly)
}
}
pub fn should_repaint(mode: Option<&str>, has_payload: bool) -> bool {
import_action(mode, has_payload) == Some(ImportAction::ImportAndRepaint)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NoneBounce {
Back,
ForwardNone,
}
pub fn none_bounce(history_len: u32) -> NoneBounce {
if history_len > 1 {
NoneBounce::Back
} else {
NoneBounce::ForwardNone
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn absent_param_is_not_a_return_leg() {
assert_eq!(import_action(None, false), None);
assert_eq!(import_action(None, true), None);
assert!(!should_repaint(None, true));
}
#[test]
fn sealed_payload_runs_the_import_repaint_path() {
assert_eq!(import_action(Some("1"), true), Some(ImportAction::ImportAndRepaint));
assert!(should_repaint(Some("1"), true));
}
#[test]
fn none_bounce_scrubs_without_repaint() {
assert_eq!(import_action(Some("none"), false), Some(ImportAction::ScrubOnly));
assert!(!should_repaint(Some("none"), false));
assert!(!should_repaint(Some("none"), true));
}
#[test]
fn payloadless_or_junk_modes_scrub_without_repaint() {
assert_eq!(import_action(Some("1"), false), Some(ImportAction::ScrubOnly));
assert!(!should_repaint(Some("1"), false));
assert!(!should_repaint(Some("2"), true));
assert!(!should_repaint(Some(""), true));
}
#[test]
fn apex_goes_back_when_history_allows() {
assert_eq!(none_bounce(2), NoneBounce::Back);
assert_eq!(none_bounce(10), NoneBounce::Back);
assert_eq!(none_bounce(1), NoneBounce::ForwardNone);
assert_eq!(none_bounce(0), NoneBounce::ForwardNone);
}
}