;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Julien Lepiller ;;; Copyright © 2021 Xinglu Chen ;;; Copyright © 2021 Sarah Morgensen ;;; ;;; 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 . (define-module (test-opam) #:use-module (guix import opam) #:use-module (guix base32) #:use-module (gcrypt hash) #:use-module (guix tests) #:use-module ((guix build syscalls) #:select (mkdtemp!)) #:use-module ((guix build utils) #:select (delete-file-recursively mkdir-p which)) #:use-module ((guix utils) #:select (call-with-temporary-output-file)) #:use-module (srfi srfi-1) #:use-module (srfi srfi-64) #:use-module (web uri) #:use-module (ice-9 match) #:use-module (ice-9 peg)) (define test-opam-file "opam-version: \"2.0\" version: \"1.0.0\" maintainer: \"Alice Doe\" authors: [ \"Alice Doe\" \"John Doe\" ] homepage: \"https://example.org/\" bug-reports: \"https://example.org/bugs\" dev-repo: \"https://example.org/git\" build: [ [\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--pinned\" \"%{pinned}%\"] ] build-test: [ [\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--pinned\" \"%{pinned}%\" \"--tests\" \"true\"] ] depends: [ \"alcotest\" {test & >= \"0.7.2\"} \"ocamlbuild\" {build & >= \"0.9.2\"} \"zarith\" {>= \"0.7
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2017 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 (test-base16)
  #:use-module (guix base16)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-64)
  #:use-module (rnrs bytevectors))

(test-begin "base16")

(test-assert "bytevector->base16-string->bytevector"
  (every (lambda (bv)
           (equal? (base16-string->bytevector
                    (bytevector->base16-string bv))
                   bv))
         (map string->utf8 '("" "f" "fo" "foo" "foob" "fooba" "foobar"))))

(test-end "base16")
g? hash))))) (build-system ocaml-build-system) (propagated-inputs (list ocaml-zarith)) (native-inputs (list ocaml-alcotest ocamlbuild)) (home-page "https://example.org/") (synopsis "Some example package") (description "This package is just an example.") (license license:bsd-3)) (string=? (bytevector->nix-base32-string test-source-hash) hash)) (x (pk 'fail x #f)))))) ;; Test the opam file parser ;; We fold over some test cases. Each case is a pair of the string to parse and the ;; expected result. (define (test-opam-syntax name pattern test-cases) (test-assert name (fold (lambda (test acc) (display test) (newline) (match test ((str . expected) (and acc (let ((result (peg:tree (match-pattern pattern str)))) (if (equal? result expected) #t (pk 'fail (list str result expected) #f))))))) #t test-cases))) (test-opam-syntax "parse-strings" string-pat '(("" . #f) ("\"hello\"" . (string-pat "hello")) ("\"hello world\"" . (string-pat "hello world")) ("\"The dreaded \\\"é\\\"\"" . (string-pat "The dreaded \"é\"")) ("\"Have some \\\\\\\\ :)\"" . (string-pat "Have some \\\\ :)")) ("\"今日は\"" . (string-pat "今日は")))) (test-opam-syntax "parse-multiline-strings" multiline-string '(("" . #f) ("\"\"\"hello\"\"\"" . (multiline-string "hello")) ("\"\"\"hello \"world\"!\"\"\"" . (multiline-string "hello \"world\"!")) ("\"\"\"hello \"\"world\"\"!\"\"\"" . (multiline-string "hello \"\"world\"\"!")))) (test-opam-syntax "parse-lists" list-pat '(("" . #f) ("[]" . list-pat) ("[make]" . (list-pat (var "make"))) ("[\"make\"]" . (list-pat (string-pat "make"))) ("[\n a\n b\n c]" . (list-pat (var "a") (var "b") (var "c"))) ("[a b \"c\"]" . (list-pat (var "a") (var "b") (string-pat "c"))) ;; complex lists ("[(a & b)]" . (list-pat (choice-pat (group-pat (var "a") (var "b"))))) ("[(a | b & c)]" . (list-pat (choice-pat (var "a") (group-pat (var "b") (var "c"))))) ("[a (b | c) d]" . (list-pat (var "a") (choice-pat (var "b") (var "c")) (var "d"))))) (test-opam-syntax "parse-dicts" dict '(("" . #f) ("{}" . dict) ("{a: \"b\"}" . (dict (record "a" (string-pat "b")))) ("{a: \"b\"\nc: \"d\"}" . (dict (record "a" (string-pat "b")) (record "c" (string-pat "d")))))) (test-opam-syntax "parse-conditions" condition '(("" . #f) ("{}" . #f) ("{build}" . (condition-var "build")) ("{>= \"0.2.0\"}" . (condition-greater-or-equal (condition-string "0.2.0"))) ("{>= \"0.2.0\" & test}" . (condition-and (condition-greater-or-equal (condition-string "0.2.0")) (condition-var "test"))) ("{>= \"0.2.0\" | build}" . (condition-or (condition-greater-or-equal (condition-string "0.2.0")) (condition-var "build"))) ("{ = \"1.0+beta19\" }" . (condition-eq (condition-string "1.0+beta19"))))) (test-opam-syntax "parse-comment" list-pat '(("" . #f) ("[#comment\n]" . list-pat))) (test-end "opam")