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