Tidy up and a bit of renaming; gets rid of those end-of-file exceptions.

This commit is contained in:
simon 2014-04-07 20:55:59 +01:00
parent 3361d55d81
commit 6d3b5d76a3
2 changed files with 200 additions and 96 deletions

View file

@ -9,7 +9,8 @@
(symbol? val) (list 'symbol (str val)) (symbol? val) (list 'symbol (str val))
true (list 'quote val))) true (list 'quote val)))
(defn write-test [fnname arg] (defn generate-assertion [fnname arg]
"Generate an appropiate assertion for this argument passed to this function"
(try (try
(let [val (eval (list fnname arg))] (let [val (eval (list fnname arg))]
(list 'is (list '= (list fnname arg) (maybe-quote val)))) (list 'is (list '= (list fnname arg) (maybe-quote val))))
@ -39,12 +40,12 @@
true %) true %)
(constants sexpr))))) (constants sexpr)))))
(defn testgen [fndef extra-vars] (defn generate-test [fndef extra-vars]
(cond (or (= (first fndef) 'def)(= (first fndef) 'defn)) (cond (or (= (first fndef) 'def)(= (first fndef) 'defn))
(let [name (first (rest fndef))] (let [name (first (rest fndef))]
(list 'deftest (symbol (str "test-" name)) (list 'deftest (symbol (str "test-" name))
(concat (list 'testing (str name)) (concat (list 'testing (str name))
(map #(write-test name %) (map #(generate-assertion name %)
(find-interesting-args fndef extra-vars))))))) (find-interesting-args fndef extra-vars)))))))
;; generating a test file ;; generating a test file
@ -72,20 +73,33 @@
(let [fn (clean-filename filename)] (let [fn (clean-filename filename)]
(symbol (.replace fn "/" ".")))) (symbol (.replace fn "/" "."))))
(defn find-vars-in-reader [eddie] ;; This should be a better mechanism for reading expressions from a file but I haven't
"Return a list of names of variables declared in the stream this reader reads" ;; really made it work yet.
(try (defn expr-seq
(let [sexpr (read eddie)] "Returns forms from src (assumed to be Clojure source) as a lazy sequence of expressions"
[^java.io.PushbackReader src]
(when-let [expr (read src false nil)]
(cons expr (lazy-seq (expr-seq src)))))
(defn find-vars-in-reader [eddi]
"Return a list of names of vars declared in the stream this reader reads"
(let [sexpr (read eddi false nil)]
(cond (cond
(nil? sexpr) nil (nil? sexpr) nil
(= (first sexpr) 'def) (cons (first (rest sexpr)) (find-vars-in-reader eddie)) (= (first sexpr) 'def) (cons (first (rest sexpr)) (find-vars-in-reader eddi))
true (find-vars-in-reader eddie))) true (find-vars-in-reader eddi))))
(catch RuntimeException eof)))
(defn find-vars-in-file [filename] (defn find-vars-in-file [filename]
"Return a list of names of variables declared in the file at this path name" "Return a list of names of vars declared in the file at this path name"
(with-open [eddie (java.io.PushbackReader. (reader filename))] (with-open [eddi (java.io.PushbackReader. (reader filename))]
(find-vars-in-reader eddie))) (find-vars-in-reader eddi)))
(defn write-header [writer package]
(.write writer (str "(ns " package "_test\n"))
(.write writer (str "\t(:require [clojure.test :refer :all]\n\t["
package " :refer :all]))\n\n"))
(.write writer
";; auto-generated by testgen - see https://github.com/simon-brooke/testgen\n\n"))
(defn generate-tests [filename] (defn generate-tests [filename]
"Generate a suite of characterisation tests for the file indicated by this filename. "Generate a suite of characterisation tests for the file indicated by this filename.
@ -99,24 +113,18 @@
;; load the file so that any functions in it are usable ;; load the file so that any functions in it are usable
(load fn) (load fn)
(refer pn) (refer pn)
(with-open [eddie (java.io.PushbackReader. (reader filename)) (with-open [eddi (java.io.PushbackReader. (reader filename))
dickens (writer (test-filename filename))] dickens (writer (test-filename filename))]
(.write dickens (str "(ns " pn "_test\n")) (write-header dickens pn)
(.write dickens (str "\t(:require [clojure.test :refer :all]\n\t[" (while (.ready eddi)
pn " :refer :all]))\n\n"))
(.write dickens
";; auto-generated by testgen - see https://github.com/simon-brooke/testgen\n\n")
(while (.ready eddie)
(try
(println "reading...") (println "reading...")
(let [form (read eddie)] (let [form (read eddi false nil)]
(cond (= (first form) 'defn) (cond (= (first form) 'defn)
(do (do
(println (first (rest form)) "...") (println (first (rest form)) "...")
(pprint (testgen form extra-vars) dickens) (pprint (generate-test form extra-vars) dickens)
(.write dickens "\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n") (.write dickens "\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n")
))) ))))
(catch Exception eof)))
(.write dickens "\n\n;; end of file ;;\n\n") (.write dickens "\n\n;; end of file ;;\n\n")
(.flush dickens)))) (.flush dickens))))

