
; Test cases for cond-expand in ScriptFu interpreter of PIKA app.

; cond-expand is SRFI-0
; https://www.gnu.org/software/mit-scheme/documentation/stable/mit-scheme-ref/cond_002dexpand-_0028SRFI-0_0029.html

; ScriptFu cond-expand is defined in the tail of script-fu.init

; This tests existing ScriptFu code, which is not a full implementation of cond-expand.
; ScriptFu omits "else" clause.
; PIKA issue #9729 proposes an enhancement that adds else clause to cond-expand, etc.


; *features* is a defined symbol that names features of language
(assert '(equal?
           *features*
           '(srfi-0 tinyscheme)))

; srfi-0 is not a defined symbol
(assert-error '(srfi-0)
              "eval: unbound variable:")
; Note that *error-hook* erroneously omits tail of error message



; simple condition on one supported feature
(assert '(equal?
            (cond-expand (tinyscheme "implements tinyscheme"))
             "implements tinyscheme"))

; simple clause on one unsupported feature
; Since the condition fails there is no expansion.
; Since there is no 'else clause', there is no expansion for false condition.
; The cond-expand doc says:
; "It either expands into the body of one of its clauses or signals an error during syntactic processing."
; Yielding #t is not "signals an error" so is not correct.
; This documents what ScriptFu does, until we decide whether and how to fix it.
(assert '(equal?
            (cond-expand (srfi-38 "implements srfi-38"))
             #t))

; multiple clauses
(assert '(equal?
            (cond-expand
              (srfi-38 "implements srfi-38")
              ((not srfi-38) "not implements srfi-38"))
            "not implements srfi-38"))


; clauses start with 'and', 'or', or 'not'

; 'not clause'
(assert '(equal?
            (cond-expand ((not srfi-38) "not implements srfi-38"))
            "not implements srfi-38"))

; 'and clause' having two logical conditions that are true
(assert '(equal?
            (cond-expand ((and tinyscheme srfi-0) "implements both tinyscheme and srfi-0"))
            "implements both tinyscheme and srfi-0"))

; 'or clause' having two logical conditions, one of which is false
(assert '(equal?
            (cond-expand ((or tinyscheme srfi-38) "implements tinyscheme or srfi-38"))
            "implements tinyscheme or srfi-38"))


; nested logical clauses
(assert '(equal?
            (cond-expand ((or srfi-38 (and tinyscheme srfi-0)) "implements srfi-38 or tinyscheme and srfi-0"))
            "implements srfi-38 or tinyscheme and srfi-0"))







