shoes-core 4.0.0.pre6 → 4.0.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/bin/shoes-picker +1 -1
  3. data/lib/shoes/app.rb +3 -3
  4. data/lib/shoes/arc.rb +6 -5
  5. data/lib/shoes/arrow.rb +31 -0
  6. data/lib/shoes/background.rb +1 -1
  7. data/lib/shoes/border.rb +1 -1
  8. data/lib/shoes/builtin_methods.rb +1 -1
  9. data/lib/shoes/color.rb +3 -3
  10. data/lib/shoes/color/dsl_helpers.rb +10 -7
  11. data/lib/shoes/color/hex_converter.rb +1 -1
  12. data/lib/shoes/common/attachable.rb +11 -0
  13. data/lib/shoes/common/background_element.rb +8 -0
  14. data/lib/shoes/common/hover.rb +7 -17
  15. data/lib/shoes/common/link_finder.rb +12 -0
  16. data/lib/shoes/common/positioning.rb +1 -1
  17. data/lib/shoes/common/state.rb +1 -1
  18. data/lib/shoes/common/style.rb +9 -4
  19. data/lib/shoes/common/translate.rb +24 -0
  20. data/lib/shoes/common/ui_element.rb +1 -0
  21. data/lib/shoes/common/visibility.rb +1 -1
  22. data/lib/shoes/configuration.rb +2 -2
  23. data/lib/shoes/core/version.rb +3 -1
  24. data/lib/shoes/dimensions.rb +6 -2
  25. data/lib/shoes/dsl.rb +34 -14
  26. data/lib/shoes/font.rb +1 -1
  27. data/lib/shoes/gradient.rb +2 -1
  28. data/lib/shoes/image.rb +2 -2
  29. data/lib/shoes/input_box.rb +2 -2
  30. data/lib/shoes/internal_app.rb +8 -8
  31. data/lib/shoes/line.rb +7 -6
  32. data/lib/shoes/link.rb +5 -6
  33. data/lib/shoes/list_box.rb +2 -2
  34. data/lib/shoes/logger.rb +2 -1
  35. data/lib/shoes/mock.rb +1 -0
  36. data/lib/shoes/mock/arrow.rb +15 -0
  37. data/lib/shoes/mock/rect.rb +2 -1
  38. data/lib/shoes/mock/slot.rb +5 -1
  39. data/lib/shoes/mock/star.rb +2 -1
  40. data/lib/shoes/oval.rb +5 -4
  41. data/lib/shoes/point.rb +2 -1
  42. data/lib/shoes/progress.rb +1 -1
  43. data/lib/shoes/rect.rb +3 -2
  44. data/lib/shoes/shape.rb +14 -9
  45. data/lib/shoes/slot.rb +54 -25
  46. data/lib/shoes/slot_contents.rb +1 -3
  47. data/lib/shoes/star.rb +4 -3
  48. data/lib/shoes/text.rb +5 -0
  49. data/lib/shoes/text_block.rb +9 -9
  50. data/lib/shoes/ui/picker.rb +5 -5
  51. data/lib/shoes/version.rb +3 -1
  52. data/lib/shoes/widget.rb +2 -2
  53. data/lib/shoes/window.rb +6 -0
  54. data/spec/shoes/app_spec.rb +16 -16
  55. data/spec/shoes/arc_spec.rb +1 -1
  56. data/spec/shoes/arrow_spec.rb +28 -0
  57. data/spec/shoes/background_spec.rb +2 -2
  58. data/spec/shoes/border_spec.rb +3 -3
  59. data/spec/shoes/builtin_methods_spec.rb +2 -2
  60. data/spec/shoes/button_spec.rb +4 -2
  61. data/spec/shoes/color_spec.rb +12 -12
  62. data/spec/shoes/common/attachable_spec.rb +32 -0
  63. data/spec/shoes/common/inspect_spec.rb +4 -4
  64. data/spec/shoes/common/remove_spec.rb +5 -5
  65. data/spec/shoes/common/rotate_spec.rb +1 -1
  66. data/spec/shoes/common/style_normalizer_spec.rb +4 -4
  67. data/spec/shoes/common/style_spec.rb +15 -11
  68. data/spec/shoes/common/translate_spec.rb +27 -0
  69. data/spec/shoes/dimension_spec.rb +111 -100
  70. data/spec/shoes/dimensions_spec.rb +344 -303
  71. data/spec/shoes/download_spec.rb +17 -17
  72. data/spec/shoes/flow_spec.rb +2 -2
  73. data/spec/shoes/framework_learning_spec.rb +3 -1
  74. data/spec/shoes/helpers/fake_absolute_element.rb +3 -2
  75. data/spec/shoes/helpers/fake_element.rb +3 -2
  76. data/spec/shoes/input_box_spec.rb +2 -2
  77. data/spec/shoes/internal_app_spec.rb +14 -14
  78. data/spec/shoes/link_spec.rb +18 -19
  79. data/spec/shoes/list_box_spec.rb +9 -8
  80. data/spec/shoes/oval_spec.rb +1 -1
  81. data/spec/shoes/point_spec.rb +3 -3
  82. data/spec/shoes/renamed_delegate_spec.rb +2 -2
  83. data/spec/shoes/shape_spec.rb +20 -20
  84. data/spec/shoes/shared_examples/common_methods.rb +2 -2
  85. data/spec/shoes/shared_examples/dsl.rb +2 -2
  86. data/spec/shoes/shared_examples/dsl/flow.rb +1 -1
  87. data/spec/shoes/shared_examples/dsl/pattern.rb +2 -2
  88. data/spec/shoes/shared_examples/dsl/rgb.rb +2 -2
  89. data/spec/shoes/shared_examples/dsl/shape.rb +11 -7
  90. data/spec/shoes/shared_examples/dsl/star.rb +44 -44
  91. data/spec/shoes/shared_examples/dsl/style.rb +1 -1
  92. data/spec/shoes/shared_examples/dsl/text_elements.rb +6 -3
  93. data/spec/shoes/shared_examples/dsl/video.rb +1 -1
  94. data/spec/shoes/shared_examples/dsl_app_context.rb +6 -5
  95. data/spec/shoes/shared_examples/hover.rb +2 -2
  96. data/spec/shoes/shared_examples/shared_element_method.rb +2 -2
  97. data/spec/shoes/shared_examples/slot.rb +32 -21
  98. data/spec/shoes/shared_examples/style.rb +1 -1
  99. data/spec/shoes/slot_spec.rb +24 -7
  100. data/spec/shoes/span_spec.rb +5 -5
  101. data/spec/shoes/spec_helper.rb +1 -1
  102. data/spec/shoes/stack_spec.rb +5 -5
  103. data/spec/shoes/text_block_dimensions_spec.rb +6 -3
  104. data/spec/shoes/text_block_spec.rb +13 -7
  105. data/spec/shoes/text_spec.rb +22 -0
  106. data/spec/shoes/ui/picker_spec.rb +3 -3
  107. data/spec/shoes/url_spec.rb +4 -4
  108. data/spec/shoes/widget_spec.rb +1 -1
  109. data/spec/shoes_spec.rb +3 -3
  110. data/spec/spec_helper.rb +8 -1
  111. metadata +17 -4
  112. data/bin/shoes +0 -1
