shoes-core 4.0.0.pre3

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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +31 -0
  3. data/README.md +8 -0
  4. data/Rakefile +1 -0
  5. data/bin/shoes +62 -0
  6. data/bin/shoes-guard +8 -0
  7. data/bin/shoes-picker +6 -0
  8. data/bin/shoes-stub +62 -0
  9. data/ext/install/Rakefile +29 -0
  10. data/ext/install/shoes.bat +15 -0
  11. data/fonts/Coolvetica.ttf +0 -0
  12. data/fonts/Lacuna.ttf +0 -0
  13. data/lib/rubygems_plugin.rb +24 -0
  14. data/lib/shoes.rb +1 -0
  15. data/lib/shoes/animation.rb +56 -0
  16. data/lib/shoes/app.rb +130 -0
  17. data/lib/shoes/arc.rb +25 -0
  18. data/lib/shoes/background.rb +20 -0
  19. data/lib/shoes/border.rb +20 -0
  20. data/lib/shoes/builtin_methods.rb +76 -0
  21. data/lib/shoes/button.rb +29 -0
  22. data/lib/shoes/check_button.rb +41 -0
  23. data/lib/shoes/color.rb +387 -0
  24. data/lib/shoes/common/background_element.rb +9 -0
  25. data/lib/shoes/common/changeable.rb +34 -0
  26. data/lib/shoes/common/clickable.rb +24 -0
  27. data/lib/shoes/common/inspect.rb +14 -0
  28. data/lib/shoes/common/positioning.rb +30 -0
  29. data/lib/shoes/common/registration.rb +31 -0
  30. data/lib/shoes/common/remove.rb +10 -0
  31. data/lib/shoes/common/state.rb +16 -0
  32. data/lib/shoes/common/style.rb +160 -0
  33. data/lib/shoes/common/style_normalizer.rb +16 -0
  34. data/lib/shoes/common/ui_element.rb +11 -0
  35. data/lib/shoes/common/visibility.rb +41 -0
  36. data/lib/shoes/configuration.rb +96 -0
  37. data/lib/shoes/core.rb +1 -0
  38. data/lib/shoes/core/version.rb +5 -0
  39. data/lib/shoes/dialog.rb +56 -0
  40. data/lib/shoes/dimension.rb +269 -0
  41. data/lib/shoes/dimensions.rb +203 -0
  42. data/lib/shoes/download.rb +130 -0
  43. data/lib/shoes/dsl.rb +656 -0
  44. data/lib/shoes/file_not_found_error.rb +4 -0
  45. data/lib/shoes/font.rb +50 -0
  46. data/lib/shoes/gradient.rb +31 -0
  47. data/lib/shoes/image.rb +53 -0
  48. data/lib/shoes/image_pattern.rb +12 -0
  49. data/lib/shoes/input_box.rb +59 -0
  50. data/lib/shoes/internal_app.rb +230 -0
  51. data/lib/shoes/key_event.rb +17 -0
  52. data/lib/shoes/line.rb +84 -0
  53. data/lib/shoes/link.rb +57 -0
  54. data/lib/shoes/link_hover.rb +5 -0
  55. data/lib/shoes/list_box.rb +50 -0
  56. data/lib/shoes/logger.rb +65 -0
  57. data/lib/shoes/logger/ruby.rb +16 -0
  58. data/lib/shoes/mock.rb +33 -0
  59. data/lib/shoes/mock/animation.rb +8 -0
  60. data/lib/shoes/mock/app.rb +49 -0
  61. data/lib/shoes/mock/arc.rb +9 -0
  62. data/lib/shoes/mock/background.rb +10 -0
  63. data/lib/shoes/mock/border.rb +7 -0
  64. data/lib/shoes/mock/button.rb +22 -0
  65. data/lib/shoes/mock/check.rb +24 -0
  66. data/lib/shoes/mock/clickable.rb +8 -0
  67. data/lib/shoes/mock/common_methods.rb +12 -0
  68. data/lib/shoes/mock/dialog.rb +13 -0
  69. data/lib/shoes/mock/download.rb +16 -0
  70. data/lib/shoes/mock/font.rb +15 -0
  71. data/lib/shoes/mock/image.rb +13 -0
  72. data/lib/shoes/mock/image_pattern.rb +8 -0
  73. data/lib/shoes/mock/input_box.rb +30 -0
  74. data/lib/shoes/mock/keypress.rb +11 -0
  75. data/lib/shoes/mock/keyrelease.rb +11 -0
  76. data/lib/shoes/mock/line.rb +14 -0
  77. data/lib/shoes/mock/link.rb +11 -0
  78. data/lib/shoes/mock/list_box.rb +19 -0
  79. data/lib/shoes/mock/oval.rb +11 -0
  80. data/lib/shoes/mock/packager.rb +13 -0
  81. data/lib/shoes/mock/progress.rb +10 -0
  82. data/lib/shoes/mock/radio.rb +27 -0
  83. data/lib/shoes/mock/rect.rb +14 -0
  84. data/lib/shoes/mock/shape.rb +20 -0
  85. data/lib/shoes/mock/slot.rb +16 -0
  86. data/lib/shoes/mock/sound.rb +8 -0
  87. data/lib/shoes/mock/star.rb +14 -0
  88. data/lib/shoes/mock/text_block.rb +36 -0
  89. data/lib/shoes/mock/timer.rb +8 -0
  90. data/lib/shoes/not_implemented_error.rb +4 -0
  91. data/lib/shoes/oval.rb +20 -0
  92. data/lib/shoes/packager.rb +26 -0
  93. data/lib/shoes/point.rb +54 -0
  94. data/lib/shoes/progress.rb +25 -0
  95. data/lib/shoes/radio.rb +15 -0
  96. data/lib/shoes/rect.rb +21 -0
  97. data/lib/shoes/renamed_delegate.rb +15 -0
  98. data/lib/shoes/shape.rb +159 -0
  99. data/lib/shoes/slot.rb +276 -0
  100. data/lib/shoes/slot_contents.rb +51 -0
  101. data/lib/shoes/sound.rb +18 -0
  102. data/lib/shoes/span.rb +16 -0
  103. data/lib/shoes/star.rb +50 -0
  104. data/lib/shoes/text.rb +24 -0
  105. data/lib/shoes/text_block.rb +142 -0
  106. data/lib/shoes/text_block_dimensions.rb +51 -0
  107. data/lib/shoes/timer.rb +14 -0
  108. data/lib/shoes/ui/cli.rb +67 -0
  109. data/lib/shoes/ui/picker.rb +47 -0
  110. data/lib/shoes/url.rb +44 -0
  111. data/lib/shoes/version.rb +3 -0
  112. data/lib/shoes/widget.rb +67 -0
  113. data/shoes-core.gemspec +22 -0
  114. data/spec/shoes/animation_spec.rb +71 -0
  115. data/spec/shoes/app_spec.rb +484 -0
  116. data/spec/shoes/arc_spec.rb +51 -0
  117. data/spec/shoes/background_spec.rb +47 -0
  118. data/spec/shoes/border_spec.rb +46 -0
  119. data/spec/shoes/builtin_methods_spec.rb +110 -0
  120. data/spec/shoes/button_spec.rb +44 -0
  121. data/spec/shoes/check_spec.rb +35 -0
  122. data/spec/shoes/color_spec.rb +408 -0
  123. data/spec/shoes/common/inspect_spec.rb +26 -0
  124. data/spec/shoes/common/remove_spec.rb +38 -0
  125. data/spec/shoes/common/style_normalizer_spec.rb +28 -0
  126. data/spec/shoes/common/style_spec.rb +147 -0
  127. data/spec/shoes/configuration_spec.rb +36 -0
  128. data/spec/shoes/constants_spec.rb +38 -0
  129. data/spec/shoes/dialog_spec.rb +171 -0
  130. data/spec/shoes/dimension_spec.rb +433 -0
  131. data/spec/shoes/dimensions_spec.rb +837 -0
  132. data/spec/shoes/download_spec.rb +146 -0
  133. data/spec/shoes/flow_spec.rb +133 -0
  134. data/spec/shoes/font_spec.rb +37 -0
  135. data/spec/shoes/framework_learning_spec.rb +30 -0
  136. data/spec/shoes/gradient_spec.rb +32 -0
  137. data/spec/shoes/helpers/fake_element.rb +17 -0
  138. data/spec/shoes/helpers/inspect_helpers.rb +5 -0
  139. data/spec/shoes/helpers/sample17_helper.rb +66 -0
  140. data/spec/shoes/image_spec.rb +68 -0
  141. data/spec/shoes/images/shoe.jpg +0 -0
  142. data/spec/shoes/input_box_spec.rb +80 -0
  143. data/spec/shoes/integration_spec.rb +20 -0
  144. data/spec/shoes/internal_app_spec.rb +141 -0
  145. data/spec/shoes/keypress_spec.rb +11 -0
  146. data/spec/shoes/keyrelease_spec.rb +12 -0
  147. data/spec/shoes/line_spec.rb +87 -0
  148. data/spec/shoes/link_spec.rb +118 -0
  149. data/spec/shoes/list_box_spec.rb +74 -0
  150. data/spec/shoes/logger/ruby_spec.rb +8 -0
  151. data/spec/shoes/logger_spec.rb +45 -0
  152. data/spec/shoes/oval_spec.rb +24 -0
  153. data/spec/shoes/packager_spec.rb +25 -0
  154. data/spec/shoes/point_spec.rb +71 -0
  155. data/spec/shoes/progress_spec.rb +54 -0
  156. data/spec/shoes/radio_spec.rb +32 -0
  157. data/spec/shoes/rect_spec.rb +39 -0
  158. data/spec/shoes/renamed_delegate_spec.rb +70 -0
  159. data/spec/shoes/shape_spec.rb +106 -0
  160. data/spec/shoes/shared_examples/button.rb +6 -0
  161. data/spec/shoes/shared_examples/changeable.rb +26 -0
  162. data/spec/shoes/shared_examples/clickable.rb +5 -0
  163. data/spec/shoes/shared_examples/common_methods.rb +35 -0
  164. data/spec/shoes/shared_examples/dimensions.rb +32 -0
  165. data/spec/shoes/shared_examples/dsl.rb +44 -0
  166. data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
  167. data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
  168. data/spec/shoes/shared_examples/dsl/background.rb +26 -0
  169. data/spec/shoes/shared_examples/dsl/border.rb +10 -0
  170. data/spec/shoes/shared_examples/dsl/button.rb +5 -0
  171. data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
  172. data/spec/shoes/shared_examples/dsl/check.rb +11 -0
  173. data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
  174. data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
  175. data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
  176. data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
  177. data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
  178. data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
  179. data/spec/shoes/shared_examples/dsl/image.rb +21 -0
  180. data/spec/shoes/shared_examples/dsl/line.rb +9 -0
  181. data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
  182. data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
  183. data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
  184. data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
  185. data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
  186. data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
  187. data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
  188. data/spec/shoes/shared_examples/dsl/shape.rb +57 -0
  189. data/spec/shoes/shared_examples/dsl/star.rb +111 -0
  190. data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
  191. data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
  192. data/spec/shoes/shared_examples/dsl/style.rb +32 -0
  193. data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
  194. data/spec/shoes/shared_examples/dsl/video.rb +5 -0
  195. data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
  196. data/spec/shoes/shared_examples/hover_leave.rb +11 -0
  197. data/spec/shoes/shared_examples/parent.rb +6 -0
  198. data/spec/shoes/shared_examples/scroll.rb +41 -0
  199. data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
  200. data/spec/shoes/shared_examples/slot.rb +394 -0
  201. data/spec/shoes/shared_examples/state.rb +19 -0
  202. data/spec/shoes/shared_examples/style.rb +82 -0
  203. data/spec/shoes/slot_spec.rb +186 -0
  204. data/spec/shoes/sound_spec.rb +15 -0
  205. data/spec/shoes/span_spec.rb +112 -0
  206. data/spec/shoes/spec_helper.rb +24 -0
  207. data/spec/shoes/stack_spec.rb +79 -0
  208. data/spec/shoes/star_spec.rb +48 -0
  209. data/spec/shoes/text_block_dimensions_spec.rb +75 -0
  210. data/spec/shoes/text_block_spec.rb +270 -0
  211. data/spec/shoes/url_spec.rb +68 -0
  212. data/spec/shoes/widget_spec.rb +70 -0
  213. data/spec/shoes_spec.rb +44 -0
  214. data/spec/spec_helper.rb +19 -0
  215. data/static/downloading.png +0 -0
  216. data/static/shoes-icon-blue.png +0 -0
  217. data/static/shoes-icon-brown.png +0 -0
  218. data/static/shoes-icon.png +0 -0
  219. metadata +366 -0
