aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/ast/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/ast/tests.rs')
-rw-r--r--compiler/src/ast/tests.rs136
1 files changed, 1 insertions, 135 deletions
diff --git a/compiler/src/ast/tests.rs b/compiler/src/ast/tests.rs
index 8905427..505b075 100644
--- a/compiler/src/ast/tests.rs
+++ b/compiler/src/ast/tests.rs
@@ -1,4 +1,4 @@
1use std::{fmt::Debug, iter::repeat_n, rc::Rc}; 1use std::{fmt::Debug, iter::repeat_n};
2 2
3use crate::{ 3use crate::{
4 ast::{Atom, Error, Expr, Parser, parser::MAX_DEPTH, tests::E::*}, 4 ast::{Atom, Error, Expr, Parser, parser::MAX_DEPTH, tests::E::*},
@@ -263,53 +263,6 @@ fn test_lists() {
263 } 263 }
264} 264}
265 265
266fn quote(expr: E) -> E {
267 List(vec![Sym("quote"), expr])
268}
269
270#[test]
271fn test_quote() {
272 let cases = vec![
273 // 'x -> (quote x)
274 (vec![Quote, Symbol("x")], vec![quote(Sym("x"))]),
275 // '42 -> (quote 42)
276 (vec![Quote, Number("42")], vec![quote(Int(42))]),
277 // '() -> (quote nil)
278 (vec![Quote, LeftPar, RightPar], vec![quote(Nil)]),
279 // ''x -> (quote (quote x))
280 (
281 vec![Quote, Quote, Symbol("x")],
282 vec![quote(quote(Sym("x")))],
283 ),
284 // '''x -> (quote (quote (quote x)))
285 (
286 vec![Quote, Quote, Quote, Symbol("x")],
287 vec![quote(quote(quote(Sym("x"))))],
288 ),
289 // '(1 2) -> (quote (1 2))
290 (
291 vec![Quote, LeftPar, Number("1"), Number("2"), RightPar],
292 vec![quote(List(vec![Int(1), Int(2)]))],
293 ),
294 // (list 'a 'b) -> (list (quote a) (quote b))
295 (
296 vec![
297 LeftPar,
298 Symbol("list"),
299 Quote,
300 Symbol("a"),
301 Quote,
302 Symbol("b"),
303 RightPar,
304 ],
305 vec![List(vec![Sym("list"), quote(Sym("a")), quote(Sym("b"))])],
306 ),
307 ];
308 for (tokens, expected) in cases {
309 assert_eq!(parse(tokens.clone()), expected, "input: {tokens:?}");
310 }
311}
312
313#[test] 266#[test]
314fn test_top_level() { 267fn test_top_level() {
315 let cases = vec![ 268 let cases = vec![
@@ -344,8 +297,6 @@ fn test_unexpected_right_par() {
344 vec![RightPar], 297 vec![RightPar],
345 vec![Number("1"), RightPar], 298 vec![Number("1"), RightPar],
346 vec![LeftPar, Symbol("a"), RightPar, RightPar], 299 vec![LeftPar, Symbol("a"), RightPar, RightPar],
347 vec![Quote, RightPar],
348 vec![LeftPar, Quote, Quote, RightPar],
349 ]; 300 ];
350 for tokens in cases { 301 for tokens in cases {
351 assert_eq!( 302 assert_eq!(
@@ -373,24 +324,6 @@ fn test_unclosed_left_par() {
373} 324}
374 325
375#[test] 326#[test]
376fn test_unexpected_eof_after_quote() {
377 let cases = vec![
378 vec![Quote],
379 vec![Quote, Quote],
380 vec![Symbol("a"), Quote],
381 vec![LeftPar, Quote],
382 vec![Quote, LeftPar, Quote],
383 ];
384 for tokens in cases {
385 assert_eq!(
386 parse_err(tokens.clone()),
387 Error::UnexpectedEof,
388 "input: {tokens:?}"
389 );
390 }
391}
392
393#[test]
394fn test_invalid_integer() { 327fn test_invalid_integer() {
395 let cases = vec![ 328 let cases = vec![
396 "99999999999999999999", 329 "99999999999999999999",
@@ -553,63 +486,6 @@ fn test_span_empty_list_covers_parens() {
553} 486}
554 487
555#[test] 488#[test]
556fn test_span_quote_atom() {
557 // 'x -> outer = [0..2]; Sym(quote) = [0..1]; x = [1..2]
558 let q = sp((1, 0, 0), (1, 1, 1));
559 let x = sp((1, 1, 1), (1, 2, 2));
560 let tokens = vec![tsp(Quote, q), tsp(Symbol("x"), x)];
561 let prog = parse_sp(tokens.clone());
562
563 assert_eq!(prog[0].span, sp((1, 0, 0), (1, 2, 2)), "input: {tokens:?}");
564
565 if let Expr::List(items) = &prog[0].inner {
566 assert_eq!(
567 items[0].inner,
568 Expr::Atom(Atom::Symbol(Rc::from("quote"))),
569 "input: {tokens:?}",
570 );
571 assert_eq!(items[0].span, q, "input: {tokens:?}");
572 assert_eq!(items[1].span, x, "input: {tokens:?}");
573 } else {
574 panic!("expected list, input: {tokens:?}");
575 }
576}
577
578#[test]
579fn test_span_quote_of_list() {
580 // '(quote x)
581 // 0 1 2..7 8 9 10
582 let q = sp((1, 0, 0), (1, 1, 1));
583 let lp = sp((1, 1, 1), (1, 2, 2));
584 let q_sym = sp((1, 2, 2), (1, 7, 7));
585 let x_sym = sp((1, 8, 8), (1, 9, 9));
586 let rp = sp((1, 9, 9), (1, 10, 10));
587
588 let tokens = vec![
589 tsp(Quote, q),
590 tsp(LeftPar, lp),
591 tsp(Symbol("quote"), q_sym),
592 tsp(Symbol("x"), x_sym),
593 tsp(RightPar, rp),
594 ];
595 let prog = parse_sp(tokens.clone());
596
597 let outer = &prog[0]; // (quote (quote x))
598 assert_eq!(outer.span, sp((1, 0, 0), (1, 10, 10)), "input: {tokens:?}");
599
600 if let Expr::List(items) = &outer.inner {
601 assert_eq!(items[0].span, q, "input: {tokens:?}");
602 assert_eq!(
603 items[1].span,
604 sp((1, 1, 1), (1, 10, 10)),
605 "input: {tokens:?}"
606 );
607 } else {
608 panic!("expected list, input: {tokens:?}");
609 }
610}
611
612#[test]
613fn test_error_span_unexpected_right_par() { 489fn test_error_span_unexpected_right_par() {
614 let s = sp((1, 5, 5), (1, 6, 6)); 490 let s = sp((1, 5, 5), (1, 6, 6));
615 let tokens = vec![tsp(RightPar, s)]; 491 let tokens = vec![tsp(RightPar, s)];
@@ -664,16 +540,6 @@ fn test_error_span_unclosed_left_par_nested() {
664} 540}
665 541
666#[test] 542#[test]
667fn test_error_span_unexpected_eof_after_quote() {
668 let q = sp((1, 0, 0), (1, 1, 1));
669 let tokens = vec![tsp(Quote, q)];
670 let err = parse_sp_err(tokens.clone());
671
672 assert_eq!(err.inner, Error::UnexpectedEof, "input: {tokens:?}");
673 assert_eq!(err.span, q, "input: {tokens:?}");
674}
675
676#[test]
677fn test_error_span_unclosed_string() { 543fn test_error_span_unclosed_string() {
678 let s = sp((1, 0, 0), (1, 7, 7)); 544 let s = sp((1, 0, 0), (1, 7, 7));
679 let tokens = vec![tsp(UnclosedString("oops"), s)]; 545 let tokens = vec![tsp(UnclosedString("oops"), s)];