Permalink
Browse files

Added built-in colors

  • Loading branch information...
1 parent 64c806e commit e5ca08c0fc52d51d70a0d09c61a77205d5a2ba04 @wasnotrice wasnotrice committed Apr 15, 2012
Showing with 232 additions and 56 deletions.
  1. +155 −3 lib/shoes/color.rb
  2. +77 −53 spec/shoes/color_spec.rb
View
@@ -4,8 +4,7 @@ class Color
OPAQUE = 255
TRANSPARENT = 0
-
- def initialize(red, green, blue, alpha=255)
+ def initialize(red, green, blue, alpha = OPAQUE)
to_rgb = lambda { |v| v.is_a?(Fixnum) ? v : (255 * v).round }
@red = to_rgb.call(red)
@green = to_rgb.call(green)
@@ -17,7 +16,7 @@ def initialize(red, green, blue, alpha=255)
# In Red Shoes, returns a new color object with these rgb values,
# like a shortcut for Shoes::Color.new
- def rgb(red, green, blue, alpha = 255)
+ def rgb(red, green, blue, alpha = OPAQUE)
Shoes::Color.new(red, green, blue, alpha)
end
@@ -51,4 +50,157 @@ def <=>(other)
return -1 if @red + @green + @blue < other.red + other.green + other.blue
end
end
+
+ # Create all of the built-in Shoes colors
+ COLORS = {}
+
+ module ElementMethods
+ colors = [
+ [:aliceblue, 240, 248, 255],
+ [:antiquewhite, 250, 235, 215],
+ [:aqua, 0, 255, 255],
+ [:aquamarine, 127, 255, 212],
+ [:azure, 240, 255, 255],
+ [:beige, 245, 245, 220],
+ [:bisque, 255, 228, 196],
+ [:black, 0, 0, 0],
+ [:blanchedalmond, 255, 235, 205],
+ [:blue, 0, 0, 255],
+ [:blueviolet, 138, 43, 226],
+ [:brown, 165, 42, 42],
+ [:burlywood, 222, 184, 135],
+ [:cadetblue, 95, 158, 160],
+ [:chartreuse, 127, 255, 0],
+ [:chocolate, 210, 105, 30],
+ [:coral, 255, 127, 80],
+ [:cornflowerblue, 100, 149, 237],
+ [:cornsilk, 255, 248, 220],
+ [:crimson, 220, 20, 60],
+ [:cyan, 0, 255, 255],
+ [:darkblue, 0, 0, 139],
+ [:darkcyan, 0, 139, 139],
+ [:darkgoldenrod, 184, 134, 11],
+ [:darkgray, 169, 169, 169],
+ [:darkgreen, 0, 100, 0],
+ [:darkkhaki, 189, 183, 107],
+ [:darkmagenta, 139, 0, 139],
+ [:darkolivegreen, 85, 107, 47],
+ [:darkorange, 255, 140, 0],
+ [:darkorchid, 153, 50, 204],
+ [:darkred, 139, 0, 0],
+ [:darksalmon, 233, 150, 122],
+ [:darkseagreen, 143, 188, 143],
+ [:darkslateblue, 72, 61, 139],
+ [:darkslategray, 47, 79, 79],
+ [:darkturquoise, 0, 206, 209],
+ [:darkviolet, 148, 0, 211],
+ [:deeppink, 255, 20, 147],
+ [:deepskyblue, 0, 191, 255],
+ [:dimgray, 105, 105, 105],
+ [:dodgerblue, 30, 144, 255],
+ [:firebrick, 178, 34, 34],
+ [:floralwhite, 255, 250, 240],
+ [:forestgreen, 34, 139, 34],
+ [:fuchsia, 255, 0, 255],
+ [:gainsboro, 220, 220, 220],
+ [:ghostwhite, 248, 248, 255],
+ [:gold, 255, 215, 0],
+ [:goldenrod, 218, 165, 32],
+ [:gray, 128, 128, 128],
+ [:green, 0, 128, 0],
+ [:greenyellow, 173, 255, 47],
+ [:honeydew, 240, 255, 240],
+ [:hotpink, 255, 105, 180],
+ [:indianred, 205, 92, 92],
+ [:indigo, 75, 0, 130],
+ [:ivory, 255, 255, 240],
+ [:khaki, 240, 230, 140],
+ [:lavender, 230, 230, 250],
+ [:lavenderblush, 255, 240, 245],
+ [:lawngreen, 124, 252, 0],
+ [:lemonchiffon, 255, 250, 205],
+ [:lightblue, 173, 216, 230],
+ [:lightcoral, 240, 128, 128],
+ [:lightcyan, 224, 255, 255],
+ [:lightgoldenrodyellow, 250, 250, 210],
+ [:lightgreen, 144, 238, 144],
+ [:lightgrey, 211, 211, 211],
+ [:lightpink, 255, 182, 193],
+ [:lightsalmon, 255, 160, 122],
+ [:lightseagreen, 32, 178, 170],
+ [:lightskyblue, 135, 206, 250],
+ [:lightslategray, 119, 136, 153],
+ [:lightsteelblue, 176, 196, 222],
+ [:lightyellow, 255, 255, 224],
+ [:lime, 0, 255, 0],
+ [:limegreen, 50, 205, 50],
+ [:linen, 250, 240, 230],
+ [:magenta, 255, 0, 255],
+ [:maroon, 128, 0, 0],
+ [:mediumaquamarine, 102, 205, 170],
+ [:mediumblue, 0, 0, 205],
+ [:mediumorchid, 186, 85, 211],
+ [:mediumpurple, 147, 112, 219],
+ [:mediumseagreen, 60, 179, 113],
+ [:mediumslateblue, 123, 104, 238],
+ [:mediumspringgreen, 0, 250, 154],
+ [:mediumturquoise, 72, 209, 204],
+ [:mediumvioletred, 199, 21, 133],
+ [:midnightblue, 25, 25, 112],
+ [:mintcream, 245, 255, 250],
+ [:mistyrose, 255, 228, 225],
+ [:moccasin, 255, 228, 181],
+ [:navajowhite, 255, 222, 173],
+ [:navy, 0, 0, 128],
+ [:oldlace, 253, 245, 230],
+ [:olive, 128, 128, 0],
+ [:olivedrab, 107, 142, 35],
+ [:orange, 255, 165, 0],
+ [:orangered, 255, 69, 0],
+ [:orchid, 218, 112, 214],
+ [:palegoldenrod, 238, 232, 170],
+ [:palegreen, 152, 251, 152],
+ [:paleturquoise, 175, 238, 238],
+ [:palevioletred, 219, 112, 147],
+ [:papayawhip, 255, 239, 213],
+ [:peachpuff, 255, 218, 185],
+ [:peru, 205, 133, 63],
+ [:pink, 255, 192, 203],
+ [:plum, 221, 160, 221],
+ [:powderblue, 176, 224, 230],
+ [:purple, 128, 0, 128],
+ [:red, 255, 0, 0],
+ [:rosybrown, 188, 143, 143],
+ [:royalblue, 65, 105, 225],
+ [:saddlebrown, 139, 69, 19],
+ [:salmon, 250, 128, 114],
+ [:sandybrown, 244, 164, 96],
+ [:seagreen, 46, 139, 87],
+ [:seashell, 255, 245, 238],
+ [:sienna, 160, 82, 45],
+ [:silver, 192, 192, 192],
+ [:skyblue, 135, 206, 235],
+ [:slateblue, 106, 90, 205],
+ [:slategray, 112, 128, 144],
+ [:snow, 255, 250, 250],
+ [:springgreen, 0, 255, 127],
+ [:steelblue, 70, 130, 180],
+ [:tan, 210, 180, 140],
+ [:teal, 0, 128, 128],
+ [:thistle, 216, 191, 216],
+ [:tomato, 255, 99, 71],
+ [:turquoise, 64, 224, 208],
+ [:violet, 238, 130, 238],
+ [:wheat, 245, 222, 179],
+ [:white, 255, 255, 255],
+ [:whitesmoke, 245, 245, 245],
+ [:yellow, 255, 255, 0],
+ [:yellowgreen, 154, 205, 50],
+ ]
+
+ colors.each do |c, r, g, b|
+ Shoes::COLORS[c] = Shoes::Color.new(r, g, b)
+ define_method(c) { Shoes::COLORS.fetch(c) }
+ end
+ end
end
View
@@ -1,4 +1,3 @@
-$LOAD_PATH << "../lib"
require 'shoes/color'
describe Shoes::Color do
@@ -40,6 +39,12 @@
end
end
+ context "white" do
+ subject { Shoes::Color.new(255, 255, 255) }
+ it { should be_white }
+ it { should_not be_black }
+ end
+
context "peru" do
shared_examples_for "peru" do
its(:class) { should eq(Shoes::Color) }
@@ -92,78 +97,97 @@
end
end
end
-end
-describe "light and dark" do
- let(:lightgreen) { Shoes::Color.new(144, 238, 144) }
- let(:darkgreen) { Shoes::Color.new(0, 100, 0) }
- let(:mediumseagreen) { Shoes::Color.new(60, 179, 113) }
+ describe "bad input" do
- specify "light color is light" do
- lightgreen.should be_light
- mediumseagreen.should_not be_light
- darkgreen.should_not be_light
end
- specify "dark color is dark" do
- lightgreen.should_not be_dark
- mediumseagreen.should_not be_dark
- darkgreen.should be_dark
- end
-end
+ describe "light and dark" do
+ let(:lightgreen) { Shoes::Color.new(144, 238, 144) }
+ let(:darkgreen) { Shoes::Color.new(0, 100, 0) }
+ let(:mediumseagreen) { Shoes::Color.new(60, 179, 113) }
-describe "transparency" do
- let(:transparent) { Shoes::Color.new(25, 25, 112, 0) }
- let(:semi) { Shoes::Color.new(25, 25, 112, 100) }
- let(:opaque) { Shoes::Color.new(25, 25, 25) }
+ specify "light color is light" do
+ lightgreen.should be_light
+ mediumseagreen.should_not be_light
+ darkgreen.should_not be_light
+ end
- specify "only transparent colors are transparent" do
- transparent.should be_transparent
- semi.should_not be_transparent
- opaque.should_not be_transparent
+ specify "dark color is dark" do
+ lightgreen.should_not be_dark
+ mediumseagreen.should_not be_dark
+ darkgreen.should be_dark
+ end
end
- specify "only opaque colors should be opaque" do
- transparent.should_not be_opaque
- semi.should_not be_opaque
- opaque.should be_opaque
- end
-end
+ describe "transparency" do
+ let(:transparent) { Shoes::Color.new(25, 25, 112, 0) }
+ let(:semi) { Shoes::Color.new(25, 25, 112, 100) }
+ let(:opaque) { Shoes::Color.new(25, 25, 25) }
-describe "comparable" do
- let(:color_1) { Shoes::Color.new(255, 69, 0) } # orangered
+ specify "only transparent colors are transparent" do
+ transparent.should be_transparent
+ semi.should_not be_transparent
+ opaque.should_not be_transparent
+ end
- it "is equal when values are equal" do
- color_2 = Shoes::Color.new(255, 69, 0)
- color_1.should eq(color_2)
+ specify "only opaque colors should be opaque" do
+ transparent.should_not be_opaque
+ semi.should_not be_opaque
+ opaque.should be_opaque
+ end
end
- it "is less than when darker" do
- color_2 = Shoes::Color.new(255, 70, 0)
- color_1.should be < color_2
- end
+ describe "comparable" do
+ let(:color_1) { Shoes::Color.new(255, 69, 0) } # orangered
+
+ it "is equal when values are equal" do
+ color_2 = Shoes::Color.new(255, 69, 0)
+ color_1.should eq(color_2)
+ end
+
+ it "is less than when darker" do
+ color_2 = Shoes::Color.new(255, 70, 0)
+ color_1.should be < color_2
+ end
- it "is greater than when lighter" do
- color_2 = Shoes::Color.new(255, 68, 0)
- color_1.should be > color_2
+ it "is greater than when lighter" do
+ color_2 = Shoes::Color.new(255, 68, 0)
+ color_1.should be > color_2
+ end
end
-end
-describe "rgb" do
- let(:color) { Shoes::Color.new(135, 206, 235) } # skyblue
- let(:new_color) { color.rgb(135, 206, 235) }
+ describe "rgb" do
+ let(:color) { Shoes::Color.new(135, 206, 235) } # skyblue
+ let(:new_color) { color.rgb(135, 206, 235) }
+
+ it "returns a new Shoes::Color object" do
+ new_color.should_not equal(color)
+ new_color.should eq(color)
+ end
- it "returns a new Shoes::Color object" do
- new_color.should_not equal(color)
- new_color.should eq(color)
+ it "accepts alpha" do
+ color.rgb(135, 206, 235, 40).alpha.should eq(40)
+ end
+
+ it "allows alpha to be omitted" do
+ new_color.alpha.should eq(255)
+ end
end
+end
- it "accepts alpha" do
- color.rgb(135, 206, 235, 40).alpha.should eq(40)
+describe "Shoes built-in colors" do
+ specify "there are 140" do
+ Shoes::COLORS.length.should eq(140)
end
- it "allows alpha to be omitted" do
- new_color.alpha.should eq(255)
+ class MockApp
+ include Shoes::ElementMethods
end
+
+ subject { MockApp.new }
+
+ its(:papayawhip) { should eq(Shoes::Color.new(255, 239, 213)) }
+ its(:aquamarine) { should eq(Shoes::Color.new(127, 255, 212)) }
end

0 comments on commit e5ca08c

Please sign in to comment.