aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/ast/tests.rs
diff options
context:
space:
mode:
authorTolmachev Igor <me@igorek.dev>2026-05-10 12:54:41 +0300
committerTolmachev Igor <me@igorek.dev>2026-05-10 12:54:41 +0300
commit843242e692280d604b74324ba26ead6158223439 (patch)
treee5f2d362b1c728f900d8214bc415752336fa4a94 /compiler/src/ast/tests.rs
parent1801afdbd0058cc9cc040b977de0d5652d65aab9 (diff)
downloadcrisp-843242e692280d604b74324ba26ead6158223439.tar.gz
crisp-843242e692280d604b74324ba26ead6158223439.zip
Remove Float from parser
Dropped to make the language simpler.
Diffstat (limited to 'compiler/src/ast/tests.rs')
-rw-r--r--compiler/src/ast/tests.rs96
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)]
10enum E { 10enum 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]
72fn 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]
95fn 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]
105fn test_keywords() { 70fn 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]
121fn 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]
131fn test_keywords_case_sensitive() { 83fn 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]
354fn 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]
384fn test_unclosed_string() { 306fn 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]
508fn 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]
522fn test_error_span_unclosed_left_par() { 430fn 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)];