|
2 | 2 | (:require
|
3 | 3 | [cider.nrepl.middleware.util.instrument :as ins]
|
4 | 4 | [cider.nrepl.middleware.debug :as d]
|
| 5 | + [cider.test-helpers :refer :all] |
5 | 6 | [clojure.test :refer :all]
|
6 | 7 | [clojure.walk :as walk]
|
| 8 | + [matcher-combinators.matchers :as matchers] |
7 | 9 | [nrepl.middleware.interruptible-eval :refer [*msg*]]
|
8 | 10 | [nrepl.transport :as t]))
|
9 | 11 |
|
|
72 | 74 | ~m))
|
73 | 75 |
|
74 | 76 | (defmacro locals []
|
75 |
| - `~(#'d/sanitize-env &env)) |
| 77 | + `~(#'d/locals-capturer &env)) |
76 | 78 |
|
77 | 79 | (defmacro add-locals
|
78 | 80 | "Add locals to map m."
|
79 | 81 | [& [m]]
|
80 | 82 | `(assoc ~m
|
81 |
| - :locals ~(#'d/sanitize-env &env) |
| 83 | + :locals ~(#'d/locals-capturer &env) |
82 | 84 | :original-ns "user"))
|
83 | 85 |
|
84 | 86 | (deftest read-debug-input-roundtrip
|
|
200 | 202 |
|
201 | 203 | (deftest breakpoint
|
202 | 204 | ;; Map merging
|
203 |
| - (with-redefs [d/read-debug-command (fn [_ v _ s] (assoc (:msg s) :value v)) |
204 |
| - d/debugger-message (atom [:fake]) |
205 |
| - d/*skip-breaks* (atom nil)] |
206 |
| - (binding [*msg* {:session (atom {}) |
207 |
| - :code :code |
208 |
| - :id :id |
209 |
| - :file :file |
210 |
| - :line :line |
211 |
| - :column :column}] |
212 |
| - (let [form `(d/with-initial-debug-bindings |
213 |
| - (d/breakpoint-if-interesting (inc 10) {:coor [6]} ~'(inc 10))) |
214 |
| - m (eval form)] |
215 |
| - (are [k v] (= (k m) v) |
216 |
| - :value 11 |
217 |
| - :file :file |
218 |
| - :line :line |
219 |
| - :column :column |
220 |
| - :code :code |
221 |
| - :original-id :id)) |
222 |
| - (reset! d/debugger-message [:fake]) |
223 |
| - ;; Locals capturing |
224 |
| - (is (= (:value (eval `(d/with-initial-debug-bindings |
225 |
| - (let [~'x 10] |
226 |
| - (d/breakpoint-if-interesting |
227 |
| - (locals) |
228 |
| - {:coor [1]} nil))))) |
229 |
| - '{x 10})) |
230 |
| - ;; Top-level sexps are not debugged, just returned. |
231 |
| - (is (= (eval `(d/with-initial-debug-bindings |
232 |
| - (let [~'x 10] |
233 |
| - (d/breakpoint-if-interesting |
234 |
| - (locals) |
235 |
| - {:coor []} |
236 |
| - nil)))) |
237 |
| - '{x 10}))))) |
| 205 | + (let [capture (atom nil)] |
| 206 | + (with-redefs [d/read-debug-command (fn [_ v _ s] |
| 207 | + (reset! capture (assoc (:msg s) :value v)) |
| 208 | + v) |
| 209 | + d/debugger-message (atom [:fake]) |
| 210 | + d/*skip-breaks* (atom nil)] |
| 211 | + (binding [*msg* {:session (atom {}) |
| 212 | + :code :code |
| 213 | + :id :id |
| 214 | + :file :file |
| 215 | + :line :line |
| 216 | + :column :column}] |
| 217 | + (let [form `(d/with-initial-debug-bindings |
| 218 | + (d/breakpoint-if-interesting (inc 10) {:coor [6]} ~'(inc 10))) |
| 219 | + m (eval form)] |
| 220 | + (is+ {:value 11 |
| 221 | + :file :file |
| 222 | + :line :line |
| 223 | + :column :column |
| 224 | + :code :code |
| 225 | + :original-id :id} |
| 226 | + @capture)) |
| 227 | + (reset! d/debugger-message [:fake]) |
| 228 | + ;; Locals capturing |
| 229 | + (eval `(d/with-initial-debug-bindings |
| 230 | + (let [~'x 10] |
| 231 | + (d/breakpoint-if-interesting |
| 232 | + (locals) {:coor [1]} nil)))) |
| 233 | + (is (= (:value @capture) '{x 10})) |
| 234 | + ;; Top-level sexps are not debugged, just returned. |
| 235 | + (is (= (eval `(d/with-initial-debug-bindings |
| 236 | + (let [~'x 10] |
| 237 | + (d/breakpoint-if-interesting |
| 238 | + (locals) |
| 239 | + {:coor []} |
| 240 | + nil)))) |
| 241 | + '{x 10})))))) |
| 242 | + |
| 243 | +(deftest instrumentation-stress-test |
| 244 | + (testing "able to compile this function full of locals" |
| 245 | + (is |
| 246 | + (-> '(defn a-fn [a0] |
| 247 | + (let [a0 (long (+)) |
| 248 | + a1 (long (+ a0)) |
| 249 | + a2 (+ a0 a1) |
| 250 | + a3 (+ a0 a1 a2) |
| 251 | + a4 (+ a0 a1 a2 a3) |
| 252 | + a5 (+ a0 a1 a2 a3 a4) |
| 253 | + a6 (+ a0 a1 a2 a3 a4 a5) |
| 254 | + a7 (+ a0 a1 a2 a3 a4 a5 a6) |
| 255 | + a8 (+ a0 a1 a2 a3 a4 a5 a6 a7) |
| 256 | + a9 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8) |
| 257 | + a10 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) |
| 258 | + a11 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) |
| 259 | + a12 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) |
| 260 | + a13 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) |
| 261 | + a14 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) |
| 262 | + a15 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) |
| 263 | + a16 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) |
| 264 | + a17 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16) |
| 265 | + a18 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17) |
| 266 | + a19 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18) |
| 267 | + a20 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19) |
| 268 | + a21 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20) |
| 269 | + a22 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21) |
| 270 | + a23 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22) |
| 271 | + a24 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23) |
| 272 | + a25 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24) |
| 273 | + a26 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25)] |
| 274 | + a0)) |
| 275 | + d/debug-reader |
| 276 | + ins/instrument-tagged-code |
| 277 | + eval))) |
| 278 | + |
| 279 | + (testing "fails if there is one extra line" |
| 280 | + (is (thrown? clojure.lang.Compiler$CompilerException |
| 281 | + (-> '(defn a-fn [a0] |
| 282 | + (let [a0 (long (+)) |
| 283 | + a1 (long (+ a0)) |
| 284 | + a2 (+ a0 a1) |
| 285 | + a3 (+ a0 a1 a2) |
| 286 | + a4 (+ a0 a1 a2 a3) |
| 287 | + a5 (+ a0 a1 a2 a3 a4) |
| 288 | + a6 (+ a0 a1 a2 a3 a4 a5) |
| 289 | + a7 (+ a0 a1 a2 a3 a4 a5 a6) |
| 290 | + a8 (+ a0 a1 a2 a3 a4 a5 a6 a7) |
| 291 | + a9 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8) |
| 292 | + a10 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) |
| 293 | + a11 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) |
| 294 | + a12 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) |
| 295 | + a13 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) |
| 296 | + a14 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) |
| 297 | + a15 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) |
| 298 | + a16 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) |
| 299 | + a17 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16) |
| 300 | + a18 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17) |
| 301 | + a19 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18) |
| 302 | + a20 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19) |
| 303 | + a21 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20) |
| 304 | + a22 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21) |
| 305 | + a23 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22) |
| 306 | + a24 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23) |
| 307 | + a25 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24) |
| 308 | + a26 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25) |
| 309 | + a27 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26) |
| 310 | + a28 (+ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27)] |
| 311 | + a0)) |
| 312 | + d/debug-reader |
| 313 | + ins/instrument-tagged-code |
| 314 | + eval))))) |
0 commit comments