{:version 2
 :cases
 [{:id :nil :source "nil" :readable "nil"}
  {:id :booleans :source "[true false]" :readable "[true false]"}
  {:id :escaped-string :source "\"line\\n\\t\\\"\\\\\"" :readable "\"line\\n\\t\\\"\\\\\""}
  {:id :named-characters
   :source "[\\newline \\space \\tab \\backspace \\formfeed \\return]"
   :readable "[\\newline \\space \\tab \\backspace \\formfeed \\return]"}
  {:id :unicode-character :source "\\λ" :readable "\\λ"}
  {:id :symbols-and-keywords
   :source "[plain ns/name :plain :ns/name]"
   :readable "[plain ns/name :plain :ns/name]"}
  {:id :numbers
   :source "[0 -1 9223372036854775808 42N 1.25 1.250M]"
   :readable "[0 -1 9223372036854775808N 42N 1.25 1.25M]"}
  {:id :collections
   :source "({:a [1 2] :b #{:x :y}})"
   :readable "({:a [1 2] :b #{:x :y}})"}
  {:id :reader-prefixes
   :source "['x `y ~z ~@items @state #'root]"
   :readable "[(quote x) (syntax-quote y) (unquote z) (unquote-splicing items) (deref state) (var root)]"}
  {:id :metadata
   :source "^:private [1]"
   :readable "[1]"}
  {:id :discard :source "[1 #_2 3]" :readable "[1 3]"}
  {:id :regex :source "#\"a\\\\d+\"" :readable "#\"a\\\\d+\""}
  {:id :symbolic-values
   :source "[##Inf ##-Inf ##NaN]"
   :readable "[##Inf ##-Inf ##NaN]"}

  {:id :whitespace-commas-comments :source "  1, ; ignored\n 2  " :readable "1 2"}
  {:id :empty-collections :source "[() [] {} #{}]" :readable "[() [] {} #{}]"}
  {:id :deeply-nested :source "[{:a (1 [2 #{3}])}]" :readable "[{:a (1 [2 #{3}])}]"}
  {:id :quote-family
   :source "[(quote a) (syntax-quote b) (unquote c) (unquote-splicing d) (deref e) (var f)]"
   :readable "[(quote a) (syntax-quote b) (unquote c) (unquote-splicing d) (deref e) (var f)]"}
  {:id :signed-integers :source "[+0 -0 +42 -42]" :readable "[0 0 42 -42]"}
  {:id :integer-boundaries
   :source "[-9223372036854775808 9223372036854775807 -9223372036854775809 9223372036854775808]"
   :readable "[-9223372036854775808 9223372036854775807 -9223372036854775809N 9223372036854775808N]"}
  {:id :explicit-bigints :source "[0N +42N -42N]" :readable "[0N 42N -42N]"}
  {:id :hex-integers :source "[0x0 0x2A -0x2A +0X2a]" :readable "[0 42 -42 42]"}
  {:id :octal-integers :source "[00 052 -052 +077]" :readable "[0 42 -42 63]"}
  {:id :radix-integers :source "[2r101010 8r52 16r2a 36r16 -2r101010]" :readable "[42 42 42 42 -42]"}
  {:id :floating-point
   :source "[0.0 1. 1e2 -1.25e-2]"
   :readable "[0.0 1.0 100.0 -0.0125]"}
  {:id :big-decimals
   :source "[0M 1.2500M -42M 1e2M]"
   :readable "[0M 1.25M -42M 1E+2M]"}
  {:id :character-singletons :source "[\\a \\0 \\λ \\雪]" :readable "[\\a \\0 \\λ \\雪]"}
  {:id :symbol-shapes :source "[+ - * ? ! foo.bar foo-bar foo? foo! a/b a/b/c]" :readable "[+ - * ? ! foo.bar foo-bar foo? foo! a/b a/b/c]"}
  {:id :keyword-shapes :source "[:+ :- :* :? :! :foo.bar :foo-bar :foo? :foo! :a/b]" :readable "[:+ :- :* :? :! :foo.bar :foo-bar :foo? :foo! :a/b]"}
  {:id :metadata-symbol
   :source "^private [2]"
   :readable "[2]"}
  {:id :nested-discard :source "[0 #_[1 #_2 3] 4]" :readable "[0 4]"}
  {:id :root-discard :source "#_1 2" :readable "2"}
  {:id :var-quote :source "#'ns/root" :readable "(var ns/root)"}
  {:id :unsupported-anonymous-function :source "#(1 2 3)" :error "No dispatch macro for: ("}
  {:id :tagged-literal :source "#example/tag {:a 1}" :readable "#example/tag{:a 1}"}
  {:id :multiple-top-level :source "nil true :a [1]" :readable "nil true :a [1]"}

  {:id :unmatched-delimiter :source ")" :error "Unmatched delimiter"}
  {:id :unterminated-string :source "\"" :error "EOF while reading string"}
  {:id :invalid-string-escape :source "\"\\q\"" :error "Unsupported escape character"}
  {:id :invalid-unicode-escape :source "\"\\u12X4\"" :error "Invalid digit"}
  {:id :odd-map :source "{:a 1 :b}" :error "even number of forms"}
  {:id :duplicate-map-key :source "{:a 1 :a 2}" :error "Duplicate key"}
  {:id :duplicate-set-item :source "#{1 1}" :error "Duplicate item"}
  {:id :unterminated-dispatch :source "#" :error "EOF while reading hash dispatch"}
  {:id :unknown-dispatch :source "#&" :error "No dispatch macro for: &"}
  {:id :invalid-metadata-value :source "^1 [2]" :error "Metadata must be"}
  {:id :invalid-metadata-target
   :source "^:private 1"
   :error "Metadata can only be applied"}
  {:id :missing-metadata-target :source "^:private" :error "EOF"}
  {:id :unsupported-ratio :source "1/2" :error "Ratios are not supported"}
  {:id :unsupported-negative-ratio :source "-10/3" :error "Ratios are not supported"}
  {:id :unterminated-list :source "(1 2" :error "EOF while reading"}
  {:id :unterminated-vector :source "[1 2" :error "EOF while reading"}
  {:id :unterminated-map :source "{:a 1" :error "EOF while reading"}
  {:id :unterminated-set :source "#{1 2" :error "EOF while reading"}
  {:id :mismatched-list :source "(1]" :error "Unmatched delimiter"}
  {:id :mismatched-vector :source "[1)" :error "Unmatched delimiter"}
  {:id :unreadable-form :source "#<opaque>" :error "Unreadable form"}
  {:id :unknown-symbolic :source "##Missing" :error "Unknown symbolic value"}
  {:id :unsupported-queue-dispatch :source "#[1 2]" :error "No dispatch macro for: ["}
  {:id :invalid-symbolic :source "##[1]" :error "Invalid"}
  {:id :invalid-hex :source "0xGG" :error "Invalid number"}
  {:id :invalid-radix-low :source "1r1" :error "Radix out of range"}
  {:id :invalid-radix-high :source "37r1" :error "Radix out of range"}
  {:id :invalid-radix-digit :source "2r2" :error "under radix 2"}
  {:id :invalid-octal :source "078" :error "Invalid number"}
  {:id :invalid-exponent :source "1e" :error "Invalid number"}
  {:id :invalid-bigint :source "1.0N" :error "Invalid number"}
  {:id :empty-keyword :source ":" :error "cannot be empty"}
  {:id :leading-slash-keyword :source ":/name" :error "start with a slash"}
  {:id :trailing-slash-keyword :source ":name/" :error "end with a slash"}
  {:id :multi-slash-keyword :source ":a/b/c" :error "only contain one slash"}
  {:id :missing-deref-target :source "@" :error "EOF"}
  {:id :missing-unquote-target :source "~" :error "EOF"}]}
