shoes-core 4.0.0.pre4 → 4.0.0.pre5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +5 -0
  3. data/bin/shoes +1 -1
  4. data/bin/shoes-stub +1 -1
  5. data/ext/install/Rakefile +15 -5
  6. data/ext/install/shoes.bat +1 -1
  7. data/lib/shoes/animation.rb +2 -2
  8. data/lib/shoes/arc.rb +1 -0
  9. data/lib/shoes/builtin_methods.rb +5 -18
  10. data/lib/shoes/button.rb +1 -5
  11. data/lib/shoes/check_button.rb +1 -5
  12. data/lib/shoes/color.rb +5 -274
  13. data/lib/shoes/color/dsl.rb +166 -0
  14. data/lib/shoes/color/dsl_helpers.rb +84 -0
  15. data/lib/shoes/color/hex_converter.rb +32 -0
  16. data/lib/shoes/common/background_element.rb +5 -0
  17. data/lib/shoes/common/hover.rb +87 -0
  18. data/lib/shoes/common/initialization.rb +21 -8
  19. data/lib/shoes/common/remove.rb +2 -0
  20. data/lib/shoes/common/state.rb +17 -3
  21. data/lib/shoes/common/style.rb +8 -0
  22. data/lib/shoes/configuration.rb +18 -15
  23. data/lib/shoes/core/version.rb +1 -1
  24. data/lib/shoes/dimension.rb +6 -19
  25. data/lib/shoes/dimensions.rb +8 -0
  26. data/lib/shoes/download.rb +5 -3
  27. data/lib/shoes/dsl.rb +3 -3
  28. data/lib/shoes/image.rb +1 -0
  29. data/lib/shoes/image_pattern.rb +1 -1
  30. data/lib/shoes/input_box.rb +2 -5
  31. data/lib/shoes/internal_app.rb +13 -2
  32. data/lib/shoes/line.rb +1 -0
  33. data/lib/shoes/link.rb +8 -0
  34. data/lib/shoes/list_box.rb +2 -5
  35. data/lib/shoes/mock/check.rb +3 -0
  36. data/lib/shoes/mock/image.rb +6 -0
  37. data/lib/shoes/mock/progress.rb +6 -0
  38. data/lib/shoes/mock/radio.rb +3 -0
  39. data/lib/shoes/mock/sound.rb +1 -1
  40. data/lib/shoes/oval.rb +1 -0
  41. data/lib/shoes/packager.rb +1 -1
  42. data/lib/shoes/rect.rb +1 -0
  43. data/lib/shoes/shape.rb +4 -0
  44. data/lib/shoes/slot.rb +75 -38
  45. data/lib/shoes/slot_contents.rb +4 -0
  46. data/lib/shoes/sound.rb +3 -2
  47. data/lib/shoes/star.rb +1 -0
  48. data/lib/shoes/text_block.rb +18 -2
  49. data/lib/shoes/text_block_dimensions.rb +19 -3
  50. data/lib/shoes/timer.rb +2 -2
  51. data/lib/shoes/ui/picker.rb +4 -4
  52. data/lib/shoes/version.rb +1 -1
  53. data/shoes-core.gemspec +1 -1
  54. data/spec/shoes/animation_spec.rb +2 -2
  55. data/spec/shoes/app_spec.rb +6 -17
  56. data/spec/shoes/arc_spec.rb +2 -1
  57. data/spec/shoes/background_spec.rb +2 -2
  58. data/spec/shoes/border_spec.rb +2 -2
  59. data/spec/shoes/builtin_methods_spec.rb +68 -56
  60. data/spec/shoes/button_spec.rb +3 -3
  61. data/spec/shoes/check_spec.rb +3 -2
  62. data/spec/shoes/color_spec.rb +9 -3
  63. data/spec/shoes/common/remove_spec.rb +0 -1
  64. data/spec/shoes/common/rotate_spec.rb +13 -0
  65. data/spec/shoes/common/style_spec.rb +12 -3
  66. data/spec/shoes/configuration_spec.rb +18 -3
  67. data/spec/shoes/constants_spec.rb +1 -0
  68. data/spec/shoes/dialog_spec.rb +1 -3
  69. data/spec/shoes/dimension_spec.rb +33 -24
  70. data/spec/shoes/dimensions_spec.rb +21 -31
  71. data/spec/shoes/download_spec.rb +14 -3
  72. data/spec/shoes/flow_spec.rb +6 -7
  73. data/spec/shoes/font_spec.rb +2 -3
  74. data/spec/shoes/framework_learning_spec.rb +1 -2
  75. data/spec/shoes/gradient_spec.rb +1 -2
  76. data/spec/shoes/helpers/fake_absolute_element.rb +30 -0
  77. data/spec/shoes/helpers/sample17_helper.rb +0 -1
  78. data/spec/shoes/image_spec.rb +2 -1
  79. data/spec/shoes/input_box_spec.rb +2 -2
  80. data/spec/shoes/integration_spec.rb +0 -1
  81. data/spec/shoes/internal_app_spec.rb +4 -5
  82. data/spec/shoes/keypress_spec.rb +1 -1
  83. data/spec/shoes/keyrelease_spec.rb +1 -2
  84. data/spec/shoes/line_spec.rb +3 -2
  85. data/spec/shoes/link_spec.rb +26 -6
  86. data/spec/shoes/list_box_spec.rb +2 -2
  87. data/spec/shoes/oval_spec.rb +2 -1
  88. data/spec/shoes/packager_spec.rb +1 -1
  89. data/spec/shoes/point_spec.rb +1 -1
  90. data/spec/shoes/progress_spec.rb +1 -1
  91. data/spec/shoes/radio_spec.rb +1 -1
  92. data/spec/shoes/rect_spec.rb +2 -1
  93. data/spec/shoes/renamed_delegate_spec.rb +0 -1
  94. data/spec/shoes/shape_spec.rb +1 -1
  95. data/spec/shoes/shared_examples/common_methods.rb +1 -1
  96. data/spec/shoes/shared_examples/dsl/animate.rb +1 -1
  97. data/spec/shoes/shared_examples/dsl/background.rb +2 -2
  98. data/spec/shoes/shared_examples/dsl/rgb.rb +4 -2
  99. data/spec/shoes/shared_examples/dsl/star.rb +0 -1
  100. data/spec/shoes/shared_examples/dsl/style.rb +1 -1
  101. data/spec/shoes/shared_examples/dsl/text_elements.rb +2 -2
  102. data/spec/shoes/shared_examples/dsl/video.rb +1 -1
  103. data/spec/shoes/shared_examples/dsl_app_context.rb +4 -1
  104. data/spec/shoes/shared_examples/hover.rb +78 -0
  105. data/spec/shoes/shared_examples/slot.rb +34 -4
  106. data/spec/shoes/shared_examples/state.rb +9 -2
  107. data/spec/shoes/shared_examples/style.rb +0 -5
  108. data/spec/shoes/slot_spec.rb +11 -38
  109. data/spec/shoes/sound_spec.rb +3 -2
  110. data/spec/shoes/span_spec.rb +2 -2
  111. data/spec/shoes/spec_helper.rb +1 -1
  112. data/spec/shoes/stack_spec.rb +6 -6
  113. data/spec/shoes/star_spec.rb +2 -1
  114. data/spec/shoes/text_block_dimensions_spec.rb +3 -4
  115. data/spec/shoes/text_block_spec.rb +16 -11
  116. data/spec/shoes/ui/picker_spec.rb +5 -6
  117. data/spec/shoes/url_spec.rb +1 -2
  118. data/spec/shoes/widget_spec.rb +11 -3
  119. data/spec/shoes_spec.rb +1 -4
  120. data/spec/spec_helper.rb +2 -1
  121. metadata +16 -9
  122. data/bin/shoes-guard +0 -8
  123. data/lib/shoes/link_hover.rb +0 -5
  124. data/spec/shoes/shared_examples/hover_leave.rb +0 -11