@@ -27,8 +27,8 @@ end
27
27
  shared_examples_for "left, top as center" do |*params|
28
28
  let(:centered_object) { described_class.new(app, parent, left, top, width, height, *params, center: true) }
29
29
  it "should now be located somewhere" do
30
- expect(centered_object.left).to eq(left-(width/2))
31
- expect(centered_object.top).to eq(top-(height/2))
30
+ expect(centered_object.left).to eq(left - (width / 2))
31
+ expect(centered_object.top).to eq(top - (height / 2))
32
32
  expect(centered_object.width).to eq(width)
33
33
  expect(centered_object.height).to eq(height)
34
34
  end
@@ -8,7 +8,7 @@
8
8
  shared_examples "DSL container" do
9
9
  let(:dsl) { app }
10
10
 
11
- %w[
11
+ %w(
12
12
  animate
13
13
  arc
14
14
  background
@@ -36,7 +36,7 @@ shared_examples "DSL container" do
36
36
  strokewidth
37
37
  style
38
38
  video
39
- ].each do |method|
39
+ ).each do |method|
40
40
  include_examples "#{method} DSL method"
41
41
  end
42
42
 
@@ -1,5 +1,5 @@
1
1
  shared_examples_for "flow DSL method" do
2
- let(:flow) {dsl.flow}
2
+ let(:flow) { dsl.flow }
3
3
 
