|
21 | 21 | (:use [clojure.instant :only [read-instant-date |
22 | 22 | read-instant-calendar |
23 | 23 | read-instant-timestamp]]) |
| 24 | + (:require clojure.walk) |
24 | 25 | (:import [clojure.lang BigInt Ratio] |
25 | 26 | java.io.File |
26 | 27 | java.util.TimeZone)) |
|
395 | 396 |
|
396 | 397 | ;; Metadata (^ or #^ (deprecated)) |
397 | 398 |
|
| 399 | +(deftest t-line-column-numbers |
| 400 | + (let [code "(ns reader-metadata-test |
| 401 | + (:require [clojure.java.io |
| 402 | + :refer (resource reader)])) |
| 403 | +
|
| 404 | +(let [a 5] |
| 405 | + ^:added-metadata |
| 406 | + (defn add-5 |
| 407 | + [x] |
| 408 | + (reduce + x (range a))))" |
| 409 | + stream (clojure.lang.LineNumberingPushbackReader. |
| 410 | + (java.io.StringReader. code)) |
| 411 | + top-levels (take-while identity (repeatedly #(read stream false nil))) |
| 412 | + expected-metadata '{ns {:line 1, :column 1} |
| 413 | + :require {:line 2, :column 3} |
| 414 | + resource {:line 3, :column 21} |
| 415 | + let {:line 5, :column 1} |
| 416 | + defn {:line 6, :column 3 :added-metadata true} |
| 417 | + reduce {:line 9, :column 5} |
| 418 | + range {:line 9, :column 17}} |
| 419 | + verified-forms (atom 0)] |
| 420 | + (doseq [form top-levels] |
| 421 | + (clojure.walk/postwalk |
| 422 | + #(when (list? %) |
| 423 | + (is (= (expected-metadata (first %)) |
| 424 | + (meta %))) |
| 425 | + (is (->> (meta %) |
| 426 | + vals |
| 427 | + (filter number?) |
| 428 | + (every? (partial instance? Integer)))) |
| 429 | + (swap! verified-forms inc)) |
| 430 | + form)) |
| 431 | + ;; sanity check against e.g. reading returning () |
| 432 | + (is (= (count expected-metadata) @verified-forms)))) |
| 433 | + |
398 | 434 | (deftest t-Metadata |
399 | 435 | (is (= (meta '^:static ^:awesome ^{:static false :bar :baz} sym) {:awesome true, :bar :baz, :static true}))) |
400 | 436 |
|
|
0 commit comments