@@ -1,4 +1,4 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::Arc do
4
4
  include_context "dsl app"
@@ -21,6 +21,7 @@ describe Shoes::Arc do
21
21
  it_behaves_like "object with dimensions"
22
22
  it_behaves_like "left, top as center", :start_angle, :end_angle
23
23
  it_behaves_like "object with parent"
24
+ it_behaves_like "object with hover"
24
25
 
25
26
  #it_styles_with :art_styles, :center, :dimensions, :radius
26
27
 
@@ -1,4 +1,4 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::Background do
4
4
  include_context "dsl app"
@@ -9,7 +9,7 @@ describe Shoes::Background do
9
9
  let(:height) { 200 }
10
10
 
11
11
  let(:blue) { Shoes::COLORS[:blue] }
12
- let(:input_opts){ {left: left, top: top, width: width, height: height, color: blue} }
12
+ let(:input_opts) { {left: left, top: top, width: width, height: height, color: blue} }
13
13
  subject(:background) { Shoes::Background.new(app, parent, blue, input_opts) }
14
14
 
15
15
  before do
@@ -1,4 +1,4 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  shared_examples_for "basic border" do
4
4
  it "retains app" do
@@ -13,7 +13,7 @@ end
13
13
  describe Shoes::Border do
14
14
  include_context "dsl app"
