|
450 | 450 | (-> (p/let [ctx (sci/init {:classes {'js js/globalThis :allow :all}}) |
451 | 451 | v (sci/eval-string* ctx |
452 | 452 | "(defn ^:async test-complex [] |
453 | | - (let [a (await (js/Promise.resolve 1)) |
454 | | - b (-> a inc (* 2) (+ (await (js/Promise.resolve 3)))) |
455 | | - c (if (await (js/Promise.resolve true)) |
456 | | - (let [x (await (js/Promise.resolve 10))] |
457 | | - (+ x b)) |
458 | | - 0) |
459 | | - d (loop [i 0 acc 0] |
460 | | - (if (< i 3) |
461 | | - (recur (inc i) (+ acc (await (js/Promise.resolve i)))) |
462 | | - acc)) |
463 | | - e (try |
464 | | - (+ (await (js/Promise.resolve 100)) |
465 | | - (throw (js/Error. \"oops\"))) |
466 | | - (catch :default err |
467 | | - (await (js/Promise.resolve 42)))) |
468 | | - f (case (await (js/Promise.resolve :x)) |
469 | | - :x (await (js/Promise.resolve :matched-x)) |
470 | | - :y :matched-y |
471 | | - :default) |
472 | | - g (letfn [(double [n] (* 2 n))] |
473 | | - (let [v (await (js/Promise.resolve 5))] |
474 | | - (double v))) |
475 | | - h (await ((^:async fn [x] (+ x (await (js/Promise.resolve 1)))) 10)) |
476 | | - i ((fn [x] (+ x 1)) (await (js/Promise.resolve 100))) |
477 | | - j (or (await (js/Promise.resolve nil)) |
478 | | - (await (js/Promise.resolve false)) |
479 | | - (await (js/Promise.resolve :found))) |
480 | | - k (and (await (js/Promise.resolve 1)) |
481 | | - (await (js/Promise.resolve 2)) |
482 | | - (await (js/Promise.resolve 3))) |
| 453 | + ;; All results boxed in vectors to detect unwrapped promises |
| 454 | + (let [a [(await (js/Promise.resolve 1))] |
| 455 | + b [(-> (first a) inc (* 2) (+ (await (js/Promise.resolve 3))))] |
| 456 | + c [(if (await (js/Promise.resolve true)) |
| 457 | + (let [x (await (js/Promise.resolve 10))] |
| 458 | + (+ x (first b))) |
| 459 | + 0)] |
| 460 | + d [(loop [i 0 acc 0] |
| 461 | + (if (< i 3) |
| 462 | + (recur (inc i) (+ acc (await (js/Promise.resolve i)))) |
| 463 | + acc))] |
| 464 | + e [(try |
| 465 | + (+ (await (js/Promise.resolve 100)) |
| 466 | + (throw (js/Error. \"oops\"))) |
| 467 | + (catch :default err |
| 468 | + (await (js/Promise.resolve 42))))] |
| 469 | + f [(case (await (js/Promise.resolve :x)) |
| 470 | + :x (await (js/Promise.resolve :matched-x)) |
| 471 | + :y :matched-y |
| 472 | + :default)] |
| 473 | + g [(letfn [(double [n] (* 2 n))] |
| 474 | + (let [v (await (js/Promise.resolve 5))] |
| 475 | + (double v)))] |
| 476 | + h [(await ((^:async fn [x] (+ x (await (js/Promise.resolve 1)))) 10))] |
| 477 | + i [((fn [x] (+ x 1)) (await (js/Promise.resolve 100)))] |
| 478 | + j [(or (await (js/Promise.resolve nil)) |
| 479 | + (await (js/Promise.resolve false)) |
| 480 | + (await (js/Promise.resolve :found)))] |
| 481 | + k [(and (await (js/Promise.resolve 1)) |
| 482 | + (await (js/Promise.resolve 2)) |
| 483 | + (await (js/Promise.resolve 3)))] |
483 | 484 | ;; test and short-circuit with falsy |
484 | 485 | and-atom (atom 0) |
485 | | - l (and (await (js/Promise.resolve false)) |
486 | | - (do (swap! and-atom inc) :never)) |
487 | | - l-side-effects @and-atom |
| 486 | + l [(and (await (js/Promise.resolve false)) |
| 487 | + (do (swap! and-atom inc) :never))] |
| 488 | + l-side-effects [@and-atom] |
488 | 489 | ;; test or short-circuit with truthy |
489 | 490 | or-atom (atom 0) |
490 | | - m (or (await (js/Promise.resolve :truthy)) |
491 | | - (do (swap! or-atom inc) :never)) |
492 | | - m-side-effects @or-atom |
| 491 | + m [(or (await (js/Promise.resolve :truthy)) |
| 492 | + (do (swap! or-atom inc) :never))] |
| 493 | + m-side-effects [@or-atom] |
493 | 494 | ;; async fn calling another async fn |
494 | | - n (let [async-add (^:async fn [x y] |
495 | | - (+ (await (js/Promise.resolve x)) |
496 | | - (await (js/Promise.resolve y)))) |
497 | | - async-mul (^:async fn [x y] |
498 | | - (* (await (async-add x 1)) |
499 | | - (await (js/Promise.resolve y))))] |
500 | | - (await (async-mul 2 3))) |
| 495 | + n [(let [async-add (^:async fn [x y] |
| 496 | + (+ (await (js/Promise.resolve x)) |
| 497 | + (await (js/Promise.resolve y)))) |
| 498 | + async-mul (^:async fn [x y] |
| 499 | + (* (await (async-add x 1)) |
| 500 | + (await (js/Promise.resolve y))))] |
| 501 | + (await (async-mul 2 3)))] |
501 | 502 | ;; nested do blocks |
502 | | - o (do |
503 | | - (do |
504 | | - (await (js/Promise.resolve :inner)) |
505 | | - (do |
506 | | - (await (js/Promise.resolve :deeper)) |
507 | | - :nested-result))) |
| 503 | + o [(do |
| 504 | + (do |
| 505 | + (await (js/Promise.resolve :inner)) |
| 506 | + (do |
| 507 | + (await (js/Promise.resolve :deeper)) |
| 508 | + :nested-result)))] |
508 | 509 | ;; for comprehension with await |
509 | | - p (vec (for [x (await (js/Promise.resolve [1 2]))] |
510 | | - (* x 2)))] |
| 510 | + p [(vec (for [x (await (js/Promise.resolve [1 2]))] |
| 511 | + (* x 2)))]] |
511 | 512 | {:a a :b b :c c :d d :e e :f f :g g :h h :i i :j j :k k |
512 | 513 | :l l :l-side-effects l-side-effects |
513 | 514 | :m m :m-side-effects m-side-effects |
514 | 515 | :n n :o o :p p})) |
515 | 516 | (test-complex)")] |
516 | 517 | (p/let [result v] |
517 | | - (is (= {:a 1 :b 7 :c 17 :d 3 :e 42 :f :matched-x :g 10 :h 11 :i 101 |
518 | | - :j :found :k 3 |
519 | | - :l false :l-side-effects 0 |
520 | | - :m :truthy :m-side-effects 0 |
521 | | - :n 9 :o :nested-result :p [2 4]} result)))) |
| 518 | + (is (= {:a [1] :b [7] :c [17] :d [3] :e [42] :f [:matched-x] :g [10] :h [11] :i [101] |
| 519 | + :j [:found] :k [3] |
| 520 | + :l [false] :l-side-effects [0] |
| 521 | + :m [:truthy] :m-side-effects [0] |
| 522 | + :n [9] :o [:nested-result] :p [[2 4]]} result)))) |
522 | 523 | (p/catch (fn [err] |
523 | 524 | (is false (str err)))) |
524 | 525 | (p/finally done))))) |
0 commit comments