motion-kit 0.0.1 → 0.9.0

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 (94) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +839 -0
  3. data/lib/motion-kit-cocoa/cocoa_util.rb +59 -0
  4. data/lib/motion-kit-cocoa/constraints/constraint.rb +765 -0
  5. data/lib/motion-kit-cocoa/constraints/constraint_placeholder.rb +22 -0
  6. data/lib/motion-kit-cocoa/constraints/constraints_layout.rb +536 -0
  7. data/lib/motion-kit-cocoa/constraints/constraints_target.rb +52 -0
  8. data/lib/motion-kit-cocoa/layouts/cagradientlayer_layout.rb +13 -0
  9. data/lib/motion-kit-cocoa/layouts/calayer_layout.rb +27 -0
  10. data/lib/motion-kit-cocoa/layouts/sugarcube_compat.rb +38 -0
  11. data/lib/motion-kit-ios/dummy.rb +93 -0
  12. data/lib/motion-kit-ios/ios_util.rb +20 -0
  13. data/lib/motion-kit-ios/layouts/constraints_layout.rb +22 -0
  14. data/lib/motion-kit-ios/layouts/layout_device.rb +32 -0
  15. data/lib/motion-kit-ios/layouts/layout_orientation.rb +47 -0
  16. data/lib/motion-kit-ios/layouts/uibutton_layout.rb +52 -0
  17. data/lib/motion-kit-ios/layouts/uiview_layout.rb +45 -0
  18. data/lib/motion-kit-ios/layouts/uiview_layout_autoresizing.rb +75 -0
  19. data/lib/motion-kit-ios/layouts/uiview_layout_constraints.rb +36 -0
  20. data/lib/motion-kit-ios/layouts/uiview_layout_frame.rb +307 -0
  21. data/lib/motion-kit-ios/layouts/uiview_layout_gradient.rb +20 -0
  22. data/lib/motion-kit-osx/dummy.rb +89 -0
  23. data/lib/motion-kit-osx/layouts/constraints_layout.rb +42 -0
  24. data/lib/motion-kit-osx/layouts/nsmenu_extensions.rb +186 -0
  25. data/lib/motion-kit-osx/layouts/nsmenu_layout.rb +109 -0
  26. data/lib/motion-kit-osx/layouts/nsmenuitem_extensions.rb +45 -0
  27. data/lib/motion-kit-osx/layouts/nstablecolumn_layout.rb +12 -0
  28. data/lib/motion-kit-osx/layouts/nstableview_layout.rb +20 -0
  29. data/lib/motion-kit-osx/layouts/nsview_layout.rb +47 -0
  30. data/lib/motion-kit-osx/layouts/nsview_layout_autoresizing.rb +75 -0
  31. data/lib/motion-kit-osx/layouts/nsview_layout_constraints.rb +34 -0
  32. data/lib/motion-kit-osx/layouts/nsview_layout_frame.rb +375 -0
  33. data/lib/motion-kit-osx/layouts/nswindow_frame.rb +14 -0
  34. data/lib/motion-kit-osx/layouts/nswindow_layout.rb +77 -0
  35. data/lib/motion-kit-osx/osx_util.rb +16 -0
  36. data/lib/motion-kit.rb +33 -0
  37. data/lib/motion-kit/calculate.rb +263 -0
  38. data/lib/motion-kit/layouts/base_layout.rb +299 -0
  39. data/lib/motion-kit/layouts/base_layout_class_methods.rb +43 -0
  40. data/lib/motion-kit/layouts/parent.rb +68 -0
  41. data/lib/motion-kit/layouts/view_layout.rb +327 -0
  42. data/lib/motion-kit/motion-kit.rb +18 -0
  43. data/lib/motion-kit/object.rb +16 -0
  44. data/lib/motion-kit/util.rb +20 -0
  45. data/lib/motion-kit/version.rb +1 -1
  46. data/spec/ios/apply_styles_spec.rb +21 -0
  47. data/spec/ios/autoresizing_helper_spec.rb +224 -0
  48. data/spec/ios/calculate_spec.rb +322 -0
  49. data/spec/ios/calculator_spec.rb +31 -0
  50. data/spec/ios/constraints_helpers/attribute_lookup_spec.rb +27 -0
  51. data/spec/ios/constraints_helpers/axis_lookup_spec.rb +13 -0
  52. data/spec/ios/constraints_helpers/center_constraints_spec.rb +419 -0
  53. data/spec/ios/constraints_helpers/constraint_placeholder_spec.rb +72 -0
  54. data/spec/ios/constraints_helpers/priority_lookup_spec.rb +19 -0
  55. data/spec/ios/constraints_helpers/relationship_lookup_spec.rb +27 -0
  56. data/spec/ios/constraints_helpers/relative_corners_spec.rb +274 -0
  57. data/spec/ios/constraints_helpers/relative_location_spec.rb +111 -0
  58. data/spec/ios/constraints_helpers/simple_constraints_spec.rb +2763 -0
  59. data/spec/ios/constraints_helpers/size_constraints_spec.rb +422 -0
  60. data/spec/ios/constraints_helpers/view_lookup_constraints_spec.rb +93 -0
  61. data/spec/ios/create_layout_spec.rb +40 -0
  62. data/spec/ios/custom_layout_spec.rb +13 -0
  63. data/spec/ios/deferred_spec.rb +89 -0
  64. data/spec/ios/device_helpers_spec.rb +51 -0
  65. data/spec/ios/frame_helper_spec.rb +1150 -0
  66. data/spec/ios/layer_layout_spec.rb +36 -0
  67. data/spec/ios/layout_extensions_spec.rb +70 -0
  68. data/spec/ios/layout_spec.rb +74 -0
  69. data/spec/ios/layout_state_spec.rb +27 -0
  70. data/spec/ios/motionkit_util_spec.rb +102 -0
  71. data/spec/ios/objc_selectors_spec.rb +10 -0
  72. data/spec/ios/orientation_helper_specs.rb +67 -0
  73. data/spec/ios/parent_layout_spec.rb +19 -0
  74. data/spec/ios/parent_spec.rb +45 -0
  75. data/spec/ios/remove_layout_spec.rb +25 -0
  76. data/spec/ios/root_layout_spec.rb +53 -0
  77. data/spec/ios/setters_spec.rb +63 -0
  78. data/spec/ios/uibutton_layout_spec.rb +24 -0
  79. data/spec/ios/uitextfield_spec.rb +14 -0
  80. data/spec/ios/view_attr_spec.rb +25 -0
  81. data/spec/osx/autoresizing_helper_spec.rb +224 -0
  82. data/spec/osx/constraints_helper_spec.rb +0 -0
  83. data/spec/osx/constraints_helpers/orientation_lookup_spec.rb +13 -0
  84. data/spec/osx/constraints_helpers/simple_constraints_spec.rb +2095 -0
  85. data/spec/osx/constraints_helpers/size_constraints_spec.rb +362 -0
  86. data/spec/osx/create_menu_spec.rb +14 -0
  87. data/spec/osx/create_via_extensions_spec.rb +63 -0
  88. data/spec/osx/deferred_spec.rb +85 -0
  89. data/spec/osx/frame_helper_spec.rb +1881 -0
  90. data/spec/osx/menu_extensions_spec.rb +376 -0
  91. data/spec/osx/menu_layout_spec.rb +157 -0
  92. data/spec/osx/menu_spec.rb +70 -0
  93. data/spec/osx/root_menu_spec.rb +15 -0
  94. metadata +166 -14
