mirror of
https://github.com/cccb/servicepoint.git
synced 2025-01-18 18:10:14 +01:00
unit tests for round trip command and packet, fix bugs and add needed derivations
This commit is contained in:
parent
483a5057fe
commit
ab66a6a33e
|
@ -1,5 +1,5 @@
|
||||||
/// A vector of bits
|
/// A vector of bits
|
||||||
#[derive(Clone)]
|
#[derive(Clone, PartialEq)]
|
||||||
pub struct BitVec {
|
pub struct BitVec {
|
||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/// A 2D grid of bytes
|
/// A 2D grid of bytes
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct ByteGrid {
|
pub struct ByteGrid {
|
||||||
/// Size in the x-axis
|
/// Size in the x-axis
|
||||||
pub width: usize,
|
pub width: usize,
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::command_code::CommandCode;
|
|
||||||
use crate::compression::{into_compressed, into_decompressed};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
BitVec, ByteGrid, CompressionCode, Header, Packet, PixelGrid, TILE_SIZE,
|
BitVec, ByteGrid, CompressionCode, Header, Packet, PixelGrid, TILE_SIZE,
|
||||||
};
|
};
|
||||||
|
use crate::command_code::CommandCode;
|
||||||
|
use crate::compression::{into_compressed, into_decompressed};
|
||||||
|
|
||||||
/// An origin marks the top left position of a window sent to the display.
|
/// An origin marks the top left position of a window sent to the display.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub struct Origin(pub u16, pub u16);
|
pub struct Origin(pub u16, pub u16);
|
||||||
|
|
||||||
impl Origin {
|
impl Origin {
|
||||||
|
@ -25,7 +25,7 @@ pub type Offset = u16;
|
||||||
pub type Brightness = u8;
|
pub type Brightness = u8;
|
||||||
|
|
||||||
/// A command to send to the display.
|
/// A command to send to the display.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
/// Set all pixels to the off state
|
/// Set all pixels to the off state
|
||||||
Clear,
|
Clear,
|
||||||
|
@ -290,7 +290,7 @@ fn packet_into_bitmap_win(
|
||||||
pixel_h as usize,
|
pixel_h as usize,
|
||||||
&payload,
|
&payload,
|
||||||
),
|
),
|
||||||
CompressionCode::Uncompressed,
|
compression,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,3 +523,56 @@ pub mod c_api {
|
||||||
_ = Box::from_raw(ptr);
|
_ = Box::from_raw(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{BitVec, ByteGrid, Command, CompressionCode, Origin, Packet, PixelGrid};
|
||||||
|
|
||||||
|
fn round_trip(original: Command) {
|
||||||
|
let packet: Packet = original.clone().into();
|
||||||
|
let copy: Command = match Command::try_from(packet) {
|
||||||
|
Ok(command) => command,
|
||||||
|
Err(err) => panic!("could not reload {original:?}: {err:?}"),
|
||||||
|
};
|
||||||
|
assert_eq!(copy, original);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_clear() { round_trip(Command::Clear); }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_hard_reset() { round_trip(Command::HardReset); }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_fade_out() { round_trip(Command::FadeOut); }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_brightness() { round_trip(Command::Brightness(6)); }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[allow(deprecated)]
|
||||||
|
fn round_trip_bitmap_legacy() { round_trip(Command::BitmapLegacy); }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_char_brightness() {
|
||||||
|
round_trip(Command::CharBrightness(Origin(5, 2), ByteGrid::new(7, 5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_cp437_data() {
|
||||||
|
round_trip(Command::Cp437Data(Origin(5, 2), ByteGrid::new(7, 5)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip_bitmap_linear() {
|
||||||
|
let codes = [CompressionCode::Uncompressed, CompressionCode::Lzma,
|
||||||
|
CompressionCode::Bzip2, CompressionCode::Zlib, CompressionCode::Zstd];
|
||||||
|
for compression in codes {
|
||||||
|
round_trip(Command::BitmapLinear(23, BitVec::new(40), compression));
|
||||||
|
round_trip(Command::BitmapLinearAnd(23, BitVec::new(40), compression));
|
||||||
|
round_trip(Command::BitmapLinearOr(23, BitVec::new(40), compression));
|
||||||
|
round_trip(Command::BitmapLinearXor(23, BitVec::new(40), compression));
|
||||||
|
round_trip(Command::BitmapLinearWin(Origin(0, 0), PixelGrid::max_sized(), compression));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,6 +51,10 @@ impl TryFrom<u16> for CommandCode {
|
||||||
value if value == BitmapLinearAnd as u16 => Ok(BitmapLinearAnd),
|
value if value == BitmapLinearAnd as u16 => Ok(BitmapLinearAnd),
|
||||||
value if value == BitmapLinearOr as u16 => Ok(BitmapLinearOr),
|
value if value == BitmapLinearOr as u16 => Ok(BitmapLinearOr),
|
||||||
value if value == BitmapLinearXor as u16 => Ok(BitmapLinearXor),
|
value if value == BitmapLinearXor as u16 => Ok(BitmapLinearXor),
|
||||||
|
value if value == BitmapLinearWinZstd as u16 => Ok(BitmapLinearWinZstd),
|
||||||
|
value if value == BitmapLinearWinLzma as u16 => Ok(BitmapLinearWinLzma),
|
||||||
|
value if value == BitmapLinearWinZlib as u16 => Ok(BitmapLinearWinZlib),
|
||||||
|
value if value == BitmapLinearWinBzip2 as u16 => Ok(BitmapLinearWinBzip2),
|
||||||
_ => Err(()),
|
_ => Err(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use CompressionCode::*;
|
||||||
|
|
||||||
/// Specifies the kind of compression to use. Availability depends on features.
|
/// Specifies the kind of compression to use. Availability depends on features.
|
||||||
#[repr(u16)]
|
#[repr(u16)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum CompressionCode {
|
pub enum CompressionCode {
|
||||||
Uncompressed = 0x0,
|
Uncompressed = 0x0,
|
||||||
#[cfg(feature = "compression_zlib")]
|
#[cfg(feature = "compression_zlib")]
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
|
|
||||||
/// A raw header. Should probably not be used directly.
|
/// A raw header. Should probably not be used directly.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Header(pub u16, pub u16, pub u16, pub u16, pub u16);
|
pub struct Header(pub u16, pub u16, pub u16, pub u16, pub u16);
|
||||||
|
|
||||||
/// The raw payload. Should probably not be used directly.
|
/// The raw payload. Should probably not be used directly.
|
||||||
pub type Payload = Vec<u8>;
|
pub type Payload = Vec<u8>;
|
||||||
|
|
||||||
/// The raw packet. Should probably not be used directly.
|
/// The raw packet. Should probably not be used directly.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Packet(pub Header, pub Payload);
|
pub struct Packet(pub Header, pub Payload);
|
||||||
|
|
||||||
impl From<Packet> for Vec<u8> {
|
impl From<Packet> for Vec<u8> {
|
||||||
|
@ -97,3 +97,16 @@ mod c_api {
|
||||||
_ = Box::from_raw(this)
|
_ = Box::from_raw(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{Header, Packet};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn round_trip() {
|
||||||
|
let p = Packet(Header(0,1,2,3,4), vec![42u8; 23]);
|
||||||
|
let data: Vec<u8> = p.into();
|
||||||
|
let p = Packet::try_from(&*data).unwrap();
|
||||||
|
assert_eq!(p, Packet(Header(0,1,2,3,4), vec![42u8; 23]));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::{BitVec, PIXEL_HEIGHT, PIXEL_WIDTH};
|
use crate::{BitVec, PIXEL_HEIGHT, PIXEL_WIDTH};
|
||||||
|
|
||||||
/// A grid of pixels stored in packed bytes.
|
/// A grid of pixels stored in packed bytes.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct PixelGrid {
|
pub struct PixelGrid {
|
||||||
/// the width in pixels
|
/// the width in pixels
|
||||||
pub width: usize,
|
pub width: usize,
|
||||||
|
|
Loading…
Reference in a new issue