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,68 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::Image do
4
+ include_context "dsl app"
5
+
6
+ describe "basic" do
7
+ let(:left) { 10 }
8
+ let(:top) { 20 }
9
+ let(:width) { 100 }
10
+ let(:height) { 200 }
11
+
12
+ let(:filename) { File.expand_path "../../../static/shoes-icon.png", __FILE__ }
13
+ let(:updated_filename) { File.expand_path "../../../static/shoes-icon-brown.png", __FILE__ }
14
+
15
+ subject(:image) { Shoes::Image.new(app, parent, filename, left: left, top: top, width: width, height: height) }
16
+
17
+ it { is_expected.to be_instance_of(Shoes::Image) }
18
+
19
+ it "should update image path" do
20
+ subject.path = updated_filename
21
+ expect(subject.path).to eq(updated_filename)
22
+ end
23
+
24
+ it_behaves_like "movable object"
25
+ it_behaves_like "object with dimensions"
26
+
27
+ it_behaves_like "object with style" do
28
+ let(:subject_without_style) { Shoes::Image.new(app, parent, filename) }
29
+ let(:subject_with_style) { Shoes::Image.new(app, parent, filename, arg_styles) }
30
+ end
31
+
32
+ describe "relative dimensions from parent" do
33
+ subject { Shoes::Image.new(app, parent, filename, relative_opts) }
34
+ it_behaves_like "object with relative dimensions"
35
+ end
36
+
37
+ describe "negative dimensions" do
38
+ subject { Shoes::Image.new(app, parent, filename, negative_opts) }
39
+ it_behaves_like "object with negative dimensions"
40
+ end
41
+ end
42
+
43
+ describe 'file source' do
44
+ subject { Shoes::Image.new(app, parent, filename, input_opts) }
45
+
46
+ context 'invalid path' do
47
+ let(:filename) { 'something_crazy' }
48
+ it 'should raise an error' do
49
+ expect { subject }.to raise_error Shoes::FileNotFoundError
50
+ end
51
+ end
52
+
53
+ context 'absolute path' do
54
+ let(:filename) { File.expand_path "../../../static/shoes-icon.png", __FILE__ }
55
+ its(:file_path) { should eq filename }
56
+ end
57
+
58
+ context 'relative path' do
59
+ let(:filename) { 'shoes-core/static/shoes-icon.png' }
60
+ its(:file_path) { should eq "#{Dir.pwd}/#{filename}" }
61
+ end
62
+
63
+ describe 'accepts web URL' do
64
+ let(:filename) { "http://is.gd/GVAGF7" }
65
+ its(:file_path) { should eq("http://is.gd/GVAGF7") }
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,80 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::InputBox do
4
+ include_context "dsl app"
5
+ let(:input_opts) {{left: left, top: top, width: width, height: height}}
6
+ let(:left) { 10 }
7
+ let(:top) { 20 }
8
+ let(:width) { 100 }
9
+ let(:height) { 200 }
10
+ let(:text) { "the text" }
11
+
12
+ # EditBox is an InputBox but InputBox is never instantiated itself
13
+ # And there are problems in the backend due to option settings
14
+ subject { Shoes::EditBox.new(app, parent, text, input_opts, input_block) }
15
+
16
+ it_behaves_like "object with dimensions"
17
+
18
+ it_behaves_like "object with style" do
19
+ let(:subject_without_style) { Shoes::EditBox.new(app, parent, text) }
20
+ let(:subject_with_style) { Shoes::EditBox.new(app, parent, text, arg_styles) }
21
+ end
22
+
23
+ it_behaves_like "movable object"
24
+ it_behaves_like "an element that can respond to change"
25
+ it_behaves_like "object with state"
26
+
27
+ it { is_expected.to respond_to :focus }
28
+ it { is_expected.to respond_to :text }
29
+ it { is_expected.to respond_to :text= }
30
+
31
+ it 'forwards calls to highlight_text to the backend' do
32
+ expect(subject.gui).to receive(:highlight_text).with(4, 20)
33
+ subject.highlight_text 4, 20
34
+ end
35
+
36
+ it 'forwards calls to caret_to to the backend' do
37
+ expect(subject.gui).to receive(:caret_to).with(42)
38
+ subject.caret_to 42
39
+ end
40
+
41
+ describe 'non string text' do
42
+ let(:text) {42}
43
+
44
+ it 'is converted to a string (convenience + error in backend)' do
45
+ expect(subject.text).to eq '42'
46
+ end
47
+ end
48
+
49
+ describe "relative dimensions from parent" do
50
+ subject { Shoes::EditBox.new(app, parent, text, relative_opts) }
51
+ it_behaves_like "object with relative dimensions"
52
+ end
53
+
54
+ describe "negative dimensions" do
55
+ subject { Shoes::EditBox.new(app, parent, text, negative_opts) }
56
+ it_behaves_like "object with negative dimensions"
57
+ end
58
+
59
+ describe Shoes::EditLine do
60
+ describe "secret" do
61
+ subject { Shoes::EditLine.new(app, parent, text, secret: true) }
62
+
63
+ it "gets initialized" do
64
+ expect(subject.secret).to eq(true)
65
+ expect(subject.secret?).to eq(true)
66
+ end
67
+
68
+ it "respects setting" do
69
+ subject.secret = false
70
+ expect(subject.secret).to eq(false)
71
+ expect(subject.secret?).to eq(false)
72
+ end
73
+
74
+ it_behaves_like "object with style" do
75
+ let(:subject_without_style) { Shoes::EditLine.new(app, parent, text) }
76
+ let(:subject_with_style) { Shoes::EditLine.new(app, parent, text, arg_styles) }
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ # also for stuff that is hard/brittle to test in isolation
4
+ describe 'Integration specs' do
5
+ describe 'hover & leave' do
6
+
7
+ # that #hover and #leave are called with @__app__.current_slot is hard to
8
+ # test since therefore there needs to be a current slot which is only during
9
+ # block execution, stubbing it seems fairly brittle and dependent on
10
+ # internal structure, see #603
11
+ it 'does not raise an error' do
12
+ expect do
13
+ Shoes.app do
14
+ hover {}
15
+ leave {}
16
+ end
17
+ end.not_to raise_error
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,141 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::InternalApp do
4
+ include_context "dsl app"
5
+
6
+ subject { app }
7
+
8
+ describe "#initialize" do
9
+ context "with defaults" do
10
+ let(:defaults) { Shoes::InternalApp::DEFAULT_OPTIONS }
11
+
12
+ it "sets title", :qt do
13
+ expect(subject.app_title).to eq defaults[:title]
14
+ end
15
+
16
+ it "is resizable", :qt do
17
+ expect(subject.resizable).to be_truthy
18
+ end
19
+
20
+ it "sets width" do
21
+ expect(subject.width).to eq(defaults[:width])
22
+ end
23
+
24
+ it "sets height" do
25
+ expect(subject.height).to eq(defaults[:height])
26
+ end
27
+
28
+ it "does not start as fullscreen" do
29
+ expect(subject.start_as_fullscreen?).to be_falsey
30
+ end
31
+ end
32
+
33
+ context "with custom opts" do
34
+ let(:input_opts) { {:width => 150, :height => 2, :title => "Shoes::App Spec", :resizable => false} }
35
+
36
+ it "sets title", :qt do
37
+ expect(subject.app_title).to eq input_opts[:title]
38
+ end
39
+
40
+ it "sets resizable", :qt do
41
+ expect(subject.resizable).to be_falsey
42
+ end
43
+
44
+ it "sets width" do
45
+ expect(subject.width).to eq(input_opts[:width])
46
+ end
47
+
48
+ it "sets height" do
49
+ expect(subject.height).to eq(input_opts[:height])
50
+ end
51
+ end
52
+ end
53
+
54
+ describe 'fullscreen' do
55
+ let(:input_opts) { {:fullscreen => true} }
56
+
57
+ it "sets fullscreen" do
58
+ expect(subject.start_as_fullscreen?).to be_truthy
59
+ end
60
+ end
61
+
62
+ describe '#contents' do
63
+ it 'delegates to top_slot' do
64
+ expect(subject.contents).to be(subject.top_slot.contents)
65
+ end
66
+ end
67
+
68
+ describe '#clear' do
69
+ context 'when called after the initial input block' do
70
+ let(:input_block) {
71
+ Proc.new do
72
+ para "CONTENT"
73
+ para "JUST FOR TESTING"
74
+ end
75
+ }
76
+
77
+ before :each do
78
+ expect(subject.contents.size).to eq(2)
79
+ end
80
+
81
+ it 'clears top_slot' do
82
+ subject.clear
83
+ expect(subject.contents).to be_empty
84
+ end
85
+ end
86
+
87
+ context 'when called in the initial input_block' do
88
+ let(:input_block) {
89
+ Proc.new do
90
+ para 'Hello there'
91
+ clear do
92
+ para 'see you'
93
+ end
94
+ end
95
+ }
96
+
97
+ it 'does not raise an error' do
98
+ expect {subject}.not_to raise_error
99
+ end
100
+
101
+ context 'when called inside a slot' do
102
+ let(:input_block) {
103
+ Proc.new do
104
+ button 'I am here'
105
+ stack do
106
+ button 'Hi there'
107
+ button 'Another one'
108
+ clear
109
+ end
110
+ end
111
+ }
112
+
113
+ it 'does not delete the slot, or an element outside the slot' do
114
+ expect(subject.contents.size).to eq 2
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'when called before a button in an initial input block' do
120
+ let(:input_block) {
121
+ Proc.new do
122
+ clear
123
+ button 'My Button'
124
+ end
125
+ }
126
+
127
+ it 'allows a button to be created' do
128
+ expect(subject.contents.size).to eq(1)
129
+ end
130
+
131
+ describe 'the button' do
132
+ let(:button) { subject.contents.first }
133
+
134
+ it 'has the top_slot as its parent' do
135
+ expect(button.parent).to eq subject.top_slot
136
+ end
137
+ end
138
+ end
139
+
140
+ end
141
+ end
@@ -0,0 +1,11 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::Keypress do
4
+ include_context "dsl app"
5
+
6
+ subject(:keypress) { Shoes::Keypress.new app, &input_block }
7
+
8
+ it "should clear" do
9
+ expect(keypress).to respond_to(:remove)
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::Keyrelease do
4
+ include_context "dsl app"
5
+
6
+ subject(:keyrelease) { Shoes::Keyrelease.new app, &input_block }
7
+
8
+ it "should clear" do
9
+ expect(keyrelease).to respond_to(:remove)
10
+ end
11
+
12
+ end
@@ -0,0 +1,87 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::Line do
4
+ include_context "dsl app"
5
+
6
+ describe "basic" do
7
+ let(:left) { 20 }
8
+ let(:top) { 23 }
9
+ let(:width) { 280 }
10
+ let(:height) { 407 }
11
+
12
+ subject { Shoes::Line.new(app, parent, Shoes::Point.new(left, top), Shoes::Point.new(300, 430), input_opts) }
13
+ it_behaves_like "movable object"
14
+ it_behaves_like "object with style" do
15
+ let(:subject_without_style) { Shoes::Line.new(app, parent, Shoes::Point.new(left, top), Shoes::Point.new(300, 430)) }
16
+ let(:subject_with_style) { Shoes::Line.new(app, parent, Shoes::Point.new(left, top), Shoes::Point.new(300, 430), arg_styles) }
17
+ end
18
+ it_behaves_like "object with dimensions"
19
+ it_behaves_like 'object with parent'
20
+ end
21
+
22
+ context "line with point a at leftmost, topmost" do
23
+ subject { Shoes::Line.new(app, app, Shoes::Point.new(10, 15), Shoes::Point.new(100, 60), input_opts) }
24
+ its(:left) { should eq(10) }
25
+ its(:top) { should eq(15) }
26
+ its(:right) { should eq(100) }
27
+ its(:bottom) { should eq(60) }
28
+ its(:width) { should eq(90) }
29
+ its(:height) { should eq(45) }
30
+ end
31
+
32
+ context "specified right-to-left, top-to-bottom" do
33
+ subject { Shoes::Line.new(app, app, Shoes::Point.new(100, 60), Shoes::Point.new(10, 15), input_opts) }
34
+ its(:left) { should eq(100) }
35
+ its(:top) { should eq(60) }
36
+ its(:right) { should eq(10) }
37
+ its(:bottom) { should eq(15) }
38
+ its(:width) { should eq(-90) }
39
+ its(:height) { should eq(-45) }
40
+ end
41
+
42
+ context "setting dimensions" do
43
+ subject { Shoes::Line.new(app, app, Shoes::Point.new(100, 100), Shoes::Point.new(200, 200), input_opts) }
44
+
45
+ it "moves point a with left and top" do
46
+ subject.left -= 100
47
+ subject.top -= 100
48
+ expect(subject.point_a).to eq(Shoes::Point.new(0, 0))
49
+ end
50
+
51
+ it "moves point a even when it's not leftmost or topmost" do
52
+ 2.times do
53
+ subject.left += 100
54
+ subject.top += 100
55
+ end
56
+
57
+ expect(subject.point_a).to eq(Shoes::Point.new(300, 300))
58
+ end
59
+
60
+ it "moves point a with right and bottom" do
61
+ subject.right += 100
62
+ subject.bottom += 100
63
+ expect(subject.point_b).to eq(Shoes::Point.new(300, 300))
64
+ end
65
+
66
+ it "moves point b even when it's not rightmost or bottommost" do
67
+ 2.times do
68
+ subject.right -= 100
69
+ subject.bottom -= 100
70
+ end
71
+
72
+ expect(subject.point_b).to eq(Shoes::Point.new(0, 0))
73
+ end
74
+
75
+ it "can move point a" do
76
+ subject.move(10, 10)
77
+ expect(subject.point_a).to eq(Shoes::Point.new(10, 10))
78
+ expect(subject.point_b).to eq(Shoes::Point.new(200, 200))
79
+ end
80
+
81
+ it "can move all points" do
82
+ subject.move(10, 10, 20, 20)
83
+ expect(subject.point_a).to eq(Shoes::Point.new(10, 10))
84
+ expect(subject.point_b).to eq(Shoes::Point.new(20, 20))
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,118 @@
1
+ require 'shoes/spec_helper'
2
+
3
+ describe Shoes::Link do
4
+ let(:gui) { double("gui").as_null_object }
5
+ let(:app) { double("app", gui: gui, style: {}, element_styles: {}) }
6
+ let(:internal_app) { double("internal app", app: app, gui: gui, style: {}, element_styles: {}) }
7
+ let(:texts) { ["text", "goes", "first"] }
8
+
9
+ subject { Shoes::Link.new(app, texts, {color: :blue}) }
10
+
11
+ context "initialize" do
12
+ it "should set up text" do
13
+ expect(subject.texts).to eql(texts)
14
+ expect(subject.to_s).to eql("textgoesfirst")
15
+ end
16
+
17
+ it "should set color" do
18
+ expect(subject.color).to eql(:blue)
19
+ end
20
+
21
+ it "should default styles" do
22
+ expect(subject.style[:underline]).to eql(true)
23
+ expect(subject.style[:fill]).to eql(nil)
24
+ expect(subject.style[:stroke]).to eql(Shoes::COLORS[:blue])
25
+ end
26
+
27
+ context "overriding styles" do
28
+ subject { Shoes::Link.new(app, texts,
29
+ underline: false, bg: Shoes::COLORS[:green]) }
30
+
31
+ it "should include defaults" do
32
+ expect(subject.style).to include(:stroke => Shoes::COLORS[:blue])
33
+ end
34
+
35
+ it "should override defaults" do
36
+ expect(subject.style).to include(:underline => false)
37
+ end
38
+
39
+ it "should include other options" do
40
+ expect(subject.style).to include(:bg => Shoes::COLORS[:green])
41
+ end
42
+ end
43
+
44
+ context "with a block" do
45
+ let(:callable) { double("callable") }
46
+ subject { Shoes::Link.new(internal_app, texts, {}, Proc.new { callable.call }) }
47
+
48
+ it "sets up for the click" do
49
+ expect(callable).to receive(:call)
50
+ subject.blk.call
51
+ end
52
+ end
53
+
54
+ context "with click option as text" do
55
+ subject { Shoes::Link.new(internal_app, texts, click: "/url") }
56
+
57
+ it "should visit the url" do
58
+ expect(app).to receive(:visit).with("/url")
59
+ subject.blk.call
60
+ end
61
+ end
62
+
63
+ context "with click option as Proc" do
64
+ let(:callable) { double("callable", call: nil) }
65
+ subject { Shoes::Link.new(internal_app, texts, click: Proc.new { callable.call }) }
66
+
67
+ it "calls the block" do
68
+ expect(callable).to receive(:call)
69
+ subject.blk.call
70
+ end
71
+ end
72
+
73
+ context "calling click explicitly" do
74
+ let(:original_block) { double("original") }
75
+ let(:replacement_block) { double("replacement") }
76
+ subject { Shoes::Link.new(internal_app, texts) { original_block.call } }
77
+
78
+ it "replaces original block" do
79
+ expect(original_block).to_not receive(:call)
80
+ expect(replacement_block).to receive(:call)
81
+
82
+ subject.click { replacement_block.call }
83
+ subject.blk.call
84
+ end
85
+ end
86
+ end
87
+
88
+ describe 'visibility' do
89
+ let(:text_block) {double 'text block', visible?: true, hidden?: false}
90
+
91
+ before :each do
92
+ subject.text_block = text_block
93
+ end
94
+
95
+ it 'forwards visible? calls' do
96
+ subject.visible?
97
+ expect(text_block).to have_received :visible?
98
+ end
99
+
100
+ it 'forwards hidden? calls' do
101
+ subject.hidden?
102
+ expect(text_block).to have_received :hidden?
103
+ end
104
+ end
105
+
106
+ # #979
107
+ describe 'parent' do
108
+ let(:text_block) {double 'text block'}
109
+
110
+ before :each do
111
+ subject.parent = text_block
112
+ end
113
+
114
+ it 'has the correct parent, namingly he text block' do
115
+ expect(subject.parent).to eq text_block
116
+ end
117
+ end
118
+ end