geomotion 0.0.2 → 0.1

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.
data/README.md CHANGED
@@ -1,46 +1,151 @@
1
1
  # Geomotion
2
2
 
3
- iOS geometry is too verbose for Ruby. Geomotion tries to fix that.
3
+ iOS Geometry in idiomatic Ruby. Exhaustively tested. What's not to love?
4
4
 
5
- ## Usage
5
+ ## Features
6
+
7
+ ### CGRect
6
8
 
7
9
  ```ruby
8
- # More idiomatic initializer
10
+ # Initializers
9
11
  rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
12
+ another_way = CGRect.make(origin: CGPoint, size: CGSize)
10
13
 
11
- # These do what you think
14
+ # Getters
12
15
  [rect.x, rect.y, rect.width, rect.height]
13
16
  => [10, 100, 50, 20]
14
17
 
15
- # Chainable methods for adjusting frames
18
+ rect_zero = CGRect.empty
19
+ => CGRect(0, 0, 0, 0)
20
+ rect_zero.empty?
21
+ => true
22
+
23
+ rect.center
24
+ => CGPoint(25, 10) # center as bounds
25
+ rect.center(true)
26
+ => CGPoint(35, 110) # center as frame
27
+
28
+ # Operator Overloading
29
+ rect + CGRect.make(x: 9, y: 99, width: 10, height: 10)
30
+ => CGRect(9, 99, 50, 20) # == union of rects
31
+
32
+ rect + CGSize.new(11, 1)
33
+ => CGRect(10, 100, 61, 21) # == increases the size, but keeps the origin
34
+
35
+ rect + CGPoint.new(10, 10)
36
+ => CGRect.new(20, 110, 50, 20)
37
+
38
+ rect + UIOffsetMake(10, 10)
39
+ => CGRect.new(20, 110, 50, 20)
40
+
41
+ a_point + a_size
42
+ => CGRect # a point and a size make a rectangle. makes sense, right?
43
+
44
+ # Union and Intersection
45
+ rect.union_with CGRect.new(9, 99, 10, 10)
46
+ => CGRect(9, 99, 50, 20)
47
+
48
+ rect.intersection_with CGRect.new(9, 99, 10, 10)
49
+ => CGRect.new(10, 100, 10, 10)
50
+
51
+ # Growing and shrinking
52
+ # The center stays the same. Think margins!
53
+ rect.grow(CGSize.new(10, 20))
54
+ => CGRect.new(5, 90, 60, 40)
55
+
56
+ rect.shrink(10)
57
+ => CGRect.new(15, 105, 40, 10)
58
+
59
+ # Powerful layout adjustments with chainable methods
16
60
  view = UIView.alloc.initWithFrame rect.below.width(100).height(10)
17
61
  view.frame
18
- => #<CGRect origin=#<CGPoint x=10.0 y=120.0> size=#<CGSize width=100.0 height=10.0>>
62
+ => CGRect(10, 120, 100, 10)
19
63
 
20
64
  view2 = UIView.alloc.initWithFrame rect.beside(10)
21
65
  view2.frame
22
- => #<CGRect origin=#<CGPoint x=70.0 y=100.0> size=#<CGSize width=50.0 height=20.0>>
66
+ => CGRect(70, 100, 50, 20.0)
23
67
 
68
+ # More examples of adjustments
69
+ rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
24
70
  [rect.right(20).x, rect.left(20).x, rect.up(20).y, rect.down(20).y]
25
71
  => [30, -10, 80, 120]
26
72
 
73
+ # Layout "above" and "before" rectangles
74
+ # (default offset is the rectangle's width or height)
75
+ rect.before(5)
76
+ => CGRect.new(-45, 100, 50, 20)
77
+ rect.before(5, width:20)
78
+ => CGRect.new(-15, 100, 20, 20)
79
+
80
+ rect.above(5)
81
+ => CGRect.new(10, 75, 50, 20)
82
+ rect.above(5, height:10)
83
+ => CGRect.new(10, 85, 50, 10)
84
+
27
85
  # Layout a rect relative to others
28
- rect2 = CGRect.new [50, 50], [100, 100]
29
- rect3 = CGRect.new [100, 200], [20, 20]
86
+ rect2 = CGRect.make(x: 50, y: 50, width: 100, height: 100)
87
+ rect3 = CGRect.make(x:100, y: 200, width: 20, height: 20)
30
88
 
31
89
  CGRect.layout(rect, above: rect2, right_of: rect3)
32
- => #<CGRect origin=#<CGPoint x=120.0 y=30.0> size=#<CGSize width=50.0 height=20.0>>
90
+ => CGRect(120, 30, 50, 20)
33
91
 
34
92
  # Also supports margins
35
93
  CGRect.layout(rect, above: rect2, right_of: rect3, margins: [0, 0, 10, 15])
36
- => #<CGRect origin=#<CGPoint x=135.0 y=20.0> size=#<CGSize width=50.0 height=20.0>>
94
+ => CGRect(135, 20, 50, 20)
95
+
96
+ ```
97
+
98
+ ### CGSize
99
+
100
+ ```ruby
101
+ # Initializers
102
+ size = CGSize.make(width: 50, height: 20)
103
+
104
+ # Getters
105
+ size_zero = CGSize.empty
106
+ => CGSize(0, 0)
107
+ size_zero.empty?
108
+ => true
109
+
110
+ # Operator Overloading
111
+ size + CGSize.make(width: 100, height: 50)
112
+ => CGSize(150, 70)
113
+
114
+ size + CGPoint.make(x: 10, y: 30)
115
+ => CGRect(10, 30, 50, 20)
116
+
117
+ # Combine with CGPoint
118
+ size.rect_at_point CGPoint.make(x: 10, y: 30)
119
+ => CGRect(10, 30, 50, 20)
120
+ ```
121
+
122
+ ### CGPoint
123
+
124
+ ```ruby
125
+ # Initializers
126
+ point = CGPoint.make(x: 10, y: 100)
127
+
128
+ # Operator Overloading
129
+ point + CGPoint.make(x: 20, y: 40)
130
+ => CGPoint(30, 140)
131
+
132
+ point + CGSize.make(width: 50, height: 20)
133
+ => CGRect(10, 100, 50, 20)
134
+
135
+ # Combine with CGSize
136
+ point.rect_of_size CGSize.make(width: 50, height: 20)
137
+ => CGRect(10, 100, 50, 20)
138
+
139
+ # Combine with CGRect
140
+ point.inside? CGRect.make(x: 0, y: 0, width: 20, height: 110)
141
+ => true
37
142
  ```