4
4
  it "creates a Shoes::Flow" do
5
5
  expect(flow).to be_an_instance_of(Shoes::Flow)
@@ -13,7 +13,7 @@ shared_examples_for "pattern DSL method" do
13
13
  let(:pattern) { dsl.pattern honeydew..salmon }
14
14
 
15
15
  it "returns a gradient" do
16
- expect(pattern).to eq(dsl.gradient honeydew..salmon)
16
+ expect(pattern).to eq(dsl.gradient(honeydew..salmon))
17
17
  end
18
18
  end
19
19
 
@@ -28,7 +28,7 @@ shared_examples_for "pattern DSL method" do
28
28
  let(:pattern) { dsl.pattern honeydew.hex..salmon.hex }
29
29
 
30
30
  it "returns a gradient" do
31
- expect(pattern).to eq(dsl.gradient honeydew..salmon)
31
+ expect(pattern).to eq(dsl.gradient(honeydew..salmon))
32
32
  end
33
33
  end
34
34
  end
@@ -18,11 +18,11 @@ shared_examples_for "rgb DSL method" do
18
18
 
19
19
  describe "named color method" do
20
20
  it "produces correct color" do
21
- expect(dsl.cornflowerblue).to eq(Shoes::Color.new red, green, blue)
21
+ expect(dsl.cornflowerblue).to eq(Shoes::Color.new(red, green, blue))
22
22
  end
23
23
 
24
24
  it "accepts alpha arg" do
25
- expect(dsl.cornflowerblue(alpha)).to eq(Shoes::Color.new red, green, blue, alpha)
25
+ expect(dsl.cornflowerblue(alpha)).to eq(Shoes::Color.new(red, green, blue, alpha))
26
26
  end
27
27
  end
28
28
  end
@@ -1,13 +1,13 @@
1
1
  shared_examples_for "shape DSL method" do
2
- let(:shape) {
3
- dsl.shape {
2
+ let(:shape) do
3
+ dsl.shape do
4
4
  move_to 400, 300
5
5
  line_to 400, 200
6
6
  line_to 100, 100
7
7
  line_to 400, 300
8
8
  curve_to 100, 100, 20, 200, 120, 240
9
- }
10
- }
9
+ end
10
+ end
11
11
 
12
12
  it "creates a Shoes::Shape" do
13
13
  expect(shape).to be_an_instance_of(Shoes::Shape)
@@ -33,21 +33,25 @@ shared_examples_for "shape DSL method" do
33
33
  end
34
34
 
35
35
  it "can accept a left and top" do
36
- left, top = 10, 20
36
+ left = 10
37
+ top = 20
37
38
  shape = dsl.shape left, top
38
39
  expect(shape.left).to eq(left)
39
40
  expect(shape.top).to eq(top)
40
41
  end
41
42
 
42
43
  it "accepts left and top in styles" do
43
- left, top = 10, 20
44
+ left = 10
45
+ top = 20
44
46
  shape = dsl.shape left: left, top: top
45
47
  expect(shape.left).to eq(left)
46
48
  expect(shape.top).to eq(top)
47
49
  end
48
50
 
49
51
  it "can accept a left, top, and some styles" do
50
- left, top, white = 10, 20, Shoes::COLORS.fetch(:white)
52
+ left = 10
53
+ top = 20
54
+ white = Shoes::COLORS.fetch(:white)
51
55
  shape = dsl.shape left, top, stroke: white
52
56
  expect(shape.left).to eq(left)
53
57
  expect(shape.top).to eq(top)
@@ -8,33 +8,33 @@ shared_examples_for "star DSL method" do
8
8
  end
9
9
 
10
10
  describe 'instantiation' do
