about summary refs log tree commit diff
path: root/tests/reader.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tests/reader.scm')
-rw-r--r--tests/reader.scm324
1 files changed, 170 insertions, 154 deletions
diff --git a/tests/reader.scm b/tests/reader.scm
index f3bcdd2..d55e396 100644
--- a/tests/reader.scm
+++ b/tests/reader.scm
@@ -16,169 +16,185 @@
 ;;; 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)
+(use-modules (srfi srfi-26)
              (srfi srfi-64)
              (ice-9 filesystem)
              (ice-9 match)
              (web uri)
              (ravanan reader)
              (ravanan work command-line-tool)
-             (ravanan work utils))
-
-(define normalize-formal-input
-  (@@ (ravanan reader) normalize-formal-input))
-
-(define normalize-formal-output
-  (@@ (ravanan reader) normalize-formal-output))
-
-(define normalize-input
-  (@@ (ravanan reader) normalize-input))
-
-(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))))
+             (ravanan work types)
+             (ravanan work utils)
+             (ravanan work vectors))
 
 (test-begin "reader")
 
-(test-equal "Coerce number to number"
+(test-equal "Coerce to boolean (true)"
+  #t
+  (coerce-type "true" 'boolean))
+
+(test-equal "Coerce to boolean (false)"
+  #f
+  (coerce-type "false" 'boolean))
+
+(test-equal "Coerce to int"
+  37
+  (coerce-type "37" 'int))
+
+(test-equal "Coerce to float"
+  37.1
+  (coerce-type "37.1" 'float))
+
+(test-equal "Coerce to double"
+  37.1
+  (coerce-type "37.1" 'double))
+
+(test-equal "Coerce to string"
+  "37"
+  (coerce-type "37" 'string))
+
+(test-equal "Coerce to File"
+  '(("class" . "File")
+    ("location" . "foo"))
+  (coerce-type '(("class" . "File")
+                 ("location" . "foo"))
+               'File))
+
+(test-equal "Coerce to array"
+  #(1 2 3)
+  (coerce-type #("1" "2" "3")
+               (cwl-array-type 'int)))
+
+(test-equal "Coerce to union type (int first)"
+  37
+  (coerce-type "37"
+               (cwl-union-type 'int 'string)))
+
+(test-equal "Coerce to union type (string first)"
+  "37"
+  (coerce-type "37"
+               (cwl-union-type 'string 'int)))
+
+(test-equal "Coerce int to int"
   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" . #f)))))
-          (normalize-formal-output
-           '(("type"
-              ("type" . "array")
-              ("items" . (("type" . "array")
-                          ("items" . "File"))))
-             ("id" . "foo")
-             ("secondaryFiles" . #(".bai"))))))
-
-(test-assert "Normalize inputs with only location"
-  (call-with-temporary-directory
-   (lambda (dir)
-     (json=? (let ((path (expand-file-name "foo" dir)))
-               `(("class" . "File")
-                 ("location" . ,(uri->string (build-uri 'file #:path path)))
-                 ("path" . ,path)
-                 ("basename" . "foo")
-                 ("nameroot" . "foo")
-                 ("nameext" . "")
-                 ("size" . 0)
-                 ("checksum" . "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709")))
-             (call-with-current-directory dir
-               (lambda ()
-                 ;; Create an actual file called "foo" so that canonicalize-path
-                 ;; works.
-                 (call-with-output-file "foo"
-                   (const #t))
-                 (normalize-input '(("class" . "File")
-                                    ("location" . "foo")))))))))
-
-(test-assert "Normalize inputs with only path"
-  (call-with-temporary-directory
-   (lambda (dir)
-     (json=? (let ((path (expand-file-name "foo" dir)))
-               `(("class" . "File")
-                 ("location" . ,(uri->string (build-uri 'file #:path path)))
-                 ("path" . ,path)
-                 ("basename" . "foo")
-                 ("nameroot" . "foo")
-                 ("nameext" . "")
-                 ("size" . 0)
-                 ("checksum" . "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709")))
-             (call-with-current-directory dir
-               (lambda ()
-                 ;; Create an actual file called "foo" so that canonicalize-path
-                 ;; works.
-                 (call-with-output-file "foo"
-                   (const #t))
-                 (normalize-input '(("class" . "File")
-                                    ("path" . "foo")))))))))
+  (coerce-type 37 'int))
+
+(test-equal "Normalize inputs with only location"
+  (canonicalize-json
+   (let ((path (canonicalize-path "test-data/foo")))
+     `(("class" . "File")
+       ("location" . ,(uri->string (build-uri 'file
+                                              #:host ""
+                                              #:path path
+                                              #:validate? #f)))
+       ("path" . ,path)
+       ("basename" . "foo")
+       ("nameroot" . "foo")
+       ("nameext" . "")
+       ("size" . 0)
+       ("checksum" . "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709"))))
+  (call-with-values
+      (cut read-workflow+inputs
+           "test-data/workflow-with-a-file-input.cwl"
+           "test-data/input-file-with-location-only.yaml")
+    (lambda (workflow inputs)
+      (canonicalize-json (assoc-ref inputs "foo")))))
+
+(test-equal "Normalize inputs with only path"
+  (canonicalize-json
+   (let ((path (canonicalize-path "test-data/foo")))
+     `(("class" . "File")
+       ("location" . ,(uri->string (build-uri 'file
+                                              #:host ""
+                                              #:path path
+                                              #:validate? #f)))
+       ("path" . ,path)
+       ("basename" . "foo")
+       ("nameroot" . "foo")
+       ("nameext" . "")
+       ("size" . 0)
+       ("checksum" . "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709"))))
+  (call-with-values
+      (cut read-workflow+inputs
+           "test-data/workflow-with-a-file-input.cwl"
+           "test-data/input-file-with-path-only.yaml")
+    (lambda (workflow inputs)
+      (canonicalize-json (assoc-ref inputs "foo")))))
+
+(test-equal "Read YAML inputs file with type ambiguities"
+  '(("number" . 13)
+    ("flag" . #t)
+    ("reverseflag" . #f)
+    ("foo" . "bar")
+    ("arr" . #(1 2 3)))
+  (call-with-values
+      (cut read-workflow+inputs
+           "test-data/workflow-for-inputs-with-type-ambiguities.cwl"
+           "test-data/inputs-with-type-ambiguities.yaml")
+    (lambda (workflow inputs)
+      inputs)))
+
+(test-equal "Resolve type ambiguities in workflow default inputs"
+  '(("number" . 13)
+    ("flag" . #t)
+    ("reverseflag" . #f)
+    ("foo" . "bar")
+    ("arr" . #(1 2 3)))
+  (call-with-values
+      (cut read-workflow+inputs
+           "test-data/workflow-with-default-inputs.cwl"
+           "test-data/empty.yaml")
+    (lambda (workflow inputs)
+      (vector-map->list (lambda (input)
+                          (cons (assoc-ref input "id")
+                                (assoc-ref input "default")))
+                        (assoc-ref workflow "inputs")))))
+
+(test-equal "Normalize File type formals"
+  (list (vector-map canonicalize-json
+                    #((("id" . "infoo")
+                       ("type" . "File")
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #t)))))
+                      (("id" . "inbar")
+                       ("type"
+                        ("type" . "array")
+                        ("items" . "File"))
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #t)))))
+                      (("id" . "infoobar")
+                       ("type"
+                        ("type" . "array")
+                        ("items" . (("type" . "array")
+                                    ("items" . "File"))))
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #t)))))))
+        (vector-map canonicalize-json
+                    #((("id" . "outfoo")
+                       ("type" . "File")
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #f)))))
+                      (("id" . "outbar")
+                       ("type"
+                        ("type" . "array")
+                        ("items" . "File"))
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #f)))))
+                      (("id" . "outfoobar")
+                       ("type"
+                        ("type" . "array")
+                        ("items" . (("type" . "array")
+                                    ("items" . "File"))))
+                       ("secondaryFiles" . #((("pattern" . ".bai")
+                                              ("required" . #f))))))))
+  (call-with-values
+      (cut read-workflow+inputs
+           "test-data/workflow-with-various-file-type-formals.cwl"
+           "test-data/empty.yaml")
+    (lambda (workflow inputs)
+      (list (vector-map canonicalize-json
+                        (assoc-ref workflow "inputs"))
+            (vector-map canonicalize-json
+                        (assoc-ref workflow "outputs"))))))
 
 (test-end "reader")