aboutsummaryrefslogtreecommitdiff
;;; ravanan --- High-reproducibility CWL runner powered by Guix
;;; Copyright © 2024, 2025 Arun Isaac <arunisaac@systemreboot.net>
;;;
;;; This file is part of ravanan.
;;;
;;; ravanan 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.
;;;
;;; ravanan 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 ravanan.  If not, see <https://www.gnu.org/licenses/>.

(use-modules (srfi srfi-1)
             (srfi srfi-64)
             (ice-9 match)
             (ravanan reader))

(define normalize-formal-input
  (@@ (ravanan reader) normalize-formal-input))

(define normalize-formal-output
  (@@ (ravanan reader) normalize-formal-output))

(define (json=? tree1 tree2)
  (cond
   ;; Arrays
   ((vector? tree1)
    (lset= json=?
           (vector->list tree1)
           (vector->list tree2)))
   ;; Dictionaries
   ((list? tree1)
    (lset= (match-lambda*
             (((key1 . value1) (key2 . value2))
              (and (string=? key1 key2)
                   (json=? value1 value2))))
           tree1
           tree2))
   ;; Atoms
   (else
    (equal? tree1 tree2))))

(test-begin "reader")

(test-equal "Coerce number to number"
  37
  (coerce-type 37 'number))

(test-assert "Normalize File type formal input"
  (json=? '(("type" . "File")
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #t)))))
          (normalize-formal-input
           '(("type" . "File")
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-assert "Normalize File array type formal input"
  (json=? '(("type"
             ("type" . "array")
             ("items" . "File"))
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #t)))))
          (normalize-formal-input
           '(("type"
              ("type" . "array")
              ("items" . "File"))
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-assert "Normalize array of File arrays type formal input"
  (json=? '(("type"
             ("type" . "array")
             ("items" . (("type" . "array")
                         ("items" . "File"))))
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #t)))))
          (normalize-formal-input
           '(("type"
              ("type" . "array")
              ("items" . (("type" . "array")
                          ("items" . "File"))))
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-assert "Normalize File type formal output"
  (json=? '(("type" . "File")
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #f)))))
          (normalize-formal-output
           '(("type" . "File")
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-assert "Normalize File array type formal output"
  (json=? '(("type"
             ("type" . "array")
             ("items" . "File"))
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #f)))))
          (normalize-formal-output
           '(("type"
              ("type" . "array")
              ("items" . "File"))
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-assert "Normalize array of File arrays type formal output"
  (json=? '(("type"
             ("type" . "array")
             ("items" . (("type" . "array")
                         ("items" . "File"))))
            ("id" . "foo")
            ("secondaryFiles" . #((("pattern" . ".bai")
                                   ("required" . #t)))))
          (normalize-formal-input
           '(("type"
              ("type" . "array")
              ("items" . (("type" . "array")
                          ("items" . "File"))))
             ("id" . "foo")
             ("secondaryFiles" . #(".bai"))))))

(test-end "reader")