#[non_exhaustive]
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct RadioState {
pub enabled: bool,
pub hardware_enabled: bool,
}
impl RadioState {
#[must_use]
pub fn new(enabled: bool, hardware_enabled: bool) -> Self {
Self {
enabled,
hardware_enabled,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct AirplaneModeState {
pub wifi: RadioState,
pub wwan: RadioState,
pub bluetooth: RadioState,
}
impl AirplaneModeState {
#[must_use]
pub fn new(wifi: RadioState, wwan: RadioState, bluetooth: RadioState) -> Self {
Self {
wifi,
wwan,
bluetooth,
}
}
#[must_use]
pub fn is_airplane_mode(&self) -> bool {
!self.wifi.enabled && !self.wwan.enabled && !self.bluetooth.enabled
}
#[must_use]
pub fn any_hardware_killed(&self) -> bool {
!self.wifi.hardware_enabled
|| !self.wwan.hardware_enabled
|| !self.bluetooth.hardware_enabled
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_off_is_airplane_mode() {
let state = AirplaneModeState::new(
RadioState::new(false, true),
RadioState::new(false, true),
RadioState::new(false, true),
);
assert!(state.is_airplane_mode());
assert!(!state.any_hardware_killed());
}
#[test]
fn any_on_is_not_airplane_mode() {
let state = AirplaneModeState::new(
RadioState::new(true, true),
RadioState::new(false, true),
RadioState::new(false, true),
);
assert!(!state.is_airplane_mode());
}
#[test]
fn hardware_killed_detected() {
let state = AirplaneModeState::new(
RadioState::new(true, true),
RadioState::new(true, false),
RadioState::new(true, true),
);
assert!(state.any_hardware_killed());
}
#[test]
fn no_hardware_kill() {
let state = AirplaneModeState::new(
RadioState::new(false, true),
RadioState::new(false, true),
RadioState::new(false, true),
);
assert!(!state.any_hardware_killed());
}
#[test]
fn radio_state_new() {
let rs = RadioState::new(true, false);
assert!(rs.enabled);
assert!(!rs.hardware_enabled);
}
}