You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.3 KiB
Rust

#![feature(test)]
extern crate test;
pub mod tapemachine;
#[cfg(test)]
mod tests {
use crate::tapemachine::TapeResult;
use crate::tapemachine::{CharTapeMachine, TapeError};
use test::Bencher;
const TEST_STRING: &str = "TEST STRING 1234 \\l \\n";
#[test]
fn it_returns_the_next_char() {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
let test_chars: Vec<char> = TEST_STRING.chars().collect();
let mut next = ctm.next_char().unwrap();
assert_eq!(next, *test_chars.get(1).unwrap());
next = ctm.next_char().unwrap();
assert_eq!(next, *test_chars.get(2).unwrap());
let _ = ctm.next_char().unwrap();
let _ = ctm.next_char().unwrap();
let _ = ctm.next_char().unwrap();
next = ctm.next_char().unwrap();
assert_eq!(next, *test_chars.get(6).unwrap());
}
#[test]
fn it_rewinds() {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
let test_chars: Vec<char> = TEST_STRING.chars().collect();
ctm.next_char().unwrap();
ctm.next_char().unwrap();
assert_eq!(ctm.next_char(), Some(*test_chars.get(3).unwrap()));
ctm.rewind(1);
assert_eq!(ctm.next_char(), Some(*test_chars.get(2).unwrap()));
}
#[test]
fn it_seeks() {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
let test_chars: Vec<char> = TEST_STRING.chars().collect();
assert_eq!(ctm.next_char(), Some(*test_chars.get(1).unwrap()));
ctm.seek_one().unwrap();
assert_eq!(ctm.next_char(), Some(*test_chars.get(3).unwrap()));
ctm.seek_one().unwrap();
ctm.seek_whitespace();
assert_eq!(ctm.next_char(), Some(*test_chars.get(6).unwrap()));
}
#[test]
fn it_asserts_chars() -> TapeResult<()> {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
ctm.assert_any(&['A', 'B', 'T'], None)?;
ctm.seek_one().unwrap();
ctm.assert_char(&'E', None)?;
ctm.seek_one().unwrap();
ctm.assert_str_sequence("ST ", None)?;
ctm.seek_one().unwrap();
ctm.assert_any_sequence(&[&['C'], &['A'], &['A', 'B'], &['S', 'T', 'R']], None)?;
if let Ok(_) =
ctm.assert_any_sequence(&[&['C'], &['A'], &['A', 'B'], &['S', 'T', 'R']], None)
{
Err(TapeError::new(0))
} else {
Ok(())
}
}
#[test]
fn it_checks_eof() -> TapeResult<()> {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
let _ = ctm.get_string_until_any(&['n'], &[]);
assert!(ctm.check_eof());
Ok(())
}
#[bench]
fn bench_assert_seek(b: &mut Bencher) {
let mut ctm = CharTapeMachine::new(TEST_STRING.chars().collect());
b.iter(|| {
ctm.check_char(&'T');
ctm.seek_one().unwrap();
ctm.check_char(&'E');
ctm.seek_one().unwrap();
ctm.check_char(&'F');
ctm.seek_one().unwrap();
ctm.check_any(&['A', 'B', 'C', 'D', 'E', '2']);
ctm.seek_one().unwrap();
ctm.seek_whitespace();
ctm.check_sequence(&['S', 'T', 'R', 'I', 'N', 'T']);
ctm.check_sequence(&['S', 'T', 'R', 'I', 'N', 'G']);
ctm.check_eof();
ctm.rewind(0);
})
}
}