|
6 | 6 | [clojure.string :as str]
|
7 | 7 | [clojure.walk :as walk])
|
8 | 8 | (:import java.nio.charset.Charset
|
9 |
| - (java.io StringReader) |
| 9 | + (java.io StringReader BufferedReader) |
10 | 10 | clojure.lang.LineNumberingPushbackReader))
|
11 | 11 |
|
12 | 12 | (defn compare-forms-with-meta [expected-form actual-form]
|
|
28 | 28 |
|
29 | 29 | (defn test-reader
|
30 | 30 | "Return a fresh byte array input stream reading off test-bytes"
|
31 |
| - [] |
| 31 | + [test-contents] |
32 | 32 | (StringReader. test-contents))
|
33 | 33 |
|
| 34 | +(defn replace-newlines [s replacement] |
| 35 | + (str/replace s "\n" replacement)) |
| 36 | + |
34 | 37 | (def expected-haiku-ns
|
35 | 38 | (with-meta '(^{:line 1 :column 2 :end-line 1 :end-column 4 :file "haiku.clj"} ns
|
36 | 39 | ^{:line 1 :column 5 :end-line 1 :end-column 31 :file "haiku.clj"} clojure.tools.reader.haiku)
|
|
56 | 59 | {:line 8 :column 5 :end-line 10 :end-column 32 :file "haiku.clj"}))
|
57 | 60 | {:line 3 :column 1 :end-line 10 :end-column 33 :file "haiku.clj"}))
|
58 | 61 |
|
59 |
| -(deftest read-metadata |
60 |
| - (let [reader (-> (test-reader) |
61 |
| - (LineNumberingPushbackReader.) |
62 |
| - (reader-types/indexing-push-back-reader 1 "haiku.clj")) |
63 |
| - first-form (read reader) |
64 |
| - second-form (read reader)] |
| 62 | +(defn multiple-reader-variants-from-string [s filename] |
| 63 | + [(-> (test-reader s) |
| 64 | + (LineNumberingPushbackReader.) |
| 65 | + (reader-types/indexing-push-back-reader 1 filename)) |
| 66 | + (-> (test-reader s) |
| 67 | + (BufferedReader.) |
| 68 | + (reader-types/indexing-push-back-reader 1 filename))]) |
| 69 | + |
| 70 | +(defn read-metadata-helper [reader] |
| 71 | + (let [first-form (read reader) |
| 72 | + second-form (read reader) |
| 73 | + third-form (read reader false :eof)] |
65 | 74 | (is (= {:line 1 :column 1 :end-line 1 :end-column 32 :file "haiku.clj"} (meta first-form)))
|
66 | 75 | (compare-forms-with-meta expected-haiku-ns first-form)
|
67 |
| - (compare-forms-with-meta expected-haiku-defn second-form))) |
| 76 | + (compare-forms-with-meta expected-haiku-defn second-form) |
| 77 | + (is (= :eof third-form)))) |
| 78 | + |
| 79 | +(deftest read-metadata |
| 80 | + (doseq [s [test-contents |
| 81 | + (replace-newlines test-contents "\r") |
| 82 | + (replace-newlines test-contents "\r\n")] |
| 83 | + rdr (multiple-reader-variants-from-string s "haiku.clj")] |
| 84 | + (read-metadata-helper rdr))) |
68 | 85 |
|
69 | 86 | (def expected-haiku-ns-with-source
|
70 | 87 | (with-meta '(^{:line 1 :column 2 :end-line 1 :end-column 4 :source "ns" :file "haiku.clj"} ns
|
|
101 | 118 | ^{:last last-five} [1 2 3])
|
102 | 119 | first-five middle-seven))" :file "haiku.clj"}))
|
103 | 120 |
|
104 |
| -(deftest read-metadata-with-source |
105 |
| - (let [reader (-> (test-reader) |
| 121 | +(defn read-metadata-with-source-helper [rdr] |
| 122 | + (let [reader (-> rdr |
106 | 123 | (LineNumberingPushbackReader.)
|
107 | 124 | (reader-types/source-logging-push-back-reader 1 "haiku.clj"))
|
108 | 125 | first-form (read reader)
|
|
111 | 128 | (compare-forms-with-meta expected-haiku-ns-with-source first-form)
|
112 | 129 | (compare-forms-with-meta expected-haiku-defn-with-source second-form)))
|
113 | 130 |
|
| 131 | +(deftest read-metadata-with-source |
| 132 | + (doseq [s [test-contents |
| 133 | + (replace-newlines test-contents "\r") |
| 134 | + (replace-newlines test-contents "\r\n")]] |
| 135 | + (read-metadata-with-source-helper (test-reader s)))) |
| 136 | + |
114 | 137 |
|
115 | 138 | (def test2-contents
|
116 | 139 | (str/join "\n"
|
|
157 | 180 | (reader-types/indexing-push-back-reader 1 "vector.clj"))
|
158 | 181 | first-form (read reader)]
|
159 | 182 | (compare-forms-with-meta expected-vector first-form)))
|
| 183 | + |
| 184 | +(defn test-string [n linesep] |
| 185 | + (apply str (concat ["a "] (repeat n linesep) [" b"]))) |
| 186 | + |
| 187 | +(deftest many-consecutive-lineseps |
| 188 | + ;; With older versions of tools.reader, consecutive-lineseps of |
| 189 | + ;; 10,000, linesep "\r", and one of the variants of reader, would |
| 190 | + ;; cause a StackOverflowError exception. |
| 191 | + (doseq [consecutive-lineseps [1 10 10000] |
| 192 | + linesep ["\n" "\r" "\r\n"] |
| 193 | + reader (multiple-reader-variants-from-string |
| 194 | + (test-string consecutive-lineseps linesep) "foo.clj")] |
| 195 | + (let [first-form (read reader) |
| 196 | + second-form (read reader) |
| 197 | + third-form (read reader false :eof)] |
| 198 | + (is (= {:line 1 :column 1 :end-line 1 :end-column 2 :file "foo.clj"} (meta first-form))) |
| 199 | + (is (= {:line (inc consecutive-lineseps) :column 2 |
| 200 | + :end-line (inc consecutive-lineseps) :end-column 3 :file "foo.clj"} |
| 201 | + (meta second-form))) |
| 202 | + (is (= :eof third-form))))) |
0 commit comments