mescc: Mes C Library: Avoid type/size_t conflicts.
[mes.git] / tests / peg.test
1 #! /bin/sh
2 # -*-scheme-*-
3 exec ${MES-src/mes} --no-auto-compile -L ${0%/*} -L module -C module -e '(tests peg)' -s "$0" "$@"
4 !#
5
6 ;;; -*-scheme-*-
7
8 ;;; GNU Mes --- Maxwell Equations of Software
9 ;;; Copyright © 2016 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
10 ;;;
11 ;;; This file is part of GNU Mes.
12 ;;;
13 ;;; GNU Mes is free software; you can redistribute it and/or modify it
14 ;;; under the terms of the GNU General Public License as published by
15 ;;; the Free Software Foundation; either version 3 of the License, or (at
16 ;;; your option) any later version.
17 ;;;
18 ;;; GNU Mes is distributed in the hope that it will be useful, but
19 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 ;;; GNU General Public License for more details.
22 ;;;
23 ;;; You should have received a copy of the GNU General Public License
24 ;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
25
26 (define-module (tests peg)
27   #:use-module (mes mes-0)
28   #:use-module (mes test))
29
30 (cond-expand
31  (mes
32   (mes-use-module (mes peg))
33   (mes-use-module (mes test)))
34  (guile-2.2
35   (use-modules (ice-9 peg)))
36  (guile
37   (use-modules (ice-9 syncase))
38   (display "guile 2.0: no PEG\n" (current-error-port))
39   (exit 0)))
40
41 (pass-if "first dummy" #t)
42 (pass-if-not "second dummy" #f)
43
44 (define *etc-passwd*
45   "root:x:0:0:root:/root:/bin/bash
46 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
47 bin:x:2:2:bin:/bin:/bin/sh
48 sys:x:3:3:sys:/dev:/bin/sh
49 nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
50 messagebus:x:103:107::/var/run/dbus:/bin/false")
51
52 (define-peg-string-patterns
53   "string-passwd <- entry* !.
54 entry <-- (! NL .)* NL*
55 NL < '\n'")
56
57 (pass-if-equal "peg-tree"
58     (map (lambda (x) (list 'entry x)) (string-split *etc-passwd* #\newline))
59   (peg:tree (match-pattern string-passwd *etc-passwd*)))
60
61 (define-peg-pattern passwd body (and (* entry) (not-followed-by peg-any)))
62 (define-peg-pattern entry all (and (* (and (not-followed-by NL) peg-any))
63                                    (* NL)))
64 (define-peg-pattern NL none "\n")
65 (define-peg-pattern passwd body (peg "entry* !."))
66
67 (pass-if-equal "peg-tree"
68     (map (lambda (x) (list 'entry x)) (string-split *etc-passwd* #\newline))
69   (peg:tree (match-pattern passwd *etc-passwd*)))
70
71 (result 'report)