require File.dirname(__FILE__) + '/../test_helper'

class ValueHelpersTest < MiniTest::Test
  include Sass::Script
  include Sass::Script::Value::Helpers

  def test_bool
    assert_same Value::Bool::TRUE, bool(true)
    assert_same Value::Bool::FALSE, bool(false)
    assert_same Value::Bool::FALSE, bool(nil)
    assert_same Value::Bool::TRUE, bool(Object.new)
  end

  def test_hex_color_with_three_digits
    color = hex_color("F07")
    assert_equal 255, color.red
    assert_equal 0, color.green
    assert_equal 119, color.blue
    assert_equal 1, color.alpha
  end

  def test_hex_color_without_hash
    color_without_hash = hex_color("FF007F")
    assert_equal 255, color_without_hash.red
    assert_equal 0, color_without_hash.green
    assert_equal 127, color_without_hash.blue
    assert_equal 1, color_without_hash.alpha
  end

  def test_hex_color_with_hash
    color_with_hash = hex_color("#FF007F")
    assert_equal 255, color_with_hash.red
    assert_equal 0, color_with_hash.green
    assert_equal 127, color_with_hash.blue
    assert_equal 1, color_with_hash.alpha
  end

  def test_malformed_hex_color
    assert_raises ArgumentError do
      hex_color("green")
    end
    assert_raises ArgumentError do
      hex_color("#abcd")
    end
  end


  def test_hex_color_with_alpha
    color_with_alpha = hex_color("FF007F", 0.5)
    assert_equal 0.5, color_with_alpha.alpha
  end

  def test_hex_color_alpha_clamps_0_to_1
    assert_equal 1, hex_color("FF007F", 50).alpha
  end

  def test_hsl_color_without_alpha
    no_alpha = hsl_color(1, 0.5, 1)
    assert_equal 1, no_alpha.hue
    assert_equal 0.5, no_alpha.saturation
    assert_equal 1, no_alpha.lightness
    assert_equal 1, no_alpha.alpha
  end

  def test_hsl_color_with_alpha
    has_alpha = hsl_color(1, 0.5, 1, 0.5)
    assert_equal 1, has_alpha.hue
    assert_equal 0.5, has_alpha.saturation
    assert_equal 1, has_alpha.lightness
    assert_equal 0.5, has_alpha.alpha
  end

  def test_rgb_color_without_alpha
    no_alpha = rgb_color(255, 0, 0)
    assert_equal 255, no_alpha.red
    assert_equal 0, no_alpha.green
    assert_equal 0, no_alpha.blue
    assert_equal 1, no_alpha.alpha
  end

  def test_rgb_color_with_alpha
    has_alpha = rgb_color(255, 255, 255, 0.5)
    assert_equal 255, has_alpha.red
    assert_equal 255, has_alpha.green
    assert_equal 255, has_alpha.blue
    assert_equal 0.5, has_alpha.alpha
  end

  def test_number
    n = number(1)
    assert_equal 1, n.value
    assert_equal "1", n.to_sass
  end

  def test_number_with_single_unit
    n = number(1, "px")
    assert_equal 1, n.value
    assert_equal "1px", n.to_sass
  end

  def test_number_with_singal_numerator_and_denominator
    ratio = number(1, "px/em")
    assert_equal "1px/em", ratio.to_sass
  end

  def test_number_with_many_numerator_and_denominator_units
    complex = number(1, "px*in/em*%")
    assert_equal "1in*px/%*em", complex.to_sass
  end

  def test_number_with_many_numerator_and_denominator_units_with_spaces
    complex = number(1, "px * in / em * %")
    assert_equal "1in*px/%*em", complex.to_sass
  end

  def test_number_with_malformed_units
    assert_raises ArgumentError do
      number(1, "px/em/%")
    end
    assert_raises ArgumentError do
      number(1, "/")
    end
    assert_raises ArgumentError do
      number(1, "px/")
    end
  end

  def test_space_list
    l = list(number(1, "px"), hex_color("#f71"), :space)
    l.options = {}
    assert_kind_of Sass::Script::Value::List, l
    assert_equal "1px #f71", l.to_sass
  end

  def test_comma_list
    l = list(number(1, "px"), hex_color("#f71"), :comma)
    l.options = {}
    assert_kind_of Sass::Script::Value::List, l
    assert_equal "1px, #f71", l.to_sass
  end

  def test_missing_list_type
    assert_raises ArgumentError do
      list(number(1, "px"), hex_color("#f71"))
    end
  end

  def test_null
    assert_kind_of Sass::Script::Value::Null, null
  end

  def test_quoted_string
    s = quoted_string("sassy string")
    s.options = {}
    assert_kind_of Sass::Script::Value::String, s
    assert_equal "sassy string", s.value
    assert_equal :string, s.type
    assert_equal '"sassy string"', s.to_sass
  end

  def test_identifier
    s = identifier("a-sass-ident")
    s.options = {}
    assert_kind_of Sass::Script::Value::String, s
    assert_equal "a-sass-ident", s.value
    assert_equal :identifier, s.type
    assert_equal "a-sass-ident", s.to_sass
  end

  def test_unquoted_string
    s = unquoted_string("a-sass-ident")
    s.options = {}
    assert_kind_of Sass::Script::Value::String, s
    assert_equal "a-sass-ident", s.value
    assert_equal :identifier, s.type
    assert_equal "a-sass-ident", s.to_sass
  end
end