View file

@ -44,24 +44,38 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest (deftest
test-write-test test-generate-assertion
(testing (testing
"write-test" "generate-assertion"
(is (thrown? clojure.lang.ArityException (write-test nil))) (is (thrown? clojure.lang.ArityException (generate-assertion nil)))
(is (thrown? clojure.lang.ArityException (write-test ()))) (is (thrown? clojure.lang.ArityException (generate-assertion ())))
(is (thrown? clojure.lang.ArityException (write-test '(a :b "c"))))
(is (thrown? clojure.lang.ArityException (write-test true)))
(is (thrown? clojure.lang.ArityException (write-test "test")))
(is (thrown? clojure.lang.ArityException (write-test :test)))
(is (thrown? clojure.lang.ArityException (write-test 0)))
(is (is
(thrown? (thrown?
clojure.lang.ArityException clojure.lang.ArityException
(write-test Integer/MAX_VALUE))) (generate-assertion '(a :b "c"))))
(is (thrown? clojure.lang.ArityException (write-test 22/7))) (is (thrown? clojure.lang.ArityException (generate-assertion true)))
(is (thrown? clojure.lang.ArityException (write-test 1.0E-4))) (is
(is (thrown? clojure.lang.ArityException (write-test -1.0E-4))) (thrown? clojure.lang.ArityException (generate-assertion "test")))
(is (thrown? clojure.lang.ArityException (write-test generic-args))))) (is (thrown? clojure.lang.ArityException (generate-assertion :test)))
(is (thrown? clojure.lang.ArityException (generate-assertion 0)))
(is
(thrown?
clojure.lang.ArityException
(generate-assertion Integer/MAX_VALUE)))
(is (thrown? clojure.lang.ArityException (generate-assertion 22/7)))
(is
(thrown? clojure.lang.ArityException (generate-assertion 1.0E-4)))
(is
(thrown? clojure.lang.ArityException (generate-assertion -1.0E-4)))
(is
(thrown?
clojure.lang.ArityException
(generate-assertion generic-args)))
(is
(thrown?
clojure.lang.ArityException
(generate-assertion
"Generate an appropiate assertion for this argument passed to this function")))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -184,23 +198,27 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest (deftest
test-testgen test-generate-test
(testing (testing
"testgen" "generate-test"
(is (thrown? clojure.lang.ArityException (testgen nil))) (is (thrown? clojure.lang.ArityException (generate-test nil)))
(is (thrown? clojure.lang.ArityException (testgen ()))) (is (thrown? clojure.lang.ArityException (generate-test ())))
(is (thrown? clojure.lang.ArityException (testgen '(a :b "c"))))
(is (thrown? clojure.lang.ArityException (testgen true)))
(is (thrown? clojure.lang.ArityException (testgen "test")))
(is (thrown? clojure.lang.ArityException (testgen :test)))
(is (thrown? clojure.lang.ArityException (testgen 0)))
(is (is
(thrown? clojure.lang.ArityException (testgen Integer/MAX_VALUE))) (thrown? clojure.lang.ArityException (generate-test '(a :b "c"))))
(is (thrown? clojure.lang.ArityException (testgen 22/7))) (is (thrown? clojure.lang.ArityException (generate-test true)))
(is (thrown? clojure.lang.ArityException (testgen 1.0E-4))) (is (thrown? clojure.lang.ArityException (generate-test "test")))
(is (thrown? clojure.lang.ArityException (testgen -1.0E-4))) (is (thrown? clojure.lang.ArityException (generate-test :test)))
(is (thrown? clojure.lang.ArityException (testgen generic-args))) (is (thrown? clojure.lang.ArityException (generate-test 0)))
(is (thrown? clojure.lang.ArityException (testgen "test-"))))) (is
(thrown?
clojure.lang.ArityException
(generate-test Integer/MAX_VALUE)))
(is (thrown? clojure.lang.ArityException (generate-test 22/7)))
(is (thrown? clojure.lang.ArityException (generate-test 1.0E-4)))
(is (thrown? clojure.lang.ArityException (generate-test -1.0E-4)))
(is
(thrown? clojure.lang.ArityException (generate-test generic-args)))
(is (thrown? clojure.lang.ArityException (generate-test "test-")))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -378,31 +396,83 @@
(is (= (packagename-from-filename ".") (symbol "."))))) (is (= (packagename-from-filename ".") (symbol ".")))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest
test-expr-seq
(testing
"expr-seq"
(is (thrown? java.lang.NullPointerException (expr-seq nil)))
(is (thrown? java.lang.ClassCastException (expr-seq ())))
(is (thrown? java.lang.ClassCastException (expr-seq '(a :b "c"))))
(is (thrown? java.lang.ClassCastException (expr-seq true)))
(is (thrown? java.lang.ClassCastException (expr-seq "test")))
(is (thrown? java.lang.ClassCastException (expr-seq :test)))
(is (thrown? java.lang.ClassCastException (expr-seq 0)))
(is
(thrown? java.lang.ClassCastException (expr-seq Integer/MAX_VALUE)))
(is (thrown? java.lang.ClassCastException (expr-seq 22/7)))
(is (thrown? java.lang.ClassCastException (expr-seq 1.0E-4)))
(is (thrown? java.lang.ClassCastException (expr-seq -1.0E-4)))
(is (thrown? java.lang.ClassCastException (expr-seq generic-args)))
(is
(thrown?
java.lang.ClassCastException
(expr-seq
"Returns forms from src (assumed to be Clojure source) as a lazy sequence of expressions")))
(is (thrown? java.lang.ClassCastException (expr-seq false)))
(is (thrown? java.lang.NullPointerException (expr-seq nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest (deftest
test-find-vars-in-reader test-find-vars-in-reader
(testing (testing
"find-vars-in-reader" "find-vars-in-reader"
(is (= (find-vars-in-reader nil) 'nil))
(is (= (find-vars-in-reader ()) 'nil))
(is (= (find-vars-in-reader '(a :b "c")) 'nil))
(is (= (find-vars-in-reader true) 'nil))
(is (= (find-vars-in-reader "test") 'nil))
(is (= (find-vars-in-reader :test) 'nil))
(is (= (find-vars-in-reader 0) 'nil))
(is (= (find-vars-in-reader Integer/MAX_VALUE) 'nil))
(is (= (find-vars-in-reader 22/7) 'nil))
(is (= (find-vars-in-reader 1.0E-4) 'nil))
(is (= (find-vars-in-reader -1.0E-4) 'nil))
(is (= (find-vars-in-reader generic-args) 'nil))
(is (is
(= (thrown? java.lang.NullPointerException (find-vars-in-reader nil)))
(is (thrown? java.lang.ClassCastException (find-vars-in-reader ())))
(is
(thrown?
java.lang.ClassCastException
(find-vars-in-reader '(a :b "c"))))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader true)))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader "test")))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader :test)))
(is (thrown? java.lang.ClassCastException (find-vars-in-reader 0)))
(is
(thrown?
java.lang.ClassCastException
(find-vars-in-reader Integer/MAX_VALUE)))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader 22/7)))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader 1.0E-4)))
(is
(thrown?
java.lang.ClassCastException
(find-vars-in-reader -1.0E-4)))
(is
(thrown?
java.lang.ClassCastException
(find-vars-in-reader generic-args)))
(is
(thrown?
java.lang.ClassCastException
(find-vars-in-reader (find-vars-in-reader
"Return a list of names of variables declared in the stream this reader reads") "Return a list of names of vars declared in the stream this reader reads")))
'nil)) (is
(is (= (find-vars-in-reader nil) 'nil)) (thrown? java.lang.ClassCastException (find-vars-in-reader false)))
(is (= (find-vars-in-reader true) 'nil)))) (is
(thrown? java.lang.NullPointerException (find-vars-in-reader nil)))
(is
(thrown? java.lang.NullPointerException (find-vars-in-reader nil)))
(is
(thrown? java.lang.ClassCastException (find-vars-in-reader true)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -457,7 +527,46 @@
(thrown? (thrown?
java.io.FileNotFoundException java.io.FileNotFoundException
(find-vars-in-file (find-vars-in-file
"Return a list of names of variables declared in the file at this path name"))))) "Return a list of names of vars declared in the file at this path name")))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest
test-write-header
(testing
"write-header"
(is (thrown? clojure.lang.ArityException (write-header nil)))
(is (thrown? clojure.lang.ArityException (write-header ())))
(is (thrown? clojure.lang.ArityException (write-header '(a :b "c"))))
(is (thrown? clojure.lang.ArityException (write-header true)))
(is (thrown? clojure.lang.ArityException (write-header "test")))
(is (thrown? clojure.lang.ArityException (write-header :test)))
(is (thrown? clojure.lang.ArityException (write-header 0)))
(is
(thrown?
clojure.lang.ArityException
(write-header Integer/MAX_VALUE)))
(is (thrown? clojure.lang.ArityException (write-header 22/7)))
(is (thrown? clojure.lang.ArityException (write-header 1.0E-4)))
(is (thrown? clojure.lang.ArityException (write-header -1.0E-4)))
(is
(thrown? clojure.lang.ArityException (write-header generic-args)))
(is (thrown? clojure.lang.ArityException (write-header "(ns ")))
(is (thrown? clojure.lang.ArityException (write-header "_test\n")))
(is
(thrown?
clojure.lang.ArityException
(write-header "\t(:require [clojure.test :refer :all]\n\t[")))
(is
(thrown?
clojure.lang.ArityException
(write-header " :refer :all]))\n\n")))
(is
(thrown?
clojure.lang.ArityException
(write-header
";; auto-generated by testgen - see https://github.com/simon-brooke/testgen\n\n")))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -509,26 +618,13 @@
(thrown? (thrown?
java.io.FileNotFoundException java.io.FileNotFoundException
(generate-tests "Writing to: "))) (generate-tests "Writing to: ")))
(is (thrown? java.io.FileNotFoundException (generate-tests "(ns ")))
(is
(thrown? java.io.FileNotFoundException (generate-tests "_test\n")))
(is
(thrown?
java.io.FileNotFoundException
(generate-tests "\t(:require [clojure.test :refer :all]\n\t[")))
(is
(thrown?
java.io.FileNotFoundException
(generate-tests " :refer :all]))\n\n")))
(is
(thrown?
java.io.FileNotFoundException
(generate-tests
";; auto-generated by testgen - see https://github.com/simon-brooke/testgen\n\n")))
(is (is
(thrown? (thrown?
java.io.FileNotFoundException java.io.FileNotFoundException
(generate-tests "reading..."))) (generate-tests "reading...")))
(is
(thrown? java.lang.IllegalArgumentException (generate-tests false)))
(is (thrown? java.lang.NullPointerException (generate-tests nil)))
(is (thrown? java.io.FileNotFoundException (generate-tests "..."))) (is (thrown? java.io.FileNotFoundException (generate-tests "...")))
(is (is
(thrown? (thrown?