38
143
 
39
144
  ## Install
40
145
 
41
146
  1. `gem install geomotion`
42
147
 
43
- 2. Add `require geomotion` in your `Rakefile`.
148
+ 2. Add `require 'geomotion'` in your `Rakefile`.
44
149
 
45
150
 
46
151
  ## Forking
@@ -0,0 +1,36 @@
1
+ class CGPoint
2
+ # CGPoint.make(x: 10, y: 30)
3
+ def self.make(options = {})
4
+ CGPoint.new(options[:x] || 0, options[:y] || 0)
5
+ end
6
+
7
+ # size = CGSize.make width: 100, height: 100
8
+ # point = CPPoint.make x:0, y:10
9
+ # point.rect_of_size(point) # => CGRect([0, 10], [100, 100])
10
+ # point.rect_of_size([10, 20]) # => CGRect([10, 20], [100, 100])
11
+ def rect_of_size(size)
12
+ CGRect.new([self.x, self.y], size)
13
+ end
14
+
15
+ def +(other)
16
+ case other
17
+ when CGSize
18
+ return self.rect_of_size(other)
19
+ when CGPoint
20
+ return CGPoint.new(self.x + other.x, self.y + other.y)
21
+ end
22
+ end
23
+
24
+ def round
25
+ CGPoint.new(self.x.round, self.y.round)
26
+ end
27
+
28
+ def inside?(rect)
29
+ CGRectContainsPoint(rect, self)
30
+ end
31
+
32
+ def ==(point)
33
+ point.is_a?(CGPoint) && CGPointEqualToPoint(self, point)
34
+ end
35
+
36
+ end
@@ -1,9 +1,31 @@
1
1
  class CGRect
2
2
  # CGRect.make(x: 10, y: 30)
3
+ # CGRect.make(x: 10, y: 30, width:100, height: 20)
3
4
  def self.make(options = {})
5
+ if options[:origin]
6
+ options[:x] = options[:origin].x
7
+ options[:y] = options[:origin].y
8
+ end
9
+ if options[:size]
10
+ options[:width] = options[:size].width
11
+ options[:height] = options[:size].height
12
+ end
4
13
  CGRect.new([options[:x] || 0, options[:y] || 0], [options[:width] || 0, options[:height] || 0])
