123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- ;;; GNU Guix --- Functional package management for GNU
- ;;; Copyright © 2021-2023 Ludovic Courtès <ludo@gnu.org>
- ;;;
- ;;; This file is part of GNU Guix.
- ;;;
- ;;; GNU Guix is free software; you can redistribute it and/or modify it
- ;;; under the terms of the GNU General Public License as published by
- ;;; the Free Software Foundation; either version 3 of the License, or (at
- ;;; your option) any later version.
- ;;;
- ;;; GNU Guix is distributed in the hope that it will be useful, but
- ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;;; GNU General Public License for more details.
- ;;;
- ;;; You should have received a copy of the GNU General Public License
- ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
- (define-module (tests-style)
- #:use-module (guix read-print)
- #:use-module (guix gexp) ;for the reader extensions
- #:use-module (srfi srfi-34)
- #:use-module (srfi srfi-35)
- #:use-module (srfi srfi-64)
- #:use-module (ice-9 match))
- (define-syntax-rule (test-pretty-print str args ...)
- "Test equality after a round-trip where STR is passed to
- 'read-with-comments' and the resulting sexp is then passed to
- 'pretty-print-with-comments'."
- (test-equal str
- (call-with-output-string
- (lambda (port)
- (let ((exp (call-with-input-string str
- read-with-comments)))
- (pretty-print-with-comments port exp args ...))))))
- (define-syntax-rule (test-pretty-print/sequence str args ...)
- "Likewise, but read and print entire sequences rather than individual
- expressions."
- (test-equal str
- (call-with-output-string
- (lambda (port)
- (let ((lst (call-with-input-string str
- read-with-comments/sequence)))
- (pretty-print-with-comments/splice port lst args ...))))))
- (test-begin "read-print")
- (test-assert "read-with-comments: missing closing paren"
- (guard (c ((error? c) #t))
- (call-with-input-string "(what is going on?"
- read-with-comments)))
- (test-equal "read-with-comments: dot notation"
- (cons 'a 'b)
- (call-with-input-string "(a . b)"
- read-with-comments))
- (test-equal "read-with-comments: half dot notation"
- '(lambda x x)
- (call-with-input-string "(lambda (. x) x)"
- read-with-comments))
- (test-equal "read-with-comments: list with blank line"
- `(list with ,(vertical-space 1) blank line)
- (call-with-input-string "\
- (list with
- blank line)\n"
- read-with-comments))
- (test-equal "read-with-comments: list with multiple blank lines"
- `(list with ,(comment ";multiple\n" #t)
- ,(vertical-space 3) blank lines)
- (call-with-input-string "\
- (list with ;multiple
- blank lines)\n"
- read-with-comments))
- (test-equal "read-with-comments: top-level blank lines"
- (list (vertical-space 2) '(a b c) (vertical-space 2))
- (call-with-input-string "
- (a b c)\n\n"
- (lambda (port)
- (list (read-with-comments port)
- (read-with-comments port)
- (read-with-comments port)))))
- (test-equal "read-with-comments: top-level page break"
- (list (comment ";; Begin.\n") (vertical-space 1)
- (page-break)
- (comment ";; End.\n"))
- (call-with-input-string "\
- ;; Begin.
- ;; End.\n"
- (lambda (port)
- (list (read-with-comments port)
- (read-with-comments port)
- (read-with-comments port)
- (read-with-comments port)))))
- (test-pretty-print "(list 1 2 3 4)")
- (test-pretty-print "((a . 1) (b . 2))")
- (test-pretty-print "(a b c . boom)")
- (test-pretty-print "(list 1
- 2
- 3
- 4)"
- #:long-list 3
- #:indent 20)
- (test-pretty-print "\
- (list abc
- def)"
- #:max-width 11)
- (test-pretty-print "\
- (#:foo
- #:bar)"
- #:max-width 10)
- (test-pretty-print "\
- (#:first 1
- #:second 2
- #:third 3)")
- (test-pretty-print "\
- ((x
- 1)
- (y
- 2)
- (z
- 3))"
- #:max-width 3)
- (test-pretty-print "\
- (let ((x 1)
- (y 2)
- (z 3)
- (p 4))
- (+ x y))"
- #:max-width 11)
- (test-pretty-print "\
- (begin
- 1+ 1- 123/ 456*
- (1+ 41))")
- (test-pretty-print "\
- (lambda (x y)
- ;; This is a procedure.
- (let ((z (+ x y)))
- (* z z)))")
- (test-pretty-print "\
- (case x
- ((1)
- 'one)
- ((2)
- 'two))")
- (test-pretty-print "\
- (cond
- ((zero? x)
- 'zero)
- ((odd? x)
- 'odd)
- (else #f))")
- (test-pretty-print "\
- #~(string-append #$coreutils \"/bin/uname\")")
- (test-pretty-print "\
- (package
- (inherit coreutils)
- (version \"42\"))")
- (test-pretty-print "\
- (modify-phases %standard-phases
- (add-after 'unpack 'post-unpack
- (lambda _
- #t))
- (add-before 'check 'pre-check
- (lambda* (#:key inputs #:allow-other-keys)
- do things ...)))")
- (test-pretty-print "\
- (#:phases (modify-phases sdfsdf
- (add-before 'x 'y
- (lambda _
- xyz))))")
- (test-pretty-print "\
- (string-append \"a\\tb\" \"\\n\")")
- (test-pretty-print "\
- (display \"This is a very long string.
- It contains line breaks, which are preserved,
- because it's a long string.\")")
- (test-pretty-print "\
- (description \"abcdefghijkl
- mnopqrstuvwxyz.\")"
- #:max-width 30)
- (test-pretty-print "\
- (description
- \"abcdefghijkl
- mnopqrstuvwxyz.\")"
- #:max-width 12)
- (test-pretty-print "\
- (description
- \"abcdefghijklmnopqrstuvwxyz\")"
- #:max-width 33)
- (test-pretty-print "\
- (list ;margin comment
- a b c)")
- (test-pretty-print "\
- (list
- ;; This is a line comment immediately following the list head.
- #:test-flags #~(list \"-m\" \"not external and not samples\"))")
- (test-pretty-print "\
- (modify-phases %standard-phases
- (replace 'build
- ;; Nicely indented in 'modify-phases' context.
- (lambda _
- #t)))")
- (test-pretty-print "\
- (modify-inputs inputs
- ;; Regular indentation for 'replace' here.
- (replace \"gmp\" gmp))")
- (test-pretty-print "\
- #~(modify-phases phases
- (add-after 'whatever 'something-else
- (lambda _
- ;; This comment appears inside a gexp.
- 42)))")
- (test-pretty-print "\
- #~(list #$@(list coreutils ;yup
- grep) ;margin comment
- #+sed
- ;; Line comment.
- #$grep)")
- (test-pretty-print "\
- (package
- ;; Here 'sha256', 'base32', and 'arguments' must be
- ;; immediately followed by a newline.
- (source (origin
- (method url-fetch)
- (sha256
- (base32
- \"not a real base32 string\"))))
- (arguments
- '(#:phases %standard-phases
- #:tests? #f)))")
- ;; '#:key value' is kept on the same line.
- (test-pretty-print "\
- (package
- (name \"keyword-value-same-line\")
- (arguments
- (list #:phases #~(modify-phases %standard-phases
- (add-before 'x 'y
- (lambda* (#:key inputs #:allow-other-keys)
- (foo bar baz))))
- #:make-flags #~'(\"ANSWER=42\")
- #:tests? #f)))")
- (test-pretty-print "\
- (let ((x 1)
- (y 2)
- (z (let* ((a 3)
- (b 4))
- (+ a b))))
- (list x y z))")
- (test-pretty-print "\
- (begin
- (chmod \"foo\" #o750)
- (chmod port
- (logand #o644
- (lognot (umask))))
- (logand #x7f xyz))")
- (test-pretty-print "\
- (substitute-keyword-arguments (package-arguments x)
- ((#:phases phases)
- `(modify-phases ,phases
- (add-before 'build 'do-things
- (lambda _
- #t))))
- ((#:configure-flags flags)
- `(cons \"--without-any-problem\"
- ,flags)))")
- (test-pretty-print "\
- (vertical-space one:
- two:
- three:
- end)")
- (test-pretty-print "\
- (vertical-space one
- ;; Comment after blank line.
- two)")
- (test-pretty-print "\
- (begin
- break
- ;; page break above
- end)")
- (test-pretty-print "\
- (home-environment
- (services
- (list (service-type home-bash-service-type))))")
- (test-pretty-print/sequence "\
- ;;; This is a top-level comment.
- ;; Above is a page break.
- (this is an sexp
- ;; with a comment
- !!)
- ;; The end.\n")
- (test-pretty-print/sequence "
- ;;; Hello!
- ;;; Notice that there are three semicolons here.
- (define-module (foo bar)
- #:use-module (guix)
- #:use-module (gnu))
- ;; And now, the OS.
- (operating-system
- (host-name \"komputilo\")
- (locale \"eo_EO.UTF-8\")
- (services
- (cons (service mcron-service-type) %base-services)))\n"
- #:format-comment canonicalize-comment)
- (test-equal "pretty-print-with-comments, canonicalize-comment"
- "\
- (list abc
- ;; Not a margin comment.
- ;; Ditto.
- ;;
- ;; There's a blank line above.
- def ;margin comment
- ghi)"
- (let ((sexp (call-with-input-string
- "\
- (list abc
- ;Not a margin comment.
- ;;; Ditto.
- ;;;;;
- ; There's a blank line above.
- def ;; margin comment
- ghi)"
- read-with-comments)))
- (call-with-output-string
- (lambda (port)
- (pretty-print-with-comments port sexp
- #:format-comment
- canonicalize-comment)))))
- (test-equal "pretty-print-with-comments, canonicalize-vertical-space"
- "\
- (list abc
- def
- ;; last one
- ghi)"
- (let ((sexp (call-with-input-string
- "\
- (list abc
- def
- ;; last one
- ghi)"
- read-with-comments)))
- (call-with-output-string
- (lambda (port)
- (pretty-print-with-comments port sexp
- #:format-vertical-space
- canonicalize-vertical-space)))))
- (test-equal "pretty-print-with-comments, multi-line comment"
- "\
- (list abc
- ;; This comment spans
- ;; two lines.
- def)"
- (call-with-output-string
- (lambda (port)
- (pretty-print-with-comments port
- `(list abc ,(comment "\
- ;; This comment spans\n
- ;; two lines.\n")
- def)))))
- (test-end)
|