util_test.cljs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. (ns frontend.util-test
  2. (:require [cljs.test :refer [deftest is testing]]
  3. [frontend.util :as util]
  4. [frontend.config :as config]
  5. [frontend.modules.shortcut.data-helper :as shortcut-data-helper]))
  6. (deftest test-find-first
  7. (testing "find-first"
  8. (is (= 1 (util/find-first identity [1])))))
  9. (deftest test-delete-emoji-current-pos
  10. (testing "safe current position from end for emoji"
  11. (is (= 3 (util/safe-dec-current-pos-from-end "abc😀d" 5)))
  12. (is (= 3 (util/safe-dec-current-pos-from-end "abc😀" 5)))
  13. (is (= 0 (util/safe-dec-current-pos-from-end "😀" 2)))
  14. (is (= 0 (util/safe-dec-current-pos-from-end "a" 1)))
  15. (is (= 4 (util/safe-dec-current-pos-from-end "abcde" 5)))
  16. (is (= 1 (util/safe-dec-current-pos-from-end "中文" 2))))
  17. (testing "safe current position from start for emoji"
  18. (is (= 5 (util/safe-inc-current-pos-from-start "abc😀d" 3)))
  19. (is (= 2 (util/safe-inc-current-pos-from-start "😀" 0)))
  20. (is (= 2 (util/safe-inc-current-pos-from-start "abcde" 1)))
  21. (is (= 1 (util/safe-inc-current-pos-from-start "a" 0)))
  22. (is (= 1 (util/safe-inc-current-pos-from-start "中文" 0)))))
  23. (deftest test-get-line-pos
  24. (testing "get-line-pos"
  25. (is (= 3 (util/get-line-pos "abcde" 3)))
  26. (is (= 4 (util/get-line-pos "abcd\ne" 4)))
  27. (is (= 0 (util/get-line-pos "abcd\ne" 5)))
  28. (is (= 4 (util/get-line-pos "abc😀d" 5)))
  29. (is (= 1 (util/get-line-pos "abc\nde" 5)))
  30. (is (= 1 (util/get-line-pos "abc\n😀d" 6)))
  31. (is (= 2 (util/get-line-pos "ab\nc😀d" 6)))
  32. (is (= 1 (util/get-line-pos "abc\nde\nf" 5)))
  33. (is (= 1 (util/get-line-pos "abc\n😀d\ne" 6)))
  34. (is (= 2 (util/get-line-pos "ab\nc😀d\ne" 6)))))
  35. (deftest test-get-text-range
  36. (testing "get-text-range"
  37. (is (= "" (util/get-text-range "abcdefg" 0 true)))
  38. (is (= "" (util/get-text-range "abcdefg" 0 false)))
  39. (is (= "abcdefg" (util/get-text-range "abcdefg" 10 true)))
  40. (is (= "abcdefg" (util/get-text-range "abcdefg" 10 false)))
  41. (is (= "abc" (util/get-text-range "abcdefg" 3 true)))
  42. (is (= "abc" (util/get-text-range "abcdefg" 3 false)))
  43. (is (= "abc" (util/get-text-range "abcdefg\nhijklmn" 3 true)))
  44. (is (= "abcdefg\nhij" (util/get-text-range "abcdefg\nhijklmn" 3 false)))
  45. (is (= "abcdefg\nhijklmn" (util/get-text-range "abcdefg\nhijklmn" 10 false)))
  46. (is (= "abcdefg\nhijklmn\nopq" (util/get-text-range "abcdefg\nhijklmn\nopqrst" 3 false)))
  47. (is (= "a😀b" (util/get-text-range "a😀bcdefg" 3 true)))
  48. (is (= "a😀b" (util/get-text-range "a😀bcdefg" 3 false)))
  49. (is (= "a😀b" (util/get-text-range "a😀bcdefg\nhijklmn" 3 true)))
  50. (is (= "a😀bcdefg\nhij" (util/get-text-range "a😀bcdefg\nhijklmn" 3 false)))
  51. (is (= "a😀bcdefg\nh😀i" (util/get-text-range "a😀bcdefg\nh😀ijklmn" 3 false)))))
  52. (deftest test-memoize-last
  53. (testing "memoize-last add test"
  54. (let [actual-ops (atom 0)
  55. m+ (util/memoize-last (fn [x1 x2]
  56. (swap! actual-ops inc) ;; side effect for counting
  57. (+ x1 x2)))]
  58. (is (= (m+ 1 1) 2))
  59. (is (= @actual-ops 1))
  60. (is (= (m+ 1 1) 2))
  61. (is (= (m+ 1 1) 2))
  62. (is (= @actual-ops 1))
  63. (is (= (m+ 1 2) 3))
  64. (is (= @actual-ops 2))
  65. (is (= (m+ 2 3) 5))
  66. (is (= @actual-ops 3))
  67. (is (= (m+ 3 5) 8))
  68. (is (= @actual-ops 4))
  69. (is (= (m+ 3 5) 8))
  70. (is (= @actual-ops 4))))
  71. (testing "memoize-last nested mapping test"
  72. (let [actual-ops (atom 0)
  73. flatten-f (util/memoize-last (fn [& args]
  74. (swap! actual-ops inc) ;; side effect for counting
  75. (apply #'shortcut-data-helper/flatten-bindings-by-id (conj (vec args) nil true))))
  76. target (atom {:part1 {:date-picker/complete {:binding "enter"
  77. :fn "ui-handler/shortcut-complete"}
  78. :date-picker/prev-day {:binding "left"
  79. :fn "ui-handler/shortcut-prev-day"}}
  80. :part2 {:date-picker/next-day {:binding "right"
  81. :fn "ui-handler/shortcut-next-day"}
  82. :date-picker/prev-week {:binding ["up" "ctrl+p"]
  83. :fn "ui-handler/shortcut-prev-week"}}})]
  84. (is (= (flatten-f @target) {:date-picker/complete "enter"
  85. :date-picker/prev-day "left"
  86. :date-picker/next-day "right"
  87. :date-picker/prev-week ["up" "ctrl+p"]}))
  88. (is (= @actual-ops 1))
  89. (is (= (flatten-f @target) {:date-picker/complete "enter"
  90. :date-picker/prev-day "left"
  91. :date-picker/next-day "right"
  92. :date-picker/prev-week ["up" "ctrl+p"]}))
  93. (is (= @actual-ops 1))
  94. ;; edit value
  95. (swap! target assoc-in [:part1 :date-picker/complete :binding] "tab")
  96. (is (= (flatten-f @target) {:date-picker/complete "tab"
  97. :date-picker/prev-day "left"
  98. :date-picker/next-day "right"
  99. :date-picker/prev-week ["up" "ctrl+p"]}))
  100. (is (= @actual-ops 2))
  101. (is (= (flatten-f @target) {:date-picker/complete "tab"
  102. :date-picker/prev-day "left"
  103. :date-picker/next-day "right"
  104. :date-picker/prev-week ["up" "ctrl+p"]}))
  105. (is (= @actual-ops 2))
  106. (is (= (flatten-f @target) {:date-picker/complete "tab"
  107. :date-picker/prev-day "left"
  108. :date-picker/next-day "right"
  109. :date-picker/prev-week ["up" "ctrl+p"]}))
  110. (is (= @actual-ops 2))
  111. ;; edit key
  112. (swap! target assoc :part3 {:date-picker/next-week {:binding "down"
  113. :fn "ui-handler/shortcut-next-week"}})
  114. (is (= (flatten-f @target) {:date-picker/complete "tab"
  115. :date-picker/prev-day "left"
  116. :date-picker/next-day "right"
  117. :date-picker/prev-week ["up" "ctrl+p"]
  118. :date-picker/next-week "down"}))
  119. (is (= @actual-ops 3))
  120. (is (= (flatten-f @target) {:date-picker/complete "tab"
  121. :date-picker/prev-day "left"
  122. :date-picker/next-day "right"
  123. :date-picker/prev-week ["up" "ctrl+p"]
  124. :date-picker/next-week "down"}))
  125. (is (= @actual-ops 3)))))
  126. (deftest test-media-format-from-input
  127. (testing "predicate file type from ext (html5 supported)"
  128. (is (= (config/ext-of-audio? "file.mp3") true))
  129. (is (= (config/ext-of-audio? "fIle.mP3") true))
  130. (is (= (config/ext-of-audio? "https://x.com/file.mp3") true))
  131. (is (= (config/ext-of-audio? "file.wma") false))
  132. (is (= (config/ext-of-audio? "file.wma" false) true))
  133. (is (= (config/ext-of-video? "file.mp4") true))
  134. (is (= (config/ext-of-video? "file.mp3") false))
  135. (is (= (config/ext-of-image? "file.svg") true))
  136. (is (= (config/ext-of-image? "a.file.png") true))
  137. (is (= (config/ext-of-image? "file.tiff") false))))