From 6d3b5d76a306fab0739f5e0ab73648445b55c2e5 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 7 Apr 2014 20:55:59 +0100 Subject: [PATCH] Tidy up and a bit of renaming; gets rid of those end-of-file exceptions. --- src/testgen/core.clj | 74 +++++++------ test/testgen/core_test.clj | 222 ++++++++++++++++++++++++++----------- 2 files changed, 200 insertions(+), 96 deletions(-) diff --git a/src/testgen/core.clj b/src/testgen/core.clj index b6a094b..0817e45 100644 --- a/src/testgen/core.clj +++ b/src/testgen/core.clj @@ -5,11 +5,12 @@ (defn maybe-quote [val] "Convert val into a form in which, after being passed through the pretty printer, it will be reconstituted in a form useful to the test" - (cond + (cond (symbol? val) (list 'symbol (str 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 (let [val (eval (list fnname arg))] (list 'is (list '= (list fnname arg) (maybe-quote val)))) @@ -39,12 +40,12 @@ true %) (constants sexpr))))) -(defn testgen [fndef extra-vars] +(defn generate-test [fndef extra-vars] (cond (or (= (first fndef) 'def)(= (first fndef) 'defn)) (let [name (first (rest fndef))] (list 'deftest (symbol (str "test-" name)) (concat (list 'testing (str name)) - (map #(write-test name %) + (map #(generate-assertion name %) (find-interesting-args fndef extra-vars))))))) ;; generating a test file @@ -72,20 +73,33 @@ (let [fn (clean-filename filename)] (symbol (.replace fn "/" ".")))) -(defn find-vars-in-reader [eddie] - "Return a list of names of variables declared in the stream this reader reads" - (try - (let [sexpr (read eddie)] - (cond - (nil? sexpr) nil - (= (first sexpr) 'def) (cons (first (rest sexpr)) (find-vars-in-reader eddie)) - true (find-vars-in-reader eddie))) - (catch RuntimeException eof))) +;; This should be a better mechanism for reading expressions from a file but I haven't +;; really made it work yet. +(defn expr-seq + "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 + (nil? sexpr) nil + (= (first sexpr) 'def) (cons (first (rest sexpr)) (find-vars-in-reader eddi)) + true (find-vars-in-reader eddi)))) (defn find-vars-in-file [filename] - "Return a list of names of variables declared in the file at this path name" - (with-open [eddie (java.io.PushbackReader. (reader filename))] - (find-vars-in-reader eddie))) + "Return a list of names of vars declared in the file at this path name" + (with-open [eddi (java.io.PushbackReader. (reader filename))] + (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] "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 fn) (refer pn) - (with-open [eddie (java.io.PushbackReader. (reader filename)) + (with-open [eddi (java.io.PushbackReader. (reader filename)) dickens (writer (test-filename filename))] - (.write dickens (str "(ns " pn "_test\n")) - (.write dickens (str "\t(:require [clojure.test :refer :all]\n\t[" - 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...") - (let [form (read eddie)] - (cond (= (first form) 'defn) - (do - (println (first (rest form)) "...") - (pprint (testgen form extra-vars) dickens) - (.write dickens "\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n") - ))) - (catch Exception eof))) + (write-header dickens pn) + (while (.ready eddi) + (println "reading...") + (let [form (read eddi false nil)] + (cond (= (first form) 'defn) + (do + (println (first (rest form)) "...") + (pprint (generate-test form extra-vars) dickens) + (.write dickens "\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n") + )))) (.write dickens "\n\n;; end of file ;;\n\n") (.flush dickens)))) diff --git a/test/testgen/core_test.clj b/test/testgen/core_test.clj index 9c2a3fc..1fbf4be 100644 --- a/test/testgen/core_test.clj +++ b/test/testgen/core_test.clj @@ -44,24 +44,38 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (deftest - test-write-test + test-generate-assertion (testing - "write-test" - (is (thrown? clojure.lang.ArityException (write-test nil))) - (is (thrown? clojure.lang.ArityException (write-test ()))) - (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))) + "generate-assertion" + (is (thrown? clojure.lang.ArityException (generate-assertion nil))) + (is (thrown? clojure.lang.ArityException (generate-assertion ()))) (is (thrown? clojure.lang.ArityException - (write-test Integer/MAX_VALUE))) - (is (thrown? clojure.lang.ArityException (write-test 22/7))) - (is (thrown? clojure.lang.ArityException (write-test 1.0E-4))) - (is (thrown? clojure.lang.ArityException (write-test -1.0E-4))) - (is (thrown? clojure.lang.ArityException (write-test generic-args))))) + (generate-assertion '(a :b "c")))) + (is (thrown? clojure.lang.ArityException (generate-assertion true))) + (is + (thrown? clojure.lang.ArityException (generate-assertion "test"))) + (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 - test-testgen + test-generate-test (testing - "testgen" - (is (thrown? clojure.lang.ArityException (testgen nil))) - (is (thrown? clojure.lang.ArityException (testgen ()))) - (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))) + "generate-test" + (is (thrown? clojure.lang.ArityException (generate-test nil))) + (is (thrown? clojure.lang.ArityException (generate-test ()))) (is - (thrown? clojure.lang.ArityException (testgen Integer/MAX_VALUE))) - (is (thrown? clojure.lang.ArityException (testgen 22/7))) - (is (thrown? clojure.lang.ArityException (testgen 1.0E-4))) - (is (thrown? clojure.lang.ArityException (testgen -1.0E-4))) - (is (thrown? clojure.lang.ArityException (testgen generic-args))) - (is (thrown? clojure.lang.ArityException (testgen "test-"))))) + (thrown? clojure.lang.ArityException (generate-test '(a :b "c")))) + (is (thrown? clojure.lang.ArityException (generate-test true))) + (is (thrown? clojure.lang.ArityException (generate-test "test"))) + (is (thrown? clojure.lang.ArityException (generate-test :test))) + (is (thrown? clojure.lang.ArityException (generate-test 0))) + (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 "."))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(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 test-find-vars-in-reader (testing "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 - (= + (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 - "Return a list of names of variables declared in the stream this reader reads") - 'nil)) - (is (= (find-vars-in-reader nil) 'nil)) - (is (= (find-vars-in-reader true) 'nil)))) + "Return a list of names of vars declared in the stream this reader reads"))) + (is + (thrown? java.lang.ClassCastException (find-vars-in-reader false))) + (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? java.io.FileNotFoundException (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? java.io.FileNotFoundException (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 (thrown? java.io.FileNotFoundException (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?