#[repr(u8)]
pub enum ControlOptions {
DisplayOn = 0x04,
CursorOn = 0x02,
BlinkOn = 0x01,
}
pub struct DisplayControl {
control: u8,
}
impl DisplayControl {
pub fn new() -> DisplayControl {
DisplayControl { control: 0 }
}
pub fn set(&mut self, value: ControlOptions) -> &mut Self {
self.control |= value as u8;
self
}
pub fn clear(&mut self, value: ControlOptions) -> &mut Self {
self.control &= !(value as u8);
self
}
pub fn value(&self) -> u8 {
self.control
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn initial_value_zero() {
let control = DisplayControl::new();
assert_eq!(0, control.value());
}
#[test]
fn display_on_sets_value() {
let mut control = DisplayControl::new();
control.set(ControlOptions::CursorOn);
assert_eq!(ControlOptions::CursorOn as u8, control.value());
}
#[test]
fn two_options_on() {
let mut control = DisplayControl::new();
control.set(ControlOptions::CursorOn).set(ControlOptions::DisplayOn);
assert_eq!(ControlOptions::CursorOn as u8 | ControlOptions::DisplayOn as u8, control.value());
}
#[test]
fn two_options_on_then_clear_one() {
let mut control = DisplayControl::new();
control.set(ControlOptions::CursorOn).set(ControlOptions::DisplayOn);
control.clear(ControlOptions::CursorOn);
assert_eq!(ControlOptions::DisplayOn as u8, control.value());
}
}