#!/usr/bin/env sh exec guile -L . -s "$0" "$@" !# (use-modules (potato make) (srfi srfi-1) (srfi srfi-64)) ;; These stubs override the driver that calls ;; 'system' so we can instead just investigate ;; what string it was passed. (define %cmd #f) (define (stub-system-pass cmd) (set! %cmd cmd) 0) (define (stub-system-fail cmd) (set! %cmd cmd) 1) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; MAKEVARS (test-begin "makevars") (test-equal "can set makevar with environment" "BAR1" (begin (setenv "FOO1" "BAR1") (initialize '("test" "--environment")) (let ((result ($ FOO1))) (unsetenv "FOO1") result))) (test-equal "can set makevar with MAKEFLAGS" "BAR2" (begin (setenv "MAKEFLAGS" "FOO2=BAR2") (initialize '("test" "--environment")) (let ((result ($ FOO2))) (unsetenv "MAKEFLAGS") result))) (test-equal "can set makevar with initialize" "BAR3" (begin (initialize '("test" "FOO3=BAR3")) ($ FOO3))) (test-equal "can set makevar in script" "BAR4" (begin (:= FOO4 "BAR4") ($ FOO4))) (test-equal "can set makevar lazily in script" "BAR5" (begin (?= FOO5 "BAR5") ($ FOO5))) (test-assert "a lazy makevar of a procedure is a promise before it is referenced" (begin (?= FOO6 (lambda () "BAR6")) (let ((val (hash-ref (@@ (potato makevars) %makevars) "FOO6"))) (promise? (car val))))) (test-equal "a lazy makevar of a procedure is a string after it is referenced" "BAR7" (begin (?= FOO7 (lambda () "BAR7")) ($ FOO7) (let ((val (hash-ref (@@ (potato makevars) %makevars) "FOO7"))) (car val)))) (test-equal "referencing an unset makevar returns an empty string" "" ($ FOO8)) (test-error "referencing an unset makevar throws an error in strict mode" #t (begin (initialize '("test" "--strict")) ($ FOO9))) (test-equal "assign converts integers to strings" "100" (begin (:= FOO10 100) ($ FOO10))) (test-equal "assign converts characters to strings" "x" (begin (:= FOO11 #\x) ($ FOO11))) (test-equal "quote-reference adds quotation marks" "\"BAR 12\"" (begin (:= FOO12 "BAR 12") (Q FOO12))) (test-equal "quote-reference of an unassigned makevar returns empty quotation marks in non-strict mode" "\"\"" (begin (initialize '("test")) (Q FOO13))) (test-error "quote-reference of an unassigned makevar throws an error in strict mode" #t (begin (initialize '("test" "--strict")) (Q FOO13))) (test-equal "script assignment overrides command-line assignment" "BAZ14" (begin (initialize '("test" "FOO14=BAR14")) (:= FOO14 "BAZ14") ($ FOO14))) (test-equal "script assignment overrides MAKEFLAGS assignment" "BAZ15" (begin (setenv "MAKEFLAGS" "FOO15=BAR15") (initialize '("test" "--environment")) (:= FOO15 "BAZ15") ($ FOO15))) (test-equal "script assignment overrides environment assignment" "BAZ16" (begin (setenv "FOO16" "BAR16") (initialize '("test" "--environment")) (unsetenv "FOO16") (:= FOO16 "BAZ16") ($ FOO16))) (test-equal "command-line assignment overrides script assignment in elevate mode" "BAR14" (begin (initialize '("test" "FOO14=BAR14" "--elevate-environment")) (:= FOO14 "BAZ14") ($ FOO14))) (test-equal "MAKEFLAGS assignment overrides script assignment in elevate mode" "BAR15" (begin (setenv "MAKEFLAGS" "FOO15=BAR15") (initialize '("test" "--elevate-environment")) (unsetenv "MAKEFLAGS") (:= FOO15 "BAZ15") ($ FOO15))) (test-equal "environment assignment overrides script assignment in elevate mode" "BAR16" (begin (setenv "FOO16" "BAR16") (initialize '("test" "--elevate-environment")) (:= FOO16 "BAZ16") ($ FOO16))) (test-end "makevars") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; RECIPE HELPERS (test-begin "recipe_helpers") (test-assert "string-compose returns 'default and procedure" (let ((ret (~ "hello"))) (and (eq? (car ret) 'default) (procedure? (cdr ret))))) (test-assert "silent-compose returns 'silent and procedure" (let ((ret (~@ "hello"))) (and (eq? (car ret) 'silent) (procedure? (cdr ret))))) (test-assert "always-execute-compose returns 'always-execute and procedure" (let ((ret (~+ "hello"))) (and (eq? (car ret) 'always-execute) (procedure? (cdr ret))))) (test-assert "ignore-error-compose returns 'ignore-error and procedure" (let ((ret (~- "hello"))) (and (eq? (car ret) 'ignore-error) (procedure? (cdr ret))))) (test-equal "string-compose string passthrough" "hello" (let ((ret (~ "hello"))) ((cdr ret)))) (test-equal "string-compose two strings passthrough" "hello world" (let ((ret (~ "hello" "world"))) ((cdr ret)))) (test-equal "string-compose empty initial string" "world" (let ((ret (~ "" "world"))) ((cdr ret)))) (test-equal "string-compose empty terminal string" "hello" (let ((ret (~ "hello" ""))) ((cdr ret)))) (test-equal "string-compose empty medial string" "hello world" (let ((ret (~ "hello" "" "world"))) ((cdr ret)))) (test-equal "string-compose handles procedure" "hello world" (let ((ret (~ "hello" (lambda () "world")))) ((cdr ret)))) (test-equal "string-compose handles integer" "hello 123" (let ((ret (~ "hello" 123))) ((cdr ret)))) (test-equal "string-compose handles character" "hello w" (let ((ret (~ "hello" #\w))) ((cdr ret)))) (test-equal "string-compose handles makevar" "hello BAR" (begin (:= FOO "BAR") (let ((ret (~ "hello" ($ FOO)))) ((cdr ret))))) (test-equal "empty string-compose" "" (let ((ret (~))) ((cdr ret)))) (test-end "recipe_helpers") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TARGET RULES (test-begin "target_rules") (test-assert "install alternate system driver" (false-if-exception (install-alternate-system-driver stub-system-pass))) (test-equal "target rule is a string" "cc -o foo.exe foo.c" (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") "cc -o foo.exe foo.c") (execute) %cmd)) (test-assert "target rule is a procedure" (begin (let ((tmpvar #f)) (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (lambda () (set! tmpvar #t))) (execute) tmpvar))) (test-equal "target rule is a procedure returning a string" "cc -o foo.exe foo.c" (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (lambda () ("cc -o foo.exe foo.c"))) (execute) %cmd)) (test-equal "target rule using string-compose on a string" "cc -o foo.exe foo.c" (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (~ "cc -o foo.exe foo.c")) (execute) %cmd)) (test-equal "target rule using string-compose on special variables" "cc -o foo.exe foo.c" (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (~ "cc -o" $@ $<)) (execute) %cmd)) (test-equal "target rule check success" #t (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (~ "cc -o" $@ $<)) (execute))) (test-assert "install failing alternate system driver" (false-if-exception (install-alternate-system-driver stub-system-fail))) (test-equal "target rule check failure of system call" #f (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (~ "cc -o" $@ $<)) (execute))) (test-equal "target rule check failure of scheme procedure" #f (begin (initialize '("test" "foo.exe")) (: "foo.exe" '("foo.c") (lambda () #f)) (execute))) (test-end "target_rules") (test-begin "suffix_rules") (test-assert "install alternate system driver" (false-if-exception (install-alternate-system-driver stub-system-pass))) (test-equal "suffix rule simple" "cc -c foo.c" (begin (initialize '("test" "foo.o")) (-> ".c" ".o" (~ "cc -c" $<)) (execute) %cmd)) (test-end "suffix_rules")