11
- let(:left) {10}
12
- let(:top) {20}
13
- let(:points) {15}
14
- let(:outer) {27}
15
- let(:inner) {33}
16
- let(:clickable) { proc { } }
11
+ let(:left) { 10 }
12
+ let(:top) { 20 }
13
+ let(:points) { 15 }
14
+ let(:outer) { 27 }
15
+ let(:inner) { 33 }
16
+ let(:clickable) { proc {} }
17
17
 
18
18
  DEFAULT_POINTS = 10
19
19
  DEFAULT_OUTER = 100.0
20
20
  DEFAULT_INNER = 50.0
21
21
 
22
22
  describe '2 arguments' do
23
- subject {dsl.star left, top}
24
- its(:left) {should eq left}
25
- its(:top) {should eq top}
26
- its(:points) {should eq DEFAULT_POINTS}
27
- its(:outer) {should eq DEFAULT_OUTER}
28
- its(:inner) {should eq DEFAULT_INNER}
23
+ subject { dsl.star left, top }
24
+ its(:left) { should eq left }
25
+ its(:top) { should eq top }
26
+ its(:points) { should eq DEFAULT_POINTS }
27
+ its(:outer) { should eq DEFAULT_OUTER }
28
+ its(:inner) { should eq DEFAULT_INNER }
29
29
  end
30
30
 
31
31
  describe '2 arguments with hash' do
32
32
  subject { dsl.star left, top, click: clickable }
33
- its(:left) {should eq left}
34
- its(:top) {should eq top}
35
- its(:points) {should eq DEFAULT_POINTS}
36
- its(:outer) {should eq DEFAULT_OUTER}
37
- its(:inner) {should eq DEFAULT_INNER}
33
+ its(:left) { should eq left }
34
+ its(:top) { should eq top }
35
+ its(:points) { should eq DEFAULT_POINTS }
36
+ its(:outer) { should eq DEFAULT_OUTER }
37
+ its(:inner) { should eq DEFAULT_INNER }
38
38
 
39
39
  it "gets the click" do
40
40
  expect(subject.style[:click]).to eq(clickable)
@@ -43,11 +43,11 @@ shared_examples_for "star DSL method" do
43
43
 
44
44
  describe '3 arguments with hash' do
45
45
  subject { dsl.star left, top, points, click: clickable }
46
- its(:left) {should eq left}
47
- its(:top) {should eq top}
48
- its(:points) {should eq points}
49
- its(:outer) {should eq DEFAULT_OUTER}
50
- its(:inner) {should eq DEFAULT_INNER}
46
+ its(:left) { should eq left }
47
+ its(:top) { should eq top }
48
+ its(:points) { should eq points }
49
+ its(:outer) { should eq DEFAULT_OUTER }
50
+ its(:inner) { should eq DEFAULT_INNER }
51
51
 
52
52
  it "gets the click" do
53
53
  expect(subject.style[:click]).to eq(clickable)
@@ -55,21 +55,21 @@ shared_examples_for "star DSL method" do
55
55
  end
56
56
 
57
57
  describe '4 arguments' do
58
- subject {dsl.star left, top, points, outer}
59
- its(:left) {should eq left}
60
- its(:top) {should eq top}
61
- its(:points) {should eq points}
62
- its(:outer) {should eq outer}
63
- its(:inner) {should eq DEFAULT_INNER}
58
+ subject { dsl.star left, top, points, outer }
59
+ its(:left) { should eq left }
60
+ its(:top) { should eq top }
61
+ its(:points) { should eq points }
62
+ its(:outer) { should eq outer }
63
+ its(:inner) { should eq DEFAULT_INNER }
64
64
  end
65
65
 
66
66
  describe '4 arguments with hash' do
67
67
  subject { dsl.star left, top, points, outer, click: clickable }
68
- its(:left) {should eq left}
69
- its(:top) {should eq top}
70
- its(:points) {should eq points}
71
- its(:outer) {should eq outer}
72
- its(:inner) {should eq DEFAULT_INNER}
68
+ its(:left) { should eq left }
69
+ its(:top) { should eq top }
70
+ its(:points) { should eq points }
71
+ its(:outer) { should eq outer }
72
+ its(:inner) { should eq DEFAULT_INNER }
73
73
 
