diff options
Diffstat (limited to 'tests/reader.scm')
| -rw-r--r-- | tests/reader.scm | 324 |
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") |
