     (filter #((:pred %) proc encoding opts)
             [{:pred (constantly true)
               :desc "exemplar file"
+              :input transit-exemplars
               :path [:tests :exemplar-file]
-              :test #(test-transit transit-exemplars proc encoding)}
+              :test #(test-transit % proc encoding)}
              {:pred (constantly true)
               :desc "EDN corner case"
+              :input cc/forms
               :path [:tests :corner-case-edn]
-              :test #(test-edn cc/forms proc encoding)}
+              :test #(test-edn % proc encoding)}
              {:pred (fn [_ e _] (= e :json))
               :desc "JSON transit corner case"
+              :input (map (fn [s] (.getBytes s)) cc/transit-json)
               :path [:tests :corner-case-transit-json]
-              :test #(test-transit (map (fn [s] (.getBytes s)) cc/transit-json) proc encoding)}
+              :test #(test-transit % proc encoding)}
              {:pred (fn [_ _ o] (:gen o))
               :desc "generated EDN"
+              :input (:generated-forms opts)
               :path [:tests :generated-edn]
-              :test #(test-edn (:generated-forms opts) proc encoding)}
+              :test #(test-edn % proc encoding)}
              {:pred (fn [_ _ o] (:time o))
               :desc "timing"
+              :input transit-exemplars
               :path [:time]
-              :test #(let [ms (test-timing transit-exemplars proc encoding)]
+              :test #(let [ms (test-timing % proc encoding)]
                        {:ms ms
                         :count (count transit-exemplars)
                         :encoding encoding})}])))

      (str \u001b (style styles) s \u001b (:reset styles))
      s)))

(defn timeout-result? [results]
  (when-let [e (:exception results)]
    (= (:status (ex-data e)) :timeout)))

(defn exception-result? [results]
  (:exception results))

(defn not-implemented? [results]
  (every? #(= (:data-actual %) ::read-error) (apply concat (vals (:tests results)))))

;; TODO: when there is an exception, print out the form that was being
;; transmitted
;; TODO: would be nice if we could do the same thing we do with
;; timeouts and show the previous thing as well
(defn report [{:keys [project command encoding tests time] :as results} opts]
  (println (with-style :bright "Project: " project))
  (println "Command: " command)

  directories which have a `bin/roundtrip` script. Options can be used
  to control which project is tested, which encoding to test, turn on
  generative testing and collect timing information."
  (:require [clojure.java.io :as io]
            [clojure.walk :as walk]
            [transit.read :as r]
            [transit.write :as w]
            [transit.generators :as gen]
            [transit.corner-cases :as cc])
  (:import [java.io PrintStream ByteArrayOutputStream ByteArrayInputStream
            BufferedInputStream BufferedOutputStream FileInputStream]
           [org.apache.commons.codec.binary Hex]
           [java.math MathContext]))

(def TIMEOUT
  "Timeout for roundtrip requests to native implementation"
