 ;; inputs is either a list or a function that, when called, will create a
 ;; random element of the set.
 (def csl-data-domains
-  [[(list "", "A", "\t", "\n", "B\n", "\n\n",
-          (apply str (repeat 50 \newline))
-          (apply str (repeat 50 \space))
-          (apply str (repeat 50 \s))
-          (apply str (take 50 (cycle (list \C \D \newline))))
-          (apply str (take 50 (cycle (list \x \newline \y \space))))
-          (apply str (take 50 (cycle (list \space \newline))))) 12 0] ;; "Special" inputs covering some base cases
-   [(fn [] (csl-input (inc (lrand-int 50)))) 88 1000]
+  [[(list ["" "" ""] ["" "a" "bc"] ["q" "" "to"]) 3 0] ;; Some small cases with empty strings
+   [(fn [] (repeat 3 (csl-input (lrand-int 50)))) 5 100] ;; Edge cases where all are the same
+   [(fn [] (sort-by count (repeatedly 3 #(csl-input (lrand-int 50))))) 20 200] ;; Cases forced to be in order
+   [(fn [] (repeatedly 3 #(csl-input (lrand-int 50)))) 72 700] ;; Cases in random order
    ])
 
 

  [data-domains]
  (let [[train-cases test-cases] (map csl-test-cases
                                      (test-and-train-data-from-domains data-domains))]
    (when false ;; Change to false to not print test cases
      (doseq [[i case] (map vector (range) train-cases)]
        (println (format "Train Case: %3d | Input/Output: %s" i (str case))))
      (doseq [[i case] (map vector (range) test-cases)]

  (concat (list
            (fn [] (lrand-nth (list true false))) ;Boolean
            ;;; end ERCs
            (tag-instruction-erc [:integer :boolean :string :exec] 1000)
            (tagged-instruction-erc 1000)
            ;;; end tag ERCs
            'in1
            'in2
            'in3
            ;;; end input instructions
            )
          (registered-for-stacks [:integer :boolean :string :exec])))


;; Define test cases
(defn csl-input
  "Makes a Compare String Lengths input string of length len."
  [len]
  (apply str
         (repeatedly len