15
15
  let(:parent) { Shoes::FakeElement.new nil, left, top, width, height}
16
- let(:opts){ {left: left, top: top, width: width, height: height} }
16
+ let(:opts) { {left: left, top: top, width: width, height: height} }
17
17
 
18
18
  let(:left) { 10 }
19
19
  let(:top) { 20 }
@@ -1,9 +1,10 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::BuiltinMethods do
4
4
  let(:input_blk) { Proc.new {} }
5
5
  let(:app) { Shoes::App.new({}, &input_blk) }
6
6
  let(:logger) { double("logger") }
7
+ let(:dialog) { double('dialog') }
7
8
 
8
9
  before :each do
9
10
  Shoes::LOG.clear
@@ -22,63 +23,33 @@ describe Shoes::BuiltinMethods do
22
23
  end
23
24
  end
24
25
 
25
- describe "info" do
26
- before :each do
27
- allow(logger).to receive(:info)
28
- app.info("test")
29
- end
30
-
31
- it "sets Shoes::LOG" do
32
- expect(Shoes::LOG).to eq([["info", "test"]])
33
- end
34
-
35
- it "sends message to logger" do
36
- expect(logger).to have_received(:info)
37
- end
38
- end
39
-
40
- describe "debug" do
41
- before :each do
42
- allow(logger).to receive(:debug)
43
- app.debug("test")
44
- end
45
-
46
- it "sets Shoes::LOG" do
47
- expect(Shoes::LOG).to eq([["debug", "test"]])
48
- end
49
-
50
- it "sends message to logger" do
51
- expect(logger).to have_received(:debug)
52
- end
53
- end
54
-
55
- describe "warn" do
56
- before :each do
57
- allow(logger).to receive(:warn)
58
- app.warn("test")
59
- end
26
+ %w(info debug warn error).each do |level|
27
+ describe "##{level}" do
28
+ before :each do
29
+ allow(logger).to receive(level)
30
+ app.public_send(level, "test")
31
+ end
60
32
 
61
- it "sets Shoes::LOG" do
62
- expect(Shoes::LOG).to eq([["warn", "test"]])
63
- end
33
+ it 'sets Shoes::LOG' do
34
+ expect(Shoes::LOG).to eq([[level, 'test']])
35
+ end
64
36
 
65
- it "sends message to logger" do
66
- expect(logger).to have_received(:warn)
37
+ it 'sends message to logger' do
38
+ expect(logger).to have_received(level)
39
+ end
67
40
  end
