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,2 @@
1
+ scss {
2
+ imported: yes; }
@@ -0,0 +1 @@
1
+ #pi { width: 314px; }
@@ -0,0 +1,3 @@
1
+ #nested { relative: true; }
2
+
3
+ #subdir { font-size: 20px; font-weight: bold; }
@@ -0,0 +1,11 @@
1
+ b {
2
+ foo: 5px;
3
+ bar: 24px;
4
+ baz: 66.667%;
5
+ many-units: 32em;
6
+ mm: 15mm;
7
+ pc: 2pc;
8
+ pt: -72pt;
9
+ inches: 2in;
10
+ more-inches: 3.5in;
11
+ mixed: 6px; }
File without changes
File without changes
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require File.dirname(__FILE__) + '/../test_helper'
4
+ require 'sass/engine'
5
+
6
+ class SassScriptConversionTest < Test::Unit::TestCase
7
+ def test_bool
8
+ assert_renders "true"
9
+ assert_renders "false"
10
+ end
11
+
12
+ def test_color
13
+ assert_renders "#abcdef"
14
+ assert_renders "blue"
15
+ assert_renders "rgba(0, 1, 2, 0.2)"
16
+
17
+ assert_equal "#aabbcc", render("#abc")
18
+ assert_equal "blue", render("#0000ff")
19
+ end
20
+
21
+ def test_number
22
+ assert_renders "10"
23
+ assert_renders "10.35"
24
+ assert_renders "12px"
25
+ assert_renders "12.45px"
26
+
27
+ assert_equal "12.346", render("12.345678901")
28
+ end
29
+
30
+ def test_string
31
+ assert_renders '"foo"'
32
+ assert_renders '"bar baz"'
33
+ assert_equal '"baz bang"', render("'baz bang'")
34
+ end
35
+
36
+ def test_string_quotes
37
+ assert_equal "'quote\"quote'", render('"quote\\"quote"')
38
+ assert_equal '"quote\'quote"', render("'quote\\'quote'")
39
+ assert_renders '"quote\'quote\\"quote"'
40
+ assert_equal '"quote\'quote\\"quote"', render("'quote\\'quote\"quote'")
41
+ end
42
+
43
+ def test_string_escapes
44
+ assert_renders '"foo\\\\bar"'
45
+ end
46
+
47
+ def test_funcall
48
+ assert_renders "foo(true, blue)"
49
+ assert_renders "hsla(20deg, 30%, 50%, 0.3)"
50
+ assert_renders "blam()"
51
+
52
+ assert_renders "-\xC3\xBFoo(12px)"
53
+ assert_renders "-foo(12px)"
54
+ end
55
+
56
+ def test_funcall_with_keyword_args
57
+ assert_renders "foo(arg1, arg2, $karg1: val, $karg2: val2)"
58
+ assert_renders "foo($karg1: val, $karg2: val2)"
59
+ end
60
+
61
+ def test_url
62
+ assert_renders "url(foo.gif)"
63
+ assert_renders "url($var)"
64
+ assert_renders "url(\#{$var}/flip.gif)"
65
+ end
66
+
67
+ def test_variable
68
+ assert_renders "$foo-bar"
69
+ assert_renders "$flaznicate"
70
+ end
71
+
72
+ def self.test_precedence(outer, inner)
73
+ op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
74
+ op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
75
+ class_eval <<RUBY
76
+ def test_precedence_#{outer}_#{inner}
77
+ assert_renders "$foo #{op_outer} $bar #{op_inner} $baz"
78
+ assert_renders "$foo #{op_inner} $bar #{op_outer} $baz"
79
+
80
+ assert_renders "($foo #{op_outer} $bar) #{op_inner} $baz"
81
+ assert_renders "$foo #{op_inner} ($bar #{op_outer} $baz)"
82
+
83
+ assert_equal "$foo #{op_outer} $bar #{op_inner} $baz",
84
+ render("$foo #{op_outer} ($bar #{op_inner} $baz)")
85
+ assert_equal "$foo #{op_inner} $bar #{op_outer} $baz",
86
+ render("($foo #{op_inner} $bar) #{op_outer} $baz")
87
+ end
88
+ RUBY
89
+ end
90
+
91
+ def self.assert_associative(op_name, sibling_name)
92
+ op = separator_for(op_name)
93
+ sibling = separator_for(sibling_name)
94
+ class_eval <<RUBY
95
+ def test_associative_#{op_name}_#{sibling_name}
96
+ assert_renders "$foo#{op}$bar#{op}$baz"
97
+
98
+ assert_equal "$foo#{op}$bar#{op}$baz",
99
+ render("$foo#{op}($bar#{op}$baz)")
100
+ assert_equal "$foo#{op}$bar#{op}$baz",
101
+ render("($foo#{op}$bar)#{op}$baz")
102
+
103
+ assert_equal "$foo#{op}$bar#{sibling}$baz",
104
+ render("$foo#{op}($bar#{sibling}$baz)")
105
+ assert_equal "$foo#{sibling}$bar#{op}$baz",
106
+ render("($foo#{sibling}$bar)#{op}$baz")
107
+ end
108
+ RUBY
109
+ end
110
+
111
+ def self.separator_for(op_name)
112
+ case op_name
113
+ when :comma; ", "
114
+ when :space; " "
115
+ else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[op_name]} "
116
+ end
117
+ end
118
+
119
+ def self.assert_non_associative(op_name, sibling_name)
120
+ op = Sass::Script::Lexer::OPERATORS_REVERSE[op_name]
121
+ sibling = Sass::Script::Lexer::OPERATORS_REVERSE[sibling_name]
122
+ class_eval <<RUBY
123
+ def test_non_associative_#{op_name}_#{sibling_name}
124
+ assert_renders "$foo #{op} $bar #{op} $baz"
125
+
126
+ assert_renders "$foo #{op} ($bar #{op} $baz)"
127
+ assert_equal "$foo #{op} $bar #{op} $baz",
128
+ render("($foo #{op} $bar) #{op} $baz")
129
+
130
+ assert_renders "$foo #{op} ($bar #{sibling} $baz)"
131
+ assert_equal "$foo #{sibling} $bar #{op} $baz",
132
+ render("($foo #{sibling} $bar) #{op} $baz")
133
+ end
134
+ RUBY
135
+ end
136
+
137
+ test_precedence :or, :and
138
+ test_precedence :and, :eq
139
+ test_precedence :and, :neq
140
+ test_precedence :eq, :gt
141
+ test_precedence :eq, :gte
142
+ test_precedence :eq, :lt
143
+ test_precedence :eq, :lte
144
+ test_precedence :gt, :plus
145
+ test_precedence :gt, :minus
146
+ test_precedence :plus, :times
147
+ test_precedence :plus, :div
148
+ test_precedence :plus, :mod
149
+
150
+ assert_associative :plus, :minus
151
+ assert_associative :times, :div
152
+ assert_associative :times, :mod
153
+
154
+ assert_non_associative :minus, :plus
155
+ assert_non_associative :div, :times
156
+ assert_non_associative :mod, :times
157
+ assert_non_associative :gt, :gte
158
+ assert_non_associative :gte, :lt
159
+ assert_non_associative :lt, :lte
160
+ assert_non_associative :lte, :gt
161
+
162
+ def test_comma_precedence
163
+ assert_renders "$foo, $bar, $baz"
164
+
165
+ assert_renders "$foo ($bar, $baz)"
166
+ assert_renders "($foo, $bar) $baz"
167
+
168
+ assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
169
+ assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
170
+
171
+ assert_equal "$foo, ($bar, $baz)", render("$foo, ($bar, $baz)")
172
+ assert_equal "($foo, $bar), $baz", render("($foo, $bar), $baz")
173
+ end
174
+
175
+ def test_space_precedence
176
+ assert_renders "$foo $bar $baz"
177
+
178
+ assert_renders "$foo or ($bar $baz)"
179
+ assert_renders "($foo $bar) or $baz"
180
+
181
+ assert_equal "$foo $bar or $baz", render("$foo ($bar or $baz)")
182
+ assert_equal "$foo or $bar $baz", render("($foo or $bar) $baz")
183
+
184
+ assert_equal "$foo ($bar $baz)", render("$foo ($bar $baz)")
185
+ assert_equal "($foo $bar) $baz", render("($foo $bar) $baz")
186
+ end
187
+
188
+ def test_unary_op
189
+ assert_renders "-12px"
190
+ assert_renders '/"foo"'
191
+ assert_renders 'not true'
192
+
193
+ assert_renders "-(foo(12px))"
194
+ assert_renders "-(-foo(12px))"
195
+ assert_renders "-(_foo(12px))"
196
+ assert_renders "-(\xC3\xBFoo(12px))"
197
+ assert_renders "-(blue)"
198
+
199
+ assert_equal 'not true or false', render('(not true) or false')
200
+ assert_equal 'not (true or false)', render('not (true or false)')
201
+ end
202
+
203
+ def test_interpolation
204
+ assert_renders "$foo\#{$bar}$baz"
205
+ assert_renders "$foo\#{$bar} $baz"
206
+ assert_renders "$foo \#{$bar}$baz"
207
+ assert_renders "$foo \#{$bar} $baz"
208
+ assert_renders "$foo \#{$bar}\#{$bang} $baz"
209
+ assert_renders "$foo \#{$bar} \#{$bang} $baz"
210
+ assert_renders "\#{$bar}$baz"
211
+ assert_renders "$foo\#{$bar}"
212
+ assert_renders "\#{$bar}"
213
+ end
214
+
215
+ def test_interpolation_in_function
216
+ assert_renders 'flabnabbit(#{1 + "foo"})'
217
+ assert_renders 'flabnabbit($foo #{1 + "foo"}$baz)'
218
+ assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
219
+ end
220
+
221
+ def test_interpolation_near_operators
222
+ assert_renders '#{1 + 2} , #{3 + 4}'
223
+ assert_renders '#{1 + 2}, #{3 + 4}'
224
+ assert_renders '#{1 + 2} ,#{3 + 4}'
225
+ assert_renders '#{1 + 2},#{3 + 4}'
226
+
227
+ assert_renders '3 / #{3 + 4}'
228
+ assert_renders '3 /#{3 + 4}'
229
+ assert_renders '3/ #{3 + 4}'
230
+ assert_renders '3/#{3 + 4}'
231
+
232
+ assert_renders '#{1 + 2} * 7'
233
+ assert_renders '#{1 + 2}* 7'
234
+ assert_renders '#{1 + 2} *7'
235
+ assert_renders '#{1 + 2}*7'
236
+
237
+ assert_renders '-#{1 + 2}'
238
+ assert_renders '- #{1 + 2}'
239
+
240
+ assert_renders '5 + #{1 + 2} * #{3 + 4}'
241
+ assert_renders '5 +#{1 + 2} * #{3 + 4}'
242
+ assert_renders '5+#{1 + 2} * #{3 + 4}'
243
+ assert_renders '#{1 + 2} * #{3 + 4} + 5'
244
+ assert_renders '#{1 + 2} * #{3 + 4}+ 5'
245
+ assert_renders '#{1 + 2} * #{3 + 4}+5'
246
+
247
+ assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 / (#{1 + 2} + #{3 + 4})')
248
+ assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /(#{1 + 2} + #{3 + 4})')
249
+ assert_equal '5 / #{1 + 2} + #{3 + 4}', render('5 /( #{1 + 2} + #{3 + 4} )')
250
+ assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
251
+ assert_equal '#{1 + 2} + #{3 + 4} / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
252
+ assert_equal '#{1 + 2} + #{3 + 4} / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
253
+
254
+ assert_renders '#{1 + 2} + 2 + 3'
255
+ assert_renders '#{1 + 2} +2 + 3'
256
+ end
257
+
258
+ def test_string_interpolation
259
+ assert_renders '"foo#{$bar}baz"'
260
+ assert_renders '"foo #{$bar}baz"'
261
+ assert_renders '"foo#{$bar} baz"'
262
+ assert_renders '"foo #{$bar} baz"'
263
+ assert_renders '"foo #{$bar}#{$bang} baz"'
264
+ assert_renders '"foo #{$bar} #{$bang} baz"'
265
+ assert_renders '"#{$bar}baz"'
266
+ assert_renders '"foo#{$bar}"'
267
+ assert_equal '#{$bar}', render('"#{$bar}"')
268
+
269
+ assert_equal '"foo#{$bar}baz"', render("'foo\#{$bar}baz'")
270
+ end
271
+
272
+ private
273
+
274
+ def assert_renders(script, options = {})
275
+ assert_equal(script, render(script, options))
276
+ end
277
+
278
+ def render(script, options = {})
279
+ munge_filename(options)
280
+ node = Sass::Script.parse(script, 1, 0, options)
281
+ node.to_sass
282
+ end
283
+ end
@@ -0,0 +1,496 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+ require 'sass/engine'
4
+
5
+ module Sass::Script::Functions::UserFunctions
6
+ def assert_options(val)
7
+ val.options[:foo]
8
+ Sass::Script::String.new("Options defined!")
9
+ end
10
+ end
11
+
12
+ class SassScriptTest < Test::Unit::TestCase
13
+ include Sass::Script
14
+
15
+ def test_color_checks_input
16
+ assert_raise_message(ArgumentError, "Blue value must be between 0 and 255") {Color.new([1, 2, -1])}
17
+ assert_raise_message(ArgumentError, "Red value must be between 0 and 255") {Color.new([256, 2, 3])}
18
+ end
19
+
20
+ def test_color_checks_rgba_input
21
+ assert_raise_message(ArgumentError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, 1.1])}
22
+ assert_raise_message(ArgumentError, "Alpha channel must be between 0 and 1") {Color.new([1, 2, 3, -0.1])}
23
+ end
24
+
25
+ def test_string_escapes
26
+ assert_equal "'", resolve("\"'\"")
27
+ assert_equal '"', resolve("\"\\\"\"")
28
+ assert_equal "\\\\", resolve("\"\\\\\"")
29
+ assert_equal "\\02fa", resolve("\"\\02fa\"")
30
+
31
+ assert_equal "'", resolve("'\\''")
32
+ assert_equal '"', resolve("'\"'")
33
+ assert_equal "\\\\", resolve("'\\\\'")
34
+ assert_equal "\\02fa", resolve("'\\02fa'")
35
+ end
36
+
37
+ def test_string_interpolation
38
+ assert_equal "foo2bar", resolve('\'foo#{1 + 1}bar\'')
39
+ assert_equal "foo2bar", resolve('"foo#{1 + 1}bar"')
40
+ assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
41
+ end
42
+
43
+ def test_color_names
44
+ assert_equal "white", resolve("white")
45
+ assert_equal "white", resolve("#ffffff")
46
+ assert_equal "#fffffe", resolve("white - #000001")
47
+ end
48
+
49
+ def test_rgba_color_literals
50
+ assert_equal Sass::Script::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
51
+ assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
52
+
53
+ assert_equal Sass::Script::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
54
+ assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
55
+
56
+ assert_equal Sass::Script::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
57
+ assert_equal Sass::Script::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
58
+ assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
59
+ assert_equal "white", resolve("rgba(255, 255, 255, 1)")
60
+ end
61
+
62
+ def test_rgba_color_math
63
+ assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")
64
+ assert_equal "rgba(52, 52, 52, 0.25)", resolve("rgba(2, 2, 2, 0.25) + rgba(50, 50, 50, 0.25)")
65
+
66
+ assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)") do
67
+ resolve("rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)")
68
+ end
69
+ assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: #123456 * rgba(50, 50, 50, 0.75)") do
70
+ resolve("#123456 * rgba(50, 50, 50, 0.75)")
71
+ end
72
+ assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(50, 50, 50, 0.75) / #123456") do
73
+ resolve("rgba(50, 50, 50, 0.75) / #123456")
74
+ end
75
+ end
76
+
77
+ def test_rgba_number_math
78
+ assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")
79
+ assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")
80
+ end
81
+
82
+ def test_rgba_rounding
83
+ assert_equal "rgba(10, 1, 0, 0.123)", resolve("rgba(10.0, 1.23456789, 0.0, 0.1234567)")
84
+ end
85
+
86
+ def test_compressed_colors
87
+ assert_equal "#123456", resolve("#123456", :style => :compressed)
88
+ assert_equal "rgba(1,2,3,0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
89
+ assert_equal "#123", resolve("#112233", :style => :compressed)
90
+ assert_equal "#000", resolve("black", :style => :compressed)
91
+ assert_equal "red", resolve("#f00", :style => :compressed)
92
+ assert_equal "blue", resolve("#00f", :style => :compressed)
93
+ assert_equal "navy", resolve("#000080", :style => :compressed)
94
+ assert_equal "navy #fff", resolve("#000080 white", :style => :compressed)
95
+ assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
96
+ end
97
+
98
+ def test_compressed_comma
99
+ # assert_equal "foo,bar,baz", resolve("foo, bar, baz", :style => :compressed)
100
+ # assert_equal "foo,#baf,baz", resolve("foo, #baf, baz", :style => :compressed)
101
+ assert_equal "foo,#baf,red", resolve("foo, #baf, #f00", :style => :compressed)
102
+ end
103
+
104
+ def test_implicit_strings
105
+ assert_equal Sass::Script::String.new("foo"), eval("foo")
106
+ assert_equal Sass::Script::String.new("foo/bar"), eval("foo/bar")
107
+ end
108
+
109
+ def test_basic_interpolation
110
+ assert_equal "foo3bar", resolve("foo\#{1 + 2}bar")
111
+ assert_equal "foo3 bar", resolve("foo\#{1 + 2} bar")
112
+ assert_equal "foo 3bar", resolve("foo \#{1 + 2}bar")
113
+ assert_equal "foo 3 bar", resolve("foo \#{1 + 2} bar")
114
+ assert_equal "foo 35 bar", resolve("foo \#{1 + 2}\#{2 + 3} bar")
115
+ assert_equal "foo 3 5 bar", resolve("foo \#{1 + 2} \#{2 + 3} bar")
116
+ assert_equal "3bar", resolve("\#{1 + 2}bar")
117
+ assert_equal "foo3", resolve("foo\#{1 + 2}")
118
+ assert_equal "3", resolve("\#{1 + 2}")
119
+ end
120
+
121
+ def test_interpolation_in_function
122
+ assert_equal 'flabnabbit(1foo)', resolve('flabnabbit(#{1 + "foo"})')
123
+ assert_equal 'flabnabbit(foo 1foobaz)', resolve('flabnabbit(foo #{1 + "foo"}baz)')
124
+ assert_equal('flabnabbit(foo 1foo2bar baz)',
125
+ resolve('flabnabbit(foo #{1 + "foo"}#{2 + "bar"} baz)'))
126
+ end
127
+
128
+ def test_interpolation_near_operators
129
+ assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
130
+ assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
131
+ assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
132
+ assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
133
+
134
+ assert_equal '3 / 7', resolve('3 / #{3 + 4}')
135
+ assert_equal '3 /7', resolve('3 /#{3 + 4}')
136
+ assert_equal '3/ 7', resolve('3/ #{3 + 4}')
137
+ assert_equal '3/7', resolve('3/#{3 + 4}')
138
+
139
+ assert_equal '3 * 7', resolve('#{1 + 2} * 7')
140
+ assert_equal '3* 7', resolve('#{1 + 2}* 7')
141
+ assert_equal '3 *7', resolve('#{1 + 2} *7')
142
+ assert_equal '3*7', resolve('#{1 + 2}*7')
143
+
144
+ assert_equal '-3', resolve('-#{1 + 2}')
145
+ assert_equal '- 3', resolve('- #{1 + 2}')
146
+
147
+ assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
148
+ assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
149
+ assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
150
+ assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
151
+ assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
152
+ assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
153
+
154
+ assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
155
+ assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
156
+ assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
157
+ assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
158
+ assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
159
+ assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
160
+
161
+ assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
162
+ assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
163
+ end
164
+
165
+ def test_string_interpolation
166
+ assert_equal "foo bar, baz bang", resolve('"foo #{"bar"}, #{"baz"} bang"')
167
+ assert_equal "foo bar baz bang", resolve('"foo #{"#{"ba" + "r"} baz"} bang"')
168
+ assert_equal 'foo #{bar baz} bang', resolve('"foo \#{#{"ba" + "r"} baz} bang"')
169
+ assert_equal 'foo #{baz bang', resolve('"foo #{"\#{" + "baz"} bang"')
170
+ end
171
+
172
+ def test_rule_interpolation
173
+ assert_equal(<<CSS, render(<<SASS))
174
+ foo bar baz bang {
175
+ a: b; }
176
+ CSS
177
+ foo \#{"\#{"ba" + "r"} baz"} bang
178
+ a: b
179
+ SASS
180
+ assert_equal(<<CSS, render(<<SASS))
181
+ foo [bar="\#{bar baz}"] bang {
182
+ a: b; }
183
+ CSS
184
+ foo [bar="\\\#{\#{"ba" + "r"} baz}"] bang
185
+ a: b
186
+ SASS
187
+ assert_equal(<<CSS, render(<<SASS))
188
+ foo [bar="\#{baz"] bang {
189
+ a: b; }
190
+ CSS
191
+ foo [bar="\#{"\\\#{" + "baz"}"] bang
192
+ a: b
193
+ SASS
194
+ end
195
+
196
+ def test_inaccessible_functions
197
+ assert_equal "send(to_s)", resolve("send(to_s)", :line => 2)
198
+ assert_equal "public_instance_methods()", resolve("public_instance_methods()")
199
+ end
200
+
201
+ def test_adding_functions_directly_to_functions_module
202
+ assert !Functions.callable?('nonexistant')
203
+ Functions.class_eval { def nonexistant; end }
204
+ assert Functions.callable?('nonexistant')
205
+ Functions.send :remove_method, :nonexistant
206
+ end
207
+
208
+ def test_default_functions
209
+ assert_equal "url(12)", resolve("url(12)")
210
+ assert_equal 'blam("foo")', resolve('blam("foo")')
211
+ end
212
+
213
+ def test_function_results_have_options
214
+ assert_equal "Options defined!", resolve("assert_options(abs(1))")
215
+ assert_equal "Options defined!", resolve("assert_options(round(1.2))")
216
+ end
217
+
218
+ def test_funcall_requires_no_whitespace_before_lparen
219
+ assert_equal "no-repeat 15px", resolve("no-repeat (7px + 8px)")
220
+ assert_equal "no-repeat(15px)", resolve("no-repeat(7px + 8px)")
221
+ end
222
+
223
+ def test_dynamic_url
224
+ assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::String.new("foo-bar")))
225
+ assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::String.new("foo-bar"), 'bar' => Sass::Script::String.new("baz")))
226
+ assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::String.new("baz")))
227
+ assert_equal "url(foo bar)", resolve("url(foo bar)")
228
+ end
229
+
230
+ def test_url_with_interpolation
231
+ assert_equal "url(http://sass-lang.com/images/foo-bar)", resolve("url(http://sass-lang.com/images/\#{foo-bar})")
232
+ assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve("url('http://sass-lang.com/images/\#{foo-bar}')")
233
+ assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve('url("http://sass-lang.com/images/#{foo-bar}")')
234
+ assert_unquoted "url(http://sass-lang.com/images/\#{foo-bar})"
235
+ end
236
+
237
+ def test_hyphenated_variables
238
+ assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::String.new("a-b"))))
239
+ end
240
+
241
+ def test_ruby_equality
242
+ assert_equal eval('"foo"'), eval('"foo"')
243
+ assert_equal eval('1'), eval('1.0')
244
+ assert_equal eval('1 2 3.0'), eval('1 2 3')
245
+ assert_equal eval('1, 2, 3.0'), eval('1, 2, 3')
246
+ assert_equal eval('(1 2), (3, 4), (5 6)'), eval('(1 2), (3, 4), (5 6)')
247
+ assert_not_equal eval('1, 2, 3'), eval('1 2 3')
248
+ assert_not_equal eval('1'), eval('"1"')
249
+ end
250
+
251
+ def test_booleans
252
+ assert_equal "true", resolve("true")
253
+ assert_equal "false", resolve("false")
254
+ end
255
+
256
+ def test_boolean_ops
257
+ assert_equal "true", resolve("true and true")
258
+ assert_equal "true", resolve("false or true")
259
+ assert_equal "true", resolve("true or false")
260
+ assert_equal "true", resolve("true or true")
261
+ assert_equal "false", resolve("false or false")
262
+ assert_equal "false", resolve("false and true")
263
+ assert_equal "false", resolve("true and false")
264
+ assert_equal "false", resolve("false and false")
265
+
266
+ assert_equal "true", resolve("not false")
267
+ assert_equal "false", resolve("not true")
268
+ assert_equal "true", resolve("not not true")
269
+
270
+ assert_equal "1", resolve("false or 1")
271
+ assert_equal "false", resolve("false and 1")
272
+ assert_equal "2", resolve("2 or 3")
273
+ assert_equal "3", resolve("2 and 3")
274
+ end
275
+
276
+ def test_arithmetic_ops
277
+ assert_equal "2", resolve("1 + 1")
278
+ assert_equal "0", resolve("1 - 1")
279
+ assert_equal "8", resolve("2 * 4")
280
+ assert_equal "0.5", resolve("(2 / 4)")
281
+ assert_equal "2", resolve("(4 / 2)")
282
+
283
+ assert_equal "-1", resolve("-1")
284
+ end
285
+
286
+ def test_string_ops
287
+ assert_equal '"foo" "bar"', resolve('"foo" "bar"')
288
+ assert_equal "true 1", resolve('true 1')
289
+ assert_equal '"foo", "bar"', resolve("'foo' , 'bar'")
290
+ assert_equal "true, 1", resolve('true , 1')
291
+ assert_equal "foobar", resolve('"foo" + "bar"')
292
+ assert_equal "true1", resolve('true + 1')
293
+ assert_equal '"foo"-"bar"', resolve("'foo' - 'bar'")
294
+ assert_equal "true-1", resolve('true - 1')
295
+ assert_equal '"foo"/"bar"', resolve('"foo" / "bar"')
296
+ assert_equal "true/1", resolve('true / 1')
297
+
298
+ assert_equal '-"bar"', resolve("- 'bar'")
299
+ assert_equal "-true", resolve('- true')
300
+ assert_equal '/"bar"', resolve('/ "bar"')
301
+ assert_equal "/true", resolve('/ true')
302
+ end
303
+
304
+ def test_relational_ops
305
+ assert_equal "false", resolve("1 > 2")
306
+ assert_equal "false", resolve("2 > 2")
307
+ assert_equal "true", resolve("3 > 2")
308
+ assert_equal "false", resolve("1 >= 2")
309
+ assert_equal "true", resolve("2 >= 2")
310
+ assert_equal "true", resolve("3 >= 2")
311
+ assert_equal "true", resolve("1 < 2")
312
+ assert_equal "false", resolve("2 < 2")
313
+ assert_equal "false", resolve("3 < 2")
314
+ assert_equal "true", resolve("1 <= 2")
315
+ assert_equal "true", resolve("2 <= 2")
316
+ assert_equal "false", resolve("3 <= 2")
317
+ end
318
+
319
+ def test_equals
320
+ assert_equal("true", resolve('"foo" == $foo', {},
321
+ env("foo" => Sass::Script::String.new("foo"))))
322
+ assert_equal "true", resolve("1 == 1.0")
323
+ assert_equal "true", resolve("false != true")
324
+ assert_equal "false", resolve("1em == 1px")
325
+ assert_equal "false", resolve("12 != 12")
326
+ assert_equal "true", resolve("(foo bar baz) == (foo bar baz)")
327
+ assert_equal "true", resolve("(foo, bar, baz) == (foo, bar, baz)")
328
+ assert_equal "true", resolve('((1 2), (3, 4), (5 6)) == ((1 2), (3, 4), (5 6))')
329
+ assert_equal "true", resolve('((1 2), (3 4)) == (1 2, 3 4)')
330
+ assert_equal "false", resolve('((1 2) 3) == (1 2 3)')
331
+ assert_equal "false", resolve('(1 (2 3)) == (1 2 3)')
332
+ assert_equal "false", resolve('((1, 2) (3, 4)) == (1, 2 3, 4)')
333
+ assert_equal "false", resolve('(1 2 3) == (1, 2, 3)')
334
+ end
335
+
336
+ def test_operation_precedence
337
+ assert_equal "false true", resolve("true and false false or true")
338
+ assert_equal "true", resolve("false and true or true and true")
339
+ assert_equal "true", resolve("1 == 2 or 3 == 3")
340
+ assert_equal "true", resolve("1 < 2 == 3 >= 3")
341
+ assert_equal "true", resolve("1 + 3 > 4 - 2")
342
+ assert_equal "11", resolve("1 + 2 * 3 + 4")
343
+ end
344
+
345
+ def test_functions
346
+ assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)")
347
+ assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001")
348
+ end
349
+
350
+ def test_operator_unit_conversion
351
+ assert_equal "1.1cm", resolve("1cm + 1mm")
352
+ assert_equal "true", resolve("2mm < 1cm")
353
+ assert_equal "true", resolve("10mm == 1cm")
354
+ assert_equal "true", resolve("1 == 1cm")
355
+ assert_equal "true", resolve("1.1cm == 11mm")
356
+ end
357
+
358
+ def test_operations_have_options
359
+ assert_equal "Options defined!", resolve("assert_options(1 + 1)")
360
+ assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
361
+ end
362
+
363
+ def test_slash_compiles_literally_when_left_alone
364
+ assert_equal "1px/2px", resolve("1px/2px")
365
+ assert_equal "1px/2px/3px/4px", resolve("1px/2px/3px/4px")
366
+
367
+ assert_equal "1px/2px redpx bluepx", resolve("1px/2px redpx bluepx")
368
+ assert_equal "foo 1px/2px/3px bar", resolve("foo 1px/2px/3px bar")
369
+ end
370
+
371
+ def test_slash_divides_with_parens
372
+ assert_equal "0.5", resolve("(1px/2px)")
373
+ assert_equal "0.5", resolve("(1px)/2px")
374
+ assert_equal "0.5", resolve("1px/(2px)")
375
+ end
376
+
377
+ def test_slash_divides_with_other_arithmetic
378
+ assert_equal "0.5px", resolve("1px*1px/2px")
379
+ assert_equal "0.5px", resolve("1px/2px*1px")
380
+ assert_equal "0.5", resolve("0+1px/2px")
381
+ assert_equal "0.5", resolve("1px/2px+0")
382
+ end
383
+
384
+ def test_slash_divides_with_variable
385
+ assert_equal "0.5", resolve("$var/2px", {}, env("var" => eval("1px")))
386
+ assert_equal "0.5", resolve("1px/$var", {}, env("var" => eval("2px")))
387
+ assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
388
+ end
389
+
390
+ def test_colors_with_wrong_number_of_digits
391
+ assert_raise_message(Sass::SyntaxError,
392
+ "Colors must have either three or six digits: '#0'") {eval("#0")}
393
+ assert_raise_message(Sass::SyntaxError,
394
+ "Colors must have either three or six digits: '#12'") {eval("#12")}
395
+ assert_raise_message(Sass::SyntaxError,
396
+ "Colors must have either three or six digits: '#abcd'") {eval("#abcd")}
397
+ assert_raise_message(Sass::SyntaxError,
398
+ "Colors must have either three or six digits: '#abcdE'") {eval("#abcdE")}
399
+ assert_raise_message(Sass::SyntaxError,
400
+ "Colors must have either three or six digits: '#abcdEFA'") {eval("#abcdEFA")}
401
+ end
402
+
403
+ def test_case_insensitive_color_names
404
+ assert_equal "blue", resolve("BLUE")
405
+ assert_equal "red", resolve("rEd")
406
+ assert_equal "#7f4000", resolve("mix(GrEeN, ReD)")
407
+ end
408
+
409
+ def test_empty_list
410
+ assert_equal "1 2 3", resolve("1 2 () 3")
411
+ assert_equal "1 2 3", resolve("1 2 3 ()")
412
+ assert_equal "1 2 3", resolve("() 1 2 3")
413
+ assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("()")}
414
+ assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
415
+ end
416
+
417
+ # Regression Tests
418
+
419
+ def test_funcall_has_higher_precedence_than_color_name
420
+ assert_equal "teal(12)", resolve("teal(12)")
421
+ assert_equal "tealbang(12)", resolve("tealbang(12)")
422
+ assert_equal "teal-bang(12)", resolve("teal-bang(12)")
423
+ assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
424
+ end
425
+
426
+ def test_interpolation_after_hash
427
+ assert_equal "#2", resolve('"##{1 + 1}"')
428
+ end
429
+
430
+ def test_misplaced_comma_in_funcall
431
+ assert_raise_message(Sass::SyntaxError,
432
+ 'Invalid CSS after "foo(bar, ": expected function argument, was ")"') {eval('foo(bar, )')}
433
+ end
434
+
435
+ def test_color_prefixed_identifier
436
+ assert_equal "tealbang", resolve("tealbang")
437
+ assert_equal "teal-bang", resolve("teal-bang")
438
+ end
439
+
440
+ def test_op_prefixed_identifier
441
+ assert_equal "notbang", resolve("notbang")
442
+ assert_equal "not-bang", resolve("not-bang")
443
+ assert_equal "or-bang", resolve("or-bang")
444
+ assert_equal "and-bang", resolve("and-bang")
445
+ end
446
+
447
+ private
448
+
449
+ def resolve(str, opts = {}, environment = env)
450
+ munge_filename opts
451
+ val = eval(str, opts, environment)
452
+ val.is_a?(Sass::Script::String) ? val.value : val.to_s
453
+ end
454
+
455
+ def assert_unquoted(str, opts = {}, environment = env)
456
+ munge_filename opts
457
+ val = eval(str, opts, environment)
458
+ assert_kind_of Sass::Script::String, val
459
+ assert_equal :identifier, val.type
460
+ end
461
+
462
+ def assert_quoted(str, opts = {}, environment = env)
463
+ munge_filename opts
464
+ val = eval(str, opts, environment)
465
+ assert_kind_of Sass::Script::String, val
466
+ assert_equal :string, val.type
467
+ end
468
+
469
+ def eval(str, opts = {}, environment = env)
470
+ munge_filename opts
471
+ environment.options = opts
472
+ Sass::Script.parse(str, opts.delete(:line) || 1,
473
+ opts.delete(:offset) || 0, opts).perform(environment)
474
+ end
475
+
476
+ def render(sass, options = {})
477
+ munge_filename options
478
+ Sass::Engine.new(sass, options).render
479
+ end
480
+
481
+ def env(hash = {})
482
+ env = Sass::Environment.new
483
+ hash.each {|k, v| env.set_var(k, v)}
484
+ env
485
+ end
486
+
487
+ def test_number_printing
488
+ assert_equal "1", eval("1")
489
+ assert_equal "1", eval("1.0")
490
+ assert_equal "1.121", eval("1.1214")
491
+ assert_equal "1.122", eval("1.1215")
492
+ assert_equal "Infinity", eval("1.0/0.0")
493
+ assert_equal "-Infinity", eval("-1.0/0.0")
494
+ assert_equal "NaN", eval("0.0/0.0")
495
+ end
496
+ end