test: More values, call-with-values tests.
[mes.git] / tests / scm.test
1 #! /bin/sh
2 # -*-scheme-*-
3 echo ' ()' | cat $($(dirname $0)/../scripts/include.mes $0) $0 /dev/stdin | $(dirname $0)/../scripts/mes "$@"
4 #paredit:||
5 exit $?
6 !#
7
8 ;;; -*-scheme-*-
9
10 ;;; Mes --- Maxwell Equations of Software
11 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
12 ;;;
13 ;;; scm.test: This file is part of Mes.
14 ;;;
15 ;;; Mes is free software; you can redistribute it and/or modify it
16 ;;; under the terms of the GNU General Public License as published by
17 ;;; the Free Software Foundation; either version 3 of the License, or (at
18 ;;; your option) any later version.
19 ;;;
20 ;;; Mes is distributed in the hope that it will be useful, but
21 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 ;;; GNU General Public License for more details.
24 ;;;
25 ;;; You should have received a copy of the GNU General Public License
26 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
27
28 (mes-use-module (mes base-0))
29 (mes-use-module (mes base))
30 (mes-use-module (mes quasiquote))
31 (mes-use-module (mes let))
32 (mes-use-module (srfi srfi-0))
33 (mes-use-module (mes scm))
34 (mes-use-module (mes test))
35
36 (when guile?
37   (use-modules (srfi srfi-1)))
38
39 (pass-if "first dummy" #t)
40 (pass-if-not "second dummy" #f)
41
42 (pass-if "when" (seq? (when #t 'true) 'true))
43 (pass-if "when 2" (seq? (when #f 'true) *unspecified*))
44
45 (pass-if "map" (sequal? (map identity '(1 2 3 4)) '(1 2 3 4)))
46 (pass-if "map 2 " (sequal? (map (lambda (i a) (cons i a)) '(1 2 3 4) '(a b c d))
47                            '((1 . a) (2 . b) (3 . c) (4 . d))))
48 (pass-if "for-each" (sequal? (let ((acc '())) (for-each (lambda (x) (set! acc (cons x acc))) '(1 2 3 4)) acc) '(4 3 2 1)))
49 (define xxxa 0)
50 (pass-if "set! " (seq? (begin (set! xxxa 1) xxxa) 1))
51 (pass-if "set! 2" (seq? (let ((a 0)) (set! a 1) a) 1))
52
53
54 (pass-if "list-ref" (seq? (list-ref '(0 1 2) 1) 1))
55
56 (pass-if "do" (sequal? (let ((acc '())) (do ((i 0 (+ i 1))) ((>= i 3)) (set! acc (cons i acc))) acc) '(2 1 0)))
57
58
59
60
61
62
63 (pass-if "+" (seq? (+ 1 2 3) 6))
64 (pass-if "*" (seq? (* 3 3 3) 27))
65 (pass-if "/" (seq? (/ 9 3) 3))
66 (pass-if "remainder" (seq? (remainder 11 3) 2))
67 (pass-if "modulo" (seq? (modulo 11 3) 2))
68 (pass-if "expt" (seq? (expt 2 3) 8))
69 (pass-if "logior" (seq? (logior 0 1 2 4) 7))
70
71 (pass-if "=" (seq? 3 '3))
72 (pass-if "= 2" (not (= 3 '4)))
73
74 (pass-if "string-append" (sequal? (string-append "a" "b" "c") "abc"))
75 (pass-if "substring" (sequal? (substring "hello world" 6) "world"))
76 (pass-if "substring 2" (sequal? (substring "hello world" 4 7) "o w"))
77 (pass-if "string-ref" (seq? (string-ref "hello world" 4) #\o))
78 (pass-if "eq?" (not (eq? (string-append "a" "b" "c") "abc")))
79 (pass-if "string-length" (seq? (string-length (string-append "a" "b" "c")) 3))
80 (pass-if "string->list" (sequal? (string->list "abc\n") '(#\a #\b #\c #\newline)))
81 (pass-if "char" (seq? (char->integer #\A) 65))
82 (pass-if "char 2" (seq? (char->integer #\101) (char->integer #\A)))
83 (pass-if "char 3" (seq? (integer->char 10) #\newline))
84 (pass-if "char 4" (seq? (integer->char 32) #\space))
85 (pass-if "string " (sequal? (string #\a #\space #\s #\t #\r #\i #\n #\g) "a string"))
86 (pass-if "length" (seq? (length '()) 0))
87 (pass-if "length 2" (seq? (length '(a b c)) 3))
88 (pass-if "make-list" (seq? (make-list 0) '()))
89 (pass-if "make-list 1" (sequal? (make-list 1 0) '(0)))
90 (pass-if "equal?" (sequal? #(1) #(1)))
91 (pass-if "equal?" (not (equal? #() #(1))))
92 (pass-if "memq" (sequal? (memq 'a '(a b c)) '(a b c)))
93 (pass-if "memq" (sequal? (memq 'b '(a b c)) '(b c)))
94 (pass-if "memq" (seq? (memq 'd '(a b c)) #f))
95 (pass-if "member" (sequal? (member '(a) '((a) b c)) '((a) b c)))
96 (pass-if "assq-ref" (seq? (assq-ref '((b . 1) (c . 2)) 'c) 2))
97 (pass-if "assq-ref 2" (seq? (assq-ref '((b . 1) (c . 2)) 'a) #f))
98 (pass-if "assq-set!" (sequal? (assq-set! '((b . 1)) 'a 0) '((a . 0) (b . 1))))
99 (pass-if "assq-set! 2" (sequal? (assq-set! '((a . 0)) 'a 1) '((a . 1))))
100 (pass-if "assoc" (sequal? (assoc '(a . 0) '((a . 0) (b . 1) ((a . 0) aa))) '((a . 0) aa)))
101
102 (pass-if "builtin? car" (builtin? car))
103 (pass-if "builtin? cdr" (builtin? cdr))
104 (pass-if "builtin? cons" (builtin? cons))
105 (pass-if "builtin? eq?" (builtin? eq?))
106 (pass-if "builtin? if" (builtin? eq?))
107 (when (not guile?)
108   (pass-if "builtin? eval" (not (builtin? not))))
109 (pass-if "procedure?" (procedure? builtin?))
110 (pass-if "procedure?" (procedure? procedure?))
111 (when (not guile?)
112   (pass-if "gensym" (seq? (gensym) 'g0))
113   (pass-if "gensym" (seq? (gensym) 'g1))
114   (pass-if "gensym" (seq? (gensym) 'g2)))
115
116 (pass-if "last-pair " (sequal? (last-pair '(1 2 3 4)) '(4)))
117 (pass-if "last-pair 2" (seq? (last-pair '()) '()))
118 ;; (pass-if "circular-list? "
119 ;;   (seq?
120 ;;    (let ((x (list 1 2 3 4)))
121 ;;      (set-cdr! (last-pair x) (cddr x))
122 ;;      (circular-list? x))
123 ;;    #t))
124
125 (pass-if "reverse" (sequal? (reverse '(1 2 3)) '(3 2 1)))
126
127 (pass-if "cond-expand" (sequal? (cond-expand (foobar #f) (mes (display ": pass: *YAY*") 'mes) (guile (display ": pass: *GUILE*") 'mes)) 'mes))
128
129 (pass-if "apply identity" (seq? (apply identity '(0)) 0))
130 (pass-if "apply identity 2" (sequal? (apply identity '((0 1))) '(0 1)))
131 (pass-if "apply append" (sequal? (apply append '((1 2) (3 4))) '(1 2 3 4)))
132
133 (pass-if "=" (seq? (=) #t))
134 (pass-if "= 1" (seq? (= 0) #t))
135 (pass-if "= 2" (seq? (= 0 0) #t))
136 (pass-if "= 3" (seq? (= 0 0) #t))
137 (pass-if "= 4" (seq? (= 0 1 0) #f))
138
139 (pass-if "<" (seq? (<) #t))
140 (pass-if "< 1" (seq? (< 0) #t))
141 (pass-if "< 2" (seq? (< 0 1) #t))
142 (pass-if "< 3" (seq? (< 1 0) #f))
143 (pass-if "< 4" (seq? (< 0 1 2) #t))
144 (pass-if "< 5" (seq? (< 0 2 1) #f))
145
146 (pass-if ">" (seq? (>) #t))
147 (pass-if "> 1" (seq? (> 0) #t))
148 (pass-if "> 2" (seq? (> 1 0) #t))
149 (pass-if "> 3" (seq? (> 0 1) #f))
150 (pass-if "> 4" (seq? (> 2 1 0) #t))
151 (pass-if "> 5" (seq? (> 1 2 0) #f))
152
153 (pass-if ">=" (seq? (>= 3 2 1) #t))
154 (pass-if ">= 2" (seq? (>= 1 2 3) #f))
155
156 (pass-if "<=" (seq? (<= 3 2 1) #f))
157 (pass-if "<= 2" (seq? (<= 1 2 3) #t))
158
159 (pass-if "max" (seq? (max 0) 0))
160 (pass-if "max 1" (seq? (max 0 1) 1))
161 (pass-if "max 2" (seq? (max 1 0 2) 2))
162
163 (pass-if "min" (seq? (min 0) 0))
164 (pass-if "min 1" (seq? (min 0 1) 0))
165 (pass-if "min 2" (seq? (min 1 0 2) 0))
166
167 (pass-if "char-alphabetic?" (seq? (char-alphabetic? #\a) #t))
168 (pass-if "char-alphabetic? 2" (seq? (char-alphabetic? #\[) #f))
169
170 (result 'report)