74
74
  it "gets the click" do
75
75
  expect(subject.style[:click]).to eq(clickable)
@@ -77,21 +77,21 @@ shared_examples_for "star DSL method" do
77
77
  end
78
78
 
79
79
  describe '5 arguments' do
80
- subject {dsl.star left, top, points, outer, inner}
81
- its(:left) {should eq left}
82
- its(:top) {should eq top}
83
- its(:points) {should eq points}
84
- its(:outer) {should eq outer}
85
- its(:inner) {should eq inner}
80
+ subject { dsl.star left, top, points, outer, inner }
81
+ its(:left) { should eq left }
82
+ its(:top) { should eq top }
83
+ its(:points) { should eq points }
84
+ its(:outer) { should eq outer }
85
+ its(:inner) { should eq inner }
86
86
  end
87
87
 
88
88
  describe '5 arguments with hash' do
89
89
  subject { dsl.star left, top, points, outer, inner, click: clickable }
90
- its(:left) {should eq left}
91
- its(:top) {should eq top}
92
- its(:points) {should eq points}
93
- its(:outer) {should eq outer}
94
- its(:inner) {should eq inner}
90
+ its(:left) { should eq left }
91
+ its(:top) { should eq top }
92
+ its(:points) { should eq points }
93
+ its(:outer) { should eq outer }
94
+ its(:inner) { should eq inner }
95
95
 
96
96
  it "gets the click" do
97
97
  expect(subject.style[:click]).to eq(clickable)
@@ -3,7 +3,7 @@ shared_examples_for "style DSL method" do
3
3
  let(:stroke) { Shoes::COLORS[:chartreuse] }
4
4
  let(:size) { 42 }
5
5
  let(:fill) { Shoes::COLORS[:peru] }
6
- let(:font) { "SOME FONT" }
6
+ let(:font) { "SOME FONT" }
7
7
  let(:style) { {stroke: stroke, size: size, fill: fill, font: font} }
8
8
 
9
9
  %w(Banner Title Subtitle Tagline Caption Para Inscription).each do |text_block|
@@ -35,23 +35,26 @@ shared_examples_for "text element DSL methods" do
35
35
  end
36
36
 
37
37
  describe 'span' do
38
+ let(:link_array) { [dsl.link('foo'), dsl.link('foo')] }
39
+
38
40
  it 'should parse the color' do
39
41
  span = dsl.span 'Hello', stroke: '#ccc'
40
42
  expect(span.style[:stroke]).to eq Shoes::Color.new 204, 204, 204
41
43
  end
42
44
 
43
45
  it 'should handle a splatted array of links' do
44
- expect {dsl.span(*[dsl.link('foo'), dsl.link('foo')])}.not_to raise_error
46
+ expect { dsl.span(*link_array) }.not_to raise_error
45
47
  end
46
48
 
47
49
  it 'should handle a splatted array of links and parse the color' do
48
- span = dsl.span(*[dsl.link('foo'), dsl.link('foo')], stroke: '#ccc')
50
+ span = dsl.span(*link_array, stroke: '#ccc')
49
51
  expect(span.style[:stroke]).to eq Shoes::Color.new 204, 204, 204
50
52
  end
51
53
 
52
54
  it 'should handle a splatted array of links with a block' do
53
55
  link = dsl.link('foo') { "Bar" }
54
- expect {dsl.span(*[link, link])}.not_to raise_error
56
+ array = [link, link]
57
+ expect { dsl.span(*array) }.not_to raise_error
55
58
  end
56
59
  end
57
60
 
@@ -1,5 +1,5 @@
1
1
  shared_examples_for 'video DSL method' do
2
2
  it 'throws a Shoes::NotImplementedError' do
3
- expect {dsl.video}.to raise_error Shoes::NotImplementedError
3
+ expect { dsl.video }.to raise_error Shoes::NotImplementedError
4
4
  end
5
5
  end
@@ -1,10 +1,11 @@
1
1
  shared_context "dsl app" do
2
- let(:input_block) { Proc.new {} }
2
+ let(:input_block) { proc {} }
3
3
  let(:input_opts) { Hash.new }