68
41
  end
69
42
 
70
- describe "error" do
71
- before :each do
72
- allow(logger).to receive(:error)
73
- app.error("test")
74
- end
75
-
76
- it "sets Shoes::LOG" do
77
- expect(Shoes::LOG).to eq([["error", "test"]])
78
- end
43
+ %w(open_file save_file open_folder save_folder).each do |chooser_action|
44
+ describe "#ask_#{chooser_action}" do
45
+ before do
46
+ allow(Shoes::Dialog).to receive(:new).and_return(dialog)
47
+ expect(dialog).to receive(:dialog_chooser).and_return(dialog)
48
+ end
79
49
 
80
- it "sends message to logger" do
81
- expect(logger).to have_received(:error)
50
+ it 'creates a new chooser dialog' do
51
+ expect(app.public_send("ask_#{chooser_action}")).to eq(dialog)
52
+ end
82
53
  end
83
54
  end
84
55
 
@@ -86,9 +57,9 @@ describe Shoes::BuiltinMethods do
86
57
  # elsewhere
87
58
  describe 'are builtin methods are also available from Shoes' do
88
59
  builtin_methods = [:alert, :ask, :ask_color, :ask_open_file, :ask_save_file,
89
- :ask_open_folder, :ask_save_folder, :confirm, :color,
90
- :debug, :error, :font, :gradient, :gray, :rgb, :info,
91
- :pattern, :warn]
60
+ :ask_open_folder, :ask_save_folder, :confirm, :color,
61
+ :debug, :error, :font, :gradient, :gray, :rgb, :info,
62
+ :pattern, :warn]
92
63
 
93
64
  builtin_methods.each do |method|
94
65
  it "responds to #{method}" do
@@ -96,7 +67,6 @@ describe Shoes::BuiltinMethods do
96
67
  end
97
68
  end
98
69
 
99
-
100
70
  describe 'does not get to the nitty gritty helper_methods' do
101
71
  helper_methods = [:image_file?, :image_pattern]
102
72
 
@@ -107,4 +77,46 @@ describe Shoes::BuiltinMethods do
107
77
  end
108
78
  end
109
79
  end
80
+
81
+ %w(alert confirm).each do |type|
82
+ describe '##{alert}' do
83
+ let(:message) { double('message') }
84
+
85
+ before do
86
+ allow(Shoes::Dialog).to receive(:new).and_return(dialog)
87
+ expect(dialog).to receive(type).with(message).and_return(dialog)
88
+ end
89
+
90
+ it 'creates a new dialog' do
91
+ expect(app.public_send(type, message)).to eq(dialog)
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#ask' do
97
+ let(:message) { double('message') }
98
+ let(:args) { double('args') }
99
+
100
+ before do
101
+ allow(Shoes::Dialog).to receive(:new).and_return(dialog)
102
+ expect(dialog).to receive(:ask).with(message, args).and_return(dialog)
103
+ end
104
+
105
+ it 'creates a new dialog' do
106
+ expect(app.ask(message, args)).to eq(dialog)
107
+ end
108
+ end
109
+
110
+ describe '#ask_color' do
111
+ let(:title) { double('title') }
112
+
113
+ before do
114
+ allow(Shoes::Dialog).to receive(:new).and_return(dialog)
115
+ expect(dialog).to receive(:ask_color).with(title).and_return(dialog)
116
+ end
117
+
118
+ it 'creates a new dialog' do
119
+ expect(app.ask_color(title)).to eq(dialog)
120
+ end
121
+ end
110
122
  end
@@ -1,9 +1,9 @@
1
- require "shoes/spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::Button do
4
4
  include_context "dsl app"
5
- let(:input_opts) { {:left => left, :top => top, :width => width,
6
- :height => height, :margin => margin, :state => "disabled"} }
5
+ let(:input_opts) { {left: left, top: top, width: width,
6
+ height: height, margin: margin, state: "disabled"} }
7
7
 
