;; ;; %%HEADER%% ;; (use chickumber args files posix chicken-syntax data-structures) (cond-expand (development (load "chickumber.scm") (load "chickumber-server.scm") (import chickumber chickumber-server)) (else (use chickumber chickumber-server))) (define supported-frameworks '(test boolean)) (define *verbosity* 0) (args:width 30) (define opts (list (args:make-option (h help) #:none "Show this help" (usage)) (args:make-option (v verbose) #:none "Increase verbosity. Can be given multiple times" (set! *verbosity* (+ 1 *verbosity*))) (args:make-option (p port) (required: "PORT") (sprintf "port to bind on [default: ~A]" +default-port+)) (args:make-option (f framework) (required: "FRAMEWORK") (sprintf "Testframework to use ~A" supported-frameworks)))) (define (usage) (with-output-to-port (current-error-port) (lambda () (print "Usage: " (car (argv)) " [options] [stepfiles ...]") (newline) (print (args:usage opts)))) (exit 1)) (define (default-step-files) (let loop ((defaults (map absolutize-path (list "features/support" "features/step_definitions"))) (files '())) (cond ((null? defaults) (reverse files)) ((directory? (car defaults)) (loop (cdr defaults) (add-files-from-directory (car defaults) files))) (else (loop (cdr defaults) files))))) (define (discover-step-files arguments) (let loop ((arguments arguments) (step-files (default-step-files))) (if (null? arguments) (reverse step-files) (let ((full-path (absolutize-path (car arguments)))) (if (directory? full-path) (loop (cdr arguments) (add-files-from-directory full-path step-files)) (loop (cdr arguments) (cons full-path step-files))))))) (define (add-files-from-directory directory step-files) (fold cons step-files (glob (conc directory "/*.scm")))) (define (absolutize-path path) (if (absolute-pathname? path) (normalize-pathname path) (normalize-pathname (conc (current-directory) "/" path)))) ;; todo add support for reloading of step-files (define (main) (receive (options operands) (args:parse (command-line-arguments) opts) (let ((framework (string->symbol (or (alist-ref 'framework options) "boolean")))) (unless (member framework supported-frameworks) (usage)) (let ((port (string->number (or (alist-ref 'port options) (number->string +default-port+))))) (printf "Starting chickumber at 127.0.0.1:~A with framework: ~A~%" port framework) (let ((files (discover-step-files operands))) (when (>= *verbosity* 2) (printf "Loaded files: ~A~%" files)) (start-wire-server files debug: (>= *verbosity* 3) port: port framework: framework)))))) (main)