5
14
  end
6
15
 
16
+ def self.empty
17
+ # Don't return CGRectZero; can be mutated
18
+ CGRect.make
19
+ end
20
+
21
+ def self.null
22
+ CGRectNull
23
+ end
24
+
25
+ def self.infinite
26
+ self.new([0, 0], CGSize.infinite)
27
+ end
28
+
7
29
  # OPTIONS: [:above, :below, :left_of, :right_of, :margins]
8
30
  # :margins is array of [top, right, bottom, left]
9
31
  # EX CGRect.layout(rect1, above: rect2, left_of: rect3, margins: [0, 10, 20, 0])
@@ -91,10 +113,26 @@ class CGRect
91
113
  CGRect.new([self.x, self.y + dist], self.size)
92
114
  end
93
115
 
116
+ def above(margin = 0)
117
+ self.above(margin, height:self.height)
118
+ end
119
+
120
+ def above(margin, height:height)
121
+ CGRect.new([self.x, self.y - height - margin], [self.width, height])
122
+ end
123
+
94
124
  def below(margin = 0)
95
125
  CGRect.new([self.x, self.y + self.height + margin], self.size)
96
126
  end
97
127
 
128
+ def before(margin = 0)
129
+ self.before(margin, width:self.width)
130
+ end
131
+
132
+ def before(margin, width:width)
133
+ CGRect.new([self.x - width - margin, self.y], [width, self.height])
134
+ end
135
+
98
136
  def beside(margin = 0)
99
137
  CGRect.new([self.x + self.width + margin, self.y], self.size)
100
138
  end
@@ -115,4 +153,77 @@ class CGRect
115
153
  CGRect.new([offset_x + ((rect.width - self.width) / 2),
116
154
  offset_y + ((rect.height - self.height) / 2)], self.size)
117
155
  end
118
- end
156
+
157
+ def +(other)
158
+ case other
159
+ when CGRect
160
+ return self.union_with(other)
161
+ when CGSize
162
+ return CGRect.new([self.x, self.y], [self.width + other.width, self.height + other.height])
163
+ when CGPoint
164
+ return CGRectOffset(self, other.x, other.y)
165
+ when UIOffset
166
+ CGRectOffset(self, other.horizontal, other.vertical)
167
+ when UIEdgeInsets
168
+ UIEdgeInsetsInsetRect(self, other)
169
+ end
170
+ end
171
+
172
+ def intersection_with(rect)
173
+ CGRectIntersection(self, rect)
174
+ end
175
+
176
+ def union_with(rect)
177
+ CGRectUnion(self, rect)
178
+ end
179
+
180
+ def grow(size)
181
+ if size.is_a? Numeric
182
+ size = CGSize.new(size, size)
183
+ end
184
+ CGRectInset(self, -size.width, -size.height)
185
+ end
186
+
187
+ def shrink(size)
188
+ if size.is_a? Numeric
189
+ size = CGSize.new(size, size)
190
+ end
191
+ CGRectInset(self, size.width, size.height)
192
+ end
193
+
194
+ def empty?
195
+ CGRectIsEmpty(self)
196
+ end
197
+
198
+ def infinite?
199
+ self.size.infinite?
200
+ end
201
+
202
+ def null?
203
+ CGRectIsNull(self)
204
+ end
205
+
206
+ def intersects?(rect)
207
+ case rect
208
+ when CGRect
209
+ CGRectIntersectsRect(self, rect)
210
+ else
211
+ super
212
+ end
213
+ end
214
+
215
+ def contains?(rect_or_point)
216
+ case rect_or_point
217
+ when CGPoint
218
+ CGRectContainsPoint(self, rect_or_point)
219
+ when CGRect
220
+ CGRectContainsRect(self, rect_or_point)
221
+ else
222
+ super
223
+ end
224
+ end
225
+
226
+ def ==(rect)
227
+ rect.is_a?(CGRect) && CGRectEqualToRect(self, rect)
228
+ end
229
+ end
@@ -0,0 +1,41 @@
1
+ class CGSize
2
+ # CGSize.make(width: 10, height: 30)
3
+ def self.make(options = {})
4
+ CGSize.new(options[:width] || 0, options[:height] || 0)
5
+ end
6
+
7
+ def self.infinite
8
+ infinity = CGRect.null[0][0]
9
+ CGSizeMake(infinity, infinity)
10
+ end
11
+
12
+ # size = CGSize.make width: 100, height: 100
13
+ # point = CPPoint.make x:0, y:10
14
+ # size.rect_at_point(point) # => CGRect([0, 10], [100, 100])
15
+ # size.rect_at_point([10, 20]) # => CGRect([10, 20], [100, 100])
16
+ def rect_at_point(point)
17
+ CGRect.new(point, [self.width, self.height])
18
+ end
19
+
20
+ def +(other)
21
+ case other
22
+ when CGSize
23
+ return CGSize.new(self.width + other.width, self.height + other.height)
24
+ when CGPoint
25
+ return self.rect_at_point(other)
26
+ end
27
+ end
28
+
29
+ def infinite?
30
+ infinity = CGRect.null[0][0] # null rects are rects with infinite width & height
31
+ self.width == infinity or self.height == infinity
32
+ end
33
+
34
+ def empty?
35
+ self == CGSizeZero
36
+ end
37
+
38
+ def ==(size)
39
+ size.is_a?(CGSize) && CGSizeEqualToSize(self, size)
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module Geomotion
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1"
3
3
  end
