(use-modules ((xyz euandreh heredoc) #:prefix heredoc:) ((srfi srfi-64) #:prefix t:)) (heredoc:enable-syntax) (define (test-extract-single-line-indentation) (define extract-single-line-indentation (@@ (xyz euandreh heredoc) extract-single-line-indentation)) (t:test-group "extract-single-line-indentation" (t:test-equal '(#nil #f 0) (extract-single-line-indentation '())) (t:test-equal '(#nil #t 0) (extract-single-line-indentation '(#\a #\b #\c))) (t:test-equal '(#\space #t 1) (extract-single-line-indentation '(#\space #\b #\c))) (t:test-equal '(#\space #t 5) (extract-single-line-indentation '(#\space #\space #\space #\space #\space #\b #\c))) (t:test-equal '(#\space #f 5) (extract-single-line-indentation '(#\space #\space #\space #\space #\space))) (t:test-equal '(#\space #f 1) (extract-single-line-indentation '(#\space))) (t:test-equal '(#\tab #t 3) (extract-single-line-indentation '(#\tab #\tab #\tab #\b #\c))) (t:test-equal '(#\tab #f 3) (extract-single-line-indentation '(#\tab #\tab #\tab))) (t:test-equal '(#\tab #f 1) (extract-single-line-indentation '(#\tab))) (t:test-equal '(#\space #t 1) (extract-single-line-indentation '(#\space #\tab))) (t:test-equal '(#\space #t 2) (extract-single-line-indentation '(#\space #\space #\tab #\space))) (t:test-equal '(#\tab #t 3) (extract-single-line-indentation '(#\tab #\tab #\tab #\space))) (t:test-equal '(#\tab #t 3) (extract-single-line-indentation '(#\tab #\tab #\tab #\a #\tab))) (t:test-equal '(#\tab #t 3) (extract-single-line-indentation '(#\tab #\tab #\tab #\a #\space))))) (define (test-extract-line-indentations) (define extract-line-indentations (@@ (xyz euandreh heredoc) extract-line-indentations)) (t:test-group "extract-line-indentations" (t:test-equal '() (extract-line-indentations '())) (t:test-equal '((#nil 0)) (extract-line-indentations '(""))) (t:test-equal '((#nil 0) (#nil 0) (#nil 0)) (extract-line-indentations '("" "" ""))) (t:test-equal '((#nil 0) (#nil 0) (#nil 0)) (extract-line-indentations '("a" "b" "c"))) (t:test-equal '((#\space 1) (#\space 2) (#\space 3)) (extract-line-indentations '(" " " " " "))) (t:test-equal '((#\space 1) (#\tab 1) (#\space 3)) (extract-line-indentations '(" " " " " "))) (t:test-equal '((#nil 0) (#\space 3) (#\tab 2)) (extract-line-indentations '("no spaces" " with spaces" " with tabs"))))) (define (test-maximum-indentation) (define maximum-indentation (@@ (xyz euandreh heredoc) maximum-indentation)) (t:test-group "maximum-indentation" (t:test-equal 0 (maximum-indentation '())) (t:test-equal 0 (maximum-indentation '(""))) (t:test-equal 0 (maximum-indentation '("" "" ""))) (t:test-equal 0 (maximum-indentation '("" " " ""))) (t:test-equal 1 (maximum-indentation '(" " " " " "))) (t:test-equal 2 (maximum-indentation '(" a" " b" " c"))) (t:test-equal 1 (maximum-indentation '(" space space" " space tab" " space space tab"))) (t:test-equal 0 (maximum-indentation '(" space space" " space tab" "none"))))) (define (test-trim-indentation) (define trim-indentation (@@ (xyz euandreh heredoc) trim-indentation)) (t:test-group "trim-indentation" (t:test-equal "" (trim-indentation "")) (t:test-equal "alltogether" (trim-indentation "alltogether")) (t:test-equal "with spaces between" (trim-indentation "with spaces between")) (t:test-equal "with spaces around " (trim-indentation " with spaces around ")) (t:test-equal "with multiple spaces " (trim-indentation " with multiple spaces ")) (t:test-equal "tabs " (trim-indentation " tabs ")) (t:test-equal "tabs and spaces " (trim-indentation " tabs and spaces ")) (t:test-equal "\n" (trim-indentation "\n")) (t:test-equal "\n\n\nmultiple empty lines\n\n\n" (trim-indentation "\n\n\nmultiple empty lines\n\n\n")) (t:test-equal "\n\nmixed\n indentations\n" (trim-indentation "\n\nmixed\n indentations\n")) (t:test-equal "\n\n\n \n lines with only spaces\n" (trim-indentation "\n\n \n \n lines with only spaces\n")) (t:test-equal "\n\n mixed spaces\n and tabs" (trim-indentation "\n\n mixed spaces\n and tabs")) (t:test-equal "\nstripped\n tabs" (trim-indentation "\n stripped\n tabs")) (t:test-equal " #!/bin/sh set -eu ret=0 if cmd; then echo 'Done!' ret=1 fi exit $ret " (trim-indentation " #!/bin/sh set -eu ret=0 if cmd; then echo 'Done!' ret=1 fi exit $ret ")))) (define (test-non-quote-chars?) (define non-quote-chars? (@@ (xyz euandreh heredoc) non-quote-chars?)) (t:test-group "non-quote-chars?" (t:test-equal #f (non-quote-chars? '())) (t:test-equal #f (non-quote-chars? '(#\"))) (t:test-equal #f (non-quote-chars? '(#\" #\" #\"))) (t:test-equal #t (non-quote-chars? '(#\" #\" #\-))) (t:test-equal #t (non-quote-chars? '(#\a #\"))))) (define (test-reader) (t:test-group "reader" (t:test-equal "" #"" ""#) (t:test-equal " " #"" ""#) (t:test-equal " " #"" ""#) (t:test-equal "" #""- ""#) (t:test-equal " some\n text" #"" some text""#) (t:test-equal "no trailing newline" #""- no trailing newline""#) (t:test-equal "trailing newline\n" #""- trailing newline ""#) (t:test-equal "some\ntext" #""- some text""#) (t:test-equal " indented\ntext" #""- indented text""#) (t:test-equal "with\nnewline\n" #""- with newline ""#) (t:test-equal " unindented\n newline\n" #""- unindented newline ""#) (t:test-equal "single quote: \"inside\"\n" #"- single quote: "inside" "#) (t:test-equal "multiple quotes: #\"\"\"inside\"\"\"#\n" #""""- multiple quotes: #"""inside"""# """"#) (t:test-equal " indented" #" indented"#) (t:test-equal "unindented" #""- unindented""#) (t:test-equal "#!/bin/sh set -eu some-cmd echo \"$SOMETHING\"# here is a valid glued comment if cmd; then echo 'Indentation here!' echo \"\"# anothe valid comment, glued to an empty string fi " #"""- #!/bin/sh set -eu some-cmd echo "$SOMETHING"# here is a valid glued comment if cmd; then echo 'Indentation here!' echo ""# anothe valid comment, glued to an empty string fi """#))) (define test-fns (list test-extract-single-line-indentation test-extract-line-indentations test-maximum-indentation test-trim-indentation test-non-quote-chars? test-reader)) (define (main) (t:test-begin "heredoc") (for-each (lambda (fn) (fn)) test-fns) (let ((n-fail (t:test-runner-fail-count (t:test-runner-get)))) (t:test-end) (when (not (= 0 n-fail)) (exit 1)))) (main)