css-mode-tests.el 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. ;;; css-mode-tests.el --- Test suite for CSS mode -*- lexical-binding: t; -*-
  2. ;; Copyright (C) 2016-2017 Free Software Foundation, Inc.
  3. ;; Author: Simen Heggestøyl <simenheg@gmail.com>
  4. ;; Keywords: internal
  5. ;; This file is part of GNU Emacs.
  6. ;; This program is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation, either version 3 of the License, or
  9. ;; (at your option) any later version.
  10. ;; This program is distributed in the hope that it will be useful,
  11. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ;; GNU General Public License for more details.
  14. ;; You should have received a copy of the GNU General Public License
  15. ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. ;;; Commentary:
  17. ;;; Code:
  18. (require 'css-mode)
  19. (require 'ert)
  20. (require 'seq)
  21. (ert-deftest css-test-property-values ()
  22. ;; The `float' property has a flat value list.
  23. (should
  24. (equal (seq-sort #'string-lessp (css--property-values "float"))
  25. '("left" "none" "right")))
  26. ;; The `list-style' property refers to several other properties.
  27. (should
  28. (equal (seq-sort #'string-lessp (css--property-values "list-style"))
  29. (seq-sort
  30. #'string-lessp
  31. (seq-uniq
  32. (append (css--property-values "list-style-type")
  33. (css--property-values "list-style-position")
  34. (css--property-values "list-style-image"))))))
  35. ;; The `position' property is tricky because it's also the name of a
  36. ;; value class.
  37. (should
  38. (equal (seq-sort #'string-lessp (css--property-values "position"))
  39. '("absolute" "fixed" "relative" "static")))
  40. ;; The `background-position' property should refer to the `position'
  41. ;; value class, not the property of the same name.
  42. (should
  43. (equal (css--property-values "background-position")
  44. (css--value-class-lookup 'position)))
  45. ;; Check that the `color' property doesn't cause infinite recursion
  46. ;; because it refers to the value class of the same name.
  47. (should (= (length (css--property-values "color")) 147)))
  48. (ert-deftest css-test-property-value-cache ()
  49. "Test that `css--property-value-cache' is in use."
  50. (should-not (gethash "word-wrap" css--property-value-cache))
  51. (let ((word-wrap-values (css--property-values "word-wrap")))
  52. (should (equal (gethash "word-wrap" css--property-value-cache)
  53. word-wrap-values))))
  54. (ert-deftest css-test-property-values-no-duplicates ()
  55. "Test that `css--property-values' returns no duplicates."
  56. ;; The `flex' property is prone to duplicate values; if they aren't
  57. ;; removed, it'll contain at least two instances of `auto'.
  58. (should
  59. (equal (seq-sort #'string-lessp (css--property-values "flex"))
  60. '("auto" "calc()" "content" "none"))))
  61. (ert-deftest css-test-value-class-lookup ()
  62. (should
  63. (equal (seq-sort #'string-lessp (css--value-class-lookup 'position))
  64. '("bottom" "calc()" "center" "left" "right" "top"))))
  65. ;;; Completion
  66. (defun css-mode-tests--completions ()
  67. (let ((data (css-completion-at-point)))
  68. (all-completions (buffer-substring (nth 0 data) (nth 1 data))
  69. (nth 2 data))))
  70. (ert-deftest css-test-complete-bang-rule ()
  71. (with-temp-buffer
  72. (css-mode)
  73. (insert "body { left: 0 !")
  74. (let ((completions (css-mode-tests--completions)))
  75. (should (member "important" completions))
  76. ;; Don't include SCSS bang-rules
  77. (should-not (member "default" completions)))))
  78. (ert-deftest scss-test-complete-bang-rule ()
  79. (with-temp-buffer
  80. (scss-mode)
  81. (insert "body { left: 0 !")
  82. (let ((completions (css-mode-tests--completions)))
  83. (should (member "important" completions))
  84. (should (member "default" completions)))))
  85. (ert-deftest css-test-complete-property-value ()
  86. (with-temp-buffer
  87. (css-mode)
  88. (insert "body { position: ")
  89. (let ((completions (css-mode-tests--completions)))
  90. (should
  91. (equal (seq-sort #'string-lessp completions)
  92. '("absolute" "fixed" "inherit" "initial" "relative"
  93. "static" "unset"))))))
  94. (ert-deftest css-test-complete-pseudo-class ()
  95. (with-temp-buffer
  96. (css-mode)
  97. (insert "body:a")
  98. (let ((completions (css-mode-tests--completions)))
  99. (should (member "active" completions))
  100. (should-not (member "disabled" completions))
  101. ;; Don't include pseudo-elements
  102. (should-not (member "after" completions)))))
  103. (ert-deftest css-test-complete-pseudo-element ()
  104. (with-temp-buffer
  105. (css-mode)
  106. (insert "body::a")
  107. (let ((completions (css-mode-tests--completions)))
  108. (should (member "after" completions))
  109. (should-not (member "disabled" completions))
  110. ;; Don't include pseudo-classes
  111. (should-not (member "active" completions)))))
  112. (ert-deftest css-test-complete-at-rule ()
  113. (with-temp-buffer
  114. (css-mode)
  115. (insert "@m")
  116. (let ((completions (css-mode-tests--completions)))
  117. (should (member "media" completions))
  118. (should-not (member "keyframes" completions))
  119. ;; Don't include SCSS at-rules
  120. (should-not (member "mixin" completions)))))
  121. (ert-deftest scss-test-complete-at-rule ()
  122. (with-temp-buffer
  123. (scss-mode)
  124. (insert "@m")
  125. (let ((completions (css-mode-tests--completions)))
  126. (should (member "media" completions))
  127. (should-not (member "keyframes" completions))
  128. (should (member "mixin" completions)))))
  129. (ert-deftest css-test-complete-property ()
  130. (with-temp-buffer
  131. (css-mode)
  132. (insert "body { f")
  133. (let ((completions (css-mode-tests--completions)))
  134. (should (member "filter" completions))
  135. (should-not (member "position" completions)))))
  136. (ert-deftest css-test-foreign-completions ()
  137. (let ((other-buffer-1 (generate-new-buffer "1"))
  138. (other-buffer-2 (generate-new-buffer "2")))
  139. (with-current-buffer other-buffer-1
  140. (setq-local css-class-list-function (lambda () '("foo" "bar"))))
  141. (with-current-buffer other-buffer-2
  142. (setq-local css-class-list-function (lambda () '("bar" "baz"))))
  143. (let ((completions
  144. (css--foreign-completions 'css-class-list-function)))
  145. ;; Completions from `other-buffer-1' and `other-buffer-2' should
  146. ;; be merged.
  147. (should (equal (seq-sort #'string-lessp completions)
  148. '("bar" "baz" "foo"))))
  149. (kill-buffer other-buffer-1)
  150. (kill-buffer other-buffer-2)))
  151. (ert-deftest css-test-complete-selector-tag ()
  152. (with-temp-buffer
  153. (css-mode)
  154. (insert "b")
  155. (let ((completions (css-mode-tests--completions)))
  156. (should (member "body" completions))
  157. (should-not (member "article" completions)))))
  158. (ert-deftest css-test-complete-selector-class ()
  159. (with-temp-buffer
  160. (setq-local css-class-list-function (lambda () '("foo" "bar")))
  161. (with-temp-buffer
  162. (css-mode)
  163. (insert ".f")
  164. (let ((completions (css-mode-tests--completions)))
  165. (should (equal completions '("foo")))))))
  166. (ert-deftest css-test-complete-selector-id ()
  167. (with-temp-buffer
  168. (setq-local css-id-list-function (lambda () '("foo" "bar")))
  169. (with-temp-buffer
  170. (css-mode)
  171. (insert "#b")
  172. (let ((completions (css-mode-tests--completions)))
  173. (should (equal completions '("bar")))))))
  174. (ert-deftest css-test-complete-nested-selector ()
  175. (with-temp-buffer
  176. (css-mode)
  177. (insert "body {")
  178. (let ((completions (css-mode-tests--completions)))
  179. (should-not (member "body" completions)))))
  180. (ert-deftest scss-test-complete-nested-selector ()
  181. (with-temp-buffer
  182. (scss-mode)
  183. (insert "body { b")
  184. (let ((completions (css-mode-tests--completions)))
  185. (should (member "body" completions))
  186. (should-not (member "article" completions)))))
  187. (provide 'css-mode-tests)
  188. ;;; css-mode-tests.el ends here