@@ -0,0 +1,65 @@
1
+ describe "CGPoint" do
2
+ before do
3
+ @point = CGPoint.make(x: 10, y: 20)
4
+ end
5
+
6
+ describe ".make" do
7
+ it "should work with options" do
8
+ CGPointEqualToPoint(@point, CGPointMake(10, 20)).should == true
9
+ end
10
+
11
+ it "should work with no options" do
12
+ CGPointEqualToPoint(CGPoint.make, CGPointMake(0, 0)).should == true
13
+ end
14
+ end
15
+
16
+ describe "#rect_of_size" do
17
+ it "should work" do
18
+ size = CGSizeMake(20, 30)
19
+ @point.rect_of_size(size).should == CGRectMake(10, 20, 20, 30)
20
+ end
21
+ end
22
+
23
+ describe "#+" do
24
+ it "should work with CGSize" do
25
+ size = CGSizeMake(20, 30)
26
+ (@point + size).should == CGRectMake(10, 20, 20, 30)
27
+ end
28
+
29
+ it "should work with CGPoint" do
30
+ point = CGPoint.make(x: 100, y: 200)
31
+ (@point + point).should == CGPointMake(110, 220)
32
+ end
33
+ end
34
+
35
+ describe "#inside?" do
36
+ it "should return true" do
37
+ rect = CGRectMake(0, 0, 100, 100)
38
+ @point.inside?(rect).should == true
39
+ end
40
+
41
+ it "should return false" do
42
+ rect = CGRectMake(0, 0, 5, 5)
43
+ @point.inside?(rect).should == false
44
+ end
45
+ end
46
+
47
+ describe "#round" do
48
+ it "should work" do
49
+ point = CGPointMake(10.4, 11.5).round
50
+ CGPointEqualToPoint(point, CGPointMake(10, 12)).should == true
51
+ end
52
+ end
53
+
54
+ describe "#==?" do
55
+ it "should return true" do
56
+ point = CGPointMake(10, 20)
57
+ @point.should == point
58
+ end
59
+
60
+ it "should return false" do
61
+ point = CGPointMake(20, 10)
62
+ @point.should != point
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,381 @@
1
+ describe "CGRect" do
2
+ before do
3
+ @rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
4
+ end
5
+
6
+ describe ".make" do
7
+ it "should work with options" do
8
+ CGRectEqualToRect(@rect, CGRectMake(10, 100, 50, 20)).should == true
9
+ end
10
+
11
+ it "should work with nested options" do
12
+ CGRectEqualToRect(
13
+ CGRect.make(origin: CGPointMake(10, 100), size: CGSizeMake(50,20)),
14
+ CGRectMake(10, 100, 50, 20)
15
+ ).should == true
16
+ end
17
+
18
+ it "should work with no options" do
19
+ CGRectEqualToRect(CGRect.make, CGRectMake(0, 0, 0, 0)).should == true
20
+ end
21
+ end
22
+
23
+ describe ".empty" do
24
+ it "should work" do
25
+ CGRectIsEmpty(CGRect.empty).should == true
26
+ end
27
+ end
28
+
29
+ describe "#empty?" do
30
+ it "should work" do
31
+ p "ZERO1 #{CGRectZero.inspect}"
32
+ CGRectZero.empty?.should == true
33
+ end
34
+ end
35
+
36
+ describe ".null" do
37
+ it "should work" do
38
+ CGRectIsNull(CGRect.null).should == true
39
+ end
40
+ end
41
+
42
+ describe "#null?" do
43
+ it "should work" do
44
+ CGRectNull.null?.should == true
45
+ end
46
+ end
47
+
48
+ # Currently does NOT work due to some strange RM bug?
49
+ =begin
50
+ describe ".infinite" do
51
+ it "should work" do
52
+ CGRectIsInfinite(CGRect.infinite).should == true
53
+ end
54
+ end
55
+ =end
56
+
57
+ describe "#infinite?" do
58
+ it "should work" do
59
+ CGRect.infinite.infinite?.should == true
60
+ end
61
+ end
62
+
63
+ describe "#intersects?" do
64
+ it "should work" do
65
+ left_rect = CGRectMake(0, 0, 100, 100)
66
+ right_rect = CGRectMake(80, 0, 100, 100)
67
+ left_rect.intersects?(right_rect).should == true
68
+ end
69
+ end
70
+
71
+ describe "#contains?" do
72
+ it "should work with CGPoint" do
73
+ left_rect = CGRectMake(0, 0, 100, 100)
74
+ point = CGPointMake(10, 10)
75
+ left_rect.contains?(point).should == true
76
+ end
77
+
78
+ it "should work with CGRect" do
79
+ left_rect = CGRectMake(0, 0, 100, 100)
80
+ inner_rect = CGRectMake(80, 0, 10, 10)
81
+ left_rect.contains?(inner_rect).should == true
82
+ end
83
+ end
84
+
85
+ describe "#==" do
86
+ it "should return true" do
87
+ @rect.should == CGRectMake(10, 100, 50, 20)
88
+ end
89
+
90
+ it "should return false" do
91
+ @rect.should != CGRectMake(10, 100, 50, 10)
92
+ end
93
+ end
94
+
95
+ describe ".layout" do
96
+ it "should work without margins" do
97
+ above = CGRectMake(50, 50, 100, 100)
98
+ right_of = CGRectMake(100, 200, 20, 20)
99
+
100
+ no_margins = CGRect.layout(@rect, above: above, right_of: right_of)
101
+
102
+ CGRectEqualToRect(no_margins, CGRectMake(120, 30, 50, 20)).should == true
103
+ end
104
+
105
+ it "should work with margins" do
106
+ above = CGRectMake(50, 50, 100, 100)
107
+ right_of = CGRectMake(100, 200, 20, 20)
108
+
109
+ margins = CGRect.layout(@rect, above: above, right_of: right_of, margins: [0, 0, 10, 15])
110
+
111
+ CGRectEqualToRect(margins, CGRectMake(135, 20, 50, 20)).should == true
112
+ end
113
+ end
114
+
115
+ describe "#x" do
116
+ it "returns value when no args" do
117
+ @rect.x.should == 10
118
+ end
119
+
120
+ it "returns copy when has args" do
121
+ rect = @rect.x(20)
122
+ rect.is_a?(CGRect).should == true
123
+ CGRectEqualToRect(rect, CGRectMake(20, 100, 50, 20)).should == true
124
+ end
125
+ end
126
+
127
+ describe "#x=" do
128
+ it "sets value" do
129
+ rect = CGRect.empty
130
+ rect.x = 20
131
+ rect.origin.x.should == 20
132
+ end
133
+ end
134
+
135
+ describe "#y" do
136
+ it "returns value when no args" do
137
+ @rect.y.should == 100
138
+ end
139
+
140
+ it "returns copy when has args" do
141
+ rect = @rect.y(20)
142
+ rect.is_a?(CGRect).should == true
143
+ CGRectEqualToRect(rect, CGRectMake(10, 20, 50, 20)).should == true
144
+ end
145
+ end
146
+
147
+ describe "#y=" do
148
+ it "sets value" do
149
+ rect = CGRect.empty
150
+ rect.y = 20
151
+ rect.origin.y.should == 20
152
+ end
153
+ end
154
+
155
+ describe "#width" do
156
+ it "returns value when no args" do
157
+ @rect.width.should == 50
158
+ end
159
+
160
+ it "returns copy when has args" do
161
+ rect = @rect.width(20)
162
+ rect.is_a?(CGRect).should == true
163
+ CGRectEqualToRect(rect, CGRectMake(10, 100, 20, 20)).should == true
164
+ end
165
+ end
166
+
167
+ describe "#width=" do
168
+ it "sets value" do
169
+ rect = CGRect.empty
170
+ rect.width = 20
171
+ rect.size.width.should == 20
172
+ end
173
+ end
174
+
175
+ describe "#height" do
176
+ it "returns value when no args" do
177
+ @rect.height.should == 20
178
+ end
179
+
180
+ it "returns copy when has args" do
181
+ rect = @rect.height(50)
182
+ rect.is_a?(CGRect).should == true
183
+ CGRectEqualToRect(rect, CGRectMake(10, 100, 50, 50)).should == true
184
+ end
185
+ end
186
+
187
+ describe "#height=" do
188
+ it "sets value" do
189
+ rect = CGRect.empty
190
+ rect.height = 50
191
+ rect.size.height.should == 50
192
+ end
193
+ end
194
+
195
+ describe "#left" do
196
+ it "works" do
197
+ rect = CGRect.empty
198
+ rect = rect.left(20)
199
+ rect.origin.x.should == -20
200
+ end
201
+ end
202
+
203
+ describe "#right" do
204
+ it "works" do
205
+ rect = CGRect.empty.right(20)
206
+ rect.origin.x.should == 20
207
+ end
208
+ end
209
+
210
+ describe "#up" do
211
+ it "works" do
212
+ rect = CGRect.empty.up(20)
213
+ rect.origin.y.should == -20
214
+ end
215
+ end
216
+
217
+ describe "#down" do
218
+ it "works" do
219
+ rect = CGRect.empty.down(20)
220
+ rect.origin.y.should == 20
221
+ end
222
+ end
223
+
224
+ describe "#above" do
225
+ it "works with margins" do
226
+ rect = CGRect.make(height: 50).above(20)
227
+ rect.origin.y.should == -70
228
+ end
229
+
230
+ it "works without margins" do
231
+ rect = CGRect.make(height: 50).above
232
+ rect.origin.y.should == -50
233
+ end
234
+ end
235
+
236
+ describe "#below" do
237
+ it "works" do
238
+ rect = CGRect.make(height: 50).below(20)
239
+ rect.origin.y.should == 70
240
+ end
241
+ end
242
+
243
+ describe "#before" do
244
+ it "works" do
245
+ rect = CGRect.make(x: 50).before(20)
246
+ rect.origin.x.should == 30
247
+ end
248
+ end
249
+
250
+ describe "#before:width:" do
251
+ it "works" do
252
+ rect = CGRect.make(x: 50).before(20, width: 50)
253
+ rect.origin.x.should == -20
254
+ end
255
+ end
256
+
257
+ describe "#beside" do
258
+ it "works with margins" do
259
+ rect = CGRect.make(x: 50, width: 20).beside(10)
260
+ rect.origin.x.should == 80
261
+ end
262
+
263
+ it "works without margins" do
264
+ rect = CGRect.make(x: 50, width: 20).beside
265
+ rect.origin.x.should == 70
266
+ end
267
+ end
268
+
269
+ describe "#center" do
270
+ it "works" do
271
+ point = CGRect.make(width: 100, height: 100).center
272
+ point.is_a?(CGPoint).should == true
273
+ CGPointEqualToPoint(point, CGPointMake(50, 50)).should == true
274
+ end
275
+
276
+ it "works as relative" do
277
+ point = CGRect.make(x: 50, y: 50, width: 100, height: 100).center(true)
278
+ point.is_a?(CGPoint).should == true
279
+ CGPointEqualToPoint(point, CGPointMake(100, 100)).should == true
280
+ end
281
+ end
282
+
283
+ describe "#round" do
284
+ it "works" do
285
+ rect = CGRect.make(x: 10.5, y: 10.4, width: 100.025, height: 100.75)
286
+ CGRectEqualToRect(rect.round, CGRectMake(11, 10, 100, 101)).should == true
287
+ end
288
+ end
289
+
290
+ describe "#centered_in" do
291
+ it "works" do
292
+ outer_rect = CGRect.make(width: 100, height: 100)
293
+ inner_rect = CGRect.make(width: 50, height: 50)
294
+
295
+ centered_rect = inner_rect.centered_in(outer_rect)
296
+ CGRectEqualToRect(centered_rect, CGRectMake(25, 25, 50, 50)).should == true
297
+ end
298
+
299
+ it "works as relative" do
300
+ outer_rect = CGRect.make(x: 20, y: 30, width: 100, height: 100)
301
+ inner_rect = CGRect.make(width: 50, height: 50)
302
+
303
+ centered_rect = inner_rect.centered_in(outer_rect, true)
304
+ CGRectEqualToRect(centered_rect, CGRectMake(45, 55, 50, 50)).should == true
305
+ end
306
+ end
307
+
308
+ describe "#+" do
309
+ it "works with CGRect" do
310
+ _rect = CGRectMake(10, 100, 50, 20)
311
+ rect = (_rect + CGRectMake(0, 0, 50, 110))
312
+ CGRectEqualToRect(rect, CGRectMake(0, 0, 60, 120)).should == true
313
+ end
314
+
315
+ it "works with CGSize" do
316
+ size = CGSizeMake(50, 20)
317
+ rect = (@rect + size)
318
+ CGRectEqualToRect(rect, CGRectMake(10, 100, 100, 40)).should == true
319
+ end
320
+
321
+ it "works with CGPoint" do
322
+ point = CGPointMake(50, 20)
323
+ rect = (@rect + point)
324
+ CGRectEqualToRect(rect, CGRectMake(60, 120, 50, 20)).should == true
325
+ end
326
+
327
+ it "works with UIOffset" do
328
+ offset = UIOffsetMake(50, 20)
329
+ rect = (@rect + offset)
330
+ CGRectEqualToRect(rect, CGRectMake(60, 120, 50, 20)).should == true
331
+ end
332
+
333
+ it "works with UIEdgeInsets" do
334
+ inset = UIEdgeInsetsMake(10, 10, 10, 5)
335
+ rect = (@rect + inset)
336
+ CGRectEqualToRect(rect, CGRectMake(20, 110, 35, 0)).should == true
337
+ end
338
+ end
339
+
340
+ describe "#intersection_with" do
341
+ it "should work" do
342
+ lower_rect = CGRectMake(0, 0, 100, 100)
343
+ upper_rect = CGRectMake(10, 10, 100, 100)
344
+ rect = lower_rect.intersection_with(upper_rect)
345
+ CGRectEqualToRect(rect, CGRectMake(10, 10, 90, 90)).should == true
346
+ end
347
+ end
348
+
349
+ describe "#union_with" do
350
+ it "should work" do
351
+ lower_rect = CGRectMake(0, 0, 100, 100)
352
+ upper_rect = CGRectMake(10, 10, 100, 100)
353
+ rect = lower_rect.union_with(upper_rect)
354
+ CGRectEqualToRect(rect, CGRectMake(0, 0, 110, 110)).should == true
355
+ end
356
+ end
357
+
358
+ describe "#grow" do
359
+ it "should work with Numeric" do
360
+ rect = @rect.grow(10)
361
+ CGRectEqualToRect(rect, CGRectMake(0, 90, 70, 40)).should == true
362
+ end
363
+
364
+ it "should work with CGSize" do
365
+ rect = @rect.grow(CGSizeMake(10, 20))
366
+ CGRectEqualToRect(rect, CGRectMake(0, 80, 70, 60)).should == true
367
+ end
368
+ end
369
+
370
+ describe "#shrink" do
371
+ it "should work with Numeric" do
372
+ rect = @rect.shrink(10)
373
+ CGRectEqualToRect(rect, CGRectMake(20, 110, 30, 0)).should == true
374
+ end
375
+
376
+ it "should work with CGSize" do
377
+ rect = @rect.shrink(CGSizeMake(20, 10))
378
+ CGRectEqualToRect(rect, CGRectMake(30, 110, 10, 0)).should == true
379
+ end
380
+ end
381
+ end
@@ -0,0 +1,60 @@
1
+ describe "CGSize" do
2
+ before do
3
+ @size = CGSize.make(width: 100, height: 200)
4
+ end
5
+
6
+ describe ".make" do
7
+ it "should work with options" do
8
+ CGSizeEqualToSize(@size, CGSizeMake(100, 200)).should == true
9
+ end
10
+
11
+ it "should work with no options" do
12
+ CGSizeEqualToSize(CGSize.make, CGSizeMake(0, 0)).should == true
13
+ end
14
+ end
15
+
16
+ describe "#rect_at_point" do
17
+ it "should work" do
18
+ point = CGPointMake(20, 30)
19
+ @size.rect_at_point(point).should == CGRectMake(20, 30, 100, 200)
20
+ end
21
+ end
22
+
23
+ describe "#+" do
24
+ it "should work with CGSize" do
25
+ size = CGSizeMake(20, 30)
26
+ (@size + size).should == CGSizeMake(120, 230)
27
+ end
28
+
29
+ it "should work with CGPoint" do
30
+ point = CGPointMake(20, 30)
31
+ (@size + point).should == CGRectMake(20, 30, 100, 200)
32
+ end
33
+ end
34
+
35
+ describe "#infinite?" do
36
+ it "should return true" do
37
+ infinite = CGSize.infinite
38
+ infinite.infinite?.should == true
39
+ end
40
+ end
41
+
42
+ describe "#empty?" do
43
+ it "should return true" do
44
+ empty = CGSizeMake(0, 0)
45
+ empty.empty?.should == true
46
+ end
47
+ end
48
+
49
+ describe "#==?" do
50
+ it "should return true" do
51
+ size = CGSizeMake(100, 200)
52
+ @size.should == size
53
+ end
54
+
55
+ it "should return false" do
56
+ size = CGSizeMake(20, 10)
57
+ @size.should != size
58
+ end
59
+ end
60
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geomotion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: '0.1'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-20 00:00:00.000000000 Z
12
+ date: 2012-10-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -41,9 +41,13 @@ files:
41
41
  - Rakefile
