use serde::Serialize;
use crate::error::Error;
use crate::exec::{exec, NoArgs};
#[derive(Serialize)]
struct SelectorArgs<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
to: Option<&'a str>,
}
pub fn focus(to: Option<&str>) -> Result<(), Error> {
exec("focus", &SelectorArgs { to })
}
pub fn focus_first(to: Option<&str>) -> Result<(), Error> {
exec("focus_first", &SelectorArgs { to })
}
pub fn push_focus(to: Option<&str>) -> Result<(), Error> {
exec("push_focus", &SelectorArgs { to })
}
pub fn pop_focus() -> Result<(), Error> {
exec("pop_focus", &NoArgs {})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::exec::{encode_command, NoArgs};
use serde_json::Value;
#[test]
fn focus_with_selector() {
let args = SelectorArgs {
to: Some("#first-name"),
};
let parsed: Value =
serde_json::from_str(&encode_command("focus", &args).unwrap()).unwrap();
assert_eq!(parsed[0][0], "focus");
assert_eq!(parsed[0][1]["to"], "#first-name");
}
#[test]
fn focus_without_selector_omits_to() {
let args = SelectorArgs { to: None };
let parsed: Value =
serde_json::from_str(&encode_command("focus", &args).unwrap()).unwrap();
assert!(parsed[0][1].as_object().unwrap().is_empty());
}
#[test]
fn pop_focus_takes_empty_args() {
let parsed: Value =
serde_json::from_str(&encode_command("pop_focus", &NoArgs {}).unwrap()).unwrap();
assert_eq!(parsed[0][0], "pop_focus");
assert!(parsed[0][1].as_object().unwrap().is_empty());
}
#[test]
fn non_wasm_stubs_to_ok() {
assert!(pop_focus().is_ok());
}
}