test: Add syntax tests.
[mes.git] / tests / optargs.test
1 #! /bin/sh
2 # -*-scheme-*-
3 MES=${MES-$(dirname $0)/../scripts/mes}
4 echo ' ()' | cat $(dirname $0)/../module/mes/base-0.mes $0 /dev/stdin | $MES $MES_FLAGS "$@"
5 #paredit:||
6 exit $?
7 !#
8
9 ;;; -*-scheme-*-
10
11 ;;; Mes --- Maxwell Equations of Software
12 ;;; Copyright © 2016,2018 Jan Nieuwenhuizen <janneke@gnu.org>
13 ;;;
14 ;;; This file is part of Mes.
15 ;;;
16 ;;; Mes is free software; you can redistribute it and/or modify it
17 ;;; under the terms of the GNU General Public License as published by
18 ;;; the Free Software Foundation; either version 3 of the License, or (at
19 ;;; your option) any later version.
20 ;;;
21 ;;; Mes is distributed in the hope that it will be useful, but
22 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 ;;; GNU General Public License for more details.
25 ;;;
26 ;;; You should have received a copy of the GNU General Public License
27 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
28
29 (cond-expand
30  (guile-2)
31  (guile
32   (use-modules (ice-9 optargs)))
33  (mes
34   (mes-use-module (mes optargs))
35   (mes-use-module (mes test))))
36
37 (pass-if-equal "cond =>" 10
38   (cond
39    (5 => (lambda (p) (* p 2)))))
40 (pass-if-equal "cond => 2" 10
41   (cond
42    (#f (display "hallo") (newline))
43    (5 => (lambda (p) (* p 2)))
44    (#t (display "wereld" (newline)))))
45 (pass-if-equal "cond => last" 10
46   (cond
47    (#f (display "hallo") (newline))
48    (5 => (lambda (p) (* p 2)))))
49
50 (pass-if "keyword?" (keyword? #:foo))
51 (pass-if "keywords" (eq? #:foo #:foo))
52 (pass-if-equal "keyword->symbol" 'foo (keyword->symbol #:foo))
53 (pass-if-equal "symbol->keyword" #:foo (symbol->keyword 'foo))
54 (pass-if-not "keywords" (eq? #:foo ':foo))
55 (pass-if "optargs #:optional" ((lambda* (#:optional (x #f)) x) #t))
56 (pass-if-equal "optargs #:optional default" #f ((lambda* (#:optional (x #f)) x)))
57 (pass-if "optargs key" ((lambda* (#:key (foo #f)) foo) #:foo #t))
58 (pass-if-equal "optargs key default" #f ((lambda* (#:key (foo #f)) foo)))
59
60 (cond-expand
61  (guile (use-modules (system base pmatch)
62                      (ice-9 optargs)))
63  (mes (mes-use-module (mes pmatch))))
64
65 (define <info> '<info>)
66 (define <functions> '<functions>)
67 (define <globals> '<globals>)
68 (define <locals> '<locals>)
69 (define <text> '<text>)
70
71 (define* (make o #:key (functions '()) (globals '()) (locals '()) (text '()))
72   (pmatch o
73     (<info> (list <info>
74                   (cons <functions> functions)
75                   (cons <globals> globals)
76                   (cons <locals> locals)
77                   (cons <text> text)))))
78
79 ;; (define* (make o #:key (functions '()) (globals '()) (locals '()) (text '()))
80 ;;   (format (current-error-port) "make\n")
81 ;;   ((cond ((info? o)
82 ;;           (list <info>
83 ;;                 (cons <functions> functions)
84 ;;                 (cons <globals> globals)
85 ;;                 (cons <locals> locals)
86 ;;                 (cons <text> text))))))
87
88 (define (.functions o)
89   (pmatch o
90     ((<info> . ,alist) (assq-ref alist <functions>))))
91
92 (define (.globals o)
93   (pmatch o
94     ((<info> . ,alist) (assq-ref alist <globals>))))
95
96 (define (.locals o)
97   (pmatch o
98     ((<info> . ,alist) (assq-ref alist <locals>))))
99
100 (define (.text o)
101   (pmatch o
102     ((<info> . ,alist) (assq-ref alist <text>))))
103
104 (define (info? o)
105   (and (pair? o) (eq? (car o) <info>)))
106
107 ;; FIXME: psyntax+pmatch+optarg is broken; BINDINGS-> (g1234 g1234)
108 ;; iso (function function)
109 ;; (define (clone o . rest)
110 ;;   (pmatch o
111 ;;     ((<info>
112 ;;       (<functions> . ,functions)
113 ;;       (<globals> . ,globals)
114 ;;       (<locals> . ,locals)
115 ;;       (<text> . ,text))
116 ;;      (let-keywords rest
117 ;;                    #f
118 ;;                    ((functions functions)
119 ;;                     (globals globals)
120 ;;                     (locals locals)
121 ;;                     (text text))
122 ;;                    (make <info> #:functions functions #:globals globals #:locals locals #:text text)))))
123
124 (define (clone o . rest)
125   (cond ((info? o)
126          (let ((functions (.functions o))
127                (globals (.globals o))
128                (locals (.locals o))
129                (text (.text o)))
130            (let-keywords rest
131                          #f
132                          ((functions functions)
133                           (globals globals)
134                           (locals locals)
135                           (text text))
136                          (make <info> #:functions functions #:globals globals #:locals locals #:text text))))))
137
138 (pass-if-equal "clone <info>"
139     (make <info> #:functions '(0))
140   (clone (make <info>) #:functions '(0)))
141
142 (result 'report)