@@ -0,0 +1,27 @@
1
+ shared_examples_for "fill DSL method" do
2
+ let(:color) { Shoes::COLORS.fetch :tomato }
3
+
4
+ it "returns a color" do
5
+ expect(dsl.fill(color).class).to eq(Shoes::Color)
6
+ end
7
+
8
+ # This works differently on a container than on a normal element
9
+ it "sets on receiver" do
10
+ dsl.fill color
11
+ expect(dsl.style[:fill]).to eq(color)
12
+ end
13
+
14
+ it "applies to subsequently created objects" do
15
+ dsl.fill color
16
+ oval = dsl.oval(10, 10, 100, 100)
17
+ expect(oval.fill).to eq(color)
18
+ end
19
+
20
+ context "with hex string" do
21
+ let(:color) { "#fff" }
22
+
23
+ it "sets the color" do
24
+ expect(dsl.fill(color)).to eq(Shoes::COLORS[:white])
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ shared_examples_for "flow DSL method" do
2
+ let(:flow) {dsl.flow}
3
+
4
+ it "creates a Shoes::Flow" do
5
+ expect(flow).to be_an_instance_of(Shoes::Flow)
6
+ end
7
+
8
+ it 'reports an instance of Shoes::App when asked for its app' do
9
+ expect(flow.app.class).to eq Shoes::App
10
+ end
11
+
12
+ it 'reports an object that responds to stack when asked for its app' do
13
+ expect(flow.app).to respond_to :stack
14
+ end
15
+ end
@@ -0,0 +1,62 @@
1
+ shared_examples_for "creating gradient" do
2
+ it "returns correct gradient according to #to_s" do
3
+ expect(gradient.to_s).to eq("(Shoes::Gradient)")
4
+ end
5
+
6
+ it "returns correct gradient according to #inspect" do
7
+ expect(gradient.inspect).to match("[(]Shoes::Gradient:#{shoes_object_id_pattern} rgb[(]255, 0, 0[)]->rgb[(]0, 0, 255[)][)]")
8
+ end
9
+ end
10
+
11
+ shared_examples_for "gradient DSL method" do
12
+ context "with colors" do
13
+ include InspectHelpers
14
+
15
+ let(:red) { Shoes::Color.new(255, 0, 0) }
16
+ let(:blue) { Shoes::Color.new(0, 0, 255) }
17
+
18
+ context "two separate" do
19
+ it_behaves_like "creating gradient" do
20
+ let(:gradient) { dsl.gradient(red, blue) }
21
+ end
22
+ end
23
+
24
+ context "as range" do
25
+ it_behaves_like "creating gradient" do
26
+ let(:gradient) { dsl.gradient(red..blue) }
27
+ end
28
+ end
29
+ end
30
+
31
+ context "with strings" do
32
+ include InspectHelpers
33
+
34
+ let(:red) { "#f00" }
35
+ let(:blue) { "#00f" }
36
+
37
+ context "two separate" do
38
+ it_behaves_like "creating gradient" do
39
+ let(:gradient) { dsl.gradient(red, blue) }
40
+ end
41
+ end
42
+
43
+ context "as range" do
44
+ it_behaves_like "creating gradient" do
45
+ let(:gradient) { dsl.gradient(red..blue) }
46
+ end
47
+ end
48
+ end
49
+
50
+ context "with gradient" do
51
+ include InspectHelpers
52
+
53
+ it_behaves_like "creating gradient" do
54
+ let(:gradient_arg) { dsl.gradient("#f00", "#00f") }
55
+ let(:gradient) { dsl.gradient(gradient_arg) }
56
+ end
57
+ end
58
+
59
+ it "fails on bad input" do
60
+ expect { dsl.gradient(100) }.to raise_error(ArgumentError)
61
+ end
62
+ end
@@ -0,0 +1,21 @@
1
+ shared_examples_for "image DSL method" do
2
+ let(:path) { Shoes::DIR + '/static/shoes-icon.png' }
3
+ let(:opts) { {} }
4
+ let(:image) { dsl.image path, opts }
5
+
6
+ it 'should set the path' do
7
+ expect(image.file_path).to eq(path)
8
+ end
9
+
10
+ context 'with :top and :left style attributes' do
11
+ let(:opts) { {left: 55, top: 66} }
12
+
13
+ it 'should set the left' do
14
+ expect(image.left).to eq(55)
15
+ end
16
+
17
+ it 'should set the top' do
18
+ expect(image.top).to eq(66)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ shared_examples_for "line DSL method" do
2
+ it "creates a Shoes::Line" do
3
+ expect(dsl.line(10, 15, 20, 30)).to be_an_instance_of(Shoes::Line)
4
+ end
5
+
6
+ it "raises an ArgumentError" do
7
+ expect { dsl.line(30) }.to raise_error(ArgumentError)
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ shared_examples_for "nofill DSL method" do
2
+ it "sets nil" do
3
+ dsl.nofill
4
+ expect(dsl.style[:fill]).to eq(nil)
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ shared_examples_for "nostroke DSL method" do
2
+ it "sets nil" do
3
+ dsl.nostroke
4
+ expect(dsl.style[:stroke]).to eq(nil)
5
+ end
6
+ end
@@ -0,0 +1,88 @@
1
+ shared_examples_for "an oval/circle element" do
2
+ it "makes a Shoes::Oval" do
3
+ expect(oval).to be_instance_of(Shoes::Oval)
4
+ end
5
+
6
+ it "sets the proper dimensions" do
7
+ expect(oval.top).to eq(top)
8
+ expect(oval.left).to eq(left)
9
+ expect(oval.width).to eq(width)
10
+ expect(oval.height).to eq(height)
11
+ end
12
+
13
+ it "sets stroke" do
14
+ expect(oval.style[:stroke]).to eq(stroke)
15
+ end
16
+
17
+ it "sets fill" do
18
+ expect(oval.style[:fill]).to eq(fill)
19
+ end
20
+ end
21
+
22
+ shared_examples_for "oval DSL method" do
23
+ let(:left) { 20 }
24
+ let(:top) { 30 }
25
+ let(:width) { 100 }
26
+ let(:height) { 200 }
27
+ let(:stroke) { Shoes::COLORS[:black] }
28
+ let(:fill) { Shoes::COLORS[:black] }
29
+
30
+ describe "creating an oval" do
31
+ describe "with explicit arguments" do
32
+ let(:oval) { dsl.oval(left, top, width, height) }
33
+ it_behaves_like "an oval/circle element"
34
+ end
35
+
36
+ describe "with stroke and fill styles" do
37
+ let(:stroke) { Shoes::COLORS.fetch :orchid }
38
+ let(:fill) { Shoes::COLORS.fetch :lemonchiffon }
39
+
40
+ describe "as colors" do
41
+ let(:oval) { dsl.oval(left, top, width, height, stroke: stroke, fill: fill) }
42
+ it_behaves_like "an oval/circle element"
43
+ end
44
+
45
+ describe "as hex strings" do
46
+ let(:oval) { dsl.oval(left, top, width, height, stroke: stroke.hex, fill: fill.hex) }
47
+ it_behaves_like "an oval/circle element"
48
+ end
49
+ end
50
+
51
+ describe "with too few arguments" do
52
+ it "raises an ArgumentError" do
53
+ expect { dsl.oval(10) }.to raise_error(ArgumentError)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "creating a circle" do
59
+ let(:width) { height }
60
+
61
+ describe "with explicit arguments" do
62
+ let(:oval) { dsl.oval(left, top, width, height) }
63
+ it_behaves_like "an oval/circle element"
64
+ end
65
+
66
+ describe "with top, left, diameter" do
67
+ let(:oval) { dsl.oval(left, top, width) }
68
+ it_behaves_like "an oval/circle element"
69
+ end
70
+
71
+ describe "with a style hash" do
72
+ describe "containing left, top, height, width" do
73
+ let(:oval) { dsl.oval(left: left, top: top, width: width, height: height) }
74
+ it_behaves_like "an oval/circle element"
75
+ end
76
+
77
+ describe "containing left, top, height, width, center: false" do
78
+ let(:oval) { dsl.oval(left: left, top: top, width: width, height: height, center: false) }
79
+ it_behaves_like "an oval/circle element"
80
+ end
81
+
82
+ describe "containing left, top, diameter" do
83
+ let(:oval) { dsl.oval(left: left, top: top, diameter: width) }
84
+ it_behaves_like "an oval/circle element"
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,34 @@
1
+ shared_examples_for "pattern DSL method" do
2
+ let(:honeydew) { Shoes::COLORS[:honeydew] }
3
+ let(:salmon) { Shoes::COLORS[:salmon] }
4
+
5
+ context "with single color" do
6
+ let(:pattern) { dsl.pattern honeydew }
7
+ it "returns the color" do
8
+ expect(pattern).to eq(honeydew)
9
+ end
10
+ end
11
+
12
+ context "with color range" do
13
+ let(:pattern) { dsl.pattern honeydew..salmon }
14
+
15
+ it "returns a gradient" do
16
+ expect(pattern).to eq(dsl.gradient honeydew..salmon)
17
+ end
18
+ end
19
+
20
+ context "with single string" do
21
+ let(:pattern) { dsl.pattern honeydew.hex }
22
+ it "returns the color" do
23
+ expect(pattern).to eq(honeydew)
24
+ end
25
+ end
26
+
27
+ context "with string range" do
28
+ let(:pattern) { dsl.pattern honeydew.hex..salmon.hex }
29
+
30
+ it "returns a gradient" do
31
+ expect(pattern).to eq(dsl.gradient honeydew..salmon)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ shared_examples_for "progress DSL method" do
2
+ let(:progress) { dsl.progress }
3
+
4
+ it 'should be a progress bar' do
5
+ expect(progress).to be_instance_of Shoes::Progress
6
+ end
7
+ end
@@ -0,0 +1,92 @@
1
+ shared_examples_for "rectangle dimensions" do
2
+ it "makes a Shoes::Rect" do
3
+ expect(rect).to be_an_instance_of(Shoes::Rect)
4
+ end
5
+
6
+ it "sets proper dimensions" do
7
+ expect(rect.left).to eq(left)
8
+ expect(rect.top).to eq(top)
9
+ expect(rect.width).to eq(width)
10
+ expect(rect.height).to eq(height)
11
+ end
12
+ end
13
+
14
+ shared_examples_for "rect DSL method" do
15
+ let(:left) { 40 }
16
+ let(:top) { 30 }
17
+ let(:curve) { 12 }
18
+
19
+ it "raises an ArgumentError" do
20
+ expect { dsl.rect(30) }.to raise_exception(ArgumentError)
21
+ end
22
+
23
+ context 'unequal sides' do
24
+ let(:width) { 200 }
25
+ let(:height) { 100 }
26
+
27
+ context "from explicit arguments" do
28
+ let(:rect) { dsl.rect left, top, width, height }
29
+
30
+ include_examples "rectangle dimensions"
31
+
32
+ it "defaults to corner radius of 0" do
33
+ expect(rect.curve).to eq(0)
34
+ end
35
+ end
36
+
37
+ context "round corners, from explicit arguments" do
38
+ let(:rect) { dsl.rect left, top, width, height, curve }
39
+
40
+ include_examples "rectangle dimensions"
41
+
42
+ it "sets corner radius" do
43
+ expect(rect.curve).to eq(curve)
44
+ end
45
+ end
46
+
47
+ context "from style hash" do
48
+ let(:rect) { dsl.rect left: left, top: top, width: width, height: height }
49
+
50
+ include_examples "rectangle dimensions"
51
+
52
+ it "defaults to corner radius of 0" do
53
+ expect(rect.curve).to eq(0)
54
+ end
55
+ end
56
+
57
+ context "rounded corners, from style hash" do
58
+ let(:rect) { dsl.rect left: left, top: top, width: width, height: height, curve: curve }
59
+
60
+ include_examples "rectangle dimensions"
61
+
62
+ it "sets corner radius" do
63
+ expect(rect.curve).to eq(curve)
64
+ end
65
+ end
66
+ end
67
+
68
+ context "square" do
69
+ let(:width) { 200 }
70
+ let(:height) { 200 }
71
+
72
+ context "from explicit arguments" do
73
+ let(:rect) { dsl.rect left, top, width }
74
+
75
+ include_examples "rectangle dimensions"
76
+
77
+ it "defaults to corner radius of 0" do
78
+ expect(rect.curve).to eq(0)
79
+ end
80
+ end
81
+
82
+ context "square, from style hash" do
83
+ let(:rect) { dsl.rect left: left, top: top, width: width }
84
+
85
+ include_examples "rectangle dimensions"
86
+
87
+ it "defaults to corner radius of 0" do
88
+ expect(rect.curve).to eq(0)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for "rgb DSL method" do
2
+ let(:red) { 100 }
3
+ let(:green) { 149 }
4
+ let(:blue) { 237 }
5
+ let(:alpha) { 133 } # cornflowerblue
6
+
7
+ it "sends args to Shoes::Color" do
8
+ expect(Shoes::Color).to receive(:new).with(red, green, blue, alpha)
9
+ dsl.rgb(red, green, blue, alpha)
10
+ end
11
+
12
+ it "defaults to opaque" do
13
+ expect(Shoes::Color).to receive(:new).with(red, green, blue, Shoes::Color::OPAQUE)
14
+ dsl.rgb(red, green, blue)
15
+ end
16
+
17
+ describe "named color method" do
18
+ it "produces correct color" do
19
+ expect(dsl.cornflowerblue).to eq(Shoes::Color.new red, green, blue)
20
+ end
21
+
22
+ it "accepts alpha arg" do
23
+ expect(dsl.cornflowerblue(alpha)).to eq(Shoes::Color.new red, green, blue, alpha)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,57 @@
1
+ shared_examples_for "shape DSL method" do
2
+ let(:shape) {
3
+ dsl.shape {
4
+ move_to 400, 300
5
+ line_to 400, 200
6
+ line_to 100, 100
7
+ line_to 400, 300
8
+ curve_to 100, 100, 20, 200, 120, 240
9
+ }
10
+ }
11
+
12
+ it "creates a Shoes::Shape" do
13
+ expect(shape).to be_an_instance_of(Shoes::Shape)
14
+ end
15
+
16
+ it "receives style from app" do
17
+ green = Shoes::COLORS.fetch :green
18
+ dsl.style[:stroke] = green
19
+ expect(shape.stroke).to eq(green)
20
+ end
21
+
22
+ describe "constructing" do
23
+ it "doesn't need any arguments" do
24
+ shape = dsl.shape
25
+ expect(shape.left).to eq(nil)
26
+ expect(shape.top).to eq(nil)
27
+ end
28
+
29
+ it "can accept some styles" do
30
+ white = Shoes::COLORS.fetch :white
31
+ shape = dsl.shape stroke: white
32
+ expect(shape.stroke).to eq(white)
33
+ end
34
+
35
+ it "can accept a left and top" do
36
+ left, top = 10, 20
37
+ shape = dsl.shape left, top
38
+ expect(shape.left).to eq(left)
39
+ expect(shape.top).to eq(top)
40
+ end
41
+
42
+ it "accepts left and top in styles" do
43
+ left, top = 10, 20
44
+ shape = dsl.shape left: left, top: top
45
+ expect(shape.left).to eq(left)
46
+ expect(shape.top).to eq(top)
47
+ end
48
+
49
+ it "can accept a left, top, and some styles" do
50
+ left, top, white = 10, 20, Shoes::COLORS.fetch(:white)
51
+ shape = dsl.shape left, top, stroke: white
52
+ expect(shape.left).to eq(left)
53
+ expect(shape.top).to eq(top)
54
+ expect(shape.stroke).to eq(white)
55
+ end
56
+ end
57
+ end