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.

53 lines
1.5 KiB
Rust

use crate::error::TapeResult;
use crate::input_reader::InputReader;
use crate::token::Token;
use std::io::Cursor;
#[derive(Debug)]
struct TestToken(i32);
async fn parse_test_token(reader: &mut InputReader) -> TapeResult<Option<Token>> {
let mut num = String::new();
while !reader.check_eof().await && reader.peek().await?.is_numeric() {
num.push(reader.consume().await?);
}
if num.is_empty() {
Ok(None)
} else {
Ok(Some(Token::new(TestToken(num.parse::<i32>().unwrap()))))
}
}
#[tokio::test]
async fn it_parses() {
let mut reader = InputReader::new(Cursor::new("128"));
let token = parse_test_token(&mut reader).await.unwrap();
assert!(token.is_some());
let token = token.unwrap().try_into::<TestToken>().unwrap();
assert_eq!(token.0, 128);
let mut reader = InputReader::new(Cursor::new("string a12 24\n"));
let token = parse_test_token(&mut reader).await.unwrap();
assert!(token.is_none());
reader.seek_to(8).await.unwrap();
let token = parse_test_token(&mut reader).await.unwrap();
assert!(token.is_some());
let token = token.unwrap().try_into::<TestToken>().unwrap();
assert_eq!(token.0, 12);
}
#[test]
fn it_converts() {
let token = Token::new(TestToken(12));
assert!(token.is::<TestToken>());
let test_token = token.try_as::<TestToken>();
assert!(test_token.is_some());
assert_eq!(test_token.unwrap().0, 12);
let test_token = token.try_into::<TestToken>();
assert!(test_token.is_some());
assert_eq!(test_token.unwrap().0, 12);
}