;; test_quasiquote.nu
;; tests for Nu macro-expand operator.
;;
;; Copyright (c) 2008 Jeff Buck
(class TestQuasiquote is NuTestCase
(- (id) testAtom is
(assert_equal '() `())
(assert_equal 1 `1)
(assert_equal 'a `a))
(- (id) testSimpleLists is
(assert_equal '(1) `(1))
(assert_equal '(1 2 3) `(1 2 3))
(assert_equal '(1 (2 3)) `(1 (2 3)))
(assert_equal '(1 (+ 2 3)) `(1 (+ 2 3))))
(- (id) testEvaling is
(set a 1)
(set b 2)
(assert_equal '(1) `(,a))
(assert_equal '(1 2 3) `(,a ,b 3))
(assert_equal '(1 2 3) `(,a 2 3))
(assert_equal '(1 2 3) `(,a ,b ,(+ a b)))
; Deep evals
(set a 1)
(set b 2)
(assert_equal '(1 (2 3)) `(1 (2 ,(+ a b))))
(assert_equal '((2 3) 1) `((2 ,(+ a b)) 1))
(assert_equal '(1 (2 3) 4) `(1 (2 ,(+ a b)) 4))
(assert_equal '((1 2) (3 4) 5) `(,(list 1 2) (3 ,(* 2 b)) 5))
(assert_throws "NuQuasiquoteEvalOutsideQuasiquote"
(do ()
(,(+ 1 1)))))
(- (id) testSplicing is
; Single element
(assert_equal '(1) `(,@(list 1)))
; Splice at beginning
(assert_equal '(1 2) `(,@(list 1) ,(+ 1 1)))
; Splice at end
(assert_equal '(1 2) `(1 ,@(list 2)))
; Splice at beginning and end
(assert_equal '(1 2 3) `(,@(list 1) 2 ,@(list 3)))
; Splice empty list
(assert_equal '(1 2) `(1 2 ,@(list)))
; Splice and evals
(assert_equal '(1 2 3) `(,(+ 1 0) ,@(list 2 3)))
(assert_equal '(1 2 3) `(,@(list 1) ,(+ 1 1) ,@(list 3)))
(assert_equal '(1 2 3) `(,@(list 1 2) ,(+ 1 1 1)))
; Empty lists at end
(assert_equal '(1) `(1 ,@(list)))
; Empty lists at beginning
(assert_equal '(1) `(,@(list) 1))
; Empty lists in middle
(assert_equal '(1 1) `(1 ,@(list) 1))
; Empty lists all around
(assert_equal '() `(,@(list) ,@(list) ,@(list)))
; Deep splices
(set a 1)
(set b 2)
(assert_equal '(1 (2 3)) `(1 (2 ,@(list (+ a b)))))
(assert_equal '((2 3) 1) `((2 ,@(list (+ a b))) 1))
(assert_equal '(1 (2 3) 4) `(1 (2 ,@(list (+ a b))) 4))
(assert_equal '(1 2 (3 4) 5) `(,@(list 1 2) (3 ,@(list (* 2 b))) 5))
(set x `(1 2 ,@(list (+ 1 2) (+ 2 2)) 5 ,@(list (+ 5 1) (+ 6 1)) 8))
(assert_equal x '(1 2 3 4 5 6 7 8))
(assert_throws "NuQuasiquoteSpliceOutsideQuasiquote"
(do ()
(,@(list 1))))
(assert_throws "NuQuasiquoteSpliceNoListError"
(do ()
(`(,@(1)))))))