Add a failing test that the lexer finds rational numbers
This commit is contained in:
parent
636b0dda9b
commit
f9d9a08455
2 changed files with 16 additions and 5 deletions
|
@ -41,10 +41,6 @@ enum State {
|
||||||
StringEscape,
|
StringEscape,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lex(input: &str) -> Lexer {
|
|
||||||
Lexer::new(&input)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Lexer {
|
pub struct Lexer {
|
||||||
input: String,
|
input: String,
|
||||||
begin: usize,
|
begin: usize,
|
||||||
|
|
|
@ -8,10 +8,18 @@ mod number;
|
||||||
mod str;
|
mod str;
|
||||||
mod token;
|
mod token;
|
||||||
|
|
||||||
|
pub use lexer::Lexer;
|
||||||
|
pub use token::Token;
|
||||||
|
|
||||||
|
pub fn lex(input: &str) -> Lexer {
|
||||||
|
Lexer::new(&input)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use sibiltypes::{Bool, Char, Number};
|
use sibiltypes::{Bool, Char, Number};
|
||||||
use std::iter::Iterator;
|
use std::iter::Iterator;
|
||||||
|
use super::lex;
|
||||||
use lexer::Lexer;
|
use lexer::Lexer;
|
||||||
use token::Token;
|
use token::Token;
|
||||||
|
|
||||||
|
@ -81,6 +89,12 @@ mod tests {
|
||||||
check_single_token("0.34", Token::Number(Number::from_float(0.34, false)));
|
check_single_token("0.34", Token::Number(Number::from_float(0.34, false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn finds_rational_numbers() {
|
||||||
|
check_single_token("3/2", Token::Number(Number::from_quotient(3, 2, true)));
|
||||||
|
check_single_token("-3/2", Token::Number(Number::from_quotient(-3, 2, true)));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn finds_negative_numbers() {
|
fn finds_negative_numbers() {
|
||||||
check_single_token("-3", Token::Number(Number::from_int(-3, true)));
|
check_single_token("-3", Token::Number(Number::from_int(-3, true)));
|
||||||
|
@ -110,6 +124,7 @@ mod tests {
|
||||||
fn finds_exact_numbers() {
|
fn finds_exact_numbers() {
|
||||||
check_single_token("#e45", Token::Number(Number::from_int(45, true)));
|
check_single_token("#e45", Token::Number(Number::from_int(45, true)));
|
||||||
check_single_token("#e-45", Token::Number(Number::from_int(-45, true)));
|
check_single_token("#e-45", Token::Number(Number::from_int(-45, true)));
|
||||||
|
check_single_token("#e4.5", Token::Number(Number::from_float(4.5, true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -149,7 +164,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_tokens(input: &str, expected: Vec<Token>) {
|
fn check_tokens(input: &str, expected: Vec<Token>) {
|
||||||
let lexer = Lexer::new(input);
|
let lexer = lex(input);
|
||||||
let mut expected_iter = expected.iter();
|
let mut expected_iter = expected.iter();
|
||||||
for lex in lexer {
|
for lex in lexer {
|
||||||
if let Some(expected_token) = expected_iter.next() {
|
if let Some(expected_token) = expected_iter.next() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue