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?