use crate::pixelcolor::{
raw::{RawData, RawU1},
PixelColor,
};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub enum BinaryColor {
Off,
On,
}
impl Default for BinaryColor {
fn default() -> Self {
Self::Off
}
}
impl BinaryColor {
pub fn invert(self) -> Self {
match self {
BinaryColor::On => BinaryColor::Off,
BinaryColor::Off => BinaryColor::On,
}
}
pub fn is_on(self) -> bool {
self == BinaryColor::On
}
pub fn is_off(self) -> bool {
self == BinaryColor::Off
}
pub(crate) fn map_color<T>(self, value_off: T, value_on: T) -> T {
match self {
BinaryColor::On => value_on,
BinaryColor::Off => value_off,
}
}
}
impl PixelColor for BinaryColor {
type Raw = RawU1;
}
impl From<RawU1> for BinaryColor {
fn from(data: RawU1) -> Self {
if data.into_inner() != 0 {
BinaryColor::On
} else {
BinaryColor::Off
}
}
}
impl From<BinaryColor> for RawU1 {
fn from(color: BinaryColor) -> Self {
RawU1::new(color.map_color(0, 1))
}
}
impl From<bool> for BinaryColor {
fn from(value: bool) -> Self {
if value {
BinaryColor::On
} else {
BinaryColor::Off
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::pixelcolor::{IntoStorage, Rgb565, RgbColor};
#[test]
fn default_color_is_off() {
assert_eq!(BinaryColor::default(), BinaryColor::Off);
}
#[test]
fn invert_binary_color() {
assert_eq!(BinaryColor::Off.invert(), BinaryColor::On);
assert_eq!(BinaryColor::On.invert(), BinaryColor::Off);
}
#[test]
fn map_binary_color() {
assert_eq!(
BinaryColor::Off.map_color(Rgb565::RED, Rgb565::GREEN),
Rgb565::RED
);
assert_eq!(
BinaryColor::On.map_color(Rgb565::RED, Rgb565::GREEN),
Rgb565::GREEN
);
}
#[test]
fn from_data() {
assert_eq!(BinaryColor::from(RawU1::new(0)), BinaryColor::Off);
assert_eq!(BinaryColor::from(RawU1::new(1)), BinaryColor::On);
}
#[test]
fn into_data() {
assert_eq!(RawU1::from(BinaryColor::Off).into_inner(), 0);
assert_eq!(RawU1::from(BinaryColor::On).into_inner(), 1);
}
#[test]
fn from_bool() {
assert_eq!(BinaryColor::from(false), BinaryColor::Off);
assert_eq!(BinaryColor::from(true), BinaryColor::On);
}
#[test]
fn is_on_off() {
assert!(BinaryColor::Off.is_off());
assert!(!BinaryColor::On.is_off());
assert!(!BinaryColor::Off.is_on());
assert!(BinaryColor::On.is_on());
}
#[test]
fn into_storage() {
assert_eq!(BinaryColor::Off.into_storage(), 0u8);
assert_eq!(BinaryColor::On.into_storage(), 1u8);
}
}