6130 lines
178 KiB
Rust
6130 lines
178 KiB
Rust
// Generated tests - do not edit by hand
|
|
// Use: run `python3 SLS_Tests/yaml_to_rust_tests.py SLS_Tests/cases.yaml tests/lexer_tests_generated.rs`
|
|
|
|
use sls; // crate under test
|
|
|
|
const INT64_MIN: i128 = i64::MIN as i128;
|
|
const UINT64_MAX: i128 = u64::MAX as i128;
|
|
|
|
#[test]
|
|
fn test_Empty_Statement() {
|
|
let src = "";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert!(got.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_0() {
|
|
let src = "0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_1() {
|
|
let src = "-1";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_42() {
|
|
let src = "42";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_Leading_Zeros() {
|
|
let src = "00042";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Hex_0xFF() {
|
|
let src = "0xFF";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Hex_0xdeadbeef() {
|
|
let src = "0xdeadbeef";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 3735928559);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Hex_Max() {
|
|
let src = "0x7FFFFFFFFFFFFFFF";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 9223372036854775807);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Binary_0b1010() {
|
|
let src = "0b1010";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 10);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Binary_All_Ones() {
|
|
let src = "0b1111111111111111";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Octal_0o755() {
|
|
let src = "0o755";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 493);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Octal_Max_Three_Digits() {
|
|
let src = "0o777";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 511);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_Max_i64() {
|
|
let src = "9223372036854775807";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 9223372036854775807);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_Min_i64() {
|
|
let src = "-9223372036854775808";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, INT64_MIN);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_with_Underscore() {
|
|
let src = "1_000_000";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Underscore_End() {
|
|
let src = "42_";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Underscore_Double() {
|
|
let src = "4__2";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Whitespace() {
|
|
let src = " 42 ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Hex_Zero() {
|
|
let src = "0x0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Binary_Zero() {
|
|
let src = "0b0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Octal_Zero() {
|
|
let src = "0o0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Decimal_with_Commas_Invalid() {
|
|
let src = "1,000,000";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Invalid_Characters() {
|
|
let src = "12a3";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Default_Invalid_Prefix() {
|
|
let src = "0b2";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Decimal_Positive() {
|
|
let src = "42:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Zero() {
|
|
let src = "0:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Decimal_Negative() {
|
|
let src = "-100:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Hex() {
|
|
let src = "0x7F:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 127);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Binary() {
|
|
let src = "0b1111:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Octal() {
|
|
let src = "0o77:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Max_Value() {
|
|
let src = "127:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 127);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Min_Value() {
|
|
let src = "-128:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -128);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Overflow() {
|
|
let src = "128:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Underflow() {
|
|
let src = "-129:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Decimal_Positive() {
|
|
let src = "42:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Zero() {
|
|
let src = "0:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Decimal_Negative() {
|
|
let src = "-100:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Hex() {
|
|
let src = "0xFF:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Binary() {
|
|
let src = "0b1111:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Octal() {
|
|
let src = "0o77:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Max_Value() {
|
|
let src = "32767:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 32767);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Min_Value() {
|
|
let src = "-32768:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -32768);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Overflow() {
|
|
let src = "32768:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Underflow() {
|
|
let src = "-32769:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Decimal_Positive() {
|
|
let src = "42:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Zero() {
|
|
let src = "0:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Decimal_Negative() {
|
|
let src = "-100:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Hex() {
|
|
let src = "0xFF:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Binary() {
|
|
let src = "0b1111:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Octal() {
|
|
let src = "0o77:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Max_Value() {
|
|
let src = "2147483647:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 2147483647);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Min_Value() {
|
|
let src = "-2147483648:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -2147483648);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Overflow() {
|
|
let src = "2147483648:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Underflow() {
|
|
let src = "-2147483649:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_With_Underscores() {
|
|
let src = "1_000_000:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Decimal_Positive() {
|
|
let src = "42:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Zero() {
|
|
let src = "0:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Decimal_Negative() {
|
|
let src = "-100:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Hex() {
|
|
let src = "0xFF:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Binary() {
|
|
let src = "0b1111:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Octal() {
|
|
let src = "0o77:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Max_Value() {
|
|
let src = "9223372036854775807:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 9223372036854775807);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Min_Value() {
|
|
let src = "-9223372036854775808:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, INT64_MIN);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Overflow() {
|
|
let src = "9223372036854775808:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Underflow() {
|
|
let src = "-9223372036854775809:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_With_Underscores() {
|
|
let src = "1_000_000:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Decimal_Positive() {
|
|
let src = "42:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Zero() {
|
|
let src = "0:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Hex() {
|
|
let src = "0xFF:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Binary() {
|
|
let src = "0b1111:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Octal() {
|
|
let src = "0o77:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Max_Value() {
|
|
let src = "255:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Min_Value() {
|
|
let src = "0:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Overflow() {
|
|
let src = "256:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Underflow() {
|
|
let src = "-1:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Decimal_Positive() {
|
|
let src = "42:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Zero() {
|
|
let src = "0:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Hex() {
|
|
let src = "0xFF:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Binary() {
|
|
let src = "0b1111:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Octal() {
|
|
let src = "0o77:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Max_Value() {
|
|
let src = "65535:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Min_Value() {
|
|
let src = "0:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Overflow() {
|
|
let src = "65536:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Underflow() {
|
|
let src = "-1:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Decimal_Positive() {
|
|
let src = "42:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Zero() {
|
|
let src = "0:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Hex() {
|
|
let src = "0xFF:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Binary() {
|
|
let src = "0b1111:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Octal() {
|
|
let src = "0o77:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Max_Value() {
|
|
let src = "4294967295:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4294967295);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Min_Value() {
|
|
let src = "0:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Overflow() {
|
|
let src = "4294967296:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Underflow() {
|
|
let src = "-1:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_With_Underscores() {
|
|
let src = "1_000_000:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Decimal_Positive() {
|
|
let src = "42:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Zero() {
|
|
let src = "0:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Hex() {
|
|
let src = "0xFF:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Binary() {
|
|
let src = "0b1111:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 15);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Octal() {
|
|
let src = "0o77:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Max_Value() {
|
|
let src = "18446744073709551615:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, UINT64_MAX);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Min_Value() {
|
|
let src = "0:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Overflow() {
|
|
let src = "18446744073709551616:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Underflow() {
|
|
let src = "-1:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_With_Underscores() {
|
|
let src = "1_000_000:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Hex_Max() {
|
|
let src = "0x7F:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 127);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Binary_Max() {
|
|
let src = "0b01111111:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 127);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Octal_Max() {
|
|
let src = "0o177:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 127);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i8_Negative_Hex() {
|
|
let src = "-0x80:i8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -128);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Hex_Max() {
|
|
let src = "0xFF:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Binary_Max() {
|
|
let src = "0b11111111:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u8_Octal_Max() {
|
|
let src = "0o377:u8";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Hex_Sample() {
|
|
let src = "0x1234:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4660);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Binary_Sample() {
|
|
let src = "0b1111111100000000:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, -256);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i16_Octal_Sample() {
|
|
let src = "0o1234:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 668);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Hex_Max() {
|
|
let src = "0xFFFF:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Binary_Max() {
|
|
let src = "0b1111111111111111:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Octal_Max() {
|
|
let src = "0o177777:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u16_Decimal_Mid() {
|
|
let src = "50000:u16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 50000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Hex_Sample() {
|
|
let src = "0xABCD:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 43981);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i32_Binary_Sample() {
|
|
let src = "0b11110000:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 240);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Hex_Max() {
|
|
let src = "0xFFFFFFFF:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4294967295);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Binary_Sample() {
|
|
let src = "0b11111111000000001111111100000000:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4278255360);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Octal_Max() {
|
|
let src = "0o37777777777:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4294967295);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u32_Decimal_Mid() {
|
|
let src = "1000000:u32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1000000);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Decimal_Positive_42() {
|
|
let src = "42:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Hex_0xFF() {
|
|
let src = "0xFF:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 255);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Binary_0b1010() {
|
|
let src = "0b1010:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 10);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_i64_Octal_0o755() {
|
|
let src = "0o755:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 493);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Hex_Max() {
|
|
let src = "0xFFFFFFFFFFFFFFFF:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, UINT64_MAX);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Binary_Sample() {
|
|
let src = "0b1010101010101010:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 43690);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Octal_Sample() {
|
|
let src = "0o7777:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 4095);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_u64_Decimal() {
|
|
let src = "42:u64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Hex_With_Underscores() {
|
|
let src = "0xDEAD_BEEF:i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 3735928559);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Binary_With_Underscores() {
|
|
let src = "0b1111_0000_1010_0101:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 61605);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Integer_Octal_With_Underscores() {
|
|
let src = "0o7_7_7:i16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 511);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Simple() {
|
|
let src = "3.14";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Zero() {
|
|
let src = "0.0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 0.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Negative() {
|
|
let src = "-2.5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - -2.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_One() {
|
|
let src = "1.0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Simple() {
|
|
let src = "3.14:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f64_Simple() {
|
|
let src = "2.718:f64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 2.718).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Leading_Zeros() {
|
|
let src = "00042.5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 42.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Leading_Zero_Decimal() {
|
|
let src = "0.5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 0.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Trailing_Zeros() {
|
|
let src = "3.1400";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_No_Leading_Digit() {
|
|
let src = ".5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 0.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_No_Leading_Digit_Negative() {
|
|
let src = "-.25";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - -0.25).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_No_Trailing_Digits() {
|
|
let src = "42.";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 42.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_No_Trailing_Digits_Negative() {
|
|
let src = "-7.";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - -7.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Very_Small() {
|
|
let src = "0.000001";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1e-06).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Very_Large() {
|
|
let src = "1000000.0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1000000.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Underscore_Integer_Part() {
|
|
let src = "1_000_000.5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1000000.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Underscore_Decimal_Part() {
|
|
let src = "3.141_592_653";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.141592653).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Underscore_Both_Parts() {
|
|
let src = "1_234.567_89";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1234.56789).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Underscore_Trailing() {
|
|
let src = "42.5_";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 42.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Underscore_Double() {
|
|
let src = "4__2.5";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 42.5).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_With_Underscores() {
|
|
let src = "1_234.567_89:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1234.56789).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Precision_Limit() {
|
|
let src = "1.2345678:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.2345678).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_High_Precision() {
|
|
let src = "3.141592653589793:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.141592653589793).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f64_Precision_Limit() {
|
|
let src = "1.234567890123456:f64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.234567890123456).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f64_High_Precision() {
|
|
let src = "3.141592653589793238:f64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.141592653589793).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f64_Close_Numbers_1() {
|
|
let src = "1.0000000000000001:f64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f64_Close_Numbers_2() {
|
|
let src = "1.0000000000000002:f64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.0000000000000002).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Invalid_Multiple_Decimal_Points() {
|
|
let src = "3.14.159";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Invalid_Characters() {
|
|
let src = "3.1a4";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Invalid_Type_Annotation() {
|
|
let src = "3.14:i32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Invalid_Type_Name() {
|
|
let src = "3.14:f16";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Invalid_Comma_Separator() {
|
|
let src = "1,234.56";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Leading_Whitespace() {
|
|
let src = " 3.14";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Trailing_Whitespace() {
|
|
let src = "3.14 ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Both_Whitespace() {
|
|
let src = " 3.14 ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.14).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_With_Whitespace() {
|
|
let src = " 2.718:f32 ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 2.718).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Pi_Approximate() {
|
|
let src = "3.141592653589793";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.141592653589793).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Pi_Approximate() {
|
|
let src = "3.1415927:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 3.1415927).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Euler_Approximate() {
|
|
let src = "2.718281828459045";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 2.718281828459045).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Euler_Approximate() {
|
|
let src = "2.7182817:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 2.7182817).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Golden_Ratio() {
|
|
let src = "1.618033988749895";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.618033988749895).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Sqrt2() {
|
|
let src = "1.4142135623730951";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 1.4142135623730951).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Positive_Zero() {
|
|
let src = "0.0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 0.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_Default_Negative_Zero() {
|
|
let src = "-0.0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - -0.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Positive_Zero() {
|
|
let src = "0.0:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - 0.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Float_f32_Negative_Zero() {
|
|
let src = "-0.0:f32";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Float);
|
|
let parsed: f64 = got[0].lexeme.parse().expect("expected float");
|
|
assert!((parsed - -0.0).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Simple_Letter_A() {
|
|
let src = "'A'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 65);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Simple_Letter_a() {
|
|
let src = "'a'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 97);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Simple_Letter_Z() {
|
|
let src = "'Z'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 90);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Simple_Letter_z() {
|
|
let src = "'z'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 122);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Digit_0() {
|
|
let src = "'0'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 48);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Digit_5() {
|
|
let src = "'5'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 53);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Digit_9() {
|
|
let src = "'9'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 57);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Space() {
|
|
let src = "' '";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 32);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Exclamation() {
|
|
let src = "'!'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 33);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Question_Mark() {
|
|
let src = "'?'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 63);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Period() {
|
|
let src = "'.'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 46);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Comma() {
|
|
let src = "','";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 44);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Semicolon() {
|
|
let src = "';'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 59);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Colon() {
|
|
let src = "':'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 58);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Plus() {
|
|
let src = "'+'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 43);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Minus() {
|
|
let src = "'-'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 45);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Asterisk() {
|
|
let src = "'*'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 42);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Slash() {
|
|
let src = "'/'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 47);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Equals() {
|
|
let src = "'='";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 61);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Less_Than() {
|
|
let src = "'<'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 60);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Greater_Than() {
|
|
let src = "'>'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 62);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Left_Paren() {
|
|
let src = "'('";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 40);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Right_Paren() {
|
|
let src = "')'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 41);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Left_Bracket() {
|
|
let src = "'['";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 91);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Right_Bracket() {
|
|
let src = "']'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 93);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Left_Brace() {
|
|
let src = "'{'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 123);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Right_Brace() {
|
|
let src = "'}'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 125);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Tab() {
|
|
let src = "'\\\\t'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 9);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Backslash() {
|
|
let src = "'\\\\\\\\'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 92);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Null_character() {
|
|
let src = "'\\\\0'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Single_quote() {
|
|
let src = "'\\\\''";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 39);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Carriage_return() {
|
|
let src = "'\\\\r'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 13);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Escape_Newline() {
|
|
let src = "'\\\\n'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 10);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_With_Leading_Whitespace() {
|
|
let src = " 'A'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 65);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_With_Trailing_Whitespace() {
|
|
let src = "'A' ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 65);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_With_Both_Whitespace() {
|
|
let src = " 'A' ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 65);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Tab_Before() {
|
|
let src = "\\t'B'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 66);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Newline_Before() {
|
|
let src = "\\n'C'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected char code");
|
|
assert_eq!(parsed, 67);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Empty_Literal() {
|
|
let src = "''";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Multiple_Characters() {
|
|
let src = "'AB'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Unclosed_Quote() {
|
|
let src = "'A";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Unescaped_Newline() {
|
|
let src = "'\\n'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Char_Invalid_Escape() {
|
|
let src = "'\\\\q'";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Simple_Lowercase() {
|
|
let src = "hello";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Simple_Uppercase() {
|
|
let src = "HELLO";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "HELLO");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Mixed_Case() {
|
|
let src = "HelloWorld";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "HelloWorld");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Single_Letter() {
|
|
let src = "x";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "x");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Single_Letter_Upper() {
|
|
let src = "X";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "X");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_With_Numbers() {
|
|
let src = "var123";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "var123");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Numbers_End() {
|
|
let src = "myVar2";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "myVar2");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Mixed_Numbers() {
|
|
let src = "a1b2c3";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "a1b2c3");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_With_Underscore() {
|
|
let src = "hello_world";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello_world");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Leading_Underscore() {
|
|
let src = "_private";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "_private");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Multiple_Underscores() {
|
|
let src = "my_long_var_name";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my_long_var_name");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Double_Underscore() {
|
|
let src = "my__var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my__var");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Trailing_Underscore() {
|
|
let src = "var_";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "var_");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Only_Underscores() {
|
|
let src = "___";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "___");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Snake_Case() {
|
|
let src = "my_variable_name";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my_variable_name");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Camel_Case() {
|
|
let src = "myVariableName";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "myVariableName");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Pascal_Case() {
|
|
let src = "MyClassName";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "MyClassName");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_All_Caps() {
|
|
let src = "MY_CONSTANT";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "MY_CONSTANT");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_With_Dash() {
|
|
let src = "my-var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my-var");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Simple() {
|
|
let src = "::hello";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Uppercase() {
|
|
let src = "::Point";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "Point");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Snake_Case() {
|
|
let src = "::my_var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my_var");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Type_i64() {
|
|
let src = "::i64";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "i64");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Type_String() {
|
|
let src = "::String";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "String");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Type_Point() {
|
|
let src = "::Point";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "Point");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Trait_Addable() {
|
|
let src = "::Addable";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "Addable");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Trait_Drawable() {
|
|
let src = "::Drawable";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "Drawable");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Field_x() {
|
|
let src = "::x";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "x");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Field_width() {
|
|
let src = "::width";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "width");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_With_Underscore() {
|
|
let src = "::_private";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "_private");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Multiple_Underscores() {
|
|
let src = "::my_long_name";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my_long_name");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_With_Numbers() {
|
|
let src = "::var123";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "var123");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Leading_Whitespace() {
|
|
let src = " hello";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Trailing_Whitespace() {
|
|
let src = "hello ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Both_Whitespace() {
|
|
let src = " hello ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Tab_Before() {
|
|
let src = "\\thello";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Leading_Whitespace() {
|
|
let src = " ::hello";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Trailing_Whitespace() {
|
|
let src = "::hello ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Both_Whitespace() {
|
|
let src = " ::hello ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Moderate_Length() {
|
|
let src = "thisIsAReasonablyLongVariableName";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "thisIsAReasonablyLongVariableName");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Very_Long() {
|
|
let src = "this_is_a_very_long_identifier_name_that_someone_might_use_for_some_reason";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "this_is_a_very_long_identifier_name_that_someone_might_use_for_some_reason");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Long_With_Numbers() {
|
|
let src = "variable_with_many_numbers_123_456_789_000";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "variable_with_many_numbers_123_456_789_000");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Starting_With_Number() {
|
|
let src = "123abc";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_With_Octothorpe() {
|
|
let src = "my#var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "my");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_With_Colon() {
|
|
let src = "my:var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Double_Colon_Inside() {
|
|
let src = "my::var";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Only_Numbers() {
|
|
let src = "123";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 123);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Literal_Empty() {
|
|
let src = "::";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Case_Lower() {
|
|
let src = "variable";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "variable");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Case_Upper() {
|
|
let src = "VARIABLE";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "VARIABLE");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Case_Mixed() {
|
|
let src = "Variable";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "Variable");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Case_Camel() {
|
|
let src = "variableName";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "variableName");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Case_Pascal() {
|
|
let src = "VariableName";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "VariableName");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_if() {
|
|
let src = "if";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "if");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_while() {
|
|
let src = "while";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "while");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_for() {
|
|
let src = "for";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "for");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_match() {
|
|
let src = "match";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "match");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_break() {
|
|
let src = "break";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "break");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_continue() {
|
|
let src = "continue";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "continue");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_fn() {
|
|
let src = "fn";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "fn");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_struct() {
|
|
let src = "struct";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "struct");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_union() {
|
|
let src = "union";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "union");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_enum() {
|
|
let src = "enum";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "enum");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_trait() {
|
|
let src = "trait";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "trait");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_impl() {
|
|
let src = "impl";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "impl");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_inher() {
|
|
let src = "inher";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "inher");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_dup() {
|
|
let src = "dup";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "dup");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_drop() {
|
|
let src = "drop";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "drop");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_swap() {
|
|
let src = "swap";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "swap");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_over() {
|
|
let src = "over";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "over");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_rot() {
|
|
let src = "rot";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "rot");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_pick() {
|
|
let src = "pick";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "pick");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_roll() {
|
|
let src = "roll";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "roll");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Identifier_Reserved_Word_depth() {
|
|
let src = "depth";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "depth");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True() {
|
|
let src = "true";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False() {
|
|
let src = "false";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Leading_Whitespace() {
|
|
let src = " true";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Trailing_Whitespace() {
|
|
let src = "true ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Both_Whitespace() {
|
|
let src = " true ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Tab_Before() {
|
|
let src = "\\ttrue";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Leading_Whitespace() {
|
|
let src = " false";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Trailing_Whitespace() {
|
|
let src = "false ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Both_Whitespace() {
|
|
let src = " false ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Tab_Before() {
|
|
let src = "\\tfalse";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Capitalized() {
|
|
let src = "True";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "True");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Capitalized() {
|
|
let src = "False";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "False");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_All_Caps() {
|
|
let src = "TRUE";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "TRUE");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_All_Caps() {
|
|
let src = "FALSE";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "FALSE");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_True_Mixed_Case() {
|
|
let src = "tRuE";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "tRuE");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_False_Mixed_Case() {
|
|
let src = "fAlSe";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "fAlSe");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Numeric_1() {
|
|
let src = "1";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Numeric_0() {
|
|
let src = "0";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Int);
|
|
let parsed: i128 = got[0].lexeme.parse().expect("expected integer");
|
|
assert_eq!(parsed, 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Yes() {
|
|
let src = "yes";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "yes");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_No() {
|
|
let src = "no";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "no");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Typo_Ture() {
|
|
let src = "ture";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "ture");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Typo_Flase() {
|
|
let src = "flase";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "flase");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Multiple_True_False() {
|
|
let src = "true false";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 2usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
assert_eq!(got[1].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[1].lexeme, "false");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Multiple_Same() {
|
|
let src = "true true";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 2usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
assert_eq!(got[1].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[1].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_Bool_Three_Values() {
|
|
let src = "true false true";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 3usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[0].lexeme, "true");
|
|
assert_eq!(got[1].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[1].lexeme, "false");
|
|
assert_eq!(got[2].ttype, sls::lexer::TokenType::Ident);
|
|
assert_eq!(got[2].lexeme, "true");
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Empty() {
|
|
let src = "{ }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Single_Integer() {
|
|
let src = "{ 42 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Single_Identifier() {
|
|
let src = "{ dup }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Two_Integers() {
|
|
let src = "{ 2 3 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Simple_Expression() {
|
|
let src = "{ 2 3 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Stack_Ops() {
|
|
let src = "{ dup * }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Integer_Literals() {
|
|
let src = "{ 0 42 -10 1000 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Float_Literals() {
|
|
let src = "{ 3.14 -2.5 0.0 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Char_Literal() {
|
|
let src = "{ 'A' }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Boolean_Literals() {
|
|
let src = "{ true false }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiple_Identifiers() {
|
|
let src = "{ dup swap over }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Identifier_Literals() {
|
|
let src = "{ ::x ::y }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Mixed_Identifiers() {
|
|
let src = "{ ::Point get x swap }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Nested_Single() {
|
|
let src = "{ { 2 3 + } }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Nested_With_Others() {
|
|
let src = "{ x { dup * } }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiple_Nested() {
|
|
let src = "{ { 2 3 + } { 4 5 * } }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Double_Nested() {
|
|
let src = "{ { { 42 } } }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Complex_Nesting() {
|
|
let src = "{ 1 { 2 { 3 } 4 } 5 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_No_Whitespace() {
|
|
let src = "{2 3 +}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Extra_Whitespace() {
|
|
let src = "{ 2 3 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Leading_Whitespace_Outside() {
|
|
let src = " { 2 3 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Trailing_Whitespace_Outside() {
|
|
let src = "{ 2 3 + } ";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_With_Tabs() {
|
|
let src = "{\\t2\\t3\\t+\\t}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiline_Simple() {
|
|
let src = "{\\n 2 3 +\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiline_Multiple() {
|
|
let src = "{\\n dup\\n *\\n 2\\n +\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Mixed_Line_Breaks() {
|
|
let src = "{ 1 2\\n3 4\\n\\n5 6 }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Indented_Multiline() {
|
|
let src = "{\\n dup 0 >\\n { }\\n { 0 swap - }\\n if\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Comment_End_Of_Line() {
|
|
let src = "{ 2 3 + // add them\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiple_Comments() {
|
|
let src = "{ 2 // first\\n3 // second\\n+ // add\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Comment_Own_Line() {
|
|
let src = "{\\n // This is a comment\\n 2 3 +\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Comment_At_Start() {
|
|
let src = "{ // comment\\n2 3 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Multiple_Comment_Lines() {
|
|
let src = "{\\n // First comment\\n // Second comment\\n 2 3 +\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Comments_Nested() {
|
|
let src = "{ { 2 3 + // inner comment\\n} // outer comment\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Unclosed() {
|
|
let src = "{ 2 3 +";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Unclosed_Nested() {
|
|
let src = "{ { 2 3 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Extra_Closing_Brace() {
|
|
let src = "{ 2 3 + } }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 2usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
assert_eq!(got[1].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Only_Closing_Brace() {
|
|
let src = "}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
assert_eq!(got[0].ttype, sls::lexer::TokenType::Illegal);
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Error_Inside() {
|
|
let src = "{ 2 3a + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Function_Body() {
|
|
let src = "{ dup * }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Loop_Body() {
|
|
let src = "{ dup print 1 + }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Struct_Fields() {
|
|
let src = "{ x: y: }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Lambda() {
|
|
let src = "{ 2 * }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Array_Map() {
|
|
let src = "{ dup * }";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_TokenString_Conditional_Complex() {
|
|
let src = "{\\n dup 0 >\\n { dup * }\\n { drop 0 }\\n if\\n}";
|
|
let mut lexer = sls::lexer::Lexer::new(src);
|
|
let mut got = vec![];
|
|
loop {
|
|
let t = lexer.next_token();
|
|
if t.ttype == sls::lexer::TokenType::Eof { break; }
|
|
got.push(t);
|
|
}
|
|
|
|
assert_eq!(got.len(), 1usize, "token count mismatch");
|
|
// token_string check not implemented; received token: {:#?}
|
|
// TODO: implement nested expectations
|
|
// for now just assert we got an Ident or similar
|
|
assert!(!got[0].lexeme.is_empty());
|
|
}
|