8
8
  let(:left) { 13 }
9
9
  let(:top) { 44 }
@@ -1,8 +1,9 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::Check do
4
4
  include_context "dsl app"
5
5
 
6
+ let(:input_opts) { { width: 22, height: 22 } }
6
7
  subject { Shoes::Check.new(app, parent, input_opts, input_block) }
7
8
 
8
9
  it_behaves_like "checkable"
@@ -17,7 +18,7 @@ describe Shoes::Check do
17
18
  let(:top) { 20 }
18
19
  let(:width) { 100 }
19
20
  let(:height) { 200 }
20
- let(:input_opts){ {left: left, top: top, width: width, height: height} }
21
+ let(:input_opts) { {left: left, top: top, width: width, height: height} }
21
22
  subject { Shoes::Check.new(app, parent, input_opts) }
22
23
 
23
24
  it_behaves_like "object with dimensions"
@@ -1,4 +1,4 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Shoes::Color do
4
4
  describe ".create" do
@@ -277,6 +277,12 @@ describe "Shoes built-in colors" do
277
277
  its(:papayawhip) { should eq(Shoes::Color.new(255, 239, 213)) }
278
278
  its(:aquamarine) { should eq(Shoes::Color.new(127, 255, 212)) }
279
279
  its(:tomato) { should eq(Shoes::Color.new(255, 99, 71)) }
280
+
281
+ # define colors spec here since this has the other custom colors?
282
+ it 'can use define_shoes_color to create built-in colors' do
283
+ Shoes::DSL.define_shoes_color(:test_color, 0, 1, 2)
284
+ expect(subject.test_color).to eq Shoes::Color.new(0, 1, 2)
285
+ end
280
286
  end
281
287
 
282
288
  describe "Shoes built in gray" do
@@ -413,11 +419,11 @@ describe Shoes::Color::DSLHelpers do
413
419
 
414
420
  describe '#gradient' do
415
421
  it 'raises an argument error for no arguments supplied' do
416
- expect{subject.gradient}.to raise_error ArgumentError
422
+ expect {subject.gradient}.to raise_error ArgumentError
417
423
  end
418
424
 
419
425
  it 'raises an argument error for too many (> 2) args supplied' do
420
- expect{subject.gradient 1, 2, 3}.to raise_error ArgumentError
426
+ expect {subject.gradient 1, 2, 3}.to raise_error ArgumentError
421
427
  end
422
428
  end
423
429
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoes::Common::Remove do
4
-
5
4
  let(:parent) {double 'parent', add_child: true, remove_child: true}
6
5
  let(:gui) {double 'gui', remove: true}
7
6
  let(:test_class) {Class.new {include Shoes::Common::Remove}}
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shoes::Common::Rotate do
4
+ let(:test_class) { Class.new { include Shoes::Common::Rotate } }
5
+
6
+ subject {test_class.new}
7
+
8
+ describe '#needs_rotate?' do
9
+ it 'defaults to falsey value' do
10
+ expect(subject.needs_rotate?).to be_falsey
11
+ end
12
+ end
13
+ end
@@ -8,8 +8,9 @@ describe Shoes::Common::Style do
8
8
  include Shoes::Common::Visibility
9
9
  include Shoes::DimensionsDelegations
10
10
  include Shoes::Common::Style
11
+ include Shoes::Common::Hover
11
12
 
12
- attr_reader :dimensions
13
+ attr_reader :app, :dimensions
13
14
  style_with :key, :left, :click, :strokewidth, :fill
14
15
 
15
16
  STYLES = {fill: Shoes::COLORS[:blue]}
@@ -39,7 +40,7 @@ describe Shoes::Common::Style do
39
40
 
40
41
  its(:style) { should eq(initial_style) }
41
42
  let(:initial_style) { {key: 'value', left: 15, click: nil, strokewidth: 1, fill: blue,
42
- margin: [0,0,0,0], margin_left: 0, margin_top: 0, margin_right: 0, margin_bottom: 0 } }
43
+ margin: [0,0,0,0], margin_left: 0, margin_top: 0, margin_right: 0, margin_bottom: 0 } }
43
44
 
