Guest User

Untitled

a guest
Apr 19th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. require File.dirname(__FILE__) + '/../test_helper'
  2.  
  3. class ColorTest < MoodlogTestCase
  4. fixtures :people, :moods
  5.  
  6. def setup
  7. @palette = [
  8. @white = Color.new(:value => 0xffffff),
  9. @black = Color.new(:value => 0x000000),
  10. @red = Color.new(:value => 0xff0000),
  11. @green = Color.new(:value => 0x00ff00),
  12. @blue = Color.new(:value => 0x0000ff),
  13. @fuchsia = Color.new(:value => 0xff00ff),
  14. @purple = Color.new(:value => 0x800080),
  15. @turquoise = Color.new(:value => 0x48D1CC),
  16. Color.new(:value => 0x112233),
  17. Color.new(:value => 0x001100),
  18. Color.new(:value => 0x000011),
  19. Color.new(:value => 0x000001),
  20. ]
  21. end
  22.  
  23. def test_new_with_rgb
  24. color = Color.new(:rgb => "#ffffff")
  25. assert_equal 0xffffff, color.value
  26. end
  27.  
  28. def test_create_with_rgb
  29. color = create_color(:rgb => "#ffffff")
  30. assert_equal 0xffffff, color.value
  31. end
  32.  
  33. def test_create_with_rgb_case_insensitive
  34. color = create_color(:rgb => "#fFFfFF")
  35. assert_equal 0xffffff, color.value
  36. end
  37.  
  38. def test_update_with_rgb
  39. color = create_color(:rgb => "#ffffff")
  40. color.update_attributes(:rgb => "#000011")
  41. assert_equal 0x000011, color.value
  42. end
  43.  
  44. def test_get_rgb
  45. ["#ffffff", "#112233", "#001100", "#000011", "#000001", "#000000"].each do |s|
  46. color = create_color(:rgb => s)
  47. assert_equal s, color.rgb
  48. end
  49. end
  50.  
  51. def test_to_rgb
  52. assert_equal "#dababe", Color.to_rgb(0xdababe)
  53. assert_equal Color::NEUTRAL, Color.to_rgb(nil)
  54. end
  55.  
  56. def test_hsl_for_black
  57. black = create_color(:rgb => "#000000")
  58. assert_equal 0, black.hue
  59. assert_equal 0, black.saturation
  60. assert_equal 0, black.lightness
  61. end
  62.  
  63. def test_hsl_for_white
  64. white = create_color(:rgb => "#FFFFFF")
  65. assert_equal 0, white.hue
  66. assert_equal 0, white.saturation
  67. assert_equal 1, white.lightness
  68. end
  69.  
  70. def test_hsl_to_rgb
  71. random_colors.each do |color|
  72. # assert_between_0_and_1 color.hue # todo: figure out why this is possible
  73. assert_between_0_and_1 color.saturation
  74. assert_between_0_and_1 color.lightness
  75. assert_equal color.rgb, Color.from_hsl(color.hsl).rgb
  76. end
  77. end
  78.  
  79. def assert_between_0_and_1(x)
  80. assert x >= 0, "#{x} should be >= 0"
  81. assert x <= 1.0 || approx_equal?(x, 1.0), "#{x} should be <= 1.0"
  82. end
  83.  
  84. def approx_equal?(a,b,threshold = 0.0000001)
  85. (a-b).abs<threshold
  86. end
  87.  
  88.  
  89. def random_colors
  90. rgbs = @palette
  91. 50.times { rgbs << Color.new(:rgb => "#%.6x" % rand(0x1000000).to_i) }
  92. rgbs
  93. end
  94.  
  95. def test_contrast
  96. assert_equal "#ffffff", create_color(:rgb => "#000000").contrast
  97. assert_equal "#000000", create_color(:rgb => "#ffffff").contrast
  98.  
  99. assert_equal "#000000", create_color(:rgb => "#888888").contrast
  100. assert_equal "#ffffff", create_color(:rgb => "#777777").contrast
  101.  
  102. random_colors.each do |color|
  103. assert_equal color.lightness < 0.5 ? '#ffffff' : '#000000', color.contrast, color.rgb
  104. end
  105. end
  106.  
  107. def test_consensus_where_none
  108. assert_nil Color.consensus(moods(:happy))
  109. end
  110.  
  111. def test_consensus_where_one
  112. create_color(:person => people(:quentin), :mood => moods(:happy), :rgb => "#FF0000")
  113. assert_equal "#ff0000", Color.consensus(moods(:happy)).rgb
  114. end
  115.  
  116. def test_parts
  117. assert_equal 0xff, @red.red
  118. assert_equal 0, @green.red
  119. assert_equal 0, @blue.red
  120. assert_equal 0xff, @fuchsia.red
  121.  
  122. assert_equal 0x00, @red.green
  123. assert_equal 0xff, @green.green
  124. assert_equal 0x00, @blue.green
  125. assert_equal 0x00, @fuchsia.green
  126. end
  127.  
  128. # todo: use HSL instead of RGB to find average
  129. # def test_consensus_where_many
  130. # mood = moods(:happy)
  131. # red_sum = green_sum = blue_sum = 0
  132. # @palette.each_with_index do |x,i|
  133. # person = Person.create!(:username => "person#{i}",
  134. # :password => 'test', :password_confirmation => 'test',
  135. # :addresses => {0 => {:email => "person#{i}@example.com"}})
  136. # color = create_color(:person => person, :mood => mood, :rgb => x.rgb)
  137. # red_sum += color.red
  138. # green_sum += color.green
  139. # blue_sum += color.blue
  140. # end
  141. # consensus = Color.consensus(mood)
  142. # n = @palette.size
  143. # assert_equal red_sum/n, consensus.red
  144. # assert_equal blue_sum/n, consensus.blue
  145. # assert_equal green_sum/n, consensus.green
  146. # end
  147. #
  148. def test_consensus_where_many
  149. mood = moods(:happy)
  150. hue_sum = saturation_sum = lightness_sum = 0
  151. @palette.each_with_index do |x,i|
  152. person = Person.create!(:username => "person#{i}",
  153. :password => 'test', :password_confirmation => 'test',
  154. :addresses => {0 => {:email => "person#{i}@example.com"}})
  155. color = create_color(:person => person, :mood => mood, :rgb => x.rgb)
  156. hue_sum += color.hue
  157. saturation_sum += color.saturation
  158. lightness_sum += color.lightness
  159. end
  160. consensus = Color.consensus(mood)
  161. n = @palette.size
  162. assert_nearly_equal hue_sum/n, consensus.hue
  163. assert_nearly_equal lightness_sum/n, consensus.lightness
  164. assert_nearly_equal saturation_sum/n, consensus.saturation
  165. end
  166.  
  167. def assert_nearly_equal(expected, actual)
  168. assert_equal((expected*10.0).round, (actual*10.0).round, "Expected #{expected} and #{actual} to be nearly equal")
  169. end
  170.  
  171. def create_color(options = {})
  172. options = {:person => people(:quentin), :mood => moods(:happy)}.merge(options)
  173. Color.create(options)
  174. end
  175.  
  176. end
Add Comment
Please, Sign In to add comment