42
42
  - app/app_delegate.rb
43
43
  - lib/geomotion.rb
44
+ - lib/geomotion/cg_point.rb
44
45
  - lib/geomotion/cg_rect.rb
46
+ - lib/geomotion/cg_size.rb
45
47
  - lib/geomotion/version.rb
46
- - spec/main_spec.rb
48
+ - spec/cg_point_spec.rb
49
+ - spec/cg_rect_spec.rb
50
+ - spec/cg_size_spec.rb
47
51
  homepage: https://github.com/clayallsopp/geomotion
48
52
  licenses: []
49
53
  post_install_message:
@@ -69,4 +73,6 @@ signing_key:
69
73
  specification_version: 3
70
74
  summary: A RubyMotion Geometry Wrapper
71
75
  test_files:
72
- - spec/main_spec.rb
76
+ - spec/cg_point_spec.rb
77
+ - spec/cg_rect_spec.rb
78
+ - spec/cg_size_spec.rb
@@ -1,36 +0,0 @@
1
- describe "CGRect" do
2
- before do
3
- @rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
4
- end
5
-
6
- it ".x, etc work" do
7
- [@rect.x, @rect.y, @rect.width, @rect.height].should == [10, 100, 50, 20]
8
- end
9
-
10
- it "chaining works" do
11
- rect = @rect.below(10).width(100).height(10)
12
- [rect.x, rect.y, rect.width, rect.height].should == [10, 130, 100, 10]
13
-
14
- [@rect.right(20).x, @rect.left(20).x, @rect.up(20).y, @rect.down(20).y].should == [30, -10, 80, 120]
15
- end
16
-
17
- it ".beside works" do
18
- rect = @rect.beside(10)
19
- [rect.x, rect.y, rect.width, rect.height].should == [70, 100, 50, 20]
20
- end
21
-
22
- it ".below works" do
23
- @rect.below(10).y.should == 130
24
- end
25
-
26
- it "layout works" do
27
- rect2 = CGRect.new [50, 50], [100, 100]
28
- rect3 = CGRect.new [100, 200], [20, 20]
29
-
30
- no_margins = CGRect.layout(@rect, above: rect2, right_of: rect3)
31
- [no_margins.x, no_margins.y, no_margins.width, no_margins.height].should == [120, 30, 50, 20]
32
-
33
- margins = CGRect.layout(@rect, above: rect2, right_of: rect3, margins: [0, 0, 10, 15])
34
- [margins.x, margins.y, margins.width, margins.height].should == [135, 20, 50, 20]
35
- end
36
- end