4
4
  let(:user_facing_app) { Shoes::App.new input_opts, &input_block }
5
5
  let(:app) { user_facing_app.instance_variable_get(:@__app__) }
6
- let(:parent) { Shoes::Flow.new app, app,
7
- width: Shoes::InternalApp::DEFAULT_OPTIONS[:width],
8
- height: Shoes::InternalApp::DEFAULT_OPTIONS[:height]
9
- }
6
+ let(:parent) do
7
+ Shoes::Flow.new app, app,
8
+ width: Shoes::InternalApp::DEFAULT_OPTIONS[:width],
9
+ height: Shoes::InternalApp::DEFAULT_OPTIONS[:height]
10
+ end
10
11
  end
@@ -6,12 +6,12 @@ shared_examples "object with hover" do
6
6
 
7
7
  it "registers hover" do
8
8
  expect(subject).to receive(:add_mouse_hover_control)
9
- subject.hover { }
9
+ subject.hover {}
10
10
  end
11
11
 
12
12
  it "registers with leave" do
13
13
  expect(subject).to receive(:add_mouse_hover_control)
14
- subject.leave { }
14
+ subject.leave {}
15
15
  end
16
16
 
17
17
  it "marks itself as hovered" do
@@ -24,7 +24,7 @@ shared_examples_for "object with stroke" do
24
24
 
25
25
  # Be sure the subject does *not* have the stroke set previously
26
26
  specify "defaults to black" do
27
- expect(subject.stroke).to eq(Shoes::COLORS.fetch :black)
27
+ expect(subject.stroke).to eq(Shoes::COLORS.fetch(:black))
28
28
  end
29
29
 
30
30
  describe "strokewidth" do
@@ -55,6 +55,6 @@ shared_examples_for "object with fill" do
55
55
 
56
56
  # Be sure the subject does *not* have the stroke set previously
57
57
  specify "defaults to black" do
58
- expect(subject.fill).to eq(Shoes::COLORS.fetch :black)
58
+ expect(subject.fill).to eq(Shoes::COLORS.fetch(:black))
59
59
  end
60
60
  end
@@ -2,7 +2,7 @@ shared_examples_for "Slot" do
2
2
  it "should be able to append" do
3
3
  expect(subject.contents).to be_empty
4
4
  our_subject = subject
5
- app.execute_block Proc.new { our_subject.append {para "foo"} }
5
+ app.execute_block proc { our_subject.append { para "foo" } }
6
6
  expect(subject.contents.size).to eq(1)
7
7
  end
8
8
 
@@ -21,8 +21,8 @@ shared_examples_for "Slot" do
21
21
  end
22
22
 
23
23
  shared_context 'one slot child' do
24
- let(:ele_opts) {Hash.new}
25
- let(:element) {Shoes::FakeElement.new(nil, {height: 100,width: 50}.merge(ele_opts))}
24
+ let(:ele_opts) { Hash.new }
25
+ let(:element) { Shoes::FakeElement.new(nil, {height: 100, width: 50}.merge(ele_opts)) }
26
26
 
27
27
  before :each do
28
28
  subject.add_child element
@@ -31,7 +31,7 @@ end
31
31
 
32
32
  shared_context 'two slot children' do
33
33
  include_context 'one slot child'
34
- let(:element2) {Shoes::FakeElement.new nil, height: 200, width: 70}
34
+ let(:element2) { Shoes::FakeElement.new nil, height: 200, width: 70 }
35
35
 
36
36
  before :each do
37
37
  subject.add_child element2
@@ -39,7 +39,7 @@ shared_context 'two slot children' do
39
39
  end
40
40
 
41
41
  shared_context 'hidden child' do
42
- let(:hidden_element) {Shoes::FakeElement.new nil, height: 200, width: 70}
42
+ let(:hidden_element) { Shoes::FakeElement.new nil, height: 200, width: 70 }
43
43
 
44
44
  before :each do
45
45
  subject.add_child hidden_element
@@ -50,7 +50,7 @@ end
50
50
 
51
51
  shared_context 'three slot children' do
52
52
  include_context 'two slot children'
