use crate::state_transducer::{Output, State, Transition, Transitions};
pub(crate) static TRANSITIONS: Transitions<8, 4> = {
use self::{Output::*, State::*};
macro_rules! t {
($s:expr, $o:expr) => {
Transition::new($s, $o)
};
}
[
[t!(N2, N), t!(F1, AB), t!(R1, BA), t!(N0, N)], [t!(N2, AB), t!(F1, N), t!(N0, N), t!(N0, BA)], [t!(N2, BA), t!(N2, N), t!(F2, N), t!(N0, AB)], [t!(N0, E), t!(N0, E), t!(N0, E), t!(N0, E)], [t!(N2, BA), t!(N0, N), t!(R1, N), t!(N0, AB)], [t!(N2, AB), t!(R2, N), t!(N2, N), t!(N0, BA)], [t!(N0, E), t!(N0, E), t!(N0, E), t!(N0, E)], [t!(N2, N), t!(R2, BA), t!(F2, AB), t!(N0, N)], ]
};
#[cfg(test)]
mod tests {
use crate::{
state_transducer::{
quad_step::TRANSITIONS,
Input::{self, *},
Output, State, StateTransducer,
},
Change::{self, *},
Error, IncrementalDecoder, QuadStep,
};
type Decoder = IncrementalDecoder<QuadStep>;
fn update(decoder: &mut Decoder, input: Input) -> Result<Option<Change>, Error> {
decoder.update(input.a(), input.b())
}
#[test]
fn initial_state() {
let transducer = StateTransducer::new(&TRANSITIONS);
assert_eq!(transducer.state(), State::N0);
}
#[test]
fn identity() {
let mut transducer = StateTransducer::new(&TRANSITIONS);
let scenarios = [
(State::N0, Input::A1B1),
(State::F1, Input::A0B1),
(State::F2, Input::A1B0),
(State::R1, Input::A1B0),
(State::R2, Input::A0B1),
(State::N2, Input::A0B0),
];
for (state, input) in scenarios {
transducer.set_state(state);
let output = transducer.step(input);
assert_eq!(output, Output::N);
assert_eq!(transducer.state(), state);
}
}
mod clean {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
}
mod stutter {
use super::*;
mod block {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Positive))); assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Negative))); assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
}
mod interleaved {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B1), Ok(None)); assert_eq!(update(&mut decoder, A0B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Ok(None)); assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B0), Ok(None)); assert_eq!(update(&mut decoder, A0B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B0), Ok(None)); assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Ok(None)); assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
}
}
mod direction_change {
use super::*;
mod half {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
}
mod quarter {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
}
}
mod noise {
use super::*;
mod single {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
decoder.reset();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Positive)));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
decoder.reset();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B1), Ok(Some(Negative)));
}
}
mod double {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
}
}
mod quadruple {
use super::*;
#[test]
fn forwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B0), Err(Error::E11_00)); assert_eq!(update(&mut decoder, A0B1), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A1B1), Err(Error::E00_11)); assert_eq!(update(&mut decoder, A1B0), Ok(Some(Negative)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
}
#[test]
fn backwards() {
let mut decoder = Decoder::default();
assert_eq!(update(&mut decoder, A0B0), Err(Error::E11_00)); assert_eq!(update(&mut decoder, A1B0), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A0B1), Err(Error::E10_01)); assert_eq!(update(&mut decoder, A0B0), Ok(None));
assert_eq!(update(&mut decoder, A1B1), Err(Error::E00_11)); assert_eq!(update(&mut decoder, A0B1), Ok(Some(Positive)));
assert_eq!(update(&mut decoder, A1B0), Err(Error::E01_10)); assert_eq!(update(&mut decoder, A1B1), Ok(None));
}
}
}
}