@@ -0,0 +1,72 @@
1
+ describe 'Constraints - placeholder helpers' do
2
+
3
+ before do
4
+ @layout = MK::Layout.new
5
+ @view = @layout.context(UIView.new) do
6
+ @first = @layout.add UILabel.new, :label do
7
+ @layout.text 'first'
8
+ end
9
+ @nth = @layout.add UILabel.new, :label do
10
+ @layout.text 'nth'
11
+ end
12
+ @last = @layout.add UILabel.new, :label do
13
+ @layout.text 'last'
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'should return :first' do
19
+ @layout.context(@view) do
20
+ @layout.constraints do
21
+ @constraint = @layout.x.equals(@layout.first(:label))
22
+ end
23
+ end
24
+
25
+ resolved = @constraint.resolve_all(@layout, @view)
26
+ resolved.length.should == 1
27
+ resolved[0].firstItem.should == @view
28
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
29
+ resolved[0].relation.should == NSLayoutRelationEqual
30
+ resolved[0].secondItem.should == @first
31
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
32
+ resolved[0].multiplier.should == 1
33
+ resolved[0].constant.should == 0
34
+ end
35
+
36
+ it 'should return :nth' do
37
+ @layout.context(@view) do
38
+ @layout.constraints do
39
+ @constraint = @layout.x.equals(@layout.nth(:label, 1))
40
+ end
41
+ end
42
+
43
+ resolved = @constraint.resolve_all(@layout, @view)
44
+ resolved.length.should == 1
45
+ resolved[0].firstItem.should == @view
46
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
47
+ resolved[0].relation.should == NSLayoutRelationEqual
48
+ resolved[0].secondItem.should == @nth
49
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
50
+ resolved[0].multiplier.should == 1
51
+ resolved[0].constant.should == 0
52
+ end
53
+
54
+ it 'should return :last' do
55
+ @layout.context(@view) do
56
+ @layout.constraints do
57
+ @constraint = @layout.x.equals(@layout.last(:label))
58
+ end
59
+ end
60
+
61
+ resolved = @constraint.resolve_all(@layout, @view)
62
+ resolved.length.should == 1
63
+ resolved[0].firstItem.should == @view
64
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
65
+ resolved[0].relation.should == NSLayoutRelationEqual
66
+ resolved[0].secondItem.should == @last
67
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
68
+ resolved[0].multiplier.should == 1
69
+ resolved[0].constant.should == 0
70
+ end
71
+
72
+ end
@@ -0,0 +1,19 @@
1
+ describe 'Constraints - priority lookup' do
2
+
3
+ it 'should return 1000' do
4
+ MotionKit::Constraint.priority_lookup(:required).should == 1000
5
+ MotionKit::Constraint.priority_lookup(1000).should == 1000
6
+ end
7
+
8
+ it 'should return 250' do
9
+ MotionKit::Constraint.priority_lookup(:low).should == 250
10
+ MotionKit::Constraint.priority_lookup(250).should == 250
11
+ end
12
+
13
+ it 'should raise InvalidPriorityError' do
14
+ -> do
15
+ MotionKit::Constraint.priority_lookup(:foo)
16
+ end.should.raise(MotionKit::InvalidPriorityError)
17
+ end
18
+
19
+ end
@@ -0,0 +1,27 @@
1
+ describe 'Constraints - relationship lookup' do
2
+
3
+ it 'should return NSLayoutRelationEqual' do
4
+ MotionKit::Constraint.relationship_lookup(:equal).should == NSLayoutRelationEqual
5
+ MotionKit::Constraint.relationship_lookup(NSLayoutRelationEqual).should == NSLayoutRelationEqual
6
+ end
7
+
8
+ it 'should return NSLayoutRelationGreaterThanOrEqual' do
9
+ MotionKit::Constraint.relationship_lookup(:gte).should == NSLayoutRelationGreaterThanOrEqual
10
+ MotionKit::Constraint.relationship_lookup(NSLayoutRelationGreaterThanOrEqual).should == NSLayoutRelationGreaterThanOrEqual
11
+ end
12
+
13
+ it 'should raise InvalidRelationshipError' do
14
+ -> do
15
+ MotionKit::Constraint.relationship_lookup(:foo)
16
+ end.should.raise(MotionKit::InvalidRelationshipError)
17
+ end
18
+
19
+ it 'should reverse NSLayoutRelationEqual' do
20
+ MotionKit::Constraint.relationship_reverse(NSLayoutRelationEqual).should == :equal
21
+ end
22
+
23
+ it 'should reverse NSLayoutRelationGreaterThanOrEqual' do
24
+ MotionKit::Constraint.relationship_reverse(NSLayoutRelationGreaterThanOrEqual).should == :gte
25
+ end
26
+
27
+ end
@@ -0,0 +1,274 @@
1
+ describe 'Constraints - Relative corners helpers' do
2
+
3
+ before do
4
+ @layout = MK::Layout.new
5
+ @constraint = nil
6
+ @view = nil
7
+ @another_view = nil
8
+ end
9
+
10
+ it 'should support `top_left [10, 10]`' do
11
+ @view = @layout.context(UIView.new) do
12
+ @layout.constraints do
13
+ @constraint = @layout.top_left([10, 10])
14
+ end
15
+ end
16
+
17
+ @constraint.constant.should == [10, 10]
18
+ @constraint.relationship.should == :equal
19
+ @constraint.multiplier.should == [1, 1]
20
+ @constraint.relative_to.should == :superview
21
+ @constraint.attribute.should == [:left, :top]
22
+ @constraint.attribute2.should == [:left, :top]
23
+
24
+ resolved = @constraint.resolve_all(@layout, @view)
25
+ resolved.length.should == 2
26
+ resolved[0].firstItem.should == @view
27
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
28
+ resolved[0].relation.should == NSLayoutRelationEqual
29
+ resolved[0].secondItem.should == nil
30
+ resolved[0].secondAttribute.should == NSLayoutAttributeNotAnAttribute
31
+ resolved[0].multiplier.should == 1
32
+ resolved[0].constant.should == 10
33
+
34
+ resolved[1].firstItem.should == @view
35
+ resolved[1].firstAttribute.should == NSLayoutAttributeTop
36
+ resolved[1].relation.should == NSLayoutRelationEqual
37
+ resolved[1].secondItem.should == nil
38
+ resolved[1].secondAttribute.should == NSLayoutAttributeNotAnAttribute
39
+ resolved[1].multiplier.should == 1
40
+ resolved[1].constant.should == 10
41
+ end
42
+ it 'should support `top_left.equals(:another_view).plus(10).plus([5, 10])`' do
43
+ @view = @layout.context(UIView.new) do
44
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
45
+ @layout.constraints do
46
+ @constraint = @layout.top_left.equals(:another_view).plus(10).plus([5, 10])
47
+ end
48
+ end
49
+
50
+ @constraint.constant.should == [15, 20]
51
+ @constraint.relationship.should == :equal
52
+ @constraint.multiplier.should == [1, 1]
53
+ @constraint.relative_to.should == :another_view
54
+ @constraint.attribute.should == [:left, :top]
55
+ @constraint.attribute2.should == [:left, :top]
56
+
57
+ resolved = @constraint.resolve_all(@layout, @view)
58
+ resolved.length.should == 2
59
+ resolved[0].firstItem.should == @view
60
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
61
+ resolved[0].relation.should == NSLayoutRelationEqual
62
+ resolved[0].secondItem.should == @another_view
63
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
64
+ resolved[0].multiplier.should == 1
65
+ resolved[0].constant.should == 15
66
+
67
+ resolved[1].firstItem.should == @view
68
+ resolved[1].firstAttribute.should == NSLayoutAttributeTop
69
+ resolved[1].relation.should == NSLayoutRelationEqual
70
+ resolved[1].secondItem.should == @another_view
71
+ resolved[1].secondAttribute.should == NSLayoutAttributeTop
72
+ resolved[1].multiplier.should == 1
73
+ resolved[1].constant.should == 20
74
+ end
75
+
76
+ it 'should support `top_right [10, 10]`' do
77
+ @view = @layout.context(UIView.new) do
78
+ @layout.constraints do
79
+ @constraint = @layout.top_right([10, 10])
80
+ end
81
+ end
82
+
83
+ @constraint.constant.should == [10, 10]
84
+ @constraint.relationship.should == :equal
85
+ @constraint.multiplier.should == [1, 1]
86
+ @constraint.relative_to.should == :superview
87
+ @constraint.attribute.should == [:right, :top]
88
+ @constraint.attribute2.should == [:right, :top]
89
+
90
+ resolved = @constraint.resolve_all(@layout, @view)
91
+ resolved.length.should == 2
92
+ resolved[0].firstItem.should == @view
93
+ resolved[0].firstAttribute.should == NSLayoutAttributeRight
94
+ resolved[0].relation.should == NSLayoutRelationEqual
95
+ resolved[0].secondItem.should == nil
96
+ resolved[0].secondAttribute.should == NSLayoutAttributeNotAnAttribute
97
+ resolved[0].multiplier.should == 1
98
+ resolved[0].constant.should == 10
99
+
100
+ resolved[1].firstItem.should == @view
101
+ resolved[1].firstAttribute.should == NSLayoutAttributeTop
102
+ resolved[1].relation.should == NSLayoutRelationEqual
103
+ resolved[1].secondItem.should == nil
104
+ resolved[1].secondAttribute.should == NSLayoutAttributeNotAnAttribute
105
+ resolved[1].multiplier.should == 1
106
+ resolved[1].constant.should == 10
107
+ end
108
+ it 'should support `top_right.equals(:another_view).plus(10).plus([5, 10])`' do
109
+ @view = @layout.context(UIView.new) do
110
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
111
+ @layout.constraints do
112
+ @constraint = @layout.top_right.equals(:another_view).plus(10).plus([5, 10])
113
+ end
114
+ end
115
+
116
+ @constraint.constant.should == [15, 20]
117
+ @constraint.relationship.should == :equal
118
+ @constraint.multiplier.should == [1, 1]
119
+ @constraint.relative_to.should == :another_view
120
+ @constraint.attribute.should == [:right, :top]
121
+ @constraint.attribute2.should == [:right, :top]
122
+
123
+ resolved = @constraint.resolve_all(@layout, @view)
124
+ resolved.length.should == 2
125
+ resolved[0].firstItem.should == @view
126
+ resolved[0].firstAttribute.should == NSLayoutAttributeRight
127
+ resolved[0].relation.should == NSLayoutRelationEqual
128
+ resolved[0].secondItem.should == @another_view
129
+ resolved[0].secondAttribute.should == NSLayoutAttributeRight
130
+ resolved[0].multiplier.should == 1
131
+ resolved[0].constant.should == 15
132
+
133
+ resolved[1].firstItem.should == @view
134
+ resolved[1].firstAttribute.should == NSLayoutAttributeTop
135
+ resolved[1].relation.should == NSLayoutRelationEqual
136
+ resolved[1].secondItem.should == @another_view
137
+ resolved[1].secondAttribute.should == NSLayoutAttributeTop
138
+ resolved[1].multiplier.should == 1
139
+ resolved[1].constant.should == 20
140
+ end
141
+
142
+ it 'should support `bottom_left [10, 10]`' do
143
+ @view = @layout.context(UIView.new) do
144
+ @layout.constraints do
145
+ @constraint = @layout.bottom_left([10, 10])
146
+ end
147
+ end
148
+
149
+ @constraint.constant.should == [10, 10]
150
+ @constraint.relationship.should == :equal
151
+ @constraint.multiplier.should == [1, 1]
152
+ @constraint.relative_to.should == :superview
153
+ @constraint.attribute.should == [:left, :bottom]
154
+ @constraint.attribute2.should == [:left, :bottom]
155
+
156
+ resolved = @constraint.resolve_all(@layout, @view)
157
+ resolved.length.should == 2
158
+ resolved[0].firstItem.should == @view
159
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
160
+ resolved[0].relation.should == NSLayoutRelationEqual
161
+ resolved[0].secondItem.should == nil
162
+ resolved[0].secondAttribute.should == NSLayoutAttributeNotAnAttribute
163
+ resolved[0].multiplier.should == 1
164
+ resolved[0].constant.should == 10
165
+
166
+ resolved[1].firstItem.should == @view
167
+ resolved[1].firstAttribute.should == NSLayoutAttributeBottom
168
+ resolved[1].relation.should == NSLayoutRelationEqual
169
+ resolved[1].secondItem.should == nil
170
+ resolved[1].secondAttribute.should == NSLayoutAttributeNotAnAttribute
171
+ resolved[1].multiplier.should == 1
172
+ resolved[1].constant.should == 10
173
+ end
174
+ it 'should support `bottom_left.equals(:another_view).plus(10).plus([5, 10])`' do
175
+ @view = @layout.context(UIView.new) do
176
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
177
+ @layout.constraints do
178
+ @constraint = @layout.bottom_left.equals(:another_view).plus(10).plus([5, 10])
179
+ end
180
+ end
181
+
182
+ @constraint.constant.should == [15, 20]
183
+ @constraint.relationship.should == :equal
184
+ @constraint.multiplier.should == [1, 1]
185
+ @constraint.relative_to.should == :another_view
186
+ @constraint.attribute.should == [:left, :bottom]
187
+ @constraint.attribute2.should == [:left, :bottom]
188
+
189
+ resolved = @constraint.resolve_all(@layout, @view)
190
+ resolved.length.should == 2
191
+ resolved[0].firstItem.should == @view
192
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
193
+ resolved[0].relation.should == NSLayoutRelationEqual
194
+ resolved[0].secondItem.should == @another_view
195
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
196
+ resolved[0].multiplier.should == 1
197
+ resolved[0].constant.should == 15
198
+
199
+ resolved[1].firstItem.should == @view
200
+ resolved[1].firstAttribute.should == NSLayoutAttributeBottom
201
+ resolved[1].relation.should == NSLayoutRelationEqual
202
+ resolved[1].secondItem.should == @another_view
203
+ resolved[1].secondAttribute.should == NSLayoutAttributeBottom
204
+ resolved[1].multiplier.should == 1
205
+ resolved[1].constant.should == 20
206
+ end
207
+
208
+ it 'should support `bottom_right [10, 10]`' do
209
+ @view = @layout.context(UIView.new) do
210
+ @layout.constraints do
211
+ @constraint = @layout.bottom_right([10, 10])
212
+ end
213
+ end
214
+
215
+ @constraint.constant.should == [10, 10]
216
+ @constraint.relationship.should == :equal
217
+ @constraint.multiplier.should == [1, 1]
218
+ @constraint.relative_to.should == :superview
219
+ @constraint.attribute.should == [:right, :bottom]
220
+ @constraint.attribute2.should == [:right, :bottom]
221
+
222
+ resolved = @constraint.resolve_all(@layout, @view)
223
+ resolved.length.should == 2
224
+ resolved[0].firstItem.should == @view
225
+ resolved[0].firstAttribute.should == NSLayoutAttributeRight
226
+ resolved[0].relation.should == NSLayoutRelationEqual
227
+ resolved[0].secondItem.should == nil
228
+ resolved[0].secondAttribute.should == NSLayoutAttributeNotAnAttribute
229
+ resolved[0].multiplier.should == 1
230
+ resolved[0].constant.should == 10
231
+
232
+ resolved[1].firstItem.should == @view
233
+ resolved[1].firstAttribute.should == NSLayoutAttributeBottom
234
+ resolved[1].relation.should == NSLayoutRelationEqual
235
+ resolved[1].secondItem.should == nil
236
+ resolved[1].secondAttribute.should == NSLayoutAttributeNotAnAttribute
237
+ resolved[1].multiplier.should == 1
238
+ resolved[1].constant.should == 10
239
+ end
240
+ it 'should support `bottom_right.equals(:another_view).plus(10).plus([5, 10])`' do
241
+ @view = @layout.context(UIView.new) do
242
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
243
+ @layout.constraints do
244
+ @constraint = @layout.bottom_right.equals(:another_view).plus(10).plus([5, 10])
245
+ end
246
+ end
247
+
248
+ @constraint.constant.should == [15, 20]
249
+ @constraint.relationship.should == :equal
250
+ @constraint.multiplier.should == [1, 1]
251
+ @constraint.relative_to.should == :another_view
252
+ @constraint.attribute.should == [:right, :bottom]
253
+ @constraint.attribute2.should == [:right, :bottom]
254
+
255
+ resolved = @constraint.resolve_all(@layout, @view)
256
+ resolved.length.should == 2
257
+ resolved[0].firstItem.should == @view
258
+ resolved[0].firstAttribute.should == NSLayoutAttributeRight
259
+ resolved[0].relation.should == NSLayoutRelationEqual
260
+ resolved[0].secondItem.should == @another_view
261
+ resolved[0].secondAttribute.should == NSLayoutAttributeRight
262
+ resolved[0].multiplier.should == 1
263
+ resolved[0].constant.should == 15
264
+
265
+ resolved[1].firstItem.should == @view
266
+ resolved[1].firstAttribute.should == NSLayoutAttributeBottom
267
+ resolved[1].relation.should == NSLayoutRelationEqual
268
+ resolved[1].secondItem.should == @another_view
269
+ resolved[1].secondAttribute.should == NSLayoutAttributeBottom
270
+ resolved[1].multiplier.should == 1
271
+ resolved[1].constant.should == 20
272
+ end
273
+
274
+ end
@@ -0,0 +1,111 @@
1
+ describe 'Constraints - Relative location helpers' do
2
+
3
+ before do
4
+ @layout = MK::Layout.new
5
+ @constraint = nil
6
+ @view = nil
7
+ @another_view = nil
8
+ end
9
+
10
+ it 'should support `above(:another_view)`' do
11
+ @view = @layout.context(UIView.new) do
12
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
13
+ @layout.constraints do
14
+ @constraint = @layout.above(:another_view)
15
+ end
16
+ end
17
+
18
+ @constraint.constant.should == 0
19
+ @constraint.relationship.should == :equal
20
+ @constraint.multiplier.should == 1
21
+ @constraint.relative_to.should == :another_view
22
+ @constraint.attribute.should == :bottom
23
+ @constraint.attribute2.should == :top
24
+
25
+ resolved = @constraint.resolve_all(@layout, @view)
26
+ resolved.length.should == 1
27
+ resolved[0].firstItem.should == @view
28
+ resolved[0].firstAttribute.should == NSLayoutAttributeBottom
29
+ resolved[0].relation.should == NSLayoutRelationEqual
30
+ resolved[0].secondItem.should == @another_view
31
+ resolved[0].secondAttribute.should == NSLayoutAttributeTop
32
+ resolved[0].multiplier.should == 1
33
+ resolved[0].constant.should == 0
34
+ end
35
+ it 'should support `below(:another_view)`' do
36
+ @view = @layout.context(UIView.new) do
37
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
38
+ @layout.constraints do
39
+ @constraint = @layout.below(:another_view)
40
+ end
41
+ end
42
+
43
+ @constraint.constant.should == 0
44
+ @constraint.relationship.should == :equal
45
+ @constraint.multiplier.should == 1
46
+ @constraint.relative_to.should == :another_view
47
+ @constraint.attribute.should == :top
48
+ @constraint.attribute2.should == :bottom
49
+
50
+ resolved = @constraint.resolve_all(@layout, @view)
51
+ resolved.length.should == 1
52
+ resolved[0].firstItem.should == @view
53
+ resolved[0].firstAttribute.should == NSLayoutAttributeTop
54
+ resolved[0].relation.should == NSLayoutRelationEqual
55
+ resolved[0].secondItem.should == @another_view
56
+ resolved[0].secondAttribute.should == NSLayoutAttributeBottom
57
+ resolved[0].multiplier.should == 1
58
+ resolved[0].constant.should == 0
59
+ end
60
+ it 'should support `before(:another_view)`' do
61
+ @view = @layout.context(UIView.new) do
62
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
63
+ @layout.constraints do
64
+ @constraint = @layout.before(:another_view)
65
+ end
66
+ end
67
+
68
+ @constraint.constant.should == 0
69
+ @constraint.relationship.should == :equal
70
+ @constraint.multiplier.should == 1
71
+ @constraint.relative_to.should == :another_view
72
+ @constraint.attribute.should == :right
73
+ @constraint.attribute2.should == :left
74
+
75
+ resolved = @constraint.resolve_all(@layout, @view)
76
+ resolved.length.should == 1
77
+ resolved[0].firstItem.should == @view
78
+ resolved[0].firstAttribute.should == NSLayoutAttributeRight
79
+ resolved[0].relation.should == NSLayoutRelationEqual
80
+ resolved[0].secondItem.should == @another_view
81
+ resolved[0].secondAttribute.should == NSLayoutAttributeLeft
82
+ resolved[0].multiplier.should == 1
83
+ resolved[0].constant.should == 0
84
+ end
85
+ it 'should support `after(:another_view)`' do
86
+ @view = @layout.context(UIView.new) do
87
+ @another_view = @layout.add UIView.alloc.initWithFrame([[1, 1], [2, 2]]), :another_view
88
+ @layout.constraints do
89
+ @constraint = @layout.after(:another_view)
90
+ end
91
+ end
92
+
93
+ @constraint.constant.should == 0
94
+ @constraint.relationship.should == :equal
95
+ @constraint.multiplier.should == 1
96
+ @constraint.relative_to.should == :another_view
97
+ @constraint.attribute.should == :left
98
+ @constraint.attribute2.should == :right
99
+
100
+ resolved = @constraint.resolve_all(@layout, @view)
101
+ resolved.length.should == 1
102
+ resolved[0].firstItem.should == @view
103
+ resolved[0].firstAttribute.should == NSLayoutAttributeLeft
104
+ resolved[0].relation.should == NSLayoutRelationEqual
105
+ resolved[0].secondItem.should == @another_view
106
+ resolved[0].secondAttribute.should == NSLayoutAttributeRight
107
+ resolved[0].multiplier.should == 1
108
+ resolved[0].constant.should == 0
109
+ end
110
+
111
+ end