                          (read-string "::foo-bar"))))
   (is (= :clojure.core/foo-bar
          (do (alias 'core 'clojure.core)
-             (read-string "::core/foo-bar")))))
+             (read-string "::core/foo-bar"))))
+  (is (= :*+!-_? (read-string ":*+!-_?")))
+  (is (= :abc:def:ghi (read-string ":abc:def:ghi")))
+  (is (= :abc.def/ghi (read-string ":abc.def/ghi")))
+  (is (= :abc/def.ghi (read-string ":abc/def.ghi")))
+  (is (= :abc:def/ghi:jkl.mno (read-string ":abc:def/ghi:jkl.mno")))
+  (is (instance? clojure.lang.Keyword (read-string ":alphabet"))) )
 
 (deftest read-symbol
   (is (= 'foo (read-string "foo")))
   (is (= 'foo/bar (read-string "foo/bar")))
+  (is (= '*+!-_? (read-string "*+!-_?")))
+  (is (= 'abc:def:ghi (read-string "abc:def:ghi")))
+  (is (= 'abc.def/ghi (read-string "abc.def/ghi")))
+  (is (= 'abc/def.ghi (read-string "abc/def.ghi")))
+  (is (= 'abc:def/ghi:jkl.mno (read-string "abc:def/ghi:jkl.mno")))
+  (is (instance? clojure.lang.Symbol (read-string "alphabet")))
   (is (= "foo//" (str (read-string "foo//")))) ;; the clojure reader can't read this
   (is (= (str 'NaN) (str (read-string "NaN")))) ;; the clojure reader can't read this
   (is (= Double/POSITIVE_INFINITY (read-string "Infinity"))) ;; the clojure reader can't read this
   (is (= Double/POSITIVE_INFINITY (read-string "+Infinity"))) ;; the clojure reader can't read this
   (is (= Double/NEGATIVE_INFINITY (read-string "-Infinity")))) ;; the clojure reader can't read this
 
+(deftest read-specials
+  (is (= 'nil nil))
+  (is (= 'false false))
+  (is (= 'true true)))
+
 (deftest read-char
   (is (= \f (read-string "\\f")))
   (is (= \u0194 (read-string "\\u0194")))
   (is (= \a (read-string "\\x61"))) ;; the clojure reader can't read this
   (is (= \o123 (read-string "\\o123")))
-  (is (= \newline (read-string "\\newline"))))
+  (is (= \newline (read-string "\\newline")))
+  (is (= (char 0) (read-string "\\o0")))
+  (is (= (char 0) (read-string "\\o000")))
+  (is (= (char 0377) (read-string "\\o377")))
+  (is (= \A (read-string "\\u0041")))
+  (is (= (char 0xd7ff) (read-string "\\ud7ff")))
+  (is (= (char 0xe000) (read-string "\\ue000")))
+  (is (= (char 0xffff) (read-string "\\uffff"))))
 
 (deftest read-string*
   (is (= "foo bar" (read-string "\"foo bar\"")))


  (is (== 0x42e (read-string "0x42e")))
  (is (== +0x42e (read-string "+0x42e")))
  (is (== -0x42e (read-string "-0x42e"))))

(deftest read-floating
  (is (== 42.23 (read-string "42.23")))


(deftest read-eval
  (is (= 3 (read-string "#=(+ 1 2)"))))

(deftest read-tagged
  (is (= #inst "2010-11-12T13:14:15.666"
         (read-string "#inst \"2010-11-12T13:14:15.666\"")))
  (is (= #inst "2010-11-12T13:14:15.666"
         (read-string "#inst\"2010-11-12T13:14:15.666\"")))
  (is (= #uuid "550e8400-e29b-41d4-a716-446655440000"
         (read-string "#uuid \"550e8400-e29b-41d4-a716-446655440000\"")))
  (is (= #uuid "550e8400-e29b-41d4-a716-446655440000"
         (read-string "#uuid\"550e8400-e29b-41d4-a716-446655440000\"")))
  (when default-data-reader-fn
    (let [my-unknown (fn [tag val] {:unknown-tag tag :value val})]
      (is (= {:unknown-tag 'foo :value 'bar}
             (with-bindings {default-data-reader-fn my-unknown}
               (read-string "#foo bar")))))))

(defrecord foo [])
(defrecord bar [baz buz])

(deftest read-record
  (is (= (foo.) (read-string "#clojure.tools.reader_test.foo[]")))
  (is (= (foo.) (read-string "#clojure.tools.reader_test.foo []"))) ;; not valid in clojure
  (is (= (foo.) (read-string "#clojure.tools.reader_test.foo{}")))
  (is (= (assoc (foo.) :foo 'bar) (read-string "#clojure.tools.reader_test.foo{:foo bar}")))

  (is (= (map->bar {}) (read-string "#clojure.tools.reader_test.bar{}")))
  (is (= (bar. 1 nil) (read-string "#clojure.tools.reader_test.bar{:baz 1}")))
  (is (= (bar. 1 nil) (read-string "#clojure.tools.reader_test.bar[1 nil]")))
  (is (= (bar. 1 2) (read-string "#clojure.tools.reader_test.bar[1 2]"))))