53
- let(:element3) {Shoes::FakeElement.new(nil, height: 50, width: 20)}
53
+ let(:element3) { Shoes::FakeElement.new(nil, height: 50, width: 20) }
54
54
 
55
55
  before :each do
56
56
  subject.add_child element3
@@ -64,33 +64,33 @@ shared_context 'contents_alignment' do
64
64
  end
65
65
 
66
66
  shared_context 'element one with top and left' do
67
- let(:ele_top) {22}
68
- let(:ele_left) {47}
69
- let(:ele_opts) {{left: ele_left, top: ele_top}}
67
+ let(:ele_top) { 22 }
68
+ let(:ele_left) { 47 }
69
+ let(:ele_opts) { {left: ele_left, top: ele_top} }
70
70
  end
71
71
 
72
72
  shared_context 'slot with set height and width' do
73
- let(:input_opts) {{width: 250, height: 300}}
73
+ let(:input_opts) { {width: 250, height: 300} }
74
74
  end
75
75
 
76
76
  shared_context 'slot with a top margin' do
77
- let(:margin_top) {70}
78
- let(:input_opts) {{margin_top: margin_top}}
77
+ let(:margin_top) { 70 }
78
+ let(:input_opts) { {margin_top: margin_top} }
79
79
  end
80
80
 
81
81
  shared_context 'slot with a left margin' do
82
- let(:margin_left) {30}
83
- let(:input_opts) {{margin_left: margin_left}}
82
+ let(:margin_left) { 30 }
83
+ let(:input_opts) { {margin_left: margin_left} }
84
84
  end
85
85
 
86
86
  shared_context 'element one with bottom and right' do
87
- let(:ele_bottom) {24}
88
- let(:ele_right) {49}
89
- let(:ele_opts) {{right: ele_right, bottom: ele_bottom}}
87
+ let(:ele_bottom) { 24 }
88
+ let(:ele_right) { 49 }
89
+ let(:ele_opts) { {right: ele_right, bottom: ele_bottom} }
90
90
  end
91
91
 
92
92
  shared_examples_for 'positioning through :_position' do
93
- let(:element) {Shoes::FakeElement.new nil, height: 100, width: 50}
93
+ let(:element) { Shoes::FakeElement.new nil, height: 100, width: 50 }
94
94
 
95
95
  def add_child_and_align
96
96
  subject.add_child element
@@ -124,10 +124,21 @@ shared_examples_for 'positioning through :_position' do
124
124
 
125
125
  it 'is resilient to exceptions during positioning' do
126
126
  allow(element).to receive(:contents_alignment).and_raise("O_o")
127
- allow(subject).to receive(:puts) # Quiet, you
127
+ allow(subject).to receive(:puts) # Quiet, you
128
128
  add_child_and_align
129
129
  end
130
130
 
131
+ describe 'attached' do
132
+ let(:attached_to) { double('attached slot', absolute_left: 101, absolute_top: 101) }
133
+ let(:element) { Shoes::FakeElement.new nil }
134
+
135
+ it "gets positioned where it's attached" do
136
+ element.style[:attach] = attached_to
137
+ expect(element).to receive(:_position).with(101, 101).at_least(1)
138
+ add_child_and_align
139
+ end
140
+ end
141
+
131
142
  describe 'absolute dimensions' do
132
143
  let(:element) { Shoes::FakeAbsoluteElement.new }
133
144
 
@@ -256,7 +267,7 @@ shared_examples_for 'growing although relatively positioned elements' do
256
267
  include_context 'contents_alignment'
257
268
 
258
269
  describe 'positioned at the very beginning' do
259
- let(:ele_opts) {{top: 0}}
270
+ let(:ele_opts) { {top: 0} }
260
271
 
261
272
  it 'grows the slot height' do
262
273
  expect(subject.height).to eq element.height
@@ -264,7 +275,7 @@ shared_examples_for 'growing although relatively positioned elements' do
264
275
  end
265
276
 
266
277
  describe 'positioned with a good offset' do
267
- let(:ele_opts) {{top: 70}}
278
+ let(:ele_opts) { {top: 70} }
268
279
 
269
280
  it 'grows the height even further' do
270
281
  expect(subject.height).to eq element.height + 70