undo_redo2_test.cljs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. (ns frontend.worker.undo-redo2-test
  2. (:require [clojure.test :as t :refer [deftest is testing use-fixtures]]
  3. [datascript.core :as d]
  4. [frontend.db :as db]
  5. [frontend.test.helper :as test-helper]
  6. [frontend.worker.undo-redo2 :as undo-redo2]
  7. [frontend.modules.outliner.core-test :as outliner-test]
  8. [frontend.test.fixtures :as fixtures]
  9. [frontend.worker.db-listener :as worker-db-listener]
  10. [frontend.state :as state]))
  11. ;; TODO: random property ops test
  12. (def test-db test-helper/test-db)
  13. (defn listen-db-fixture
  14. [f]
  15. (let [test-db-conn (db/get-db test-db false)]
  16. (assert (some? test-db-conn))
  17. (worker-db-listener/listen-db-changes! test-db test-db-conn
  18. {:handler-keys [:gen-undo-ops]})
  19. (f)
  20. (d/unlisten! test-db-conn :frontend.worker.db-listener/listen-db-changes!)))
  21. (defn disable-browser-fns
  22. [f]
  23. ;; get-selection-blocks has a js/document reference
  24. (with-redefs [state/get-selection-blocks (constantly [])]
  25. (f)))
  26. (use-fixtures :each
  27. disable-browser-fns
  28. fixtures/react-components
  29. fixtures/reset-db
  30. listen-db-fixture)
  31. (defn- undo-all!
  32. [conn]
  33. (loop [i 0]
  34. (let [r (undo-redo2/undo test-db conn)]
  35. (if (not= :frontend.worker.undo-redo2/empty-undo-stack r)
  36. (recur (inc i))
  37. (prn :undo-count i)))))
  38. (defn- redo-all!
  39. [conn]
  40. (loop [i 0]
  41. (let [r (undo-redo2/redo test-db conn)]
  42. (if (not= :frontend.worker.undo-redo2/empty-redo-stack r)
  43. (recur (inc i))
  44. (prn :redo-count i)))))
  45. (defn- get-datoms
  46. [db]
  47. (set (map (fn [d] [(:e d) (:a d) (:v d)]) (d/datoms db :eavt))))
  48. (deftest ^:long undo-redo-test
  49. (testing "Random mixed operations"
  50. (set! undo-redo2/max-stack-length 500)
  51. (let [*random-blocks (atom (outliner-test/get-blocks-ids))]
  52. (outliner-test/transact-random-tree!)
  53. (let [conn (db/get-db false)
  54. _ (outliner-test/run-random-mixed-ops! *random-blocks)
  55. db-after @conn]
  56. (undo-all! conn)
  57. (is (= (get-datoms @conn) #{}))
  58. (redo-all! conn)
  59. (is (= (get-datoms @conn) (get-datoms db-after)))))))