use super::{Device, Result, Validate};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum BatteryState {
Charging,
Charged,
Discharging,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum CellularMode {
NotSupported,
Searching,
Failed,
Active,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum DataNetworkType {
Wifi,
Cell3G,
Cell4G,
CellLte,
CellLteA,
CellLtePlus,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum WifiMode {
Searching,
Failed,
Active,
}
pub struct StatusBar {
device: Device,
}
impl StatusBar {
pub fn clear(&self) -> Result<()> {
self.device
.simctl()
.command("status_bar")
.arg(&self.device.udid)
.arg("clear")
.output()?
.validate()
}
pub fn empty_override(&self) -> StatusBarOverride {
StatusBarOverride {
device: self.device.clone(),
time: None,
data_network: None,
wifi_mode: None,
wifi_bars: None,
cellular_mode: None,
cellular_bars: None,
operator_name: None,
battery_state: None,
battery_level: None,
}
}
}
pub struct StatusBarOverride {
device: Device,
time: Option<String>,
data_network: Option<DataNetworkType>,
wifi_mode: Option<WifiMode>,
wifi_bars: Option<usize>,
cellular_mode: Option<CellularMode>,
cellular_bars: Option<usize>,
operator_name: Option<String>,
battery_state: Option<BatteryState>,
battery_level: Option<usize>,
}
impl StatusBarOverride {
pub fn time(&mut self, time: &str) -> &mut StatusBarOverride {
self.time = Some(time.to_owned());
self
}
pub fn data_network(&mut self, data_network: DataNetworkType) -> &mut StatusBarOverride {
self.data_network = Some(data_network);
self
}
pub fn wifi_mode(&mut self, wifi_mode: WifiMode) -> &mut StatusBarOverride {
self.wifi_mode = Some(wifi_mode);
self
}
pub fn wifi_bars(&mut self, wifi_bars: usize) -> &mut StatusBarOverride {
self.wifi_bars = Some(wifi_bars);
self
}
pub fn cellular_mode(&mut self, cellular_mode: CellularMode) -> &mut StatusBarOverride {
self.cellular_mode = Some(cellular_mode);
self
}
pub fn cellular_bars(&mut self, cellular_bars: usize) -> &mut StatusBarOverride {
self.cellular_bars = Some(cellular_bars);
self
}
pub fn operator_name(&mut self, name: &str) -> &mut StatusBarOverride {
self.operator_name = Some(name.to_owned());
self
}
pub fn battery_state(&mut self, state: BatteryState) -> &mut StatusBarOverride {
self.battery_state = Some(state);
self
}
pub fn battery_level(&mut self, level: usize) -> &mut StatusBarOverride {
self.battery_level = Some(level);
self
}
pub fn apply(&self) -> Result<()> {
let mut command = self.device.simctl().command("status_bar");
command.arg(&self.device.udid).arg("override");
if let Some(time) = self.time.as_ref() {
command.arg("--time").arg(time);
}
if let Some(network) = self.data_network.as_ref() {
command.arg("--dataNetwork").arg(match network {
DataNetworkType::Wifi => "wifi",
DataNetworkType::Cell3G => "3g",
DataNetworkType::Cell4G => "4g",
DataNetworkType::CellLte => "lte",
DataNetworkType::CellLteA => "lte-a",
DataNetworkType::CellLtePlus => "lte+",
});
}
if let Some(mode) = self.wifi_mode.as_ref() {
command.arg("--wifiMode").arg(match mode {
WifiMode::Searching => "searching",
WifiMode::Failed => "failed",
WifiMode::Active => "active",
});
}
if let Some(bars) = self.wifi_bars.as_ref() {
command.arg("--wifiBars").arg(bars.to_string());
}
if let Some(mode) = self.cellular_mode.as_ref() {
command.arg("--cellularMode").arg(match mode {
CellularMode::NotSupported => "notSupported",
CellularMode::Searching => "searching",
CellularMode::Failed => "failed",
CellularMode::Active => "active",
});
}
if let Some(bars) = self.cellular_bars.as_ref() {
command.arg("--cellularBars").arg(bars.to_string());
}
if let Some(name) = self.operator_name.as_ref() {
command.arg("--operatorName").arg(&name);
}
if let Some(state) = self.battery_state.as_ref() {
command.arg("--batteryState").arg(match state {
BatteryState::Charging => "charging",
BatteryState::Charged => "charged",
BatteryState::Discharging => "discharging",
});
}
if let Some(level) = self.battery_level.as_ref() {
command.arg("--batteryLevel").arg(level.to_string());
}
command.output()?.validate()
}
}
impl Device {
pub fn status_bar(&self) -> StatusBar {
StatusBar {
device: self.clone(),
}
}
}
#[cfg(test)]
mod tests {
use serial_test::serial;
use super::*;
use crate::mock;
#[test]
#[serial]
fn test_status_bar() -> Result<()> {
mock::device()?.boot()?;
mock::device()?
.status_bar()
.empty_override()
.time("00:00")
.data_network(DataNetworkType::Cell4G)
.cellular_mode(CellularMode::Active)
.cellular_bars(3)
.operator_name("Babel")
.battery_state(BatteryState::Discharging)
.battery_level(42)
.apply()?;
mock::device()?.status_bar().clear()?;
mock::device()?.shutdown()?;
Ok(())
}
}