44
45
  describe 'reading and writing through #style(hash)' do
45
46
  let(:input_proc) { Proc.new {} }
@@ -178,7 +179,15 @@ describe Shoes::Common::Style do
178
179
  expect(subject).to respond_to "#{style}="
179
180
  end
180
181
  end
181
-
182
182
  end
183
183
 
184
+ describe 'sets hover and leave from styles' do
185
+ let(:hover_blk) { Proc.new {} }
186
+ let(:leave_blk) { Proc.new {} }
187
+
188
+ subject { StyleTester.new(app, hover: hover_blk, leave: leave_blk) }
189
+
190
+ its(:hover_blk) { should eq(hover_blk) }
191
+ its(:leave_blk) { should eq(leave_blk) }
192
+ end
184
193
  end
@@ -18,18 +18,33 @@ describe Shoes::Configuration do
18
18
 
19
19
  let(:dsl_object) { Shoes::Shape.new app, parent }
20
20
 
21
- describe "#backend_with_app_for" do
21
+ describe "#backend_for" do
22
22
  it "passes app.gui to backend" do
23
23
  expect(Shoes.configuration.backend::Shape).to receive(:new).with(an_instance_of(Shoes::Shape), app.gui).and_call_original
24
24
  dsl_object
25
25
  end
26
26
 
27
27
  it "returns shape backend object" do
28
- expect(Shoes.configuration.backend_with_app_for(dsl_object)).to be_instance_of(Shoes.configuration.backend::Shape)
28
+ expect(Shoes.backend_for(dsl_object)).to be_instance_of(Shoes.configuration.backend::Shape)
29
29
  end
30
30
 
31
31
  it "raises ArgumentError for a non-Shoes object" do
32
- expect { Shoes.configuration.backend_with_app_for(1..100) }.to raise_error(ArgumentError)
32
+ expect { Shoes.backend_for(1..100) }.to raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ describe '#backend_class' do
37
+ it 'returns the backend class for a dsl object' do
38
+ expect(Shoes.configuration.backend_class(dsl_object)).to eq(Shoes.configuration.backend::Shape)
39
+ end
40
+
41
+ it 'returns the backend class if fed with a class' do
42
+ expect(Shoes.configuration.backend_class(Shoes::Shape)).to eq(Shoes.configuration
43
+ .backend::Shape)
44
+ end
45
+
46
+ it 'raises an error when fed with a non existant class' do
47
+ expect { Shoes.configuration.backend_class(Array) }.to raise_error(ArgumentError)
33
48
  end
34
49
  end
35
50
  end
@@ -1,3 +1,4 @@
1
+ require 'spec_helper'
1
2
  require "pathname"
2
3
 
3
4
  describe "Shoes constants" do
@@ -1,11 +1,10 @@
1
- require 'shoes/spec_helper'
1
+ require 'spec_helper'
2
2
  # NOTE: This spec is sadly circumventing the integration specs since we couldn't
3
3
  # figure out how to get rid of the alert - it stopped the running tests
4
4
 
5
5
  main_object = self
6
6
 
7
7
  describe Shoes::Dialog do
8
-
9
8
  before :each do
10
9
  @dialog = Shoes::Dialog.new
11
10
  end
@@ -167,5 +166,4 @@ describe Shoes::Dialog do
167
166
  expect(@app).to respond_to :ask_color
168
167
  end
169
168
  end
170
-
171
169
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Shoes::Dimension do
4
-
5
4
  subject {Shoes::Dimension.new parent_dimension}
6
5
  let(:start) {10}
7
6
  let(:extent) {21}
@@ -218,7 +217,6 @@ describe Shoes::Dimension do
218
217
  end
219
218
 
220
219
  describe '#margins' do
221
-
222
220
  let(:margin_start) {11}
