haml_ejs 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. data/.yardopts +11 -0
  2. data/CONTRIBUTING +3 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +68 -0
  5. data/Rakefile +419 -0
  6. data/VERSION +1 -0
  7. data/VERSION_NAME +1 -0
  8. data/bin/haml +9 -0
  9. data/bin/html2haml +7 -0
  10. data/extra/update_watch.rb +13 -0
  11. data/init.rb +18 -0
  12. data/lib/haml.rb +49 -0
  13. data/lib/haml/buffer.rb +297 -0
  14. data/lib/haml/compiler.rb +486 -0
  15. data/lib/haml/engine.rb +312 -0
  16. data/lib/haml/error.rb +22 -0
  17. data/lib/haml/exec.rb +362 -0
  18. data/lib/haml/filters.rb +388 -0
  19. data/lib/haml/haml_ejs.rb +57 -0
  20. data/lib/haml/helpers.rb +608 -0
  21. data/lib/haml/helpers/action_view_extensions.rb +57 -0
  22. data/lib/haml/helpers/action_view_mods.rb +257 -0
  23. data/lib/haml/helpers/xss_mods.rb +165 -0
  24. data/lib/haml/html.rb +412 -0
  25. data/lib/haml/html/erb.rb +141 -0
  26. data/lib/haml/parser.rb +760 -0
  27. data/lib/haml/railtie.rb +19 -0
  28. data/lib/haml/root.rb +7 -0
  29. data/lib/haml/shared.rb +78 -0
  30. data/lib/haml/template.rb +99 -0
  31. data/lib/haml/template/options.rb +16 -0
  32. data/lib/haml/template/patch.rb +58 -0
  33. data/lib/haml/template/plugin.rb +123 -0
  34. data/lib/haml/util.rb +842 -0
  35. data/lib/haml/version.rb +109 -0
  36. data/lib/sass.rb +8 -0
  37. data/lib/sass/plugin.rb +10 -0
  38. data/lib/sass/rails2_shim.rb +9 -0
  39. data/lib/sass/rails3_shim.rb +16 -0
  40. data/rails/init.rb +1 -0
  41. data/test/benchmark.rb +91 -0
  42. data/test/gemfiles/Gemfile.rails-2.0.x +8 -0
  43. data/test/gemfiles/Gemfile.rails-2.0.x.lock +38 -0
  44. data/test/gemfiles/Gemfile.rails-2.1.x +8 -0
  45. data/test/gemfiles/Gemfile.rails-2.1.x.lock +38 -0
  46. data/test/gemfiles/Gemfile.rails-2.2.x +8 -0
  47. data/test/gemfiles/Gemfile.rails-2.2.x.lock +38 -0
  48. data/test/gemfiles/Gemfile.rails-2.3.x +8 -0
  49. data/test/gemfiles/Gemfile.rails-2.3.x.lock +40 -0
  50. data/test/gemfiles/Gemfile.rails-3.0.x +8 -0
  51. data/test/gemfiles/Gemfile.rails-3.0.x.lock +85 -0
  52. data/test/gemfiles/Gemfile.rails-3.1.x +8 -0
  53. data/test/gemfiles/Gemfile.rails-3.1.x.lock +98 -0
  54. data/test/gemfiles/Gemfile.rails-xss-2.3.x +9 -0
  55. data/test/gemfiles/Gemfile.rails-xss-2.3.x.lock +42 -0
  56. data/test/haml-ejs/haml-ejs_test.rb +22 -0
  57. data/test/haml-ejs/templates/conditional.input +3 -0
  58. data/test/haml-ejs/templates/conditional.output +3 -0
  59. data/test/haml-ejs/templates/conditional_and_interpolation.input +2 -0
  60. data/test/haml-ejs/templates/conditional_and_interpolation.output +3 -0
  61. data/test/haml-ejs/templates/conditional_else.input +5 -0
  62. data/test/haml-ejs/templates/conditional_else.output +5 -0
  63. data/test/haml-ejs/templates/conditional_else_elsif.input +7 -0
  64. data/test/haml-ejs/templates/conditional_else_elsif.output +7 -0
  65. data/test/haml-ejs/templates/conditional_elsif.input +5 -0
  66. data/test/haml-ejs/templates/conditional_elsif.output +5 -0
  67. data/test/haml-ejs/templates/conditional_unless.input +3 -0
  68. data/test/haml-ejs/templates/conditional_unless.output +3 -0
  69. data/test/haml-ejs/templates/conditional_unless_else.input +5 -0
  70. data/test/haml-ejs/templates/conditional_unless_else.output +5 -0
  71. data/test/haml-ejs/templates/conditional_unless_elsif_else.input +5 -0
  72. data/test/haml-ejs/templates/conditional_unless_elsif_else.output +5 -0
  73. data/test/haml-ejs/templates/interpolation.input +2 -0
  74. data/test/haml-ejs/templates/interpolation.output +1 -0
  75. data/test/haml-ejs/templates/iteration.input +2 -0
  76. data/test/haml-ejs/templates/iteration.output +3 -0
  77. data/test/haml-ejs/templates/suite.input +26 -0
  78. data/test/haml-ejs/templates/suite.output +27 -0
  79. data/test/haml/engine_test.rb +1925 -0
  80. data/test/haml/erb/_av_partial_1.erb +12 -0
  81. data/test/haml/erb/_av_partial_2.erb +8 -0
  82. data/test/haml/erb/action_view.erb +62 -0
  83. data/test/haml/erb/standard.erb +55 -0
  84. data/test/haml/helper_test.rb +454 -0
  85. data/test/haml/html2haml/erb_tests.rb +440 -0
  86. data/test/haml/html2haml_test.rb +336 -0
  87. data/test/haml/markaby/standard.mab +52 -0
  88. data/test/haml/mocks/article.rb +6 -0
  89. data/test/haml/results/content_for_layout.xhtml +12 -0
  90. data/test/haml/results/eval_suppressed.xhtml +9 -0
  91. data/test/haml/results/filters.xhtml +62 -0
  92. data/test/haml/results/helpers.xhtml +70 -0
  93. data/test/haml/results/helpful.xhtml +10 -0
  94. data/test/haml/results/just_stuff.xhtml +70 -0
  95. data/test/haml/results/list.xhtml +12 -0
  96. data/test/haml/results/nuke_inner_whitespace.xhtml +40 -0
  97. data/test/haml/results/nuke_outer_whitespace.xhtml +148 -0
  98. data/test/haml/results/original_engine.xhtml +20 -0
  99. data/test/haml/results/partial_layout.xhtml +5 -0
  100. data/test/haml/results/partials.xhtml +21 -0
  101. data/test/haml/results/render_layout.xhtml +3 -0
  102. data/test/haml/results/silent_script.xhtml +74 -0
  103. data/test/haml/results/standard.xhtml +162 -0
  104. data/test/haml/results/tag_parsing.xhtml +23 -0
  105. data/test/haml/results/very_basic.xhtml +5 -0
  106. data/test/haml/results/whitespace_handling.xhtml +89 -0
  107. data/test/haml/spec/README.md +97 -0
  108. data/test/haml/spec/lua_haml_spec.lua +30 -0
  109. data/test/haml/spec/ruby_haml_test.rb +19 -0
  110. data/test/haml/spec/tests.json +534 -0
  111. data/test/haml/spec_test.rb +44 -0
  112. data/test/haml/template_test.rb +419 -0
  113. data/test/haml/templates/_av_partial_1.haml +9 -0
  114. data/test/haml/templates/_av_partial_1_ugly.haml +9 -0
  115. data/test/haml/templates/_av_partial_2.haml +5 -0
  116. data/test/haml/templates/_av_partial_2_ugly.haml +5 -0
  117. data/test/haml/templates/_layout.erb +3 -0
  118. data/test/haml/templates/_layout_for_partial.haml +3 -0
  119. data/test/haml/templates/_partial.haml +8 -0
  120. data/test/haml/templates/_text_area.haml +3 -0
  121. data/test/haml/templates/action_view.haml +47 -0
  122. data/test/haml/templates/action_view_ugly.haml +47 -0
  123. data/test/haml/templates/breakage.haml +8 -0
  124. data/test/haml/templates/content_for_layout.haml +8 -0
  125. data/test/haml/templates/eval_suppressed.haml +11 -0
  126. data/test/haml/templates/filters.haml +66 -0
  127. data/test/haml/templates/helpers.haml +55 -0
  128. data/test/haml/templates/helpful.haml +11 -0
  129. data/test/haml/templates/just_stuff.haml +85 -0
  130. data/test/haml/templates/list.haml +12 -0
  131. data/test/haml/templates/nuke_inner_whitespace.haml +32 -0
  132. data/test/haml/templates/nuke_outer_whitespace.haml +144 -0
  133. data/test/haml/templates/original_engine.haml +17 -0
  134. data/test/haml/templates/partial_layout.haml +10 -0
  135. data/test/haml/templates/partialize.haml +1 -0
  136. data/test/haml/templates/partials.haml +12 -0
  137. data/test/haml/templates/render_layout.haml +2 -0
  138. data/test/haml/templates/silent_script.haml +40 -0
  139. data/test/haml/templates/standard.haml +43 -0
  140. data/test/haml/templates/standard_ugly.haml +43 -0
  141. data/test/haml/templates/tag_parsing.haml +21 -0
  142. data/test/haml/templates/very_basic.haml +4 -0
  143. data/test/haml/templates/whitespace_handling.haml +87 -0
  144. data/test/haml/util_test.rb +300 -0
  145. data/test/linked_rails.rb +42 -0
  146. data/test/test_helper.rb +75 -0
  147. data/vendor/sass/CONTRIBUTING +3 -0
  148. data/vendor/sass/MIT-LICENSE +20 -0
  149. data/vendor/sass/README.md +201 -0
  150. data/vendor/sass/Rakefile +339 -0
  151. data/vendor/sass/TODO +39 -0
  152. data/vendor/sass/VERSION +1 -0
  153. data/vendor/sass/VERSION_NAME +1 -0
  154. data/vendor/sass/bin/sass +8 -0
  155. data/vendor/sass/bin/sass-convert +7 -0
  156. data/vendor/sass/bin/scss +8 -0
  157. data/vendor/sass/doc-src/FAQ.md +35 -0
  158. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +210 -0
  159. data/vendor/sass/doc-src/SASS_CHANGELOG.md +2214 -0
  160. data/vendor/sass/doc-src/SASS_REFERENCE.md +1957 -0
  161. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +155 -0
  162. data/vendor/sass/ext/extconf.rb +10 -0
  163. data/vendor/sass/extra/update_watch.rb +13 -0
  164. data/vendor/sass/init.rb +18 -0
  165. data/vendor/sass/lib/sass.rb +72 -0
  166. data/vendor/sass/lib/sass/cache_stores.rb +15 -0
  167. data/vendor/sass/lib/sass/cache_stores/base.rb +84 -0
  168. data/vendor/sass/lib/sass/cache_stores/chain.rb +33 -0
  169. data/vendor/sass/lib/sass/cache_stores/filesystem.rb +58 -0
  170. data/vendor/sass/lib/sass/cache_stores/memory.rb +47 -0
  171. data/vendor/sass/lib/sass/cache_stores/null.rb +25 -0
  172. data/vendor/sass/lib/sass/callbacks.rb +66 -0
  173. data/vendor/sass/lib/sass/css.rb +294 -0
  174. data/vendor/sass/lib/sass/engine.rb +862 -0
  175. data/vendor/sass/lib/sass/environment.rb +155 -0
  176. data/vendor/sass/lib/sass/error.rb +201 -0
  177. data/vendor/sass/lib/sass/exec.rb +659 -0
  178. data/vendor/sass/lib/sass/importers.rb +22 -0
  179. data/vendor/sass/lib/sass/importers/base.rb +138 -0
  180. data/vendor/sass/lib/sass/importers/filesystem.rb +144 -0
  181. data/vendor/sass/lib/sass/less.rb +382 -0
  182. data/vendor/sass/lib/sass/plugin.rb +136 -0
  183. data/vendor/sass/lib/sass/plugin/compiler.rb +358 -0
  184. data/vendor/sass/lib/sass/plugin/configuration.rb +125 -0
  185. data/vendor/sass/lib/sass/plugin/generic.rb +15 -0
  186. data/vendor/sass/lib/sass/plugin/merb.rb +48 -0
  187. data/vendor/sass/lib/sass/plugin/rack.rb +60 -0
  188. data/vendor/sass/lib/sass/plugin/rails.rb +47 -0
  189. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +173 -0
  190. data/vendor/sass/lib/sass/railtie.rb +9 -0
  191. data/vendor/sass/lib/sass/repl.rb +58 -0
  192. data/vendor/sass/lib/sass/root.rb +7 -0
  193. data/vendor/sass/lib/sass/script.rb +40 -0
  194. data/vendor/sass/lib/sass/script/bool.rb +18 -0
  195. data/vendor/sass/lib/sass/script/color.rb +480 -0
  196. data/vendor/sass/lib/sass/script/css_lexer.rb +29 -0
  197. data/vendor/sass/lib/sass/script/css_parser.rb +31 -0
  198. data/vendor/sass/lib/sass/script/funcall.rb +162 -0
  199. data/vendor/sass/lib/sass/script/functions.rb +1343 -0
  200. data/vendor/sass/lib/sass/script/interpolation.rb +70 -0
  201. data/vendor/sass/lib/sass/script/lexer.rb +334 -0
  202. data/vendor/sass/lib/sass/script/list.rb +76 -0
  203. data/vendor/sass/lib/sass/script/literal.rb +245 -0
  204. data/vendor/sass/lib/sass/script/node.rb +91 -0
  205. data/vendor/sass/lib/sass/script/number.rb +429 -0
  206. data/vendor/sass/lib/sass/script/operation.rb +91 -0
  207. data/vendor/sass/lib/sass/script/parser.rb +467 -0
  208. data/vendor/sass/lib/sass/script/string.rb +51 -0
  209. data/vendor/sass/lib/sass/script/string_interpolation.rb +94 -0
  210. data/vendor/sass/lib/sass/script/unary_operation.rb +57 -0
  211. data/vendor/sass/lib/sass/script/variable.rb +54 -0
  212. data/vendor/sass/lib/sass/scss.rb +17 -0
  213. data/vendor/sass/lib/sass/scss/css_parser.rb +46 -0
  214. data/vendor/sass/lib/sass/scss/parser.rb +920 -0
  215. data/vendor/sass/lib/sass/scss/rx.rb +127 -0
  216. data/vendor/sass/lib/sass/scss/sass_parser.rb +11 -0
  217. data/vendor/sass/lib/sass/scss/script_lexer.rb +15 -0
  218. data/vendor/sass/lib/sass/scss/script_parser.rb +25 -0
  219. data/vendor/sass/lib/sass/scss/static_parser.rb +40 -0
  220. data/vendor/sass/lib/sass/selector.rb +361 -0
  221. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +62 -0
  222. data/vendor/sass/lib/sass/selector/comma_sequence.rb +81 -0
  223. data/vendor/sass/lib/sass/selector/sequence.rb +233 -0
  224. data/vendor/sass/lib/sass/selector/simple.rb +113 -0
  225. data/vendor/sass/lib/sass/selector/simple_sequence.rb +134 -0
  226. data/vendor/sass/lib/sass/shared.rb +78 -0
  227. data/vendor/sass/lib/sass/tree/charset_node.rb +22 -0
  228. data/vendor/sass/lib/sass/tree/comment_node.rb +77 -0
  229. data/vendor/sass/lib/sass/tree/debug_node.rb +18 -0
  230. data/vendor/sass/lib/sass/tree/directive_node.rb +23 -0
  231. data/vendor/sass/lib/sass/tree/each_node.rb +24 -0
  232. data/vendor/sass/lib/sass/tree/extend_node.rb +29 -0
  233. data/vendor/sass/lib/sass/tree/for_node.rb +36 -0
  234. data/vendor/sass/lib/sass/tree/function_node.rb +27 -0
  235. data/vendor/sass/lib/sass/tree/if_node.rb +65 -0
  236. data/vendor/sass/lib/sass/tree/import_node.rb +68 -0
  237. data/vendor/sass/lib/sass/tree/media_node.rb +32 -0
  238. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +27 -0
  239. data/vendor/sass/lib/sass/tree/mixin_node.rb +32 -0
  240. data/vendor/sass/lib/sass/tree/node.rb +204 -0
  241. data/vendor/sass/lib/sass/tree/prop_node.rb +155 -0
  242. data/vendor/sass/lib/sass/tree/return_node.rb +18 -0
  243. data/vendor/sass/lib/sass/tree/root_node.rb +28 -0
  244. data/vendor/sass/lib/sass/tree/rule_node.rb +129 -0
  245. data/vendor/sass/lib/sass/tree/variable_node.rb +30 -0
  246. data/vendor/sass/lib/sass/tree/visitors/base.rb +75 -0
  247. data/vendor/sass/lib/sass/tree/visitors/check_nesting.rb +134 -0
  248. data/vendor/sass/lib/sass/tree/visitors/convert.rb +255 -0
  249. data/vendor/sass/lib/sass/tree/visitors/cssize.rb +175 -0
  250. data/vendor/sass/lib/sass/tree/visitors/perform.rb +301 -0
  251. data/vendor/sass/lib/sass/tree/visitors/to_css.rb +216 -0
  252. data/vendor/sass/lib/sass/tree/warn_node.rb +18 -0
  253. data/vendor/sass/lib/sass/tree/while_node.rb +18 -0
  254. data/vendor/sass/lib/sass/util.rb +669 -0
  255. data/vendor/sass/lib/sass/util/subset_map.rb +101 -0
  256. data/vendor/sass/lib/sass/version.rb +112 -0
  257. data/vendor/sass/rails/init.rb +1 -0
  258. data/vendor/sass/sass.gemspec +32 -0
  259. data/vendor/sass/test/sass/cache_test.rb +74 -0
  260. data/vendor/sass/test/sass/callbacks_test.rb +61 -0
  261. data/vendor/sass/test/sass/conversion_test.rb +1203 -0
  262. data/vendor/sass/test/sass/css2sass_test.rb +364 -0
  263. data/vendor/sass/test/sass/data/hsl-rgb.txt +319 -0
  264. data/vendor/sass/test/sass/engine_test.rb +2469 -0
  265. data/vendor/sass/test/sass/extend_test.rb +1348 -0
  266. data/vendor/sass/test/sass/functions_test.rb +1025 -0
  267. data/vendor/sass/test/sass/importer_test.rb +82 -0
  268. data/vendor/sass/test/sass/less_conversion_test.rb +653 -0
  269. data/vendor/sass/test/sass/mock_importer.rb +49 -0
  270. data/vendor/sass/test/sass/more_results/more1.css +9 -0
  271. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +26 -0
  272. data/vendor/sass/test/sass/more_results/more_import.css +29 -0
  273. data/vendor/sass/test/sass/more_templates/_more_partial.sass +2 -0
  274. data/vendor/sass/test/sass/more_templates/more1.sass +23 -0
  275. data/vendor/sass/test/sass/more_templates/more_import.sass +11 -0
  276. data/vendor/sass/test/sass/plugin_test.rb +469 -0
  277. data/vendor/sass/test/sass/results/alt.css +4 -0
  278. data/vendor/sass/test/sass/results/basic.css +9 -0
  279. data/vendor/sass/test/sass/results/compact.css +5 -0
  280. data/vendor/sass/test/sass/results/complex.css +86 -0
  281. data/vendor/sass/test/sass/results/compressed.css +1 -0
  282. data/vendor/sass/test/sass/results/expanded.css +19 -0
  283. data/vendor/sass/test/sass/results/if.css +3 -0
  284. data/vendor/sass/test/sass/results/import.css +31 -0
  285. data/vendor/sass/test/sass/results/import_charset.css +4 -0
  286. data/vendor/sass/test/sass/results/import_charset_1_8.css +4 -0
  287. data/vendor/sass/test/sass/results/import_charset_ibm866.css +4 -0
  288. data/vendor/sass/test/sass/results/line_numbers.css +49 -0
  289. data/vendor/sass/test/sass/results/mixins.css +95 -0
  290. data/vendor/sass/test/sass/results/multiline.css +24 -0
  291. data/vendor/sass/test/sass/results/nested.css +22 -0
  292. data/vendor/sass/test/sass/results/options.css +1 -0
  293. data/vendor/sass/test/sass/results/parent_ref.css +13 -0
  294. data/vendor/sass/test/sass/results/script.css +16 -0
  295. data/vendor/sass/test/sass/results/scss_import.css +31 -0
  296. data/vendor/sass/test/sass/results/scss_importee.css +2 -0
  297. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  298. data/vendor/sass/test/sass/results/subdir/subdir.css +3 -0
  299. data/vendor/sass/test/sass/results/units.css +11 -0
  300. data/vendor/sass/test/sass/results/warn.css +0 -0
  301. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  302. data/vendor/sass/test/sass/script_conversion_test.rb +283 -0
  303. data/vendor/sass/test/sass/script_test.rb +496 -0
  304. data/vendor/sass/test/sass/scss/css_test.rb +916 -0
  305. data/vendor/sass/test/sass/scss/rx_test.rb +156 -0
  306. data/vendor/sass/test/sass/scss/scss_test.rb +1249 -0
  307. data/vendor/sass/test/sass/scss/test_helper.rb +37 -0
  308. data/vendor/sass/test/sass/templates/_imported_charset_ibm866.sass +4 -0
  309. data/vendor/sass/test/sass/templates/_imported_charset_utf8.sass +4 -0
  310. data/vendor/sass/test/sass/templates/_partial.sass +2 -0
  311. data/vendor/sass/test/sass/templates/alt.sass +16 -0
  312. data/vendor/sass/test/sass/templates/basic.sass +23 -0
  313. data/vendor/sass/test/sass/templates/bork1.sass +2 -0
  314. data/vendor/sass/test/sass/templates/bork2.sass +2 -0
  315. data/vendor/sass/test/sass/templates/bork3.sass +2 -0
  316. data/vendor/sass/test/sass/templates/bork4.sass +2 -0
  317. data/vendor/sass/test/sass/templates/compact.sass +17 -0
  318. data/vendor/sass/test/sass/templates/complex.sass +305 -0
  319. data/vendor/sass/test/sass/templates/compressed.sass +15 -0
  320. data/vendor/sass/test/sass/templates/expanded.sass +17 -0
  321. data/vendor/sass/test/sass/templates/if.sass +11 -0
  322. data/vendor/sass/test/sass/templates/import.sass +12 -0
  323. data/vendor/sass/test/sass/templates/import_charset.sass +7 -0
  324. data/vendor/sass/test/sass/templates/import_charset_1_8.sass +4 -0
  325. data/vendor/sass/test/sass/templates/import_charset_ibm866.sass +9 -0
  326. data/vendor/sass/test/sass/templates/importee.less +2 -0
  327. data/vendor/sass/test/sass/templates/importee.sass +19 -0
  328. data/vendor/sass/test/sass/templates/line_numbers.sass +13 -0
  329. data/vendor/sass/test/sass/templates/mixin_bork.sass +5 -0
  330. data/vendor/sass/test/sass/templates/mixins.sass +76 -0
  331. data/vendor/sass/test/sass/templates/multiline.sass +20 -0
  332. data/vendor/sass/test/sass/templates/nested.sass +25 -0
  333. data/vendor/sass/test/sass/templates/nested_bork1.sass +2 -0
  334. data/vendor/sass/test/sass/templates/nested_bork2.sass +2 -0
  335. data/vendor/sass/test/sass/templates/nested_bork3.sass +2 -0
  336. data/vendor/sass/test/sass/templates/nested_bork4.sass +2 -0
  337. data/vendor/sass/test/sass/templates/nested_import.sass +2 -0
  338. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +6 -0
  339. data/vendor/sass/test/sass/templates/options.sass +2 -0
  340. data/vendor/sass/test/sass/templates/parent_ref.sass +25 -0
  341. data/vendor/sass/test/sass/templates/script.sass +101 -0
  342. data/vendor/sass/test/sass/templates/scss_import.scss +11 -0
  343. data/vendor/sass/test/sass/templates/scss_importee.scss +1 -0
  344. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  345. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  346. data/vendor/sass/test/sass/templates/subdir/subdir.sass +6 -0
  347. data/vendor/sass/test/sass/templates/units.sass +11 -0
  348. data/vendor/sass/test/sass/templates/warn.sass +3 -0
  349. data/vendor/sass/test/sass/templates/warn_imported.sass +4 -0
  350. data/vendor/sass/test/sass/test_helper.rb +8 -0
  351. data/vendor/sass/test/sass/util/subset_map_test.rb +91 -0
  352. data/vendor/sass/test/sass/util_test.rb +254 -0
  353. data/vendor/sass/test/test_helper.rb +69 -0
  354. data/vendor/sass/yard/callbacks.rb +29 -0
  355. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +26 -0
  356. data/vendor/sass/yard/default/layout/html/footer.erb +12 -0
  357. data/vendor/sass/yard/inherited_hash.rb +41 -0
  358. metadata +458 -0
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require File.dirname(__FILE__) + '/../../test_helper'
4
+ require 'sass/engine'
5
+
6
+ class ScssRxTest < Test::Unit::TestCase
7
+ include Sass::SCSS::RX
8
+
9
+ def test_identifiers
10
+ assert_match IDENT, "foo"
11
+ assert_match IDENT, "\xC3\xBFoo" # Initial char can be nonascii
12
+ assert_match IDENT, "\\123abcoo" # Initial char can be unicode escape
13
+ assert_match IDENT, "\\f oo" # Unicode escapes can be followed by whitespace
14
+ assert_match IDENT, "\\fa\too"
15
+ assert_match IDENT, "\\ff2\roo"
16
+ assert_match IDENT, "\\f13a\foo"
17
+ assert_match IDENT, "\\f13abcoo"
18
+ assert_match IDENT, "\\ oo" # Initial char can be a plain escape as well
19
+ assert_match IDENT, "\\~oo"
20
+ assert_match IDENT, "\\\\oo"
21
+ assert_match IDENT, "\\{oo"
22
+ assert_match IDENT, "\\\xC3\xBFoo"
23
+ assert_match IDENT, "-foo" # Can put a - before anything
24
+ assert_match IDENT, "-\xC3\xBFoo"
25
+ assert_match IDENT, "-\\f oo"
26
+ assert_match IDENT, "_foo" # Can put a _ before anything
27
+ assert_match IDENT, "_\xC3\xBFoo"
28
+ assert_match IDENT, "_\\f oo"
29
+
30
+ assert_match IDENT, "foo-bar"
31
+ assert_match IDENT, "f012-23"
32
+ assert_match IDENT, "foo_-_bar"
33
+ assert_match IDENT, "f012_23"
34
+
35
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-003.xht
36
+ assert_match IDENT, "c\\lass"
37
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-004.xht
38
+ assert_match IDENT, "c\\00006Cas\\000073"
39
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-001.xht
40
+ assert_match IDENT, "IdE6n-3t0_6"
41
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-006.xht
42
+ assert_match IDENT, "\\6000ident"
43
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-007.xht
44
+ assert_match IDENT, "iden\\6000t\\6000"
45
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-013.xht
46
+ assert_match IDENT, "\\-ident"
47
+ end
48
+
49
+ def test_underscores_in_identifiers
50
+ assert_match IDENT, "foo_bar"
51
+ assert_match IDENT, "_\xC3\xBFfoo"
52
+ assert_match IDENT, "__foo"
53
+ assert_match IDENT, "_1foo"
54
+ assert_match IDENT, "-_foo"
55
+ assert_match IDENT, "_-foo"
56
+ end
57
+
58
+ def test_invalid_identifiers
59
+ assert_no_match IDENT, ""
60
+ assert_no_match IDENT, "1foo"
61
+ assert_no_match IDENT, "-1foo"
62
+ assert_no_match IDENT, "--foo"
63
+ assert_no_match IDENT, "foo bar"
64
+ assert_no_match IDENT, "foo~bar"
65
+
66
+ # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-008.xht
67
+ assert_no_match IDENT, "c\\06C ass"
68
+ assert_no_match IDENT, "back\\67\n round"
69
+ end
70
+
71
+ def test_double_quote_strings
72
+ assert_match STRING, '"foo bar"'
73
+ assert_match STRING, '"foo\\\nbar"'
74
+ assert_match STRING, "\"\\\"\""
75
+ assert_match STRING, '"\t !#$%&(-~()*+,-./0123456789~"'
76
+ end
77
+
78
+ def test_single_quote_strings
79
+ assert_match STRING, "'foo bar'"
80
+ assert_match STRING, "'foo\\\nbar'"
81
+ assert_match STRING, "'\\''"
82
+ assert_match STRING, "'\t !#\$%&(-~()*+,-./0123456789~'"
83
+ end
84
+
85
+ def test_invalid_strings
86
+ assert_no_match STRING, "\"foo\nbar\""
87
+ assert_no_match STRING, "\"foo\"bar\""
88
+ assert_no_match STRING, "'foo\nbar'"
89
+ assert_no_match STRING, "'foo'bar'"
90
+ end
91
+
92
+ def test_uri
93
+ assert_match URI, 'url("foo bar)")'
94
+ assert_match URI, "url('foo bar)')"
95
+ assert_match URI, 'url( "foo bar)" )'
96
+ assert_match URI, "url(#\\%&**+,-./0123456789~)"
97
+ end
98
+
99
+ def test_invalid_uri
100
+ assert_no_match URI, 'url(foo)bar)'
101
+ end
102
+
103
+ def test_unicode_range
104
+ assert_match UNICODERANGE, 'U+00-Ff'
105
+ assert_match UNICODERANGE, 'u+980-9FF'
106
+ assert_match UNICODERANGE, 'U+9aF??'
107
+ assert_match UNICODERANGE, 'U+??'
108
+ end
109
+
110
+ def test_escape_empty_ident
111
+ assert_equal "", Sass::SCSS::RX.escape_ident("")
112
+ end
113
+
114
+ def test_escape_just_prefix_ident
115
+ assert_equal "\\-", Sass::SCSS::RX.escape_ident("-")
116
+ assert_equal "\\_", Sass::SCSS::RX.escape_ident("_")
117
+ end
118
+
119
+ def test_escape_plain_ident
120
+ assert_equal "foo", Sass::SCSS::RX.escape_ident("foo")
121
+ assert_equal "foo-1bar", Sass::SCSS::RX.escape_ident("foo-1bar")
122
+ assert_equal "-foo-bar", Sass::SCSS::RX.escape_ident("-foo-bar")
123
+ assert_equal "f2oo_bar", Sass::SCSS::RX.escape_ident("f2oo_bar")
124
+ assert_equal "_foo_bar", Sass::SCSS::RX.escape_ident("_foo_bar")
125
+ end
126
+
127
+ def test_escape_initial_funky_ident
128
+ assert_equal "\\000035foo", Sass::SCSS::RX.escape_ident("5foo")
129
+ assert_equal "-\\000035foo", Sass::SCSS::RX.escape_ident("-5foo")
130
+ assert_equal "_\\000035foo", Sass::SCSS::RX.escape_ident("_5foo")
131
+
132
+ assert_equal "\\&foo", Sass::SCSS::RX.escape_ident("&foo")
133
+ assert_equal "-\\&foo", Sass::SCSS::RX.escape_ident("-&foo")
134
+
135
+ assert_equal "-\\ foo", Sass::SCSS::RX.escape_ident("- foo")
136
+ end
137
+
138
+ def test_escape_mid_funky_ident
139
+ assert_equal "foo\\&bar", Sass::SCSS::RX.escape_ident("foo&bar")
140
+ assert_equal "foo\\ \\ bar", Sass::SCSS::RX.escape_ident("foo bar")
141
+ assert_equal "foo\\00007fbar", Sass::SCSS::RX.escape_ident("foo\177bar")
142
+ end
143
+
144
+ private
145
+
146
+ def assert_match(rx, str)
147
+ assert_not_nil(match = rx.match(str))
148
+ assert_equal str.size, match[0].size
149
+ end
150
+
151
+ def assert_no_match(rx, str)
152
+ match = rx.match(str)
153
+ assert_not_equal str.size, match && match[0].size
154
+ end
155
+
156
+ end
@@ -0,0 +1,1249 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require File.dirname(__FILE__) + '/test_helper'
4
+
5
+ class ScssTest < Test::Unit::TestCase
6
+ include ScssTestHelper
7
+
8
+ ## One-Line Comments
9
+
10
+ def test_one_line_comments
11
+ assert_equal <<CSS, render(<<SCSS)
12
+ .foo {
13
+ baz: bang; }
14
+ CSS
15
+ .foo {// bar: baz;}
16
+ baz: bang; //}
17
+ }
18
+ SCSS
19
+ assert_equal <<CSS, render(<<SCSS)
20
+ .foo bar[val="//"] {
21
+ baz: bang; }
22
+ CSS
23
+ .foo bar[val="//"] {
24
+ baz: bang; //}
25
+ }
26
+ SCSS
27
+ end
28
+
29
+ ## Script
30
+
31
+ def test_variables
32
+ assert_equal <<CSS, render(<<SCSS)
33
+ blat {
34
+ a: foo; }
35
+ CSS
36
+ $var: foo;
37
+
38
+ blat {a: $var}
39
+ SCSS
40
+
41
+ assert_equal <<CSS, render(<<SCSS)
42
+ foo {
43
+ a: 2;
44
+ b: 6; }
45
+ CSS
46
+ foo {
47
+ $var: 2;
48
+ $another-var: 4;
49
+ a: $var;
50
+ b: $var + $another-var;}
51
+ SCSS
52
+ end
53
+
54
+ def test_unicode_variables
55
+ assert_equal <<CSS, render(<<SCSS)
56
+ blat {
57
+ a: foo; }
58
+ CSS
59
+ $vär: foo;
60
+
61
+ blat {a: $vär}
62
+ SCSS
63
+ end
64
+
65
+ def test_guard_assign
66
+ assert_equal <<CSS, render(<<SCSS)
67
+ foo {
68
+ a: 1; }
69
+ CSS
70
+ $var: 1;
71
+ $var: 2 !default;
72
+
73
+ foo {a: $var}
74
+ SCSS
75
+
76
+ assert_equal <<CSS, render(<<SCSS)
77
+ foo {
78
+ a: 2; }
79
+ CSS
80
+ $var: 2 !default;
81
+
82
+ foo {a: $var}
83
+ SCSS
84
+ end
85
+
86
+ def test_sass_script
87
+ assert_equal <<CSS, render(<<SCSS)
88
+ foo {
89
+ a: 3;
90
+ b: -1;
91
+ c: foobar;
92
+ d: 12px; }
93
+ CSS
94
+ foo {
95
+ a: 1 + 2;
96
+ b: 1 - 2;
97
+ c: foo + bar;
98
+ d: floor(12.3px); }
99
+ SCSS
100
+ end
101
+
102
+ def test_debug_directive
103
+ assert_warning "test_debug_directive_inline.scss:2 DEBUG: hello world!" do
104
+ assert_equal <<CSS, render(<<SCSS)
105
+ foo {
106
+ a: b; }
107
+
108
+ bar {
109
+ c: d; }
110
+ CSS
111
+ foo {a: b}
112
+ @debug "hello world!";
113
+ bar {c: d}
114
+ SCSS
115
+ end
116
+ end
117
+
118
+ def test_warn_directive
119
+ expected_warning = <<EXPECTATION
120
+ WARNING: this is a warning
121
+ on line 2 of test_warn_directive_inline.scss
122
+
123
+ WARNING: this is a mixin
124
+ on line 1 of test_warn_directive_inline.scss, in `foo'
125
+ from line 3 of test_warn_directive_inline.scss
126
+ EXPECTATION
127
+ assert_warning expected_warning do
128
+ assert_equal <<CSS, render(<<SCSS)
129
+ bar {
130
+ c: d; }
131
+ CSS
132
+ @mixin foo { @warn "this is a mixin";}
133
+ @warn "this is a warning";
134
+ bar {c: d; @include foo;}
135
+ SCSS
136
+ end
137
+ end
138
+
139
+ def test_for_directive
140
+ assert_equal <<CSS, render(<<SCSS)
141
+ .foo {
142
+ a: 1;
143
+ a: 2;
144
+ a: 3;
145
+ a: 4; }
146
+ CSS
147
+ .foo {
148
+ @for $var from 1 to 5 {a: $var;}
149
+ }
150
+ SCSS
151
+
152
+ assert_equal <<CSS, render(<<SCSS)
153
+ .foo {
154
+ a: 1;
155
+ a: 2;
156
+ a: 3;
157
+ a: 4;
158
+ a: 5; }
159
+ CSS
160
+ .foo {
161
+ @for $var from 1 through 5 {a: $var;}
162
+ }
163
+ SCSS
164
+ end
165
+
166
+ def test_if_directive
167
+ assert_equal <<CSS, render(<<SCSS)
168
+ foo {
169
+ a: b; }
170
+ CSS
171
+ @if "foo" == "foo" {foo {a: b}}
172
+ @if "foo" != "foo" {bar {a: b}}
173
+ SCSS
174
+
175
+ assert_equal <<CSS, render(<<SCSS)
176
+ bar {
177
+ a: b; }
178
+ CSS
179
+ @if "foo" != "foo" {foo {a: b}}
180
+ @else if "foo" == "foo" {bar {a: b}}
181
+ @else if true {baz {a: b}}
182
+ SCSS
183
+
184
+ assert_equal <<CSS, render(<<SCSS)
185
+ bar {
186
+ a: b; }
187
+ CSS
188
+ @if "foo" != "foo" {foo {a: b}}
189
+ @else {bar {a: b}}
190
+ SCSS
191
+ end
192
+
193
+ def test_comment_after_if_directive
194
+ assert_equal <<CSS, render(<<SCSS)
195
+ foo {
196
+ a: b;
197
+ /* This is a comment */
198
+ c: d; }
199
+ CSS
200
+ foo {
201
+ @if true {a: b}
202
+ /* This is a comment */
203
+ c: d }
204
+ SCSS
205
+ assert_equal <<CSS, render(<<SCSS)
206
+ foo {
207
+ a: b;
208
+ /* This is a comment */
209
+ c: d; }
210
+ CSS
211
+ foo {
212
+ @if true {a: b}
213
+ @else {x: y}
214
+ /* This is a comment */
215
+ c: d }
216
+ SCSS
217
+ end
218
+
219
+ def test_while_directive
220
+ assert_equal <<CSS, render(<<SCSS)
221
+ .foo {
222
+ a: 1;
223
+ a: 2;
224
+ a: 3;
225
+ a: 4; }
226
+ CSS
227
+ $i: 1;
228
+
229
+ .foo {
230
+ @while $i != 5 {
231
+ a: $i;
232
+ $i: $i + 1;
233
+ }
234
+ }
235
+ SCSS
236
+ end
237
+
238
+ def test_each_directive
239
+ assert_equal <<CSS, render(<<SCSS)
240
+ a {
241
+ b: 1px;
242
+ b: 2px;
243
+ b: 3px;
244
+ b: 4px; }
245
+
246
+ c {
247
+ d: foo;
248
+ d: bar;
249
+ d: baz;
250
+ d: bang; }
251
+ CSS
252
+ a {
253
+ @each $number in 1px 2px 3px 4px {
254
+ b: $number;
255
+ }
256
+ }
257
+ c {
258
+ @each $str in foo, bar, baz, bang {
259
+ d: $str;
260
+ }
261
+ }
262
+ SCSS
263
+ end
264
+
265
+ def test_css_import_directive
266
+ assert_equal "@import url(foo.css);\n", render('@import "foo.css";')
267
+ assert_equal "@import url(foo.css);\n", render("@import 'foo.css';")
268
+ assert_equal "@import url(\"foo.css\");\n", render('@import url("foo.css");')
269
+ assert_equal "@import url('foo.css');\n", render("@import url('foo.css');")
270
+ assert_equal "@import url(foo.css);\n", render('@import url(foo.css);')
271
+ end
272
+
273
+ def test_media_import
274
+ assert_equal("@import \"./fonts.sass\" all;\n", render("@import \"./fonts.sass\" all;"))
275
+ end
276
+
277
+ def test_http_import
278
+ assert_equal("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";\n",
279
+ render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";"))
280
+ end
281
+
282
+ def test_url_import
283
+ assert_equal("@import url(fonts.sass);\n", render("@import url(fonts.sass);"))
284
+ end
285
+
286
+ def test_block_comment_in_script
287
+ assert_equal <<CSS, render(<<SCSS)
288
+ foo {
289
+ a: 1bar; }
290
+ CSS
291
+ foo {a: 1 + /* flang */ bar}
292
+ SCSS
293
+ end
294
+
295
+ def test_line_comment_in_script
296
+ assert_equal <<CSS, render(<<SCSS)
297
+ foo {
298
+ a: 1blang; }
299
+ CSS
300
+ foo {a: 1 + // flang }
301
+ blang }
302
+ SCSS
303
+ end
304
+
305
+ ## Nested Rules
306
+
307
+ def test_nested_rules
308
+ assert_equal <<CSS, render(<<SCSS)
309
+ foo bar {
310
+ a: b; }
311
+ CSS
312
+ foo {bar {a: b}}
313
+ SCSS
314
+ assert_equal <<CSS, render(<<SCSS)
315
+ foo bar {
316
+ a: b; }
317
+ foo baz {
318
+ b: c; }
319
+ CSS
320
+ foo {
321
+ bar {a: b}
322
+ baz {b: c}}
323
+ SCSS
324
+ assert_equal <<CSS, render(<<SCSS)
325
+ foo bar baz {
326
+ a: b; }
327
+ foo bang bip {
328
+ a: b; }
329
+ CSS
330
+ foo {
331
+ bar {baz {a: b}}
332
+ bang {bip {a: b}}}
333
+ SCSS
334
+ end
335
+
336
+ def test_nested_rules_with_declarations
337
+ assert_equal <<CSS, render(<<SCSS)
338
+ foo {
339
+ a: b; }
340
+ foo bar {
341
+ c: d; }
342
+ CSS
343
+ foo {
344
+ a: b;
345
+ bar {c: d}}
346
+ SCSS
347
+ assert_equal <<CSS, render(<<SCSS)
348
+ foo {
349
+ a: b; }
350
+ foo bar {
351
+ c: d; }
352
+ CSS
353
+ foo {
354
+ bar {c: d}
355
+ a: b}
356
+ SCSS
357
+ assert_equal <<CSS, render(<<SCSS)
358
+ foo {
359
+ ump: nump;
360
+ grump: clump; }
361
+ foo bar {
362
+ blat: bang;
363
+ habit: rabbit; }
364
+ foo bar baz {
365
+ a: b; }
366
+ foo bar bip {
367
+ c: d; }
368
+ foo bibble bap {
369
+ e: f; }
370
+ CSS
371
+ foo {
372
+ ump: nump;
373
+ grump: clump;
374
+ bar {
375
+ blat: bang;
376
+ habit: rabbit;
377
+ baz {a: b}
378
+ bip {c: d}}
379
+ bibble {
380
+ bap {e: f}}}
381
+ SCSS
382
+ end
383
+
384
+ def test_nested_rules_with_fancy_selectors
385
+ assert_equal <<CSS, render(<<SCSS)
386
+ foo .bar {
387
+ a: b; }
388
+ foo :baz {
389
+ c: d; }
390
+ foo bang:bop {
391
+ e: f; }
392
+ CSS
393
+ foo {
394
+ .bar {a: b}
395
+ :baz {c: d}
396
+ bang:bop {e: f}}
397
+ SCSS
398
+ end
399
+
400
+ def test_almost_ambiguous_nested_rules_and_declarations
401
+ assert_equal <<CSS, render(<<SCSS)
402
+ foo {
403
+ bar: baz bang bop biddle woo look at all these elems; }
404
+ foo bar:baz:bang:bop:biddle:woo:look:at:all:these:pseudoclasses {
405
+ a: b; }
406
+ foo bar:baz bang bop biddle woo look at all these elems {
407
+ a: b; }
408
+ CSS
409
+ foo {
410
+ bar:baz:bang:bop:biddle:woo:look:at:all:these:pseudoclasses {a: b};
411
+ bar:baz bang bop biddle woo look at all these elems {a: b};
412
+ bar:baz bang bop biddle woo look at all these elems; }
413
+ SCSS
414
+ end
415
+
416
+ def test_newlines_in_selectors
417
+ assert_equal <<CSS, render(<<SCSS)
418
+ foo
419
+ bar {
420
+ a: b; }
421
+ CSS
422
+ foo
423
+ bar {a: b}
424
+ SCSS
425
+
426
+ assert_equal <<CSS, render(<<SCSS)
427
+ foo baz,
428
+ foo bang,
429
+ bar baz,
430
+ bar bang {
431
+ a: b; }
432
+ CSS
433
+ foo,
434
+ bar {
435
+ baz,
436
+ bang {a: b}}
437
+ SCSS
438
+
439
+ assert_equal <<CSS, render(<<SCSS)
440
+ foo
441
+ bar baz
442
+ bang {
443
+ a: b; }
444
+ foo
445
+ bar bip bop {
446
+ c: d; }
447
+ CSS
448
+ foo
449
+ bar {
450
+ baz
451
+ bang {a: b}
452
+
453
+ bip bop {c: d}}
454
+ SCSS
455
+
456
+ assert_equal <<CSS, render(<<SCSS)
457
+ foo bang, foo bip
458
+ bop, bar
459
+ baz bang, bar
460
+ baz bip
461
+ bop {
462
+ a: b; }
463
+ CSS
464
+ foo, bar
465
+ baz {
466
+ bang, bip
467
+ bop {a: b}}
468
+ SCSS
469
+ end
470
+
471
+ def test_trailing_comma_in_selector
472
+ assert_equal <<CSS, render(<<SCSS)
473
+ #foo #bar,
474
+ #baz #boom {
475
+ a: b; }
476
+
477
+ #bip #bop {
478
+ c: d; }
479
+ CSS
480
+ #foo #bar,,
481
+ ,#baz #boom, {a: b}
482
+
483
+ #bip #bop, ,, {c: d}
484
+ SCSS
485
+ end
486
+
487
+ def test_parent_selectors
488
+ assert_equal <<CSS, render(<<SCSS)
489
+ foo:hover {
490
+ a: b; }
491
+ bar foo.baz {
492
+ c: d; }
493
+ CSS
494
+ foo {
495
+ &:hover {a: b}
496
+ bar &.baz {c: d}}
497
+ SCSS
498
+ end
499
+
500
+ ## Namespace Properties
501
+
502
+ def test_namespace_properties
503
+ assert_equal <<CSS, render(<<SCSS)
504
+ foo {
505
+ bar: baz;
506
+ bang-bip: 1px;
507
+ bang-bop: bar; }
508
+ CSS
509
+ foo {
510
+ bar: baz;
511
+ bang: {
512
+ bip: 1px;
513
+ bop: bar;}}
514
+ SCSS
515
+ end
516
+
517
+ def test_several_namespace_properties
518
+ assert_equal <<CSS, render(<<SCSS)
519
+ foo {
520
+ bar: baz;
521
+ bang-bip: 1px;
522
+ bang-bop: bar;
523
+ buzz-fram: "foo";
524
+ buzz-frum: moo; }
525
+ CSS
526
+ foo {
527
+ bar: baz;
528
+ bang: {
529
+ bip: 1px;
530
+ bop: bar;}
531
+ buzz: {
532
+ fram: "foo";
533
+ frum: moo;
534
+ }
535
+ }
536
+ SCSS
537
+ end
538
+
539
+ def test_nested_namespace_properties
540
+ assert_equal <<CSS, render(<<SCSS)
541
+ foo {
542
+ bar: baz;
543
+ bang-bip: 1px;
544
+ bang-bop: bar;
545
+ bang-blat-baf: bort; }
546
+ CSS
547
+ foo {
548
+ bar: baz;
549
+ bang: {
550
+ bip: 1px;
551
+ bop: bar;
552
+ blat:{baf:bort}}}
553
+ SCSS
554
+ end
555
+
556
+ def test_namespace_properties_with_value
557
+ assert_equal <<CSS, render(<<SCSS)
558
+ foo {
559
+ bar: baz;
560
+ bar-bip: bop;
561
+ bar-bing: bop; }
562
+ CSS
563
+ foo {
564
+ bar: baz {
565
+ bip: bop;
566
+ bing: bop; }}
567
+ SCSS
568
+ end
569
+
570
+ def test_namespace_properties_with_script_value
571
+ assert_equal <<CSS, render(<<SCSS)
572
+ foo {
573
+ bar: bazbang;
574
+ bar-bip: bop;
575
+ bar-bing: bop; }
576
+ CSS
577
+ foo {
578
+ bar: baz + bang {
579
+ bip: bop;
580
+ bing: bop; }}
581
+ SCSS
582
+ end
583
+
584
+ def test_no_namespace_properties_without_space
585
+ assert_equal <<CSS, render(<<SCSS)
586
+ foo bar:baz {
587
+ bip: bop; }
588
+ CSS
589
+ foo {
590
+ bar:baz {
591
+ bip: bop }}
592
+ SCSS
593
+ end
594
+
595
+ def test_no_namespace_properties_without_space_even_when_its_unambiguous
596
+ render(<<SCSS)
597
+ foo {
598
+ bar:1px {
599
+ bip: bop }}
600
+ SCSS
601
+ assert(false, "Expected syntax error")
602
+ rescue Sass::SyntaxError => e
603
+ assert_equal <<MESSAGE, e.message
604
+ Invalid CSS: a space is required between a property and its definition
605
+ when it has other properties nested beneath it.
606
+ MESSAGE
607
+ assert_equal 2, e.sass_line
608
+ end
609
+
610
+ ## Mixins
611
+
612
+ def test_basic_mixins
613
+ assert_equal <<CSS, render(<<SCSS)
614
+ .foo {
615
+ a: b; }
616
+ CSS
617
+ @mixin foo {
618
+ .foo {a: b}}
619
+
620
+ @include foo;
621
+ SCSS
622
+
623
+ assert_equal <<CSS, render(<<SCSS)
624
+ bar {
625
+ c: d; }
626
+ bar .foo {
627
+ a: b; }
628
+ CSS
629
+ @mixin foo {
630
+ .foo {a: b}}
631
+
632
+ bar {
633
+ @include foo;
634
+ c: d; }
635
+ SCSS
636
+
637
+ assert_equal <<CSS, render(<<SCSS)
638
+ bar {
639
+ a: b;
640
+ c: d; }
641
+ CSS
642
+ @mixin foo {a: b}
643
+
644
+ bar {
645
+ @include foo;
646
+ c: d; }
647
+ SCSS
648
+ end
649
+
650
+ def test_mixins_with_empty_args
651
+ assert_equal <<CSS, render(<<SCSS)
652
+ .foo {
653
+ a: b; }
654
+ CSS
655
+ @mixin foo() {a: b}
656
+
657
+ .foo {@include foo();}
658
+ SCSS
659
+
660
+ assert_equal <<CSS, render(<<SCSS)
661
+ .foo {
662
+ a: b; }
663
+ CSS
664
+ @mixin foo() {a: b}
665
+
666
+ .foo {@include foo;}
667
+ SCSS
668
+
669
+ assert_equal <<CSS, render(<<SCSS)
670
+ .foo {
671
+ a: b; }
672
+ CSS
673
+ @mixin foo {a: b}
674
+
675
+ .foo {@include foo();}
676
+ SCSS
677
+ end
678
+
679
+ def test_mixins_with_args
680
+ assert_equal <<CSS, render(<<SCSS)
681
+ .foo {
682
+ a: bar; }
683
+ CSS
684
+ @mixin foo($a) {a: $a}
685
+
686
+ .foo {@include foo(bar)}
687
+ SCSS
688
+
689
+ assert_equal <<CSS, render(<<SCSS)
690
+ .foo {
691
+ a: bar;
692
+ b: 12px; }
693
+ CSS
694
+ @mixin foo($a, $b) {
695
+ a: $a;
696
+ b: $b; }
697
+
698
+ .foo {@include foo(bar, 12px)}
699
+ SCSS
700
+ end
701
+
702
+ ## Functions
703
+
704
+ def test_basic_function
705
+ assert_equal(<<CSS, render(<<SASS))
706
+ bar {
707
+ a: 3; }
708
+ CSS
709
+ @function foo() {
710
+ @return 1 + 2;
711
+ }
712
+
713
+ bar {
714
+ a: foo();
715
+ }
716
+ SASS
717
+ end
718
+
719
+ def test_function_args
720
+ assert_equal(<<CSS, render(<<SASS))
721
+ bar {
722
+ a: 3; }
723
+ CSS
724
+ @function plus($var1, $var2) {
725
+ @return $var1 + $var2;
726
+ }
727
+
728
+ bar {
729
+ a: plus(1, 2);
730
+ }
731
+ SASS
732
+ end
733
+
734
+ ## Interpolation
735
+
736
+ def test_basic_selector_interpolation
737
+ assert_equal <<CSS, render(<<SCSS)
738
+ foo 3 baz {
739
+ a: b; }
740
+ CSS
741
+ foo \#{1 + 2} baz {a: b}
742
+ SCSS
743
+ assert_equal <<CSS, render(<<SCSS)
744
+ foo.bar baz {
745
+ a: b; }
746
+ CSS
747
+ foo\#{".bar"} baz {a: b}
748
+ SCSS
749
+ assert_equal <<CSS, render(<<SCSS)
750
+ foo.bar baz {
751
+ a: b; }
752
+ CSS
753
+ \#{"foo"}.bar baz {a: b}
754
+ SCSS
755
+ end
756
+
757
+ def test_selector_only_interpolation
758
+ assert_equal <<CSS, render(<<SCSS)
759
+ foo bar {
760
+ a: b; }
761
+ CSS
762
+ \#{"foo" + " bar"} {a: b}
763
+ SCSS
764
+ end
765
+
766
+ def test_selector_interpolation_before_element_name
767
+ assert_equal <<CSS, render(<<SCSS)
768
+ foo barbaz {
769
+ a: b; }
770
+ CSS
771
+ \#{"foo" + " bar"}baz {a: b}
772
+ SCSS
773
+ end
774
+
775
+ def test_selector_interpolation_in_string
776
+ assert_equal <<CSS, render(<<SCSS)
777
+ foo[val="bar foo bar baz"] {
778
+ a: b; }
779
+ CSS
780
+ foo[val="bar \#{"foo" + " bar"} baz"] {a: b}
781
+ SCSS
782
+ end
783
+
784
+ def test_selector_interpolation_in_pseudoclass
785
+ assert_equal <<CSS, render(<<SCSS)
786
+ foo:nth-child(5n) {
787
+ a: b; }
788
+ CSS
789
+ foo:nth-child(\#{5 + "n"}) {a: b}
790
+ SCSS
791
+ end
792
+
793
+ def test_selector_interpolation_at_class_begininng
794
+ assert_equal <<CSS, render(<<SCSS)
795
+ .zzz {
796
+ a: b; }
797
+ CSS
798
+ $zzz: zzz;
799
+ .\#{$zzz} { a: b; }
800
+ SCSS
801
+ end
802
+
803
+ def test_selector_interpolation_at_id_begininng
804
+ assert_equal <<CSS, render(<<SCSS)
805
+ #zzz {
806
+ a: b; }
807
+ CSS
808
+ $zzz: zzz;
809
+ #\#{$zzz} { a: b; }
810
+ SCSS
811
+ end
812
+
813
+ def test_selector_interpolation_at_pseudo_begininng
814
+ assert_equal <<CSS, render(<<SCSS)
815
+ :zzz::zzz {
816
+ a: b; }
817
+ CSS
818
+ $zzz: zzz;
819
+ :\#{$zzz}::\#{$zzz} { a: b; }
820
+ SCSS
821
+ end
822
+
823
+ def test_selector_interpolation_at_attr_beginning
824
+ assert_equal <<CSS, render(<<SCSS)
825
+ [zzz=foo] {
826
+ a: b; }
827
+ CSS
828
+ $zzz: zzz;
829
+ [\#{$zzz}=foo] { a: b; }
830
+ SCSS
831
+ end
832
+
833
+ def test_selector_interpolation_at_dashes
834
+ assert_equal <<CSS, render(<<SCSS)
835
+ div {
836
+ -foo-a-b-foo: foo; }
837
+ CSS
838
+ $a : a;
839
+ $b : b;
840
+ div { -foo-\#{$a}-\#{$b}-foo: foo }
841
+ SCSS
842
+ end
843
+
844
+ def test_basic_prop_name_interpolation
845
+ assert_equal <<CSS, render(<<SCSS)
846
+ foo {
847
+ barbazbang: blip; }
848
+ CSS
849
+ foo {bar\#{"baz" + "bang"}: blip}
850
+ SCSS
851
+ assert_equal <<CSS, render(<<SCSS)
852
+ foo {
853
+ bar3: blip; }
854
+ CSS
855
+ foo {bar\#{1 + 2}: blip}
856
+ SCSS
857
+ end
858
+
859
+ def test_prop_name_only_interpolation
860
+ assert_equal <<CSS, render(<<SCSS)
861
+ foo {
862
+ bazbang: blip; }
863
+ CSS
864
+ foo {\#{"baz" + "bang"}: blip}
865
+ SCSS
866
+ end
867
+
868
+ ## Errors
869
+
870
+ def test_mixin_defs_only_at_toplevel
871
+ render <<SCSS
872
+ foo {
873
+ @mixin bar {a: b}}
874
+ SCSS
875
+ assert(false, "Expected syntax error")
876
+ rescue Sass::SyntaxError => e
877
+ assert_equal "Mixins may only be defined at the root of a document.", e.message
878
+ assert_equal 2, e.sass_line
879
+ end
880
+
881
+ def test_rules_beneath_properties
882
+ render <<SCSS
883
+ foo {
884
+ bar: {
885
+ baz {
886
+ bang: bop }}}
887
+ SCSS
888
+ assert(false, "Expected syntax error")
889
+ rescue Sass::SyntaxError => e
890
+ assert_equal 'Illegal nesting: Only properties may be nested beneath properties.', e.message
891
+ assert_equal 3, e.sass_line
892
+ end
893
+
894
+ def test_uses_property_exception_with_star_hack
895
+ render <<SCSS
896
+ foo {
897
+ *bar:baz [fail]; }
898
+ SCSS
899
+ assert(false, "Expected syntax error")
900
+ rescue Sass::SyntaxError => e
901
+ assert_equal 'Invalid CSS after " *bar:baz ": expected ";", was "[fail]; }"', e.message
902
+ assert_equal 2, e.sass_line
903
+ end
904
+
905
+ def test_uses_property_exception_with_colon_hack
906
+ render <<SCSS
907
+ foo {
908
+ :bar:baz [fail]; }
909
+ SCSS
910
+ assert(false, "Expected syntax error")
911
+ rescue Sass::SyntaxError => e
912
+ assert_equal 'Invalid CSS after " :bar:baz ": expected ";", was "[fail]; }"', e.message
913
+ assert_equal 2, e.sass_line
914
+ end
915
+
916
+ def test_uses_rule_exception_with_dot_hack
917
+ render <<SCSS
918
+ foo {
919
+ .bar:baz <fail>; }
920
+ SCSS
921
+ assert(false, "Expected syntax error")
922
+ rescue Sass::SyntaxError => e
923
+ assert_equal 'Invalid CSS after " .bar:baz ": expected "{", was "<fail>; }"', e.message
924
+ assert_equal 2, e.sass_line
925
+ end
926
+
927
+ def test_uses_property_exception_with_space_after_name
928
+ render <<SCSS
929
+ foo {
930
+ bar: baz [fail]; }
931
+ SCSS
932
+ assert(false, "Expected syntax error")
933
+ rescue Sass::SyntaxError => e
934
+ assert_equal 'Invalid CSS after " bar: baz ": expected ";", was "[fail]; }"', e.message
935
+ assert_equal 2, e.sass_line
936
+ end
937
+
938
+ def test_uses_property_exception_with_non_identifier_after_name
939
+ render <<SCSS
940
+ foo {
941
+ bar:1px [fail]; }
942
+ SCSS
943
+ assert(false, "Expected syntax error")
944
+ rescue Sass::SyntaxError => e
945
+ assert_equal 'Invalid CSS after " bar:1px ": expected ";", was "[fail]; }"', e.message
946
+ assert_equal 2, e.sass_line
947
+ end
948
+
949
+ def test_uses_property_exception_when_followed_by_open_bracket
950
+ render <<SCSS
951
+ foo {
952
+ bar:{baz: .fail} }
953
+ SCSS
954
+ assert(false, "Expected syntax error")
955
+ rescue Sass::SyntaxError => e
956
+ assert_equal 'Invalid CSS after " bar:{baz: ": expected expression (e.g. 1px, bold), was ".fail} }"', e.message
957
+ assert_equal 2, e.sass_line
958
+ end
959
+
960
+ def test_script_error
961
+ render <<SCSS
962
+ foo {
963
+ bar: "baz" * * }
964
+ SCSS
965
+ assert(false, "Expected syntax error")
966
+ rescue Sass::SyntaxError => e
967
+ assert_equal 'Invalid CSS after " bar: "baz" * ": expected expression (e.g. 1px, bold), was "* }"', e.message
968
+ assert_equal 2, e.sass_line
969
+ end
970
+
971
+ def test_multiline_script_syntax_error
972
+ render <<SCSS
973
+ foo {
974
+ bar:
975
+ "baz" * * }
976
+ SCSS
977
+ assert(false, "Expected syntax error")
978
+ rescue Sass::SyntaxError => e
979
+ assert_equal 'Invalid CSS after " "baz" * ": expected expression (e.g. 1px, bold), was "* }"', e.message
980
+ assert_equal 3, e.sass_line
981
+ end
982
+
983
+ def test_multiline_script_runtime_error
984
+ render <<SCSS
985
+ foo {
986
+ bar: "baz" +
987
+ "bar" +
988
+ $bang }
989
+ SCSS
990
+ assert(false, "Expected syntax error")
991
+ rescue Sass::SyntaxError => e
992
+ assert_equal "Undefined variable: \"$bang\".", e.message
993
+ assert_equal 4, e.sass_line
994
+ end
995
+
996
+ def test_post_multiline_script_runtime_error
997
+ render <<SCSS
998
+ foo {
999
+ bar: "baz" +
1000
+ "bar" +
1001
+ "baz";
1002
+ bip: $bop; }
1003
+ SCSS
1004
+ assert(false, "Expected syntax error")
1005
+ rescue Sass::SyntaxError => e
1006
+ assert_equal "Undefined variable: \"$bop\".", e.message
1007
+ assert_equal 5, e.sass_line
1008
+ end
1009
+
1010
+ def test_multiline_property_runtime_error
1011
+ render <<SCSS
1012
+ foo {
1013
+ bar: baz
1014
+ bar
1015
+ \#{$bang} }
1016
+ SCSS
1017
+ assert(false, "Expected syntax error")
1018
+ rescue Sass::SyntaxError => e
1019
+ assert_equal "Undefined variable: \"$bang\".", e.message
1020
+ assert_equal 4, e.sass_line
1021
+ end
1022
+
1023
+ def test_post_resolution_selector_error
1024
+ render "\n\nfoo \#{\") bar\"} {a: b}"
1025
+ assert(false, "Expected syntax error")
1026
+ rescue Sass::SyntaxError => e
1027
+ assert_equal 'Invalid CSS after "foo ": expected selector, was ") bar"', e.message
1028
+ assert_equal 3, e.sass_line
1029
+ end
1030
+
1031
+ def test_parent_in_mid_selector_error
1032
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1033
+ Invalid CSS after ".foo": expected "{", was "&.bar"
1034
+
1035
+ In Sass 3, the parent selector & can only be used where element names are valid,
1036
+ since it could potentially be replaced by an element name.
1037
+ MESSAGE
1038
+ flim {
1039
+ .foo&.bar {a: b}
1040
+ }
1041
+ SCSS
1042
+ end
1043
+
1044
+ def test_parent_in_mid_selector_error
1045
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1046
+ Invalid CSS after " .foo.bar": expected "{", was "& {a: b}"
1047
+
1048
+ In Sass 3, the parent selector & can only be used where element names are valid,
1049
+ since it could potentially be replaced by an element name.
1050
+ MESSAGE
1051
+ flim {
1052
+ .foo.bar& {a: b}
1053
+ }
1054
+ SCSS
1055
+ end
1056
+
1057
+ def test_double_parent_selector_error
1058
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE) {render <<SCSS}
1059
+ Invalid CSS after " &": expected "{", was "& {a: b}"
1060
+
1061
+ In Sass 3, the parent selector & can only be used where element names are valid,
1062
+ since it could potentially be replaced by an element name.
1063
+ MESSAGE
1064
+ flim {
1065
+ && {a: b}
1066
+ }
1067
+ SCSS
1068
+ end
1069
+
1070
+ def test_no_interpolation_in_media_queries
1071
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1072
+ Invalid CSS after "...nd (min-width: ": expected expression (e.g. 1px, bold), was "\#{100}px) {"
1073
+ MESSAGE
1074
+ @media screen and (min-width: \#{100}px) {
1075
+ foo {bar: baz}
1076
+ }
1077
+ SCSS
1078
+ end
1079
+
1080
+ def test_no_interpolation_in_unrecognized_directives
1081
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1082
+ Invalid CSS after "@foo ": expected selector or at-rule, was "\#{100} {"
1083
+ MESSAGE
1084
+ @foo \#{100} {
1085
+ foo {bar: baz}
1086
+ }
1087
+ SCSS
1088
+ end
1089
+
1090
+ def test_no_lonely_else
1091
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1092
+ Invalid CSS: @else must come after @if
1093
+ MESSAGE
1094
+ @else {foo: bar}
1095
+ SCSS
1096
+ end
1097
+
1098
+ # Regression
1099
+
1100
+ def test_weird_added_space
1101
+ assert_equal <<CSS, render(<<SCSS)
1102
+ foo {
1103
+ bar: -moz-bip; }
1104
+ CSS
1105
+ $value : bip;
1106
+
1107
+ foo {
1108
+ bar: -moz-\#{$value};
1109
+ }
1110
+ SCSS
1111
+ end
1112
+
1113
+ def test_interpolation_with_bracket_on_next_line
1114
+ assert_equal <<CSS, render(<<SCSS)
1115
+ a.foo b {
1116
+ color: red; }
1117
+ CSS
1118
+ a.\#{"foo"} b
1119
+ {color: red}
1120
+ SCSS
1121
+ end
1122
+
1123
+ def test_extra_comma_in_mixin_arglist_error
1124
+ assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
1125
+ Invalid CSS after "...clude foo(bar, ": expected mixin argument, was ");"
1126
+ MESSAGE
1127
+ @mixin foo($a1, $a2) {
1128
+ baz: $a1 $a2;
1129
+ }
1130
+
1131
+ .bar {
1132
+ @include foo(bar, );
1133
+ }
1134
+ SCSS
1135
+ end
1136
+
1137
+ def test_interpolation
1138
+ assert_equal <<CSS, render(<<SCSS)
1139
+ ul li#foo a span.label {
1140
+ foo: bar; }
1141
+ CSS
1142
+ $bar : "#foo";
1143
+ ul li\#{$bar} a span.label { foo: bar; }
1144
+ SCSS
1145
+ end
1146
+
1147
+ def test_mixin_with_keyword_args
1148
+ assert_equal <<CSS, render(<<SCSS)
1149
+ .mixed {
1150
+ required: foo;
1151
+ arg1: default-val1;
1152
+ arg2: non-default-val2; }
1153
+ CSS
1154
+ @mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
1155
+ required: $required;
1156
+ arg1: $arg1;
1157
+ arg2: $arg2;
1158
+ }
1159
+ .mixed { @include a-mixin(foo, $arg2: non-default-val2); }
1160
+ SCSS
1161
+ end
1162
+
1163
+ def test_passing_required_args_as_a_keyword_arg
1164
+ assert_equal <<CSS, render(<<SCSS)
1165
+ .mixed {
1166
+ required: foo;
1167
+ arg1: default-val1;
1168
+ arg2: default-val2; }
1169
+ CSS
1170
+ @mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
1171
+ required: $required;
1172
+ arg1: $arg1;
1173
+ arg2: $arg2; }
1174
+ .mixed { @include a-mixin($required: foo); }
1175
+ SCSS
1176
+ end
1177
+
1178
+ def test_passing_all_as_keyword_args_in_opposite_order
1179
+ assert_equal <<CSS, render(<<SCSS)
1180
+ .mixed {
1181
+ required: foo;
1182
+ arg1: non-default-val1;
1183
+ arg2: non-default-val2; }
1184
+ CSS
1185
+ @mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
1186
+ required: $required;
1187
+ arg1: $arg1;
1188
+ arg2: $arg2; }
1189
+ .mixed { @include a-mixin($arg2: non-default-val2, $arg1: non-default-val1, $required: foo); }
1190
+ SCSS
1191
+ end
1192
+
1193
+ def test_keyword_args_in_functions
1194
+ assert_equal <<CSS, render(<<SCSS)
1195
+ .keyed {
1196
+ color: rgba(170, 119, 204, 0.4); }
1197
+ CSS
1198
+ .keyed { color: rgba($color: #a7c, $alpha: 0.4) }
1199
+ SCSS
1200
+ end
1201
+
1202
+ def test_unknown_keyword_arg_raises_error
1203
+ assert_raise_message(Sass::SyntaxError, "Mixin a doesn't have an argument named $c") {render <<SCSS}
1204
+ @mixin a($b: 1) { a: $b; }
1205
+ div { @include a(1, $c: 3); }
1206
+ SCSS
1207
+ end
1208
+
1209
+
1210
+ def test_newlines_removed_from_selectors_when_compressed
1211
+ assert_equal <<CSS, render(<<SCSS, :style=>:compressed)
1212
+ z a,z b{display:block}
1213
+ CSS
1214
+ a,
1215
+ b {
1216
+ z & {
1217
+ display: block;
1218
+ }
1219
+ }
1220
+ SCSS
1221
+ end
1222
+
1223
+ def test_if_error_line
1224
+ assert_raise_line(2) {render(<<SCSS)}
1225
+ @if true {foo: bar}
1226
+ }
1227
+ SCSS
1228
+ end
1229
+
1230
+ def test_multiline_var
1231
+ assert_equal <<CSS, render(<<SCSS)
1232
+ foo {
1233
+ a: 3;
1234
+ b: false;
1235
+ c: a b c; }
1236
+ CSS
1237
+ foo {
1238
+ $var1: 1 +
1239
+ 2;
1240
+ $var2: true and
1241
+ false;
1242
+ $var3: a b
1243
+ c;
1244
+ a: $var1;
1245
+ b: $var2;
1246
+ c: $var3; }
1247
+ SCSS
1248
+ end
1249
+ end