diff --git a/lib/sass/script/functions.rb b/lib/sass/script/functions.rb index e647815c..35fa71eb 100644 --- a/lib/sass/script/functions.rb +++ b/lib/sass/script/functions.rb @@ -27,8 +27,13 @@ module Sass::Script # hue is in degrees, # and saturation and lightness are percentages. def hsl(h, s, l) + original_s = s + original_l = l # This algorithm is from http://www.w3.org/TR/css3-color#hsl-color h, s, l = [h, s, l].map { |a| a.value } + raise ArgumentError.new("Saturation #{s} must be between 0% and 100%") if s < 0 || s > 100 + raise ArgumentError.new("Lightness #{l} must be between 0% and 100%") if l < 0 || l > 100 + h = (h % 360) / 360.0 s /= 100.0 l /= 100.0 diff --git a/test/sass/functions_test.rb b/test/sass/functions_test.rb index 3b93f0c5..8be04739 100644 --- a/test/sass/functions_test.rb +++ b/test/sass/functions_test.rb @@ -43,6 +43,11 @@ class SassFunctionTest < Test::Unit::TestCase assert_rgb_hsl(purple, ['2820', '100%', '50%']) end + def test_hsl_checks_bounds + assert_error_message("Saturation -114 must be between 0% and 100% for `hsl'", "hsl(10, -114, 12)"); + assert_error_message("Lightness 256 must be between 0% and 100% for `hsl'", "hsl(10, 10, 256%)"); + end + def test_percentage assert_equal("50%", evaluate("percentage(.5)")) assert_equal("100%", evaluate("percentage(1)")) @@ -81,12 +86,10 @@ class SassFunctionTest < Test::Unit::TestCase end def assert_error_message(message, value) - begin - evaluate(value) - flunk("Error message expected but not raised: #{message}") - rescue Sass::SyntaxError => e - assert_equal(message, e.message) - end + evaluate(value) + flunk("Error message expected but not raised: #{message}") + rescue Sass::SyntaxError => e + assert_equal(message, e.message) end end