223
221
  let(:margin_end) {17}
224
222
 
@@ -358,12 +356,9 @@ describe Shoes::Dimension do
358
356
  before :each do
359
357
  parent.start = parent_start
360
358
  parent.extent = parent_extent
361
- parent.margin_start = margin
362
- parent.margin_end = margin
363
359
  end
364
360
 
365
361
  describe 'it takes some parent values if no values are set' do
366
- its(:start) {should eq parent_start}
367
362
  its(:extent) {should eq parent_extent}
368
363
 
369
364
  its(:margin_start) {should eq 0}
@@ -372,22 +367,28 @@ describe Shoes::Dimension do
372
367
  context 'with parent absolute_start set' do
373
368
  before :each do
374
369
  parent.absolute_start = 11
375
-
376
- # This would be set by positioning code
377
- subject.absolute_start = parent.absolute_start + margin
378
370
  end
379
371
 
380
- its(:absolute_start) {should eq parent.absolute_start + margin}
381
- its(:element_start) {should eq parent.absolute_start + margin}
372
+ its(:absolute_start) {should eq parent.element_start}
373
+ its(:element_start) {should eq parent.element_start}
382
374
  its(:element_end) {should eq parent.element_end}
383
375
  end
376
+
377
+ context 'but it takes the parent margins into account' do
378
+ before :each do
379
+ parent.margin_start = margin
380
+ parent.margin_end = margin
381
+ end
382
+
383
+ its(:extent) {is_expected.to eq 17}
384
+ end
384
385
  end
385
386
 
386
387
  describe 'otherwise it takes its own values' do
387
388
  before :each do
388
389
  subject.start = start
389
390
  subject.extent = extent
390
- subject.absolute_start = 17
391
+ parent.absolute_start = 17
391
392
  end
392
393
 
393
394
  its(:start) {should eq start}
@@ -396,36 +397,44 @@ describe Shoes::Dimension do
396
397
 
397
398
  it 'can still handle special values like a negative extent' do
398
399
  subject.extent = -10
399
- expect(subject.extent).to eq(parent_extent - 2 * margin - 10)
400
+ expect(subject.extent).to eq(parent.element_extent - 10)
400
401
  end
401
402
 
402
403
  it 'can also still handle special values like relative values' do
403
404
  subject.extent = 0.8
404
405
  expect(subject.extent).to be_within(ONE_PIXEL).of(0.8 * parent.element_extent)
405
406
  end
407
+
408
+ it 'takes the margins of parent into account' do
409
+ parent.margin_start = 10
410
+ expect(subject.absolute_start).to eq 27
411
+ end
406
412
  end
407
413
 
408
414
  describe 'it obeys parent bounds' do
409
415
  let(:parent_dimension) { double 'parent_dimension',
410
- element_start: 10,
411
- element_end: 20,
412
- absolute_start: 10,
413
- absolute_end: 20,
414
- extent: 10,
415
- element_extent: 10 }
416
+ element_start: 10,
417
+ element_end: 20,
418
+ absolute_start: 10,
419
+ absolute_end: 20,
420
+ extent: 10,
421
+ element_extent: 10 }
416
422
 
417
423
  subject {Shoes::ParentDimension.new parent_dimension}
418
424
 
419
- it "can't extend beyond parent" do
420
- subject.absolute_start = 15
421
- expect(subject.extent).to eq(6)
425
+ it "gets the parent element_extent" do
426
+ expect(subject.extent).to eq(10)
422
427
  end
423
428
 
424
- it "can't start before parent" do
425
- subject.absolute_start = 5
429
+ it "can't extend beyond the parent" do
430
+ subject.extent = 25
426
431
  expect(subject.extent).to eq(10)
427
432
  end
433
+
434
+ it 'can get smaller than the parent' do
435
+ subject.extent = 5
436
+ expect(subject.extent).to eq(5)
437
+ end
428
438
  end
429
439
  end
430
-
431
440
  end