diff options
Diffstat (limited to 'compiler/src/ast/tests.rs')
| -rw-r--r-- | compiler/src/ast/tests.rs | 96 |
1 files changed, 2 insertions, 94 deletions
diff --git a/compiler/src/ast/tests.rs b/compiler/src/ast/tests.rs index 505b075..44789cb 100644 --- a/compiler/src/ast/tests.rs +++ b/compiler/src/ast/tests.rs | |||
| @@ -8,7 +8,6 @@ use crate::{ | |||
| 8 | 8 | ||
| 9 | #[derive(Debug, PartialEq)] | 9 | #[derive(Debug, PartialEq)] |
| 10 | enum E { | 10 | enum E { |
| 11 | Flt(f64), | ||
| 12 | Int(i64), | 11 | Int(i64), |
| 13 | Str(&'static str), | 12 | Str(&'static str), |
| 14 | Sym(&'static str), | 13 | Sym(&'static str), |
| @@ -21,7 +20,6 @@ impl From<Expr> for E { | |||
| 21 | fn from(expr: Expr) -> Self { | 20 | fn from(expr: Expr) -> Self { |
| 22 | match expr { | 21 | match expr { |
| 23 | Expr::Atom(atom) => match atom { | 22 | Expr::Atom(atom) => match atom { |
| 24 | Atom::Float(f) => Flt(f), | ||
| 25 | Atom::Integer(i) => Int(i), | 23 | Atom::Integer(i) => Int(i), |
| 26 | Atom::String(s) => Str(Box::leak(s.into())), | 24 | Atom::String(s) => Str(Box::leak(s.into())), |
| 27 | Atom::Symbol(s) => Sym(Box::leak(s.into())), | 25 | Atom::Symbol(s) => Sym(Box::leak(s.into())), |
| @@ -69,47 +67,11 @@ fn test_integers() { | |||
| 69 | } | 67 | } |
| 70 | 68 | ||
| 71 | #[test] | 69 | #[test] |
| 72 | fn test_floats() { | ||
| 73 | let cases = vec![ | ||
| 74 | (vec![Number("2.71")], vec![Flt(2.71)]), | ||
| 75 | (vec![Number("-2.5")], vec![Flt(-2.5)]), | ||
| 76 | (vec![Number("+0.0")], vec![Flt(0.0)]), | ||
| 77 | (vec![Number(".5")], vec![Flt(0.5)]), | ||
| 78 | (vec![Number("-.5")], vec![Flt(-0.5)]), | ||
| 79 | (vec![Number("+.5")], vec![Flt(0.5)]), | ||
| 80 | (vec![Number("1e10")], vec![Flt(1e10)]), | ||
| 81 | (vec![Number("1E10")], vec![Flt(1e10)]), | ||
| 82 | (vec![Number("1.5e-3")], vec![Flt(1.5e-3)]), | ||
| 83 | (vec![Number("-1.5E+3")], vec![Flt(-1.5e3)]), | ||
| 84 | (vec![Number("inf")], vec![Flt(f64::INFINITY)]), | ||
| 85 | (vec![Number("-inf")], vec![Flt(f64::NEG_INFINITY)]), | ||
| 86 | (vec![Number("1e9999")], vec![Flt(f64::INFINITY)]), | ||
| 87 | (vec![Number("-1e9999")], vec![Flt(f64::NEG_INFINITY)]), | ||
| 88 | ]; | ||
| 89 | for (tokens, ast) in cases { | ||
| 90 | assert_eq!(parse(tokens.clone()), ast, "input: {tokens:?}"); | ||
| 91 | } | ||
| 92 | } | ||
| 93 | |||
| 94 | #[test] | ||
| 95 | fn test_float_nan() { | ||
| 96 | let tokens = vec![Number("nan")]; | ||
| 97 | let expr = &parse(tokens.clone())[0]; | ||
| 98 | assert!( | ||
| 99 | matches!(expr, Flt(f) if f.is_nan()), | ||
| 100 | "input: {tokens:?}, got: {expr:?}" | ||
| 101 | ); | ||
| 102 | } | ||
| 103 | |||
| 104 | #[test] | ||
| 105 | fn test_keywords() { | 70 | fn test_keywords() { |
| 106 | let cases = vec![ | 71 | let cases = vec![ |
| 107 | (vec![Symbol("true")], vec![Bool(true)]), | 72 | (vec![Symbol("true")], vec![Bool(true)]), |
| 108 | (vec![Symbol("false")], vec![Bool(false)]), | 73 | (vec![Symbol("false")], vec![Bool(false)]), |
| 109 | (vec![Symbol("nil")], vec![Nil]), | 74 | (vec![Symbol("nil")], vec![Nil]), |
| 110 | (vec![Symbol("inf")], vec![Flt(f64::INFINITY)]), | ||
| 111 | (vec![Symbol("+inf")], vec![Flt(f64::INFINITY)]), | ||
| 112 | (vec![Symbol("-inf")], vec![Flt(f64::NEG_INFINITY)]), | ||
| 113 | (vec![LeftPar, RightPar], vec![Nil]), | 75 | (vec![LeftPar, RightPar], vec![Nil]), |
| 114 | ]; | 76 | ]; |
| 115 | for (tokens, ast) in cases { | 77 | for (tokens, ast) in cases { |
| @@ -118,16 +80,6 @@ fn test_keywords() { | |||
| 118 | } | 80 | } |
| 119 | 81 | ||
| 120 | #[test] | 82 | #[test] |
| 121 | fn test_keyword_nan() { | ||
| 122 | let tokens = vec![Symbol("nan")]; | ||
| 123 | let expr = &parse(tokens.clone())[0]; | ||
| 124 | assert!( | ||
| 125 | matches!(expr, Flt(f) if f.is_nan()), | ||
| 126 | "input: {tokens:?}, got: {expr:?}" | ||
| 127 | ); | ||
| 128 | } | ||
| 129 | |||
| 130 | #[test] | ||
| 131 | fn test_keywords_case_sensitive() { | 83 | fn test_keywords_case_sensitive() { |
| 132 | let cases = vec![ | 84 | let cases = vec![ |
| 133 | (vec![Symbol("True")], vec![Sym("True")]), | 85 | (vec![Symbol("True")], vec![Sym("True")]), |
| @@ -241,7 +193,7 @@ fn test_lists() { | |||
| 241 | vec![ | 193 | vec![ |
| 242 | LeftPar, | 194 | LeftPar, |
| 243 | Number("1"), | 195 | Number("1"), |
| 244 | Number("2.5"), | 196 | Number("-1"), |
| 245 | String("s"), | 197 | String("s"), |
| 246 | Symbol("foo"), | 198 | Symbol("foo"), |
| 247 | Symbol("true"), | 199 | Symbol("true"), |
| @@ -250,7 +202,7 @@ fn test_lists() { | |||
| 250 | ], | 202 | ], |
| 251 | vec![List(vec![ | 203 | vec![List(vec![ |
| 252 | Int(1), | 204 | Int(1), |
| 253 | Flt(2.5), | 205 | Int(-1), |
| 254 | Str("s"), | 206 | Str("s"), |
| 255 | Sym("foo"), | 207 | Sym("foo"), |
| 256 | Bool(true), | 208 | Bool(true), |
| @@ -351,36 +303,6 @@ fn test_invalid_integer() { | |||
| 351 | } | 303 | } |
| 352 | 304 | ||
| 353 | #[test] | 305 | #[test] |
| 354 | fn test_invalid_float() { | ||
| 355 | let cases = vec![ | ||
| 356 | "12somE0txt", | ||
| 357 | "12som.0txt", | ||
| 358 | "12.3txt", | ||
| 359 | "1.2.3", | ||
| 360 | "1.2.3.4", | ||
| 361 | ".", | ||
| 362 | "+.", | ||
| 363 | "-.", | ||
| 364 | "1e", | ||
| 365 | "1e+", | ||
| 366 | "1e-", | ||
| 367 | "1.e", | ||
| 368 | ".e5", | ||
| 369 | "1ee5", | ||
| 370 | "1e1.5", | ||
| 371 | ]; | ||
| 372 | for number in cases { | ||
| 373 | let tokens = vec![Number(number)]; | ||
| 374 | let error = number.parse::<f64>().unwrap_err(); | ||
| 375 | assert_eq!( | ||
| 376 | parse_err(tokens.clone()), | ||
| 377 | Error::InvalidFloatLiteral(number.into(), error), | ||
| 378 | "input: {tokens:?}", | ||
| 379 | ); | ||
| 380 | } | ||
| 381 | } | ||
| 382 | |||
| 383 | #[test] | ||
| 384 | fn test_unclosed_string() { | 306 | fn test_unclosed_string() { |
| 385 | let cases = vec![ | 307 | let cases = vec![ |
| 386 | ( | 308 | ( |
| @@ -505,20 +427,6 @@ fn test_error_span_invalid_integer() { | |||
| 505 | } | 427 | } |
| 506 | 428 | ||
| 507 | #[test] | 429 | #[test] |
| 508 | fn test_error_span_invalid_float() { | ||
| 509 | let s = sp((1, 0, 0), (1, 5, 5)); | ||
| 510 | let tokens = vec![tsp(Number("1.2.3"), s)]; | ||
| 511 | let err = parse_sp_err(tokens.clone()); | ||
| 512 | |||
| 513 | assert!( | ||
| 514 | matches!(err.inner, Error::InvalidFloatLiteral(..)), | ||
| 515 | "input: {tokens:?}, got: {:?}", | ||
| 516 | err.inner, | ||
| 517 | ); | ||
| 518 | assert_eq!(err.span, s, "input: {tokens:?}"); | ||
| 519 | } | ||
| 520 | |||
| 521 | #[test] | ||
| 522 | fn test_error_span_unclosed_left_par() { | 430 | fn test_error_span_unclosed_left_par() { |
| 523 | let lp = sp((1, 0, 0), (1, 1, 1)); | 431 | let lp = sp((1, 0, 0), (1, 1, 1)); |
| 524 | let tokens = vec![tsp(LeftPar, lp)]; | 432 | let tokens = vec![tsp(LeftPar, lp)]; |
