bubble-wrap 1.5.0 → 1.6.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -1
- data/Gemfile.lock +3 -1
- data/README.md +98 -5
- data/Rakefile +1 -1
- data/bubble-wrap.gemspec +1 -0
- data/lib/bubble-wrap/all.rb +1 -1
- data/lib/bubble-wrap/http.rb +5 -5
- data/lib/bubble-wrap/network-indicator.rb +6 -0
- data/lib/bubble-wrap/ui.rb +1 -0
- data/lib/bubble-wrap/version.rb +1 -1
- data/motion/core.rb +3 -0
- data/motion/core/ios/app.rb +14 -2
- data/motion/core/string.rb +4 -0
- data/motion/location/location.rb +31 -1
- data/motion/network-indicator/network-indicator.rb +67 -0
- data/motion/reactor/eventable.rb +6 -4
- data/motion/ui/ui_activity_view_controller_wrapper.rb +51 -0
- data/motion/util/constants.rb +10 -5
- data/spec/motion/core/ios/app_spec.rb +27 -0
- data/spec/motion/core/string_spec.rb +13 -2
- data/spec/motion/location/location_spec.rb +65 -0
- data/spec/motion/network-indicator/network_indicator_spec.rb +112 -0
- data/spec/motion/reactor/eventable_spec.rb +54 -2
- data/spec/motion/ui/ui_activity_view_controller_wrapper_spec.rb +58 -0
- data/spec/motion/util/constants_spec.rb +6 -0
- metadata +29 -20
- data/motion/http.rb +0 -34
- data/motion/http/query.rb +0 -393
- data/motion/http/response.rb +0 -32
- data/spec/motion/http/query_spec.rb +0 -808
- data/spec/motion/http/response_spec.rb +0 -45
- data/spec/motion/http_spec.rb +0 -57
- data/travis.sh +0 -7
data/motion/reactor/eventable.rb
CHANGED
@@ -6,14 +6,16 @@ module BubbleWrap
|
|
6
6
|
# When `event` is triggered the block will execute
|
7
7
|
# and be passed the arguments that are passed to
|
8
8
|
# `trigger`.
|
9
|
-
def on(event, &blk)
|
10
|
-
|
9
|
+
def on(event, method = nil, &blk)
|
10
|
+
method_or_block = method ? method : blk
|
11
|
+
__events__[event].push method_or_block
|
11
12
|
end
|
12
13
|
|
13
14
|
# When `event` is triggered, do not call the given
|
14
15
|
# block any more
|
15
|
-
def off(event, &blk)
|
16
|
-
|
16
|
+
def off(event, method = nil, &blk)
|
17
|
+
method_or_block = method ? method : blk
|
18
|
+
__events__[event].delete_if { |b| b == method_or_block }
|
17
19
|
blk
|
18
20
|
end
|
19
21
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module BW
|
2
|
+
class UIActivityViewController < ::UIActivityViewController
|
3
|
+
class << self
|
4
|
+
def new(options = {}, presenting_controller = nil, &block)
|
5
|
+
options = {
|
6
|
+
activities: nil,
|
7
|
+
animated: true
|
8
|
+
}.merge(options)
|
9
|
+
|
10
|
+
if options[:item] || options[:items]
|
11
|
+
items = Array(options[:item] || options[:items])
|
12
|
+
else
|
13
|
+
raise ArgumentError, "You must specify at least one item - #{options.inspect}"
|
14
|
+
end
|
15
|
+
|
16
|
+
vc = alloc.initWithActivityItems(items, applicationActivities:options[:activities])
|
17
|
+
vc.excludedActivityTypes = BW::Constants.get("UIActivityType", Array(options[:excluded])) if options[:excluded]
|
18
|
+
|
19
|
+
unless block.nil?
|
20
|
+
block.weak! if BubbleWrap.use_weak_callbacks?
|
21
|
+
vc.setCompletionHandler block
|
22
|
+
end
|
23
|
+
|
24
|
+
presenting_controller ||= App.window.rootViewController.presentedViewController # May be nil, but handles use case of container views
|
25
|
+
presenting_controller ||= App.window.rootViewController
|
26
|
+
|
27
|
+
presenting_controller.presentViewController(vc, animated:options[:animated], completion: lambda {})
|
28
|
+
vc
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# UIActivityTypes
|
35
|
+
Constants.register(
|
36
|
+
UIActivityTypePostToFacebook,
|
37
|
+
UIActivityTypePostToTwitter,
|
38
|
+
UIActivityTypePostToWeibo,
|
39
|
+
UIActivityTypeMessage,
|
40
|
+
UIActivityTypeMail,
|
41
|
+
UIActivityTypePrint,
|
42
|
+
UIActivityTypeCopyToPasteboard,
|
43
|
+
UIActivityTypeAssignToContact,
|
44
|
+
UIActivityTypeSaveToCameraRoll,
|
45
|
+
UIActivityTypeAddToReadingList,
|
46
|
+
UIActivityTypePostToFlickr,
|
47
|
+
UIActivityTypePostToVimeo,
|
48
|
+
UIActivityTypePostToTencentWeibo,
|
49
|
+
UIActivityTypeAirDrop
|
50
|
+
)
|
51
|
+
end
|
data/motion/util/constants.rb
CHANGED
@@ -13,7 +13,7 @@ module BubbleWrap
|
|
13
13
|
# do nothing, just get the constants in the code
|
14
14
|
end
|
15
15
|
|
16
|
-
# @param [String] base of the constant
|
16
|
+
# @param [String] base of the constant
|
17
17
|
# @param [Integer, NSArray, String, Symbol] the suffix of the constant
|
18
18
|
# when NSArray, will return the bitmask of all suffixes in the array
|
19
19
|
# @return [Integer] the constant for this base and suffix
|
@@ -22,19 +22,24 @@ module BubbleWrap
|
|
22
22
|
# get("UIReturnKey", "done") => UIReturnKeyDone == 9
|
23
23
|
# get("UIReturnKey", 9) => 9
|
24
24
|
# get("UIImagePickerControllerSourceType", ["photo_library", "camera", "saved_photos_album"]) => 3
|
25
|
+
# get("UIActivityType", [:air_drop, :print]) => ["com.apple.UIKit.activity.AirDrop", "com.apple.UIKit.activity.Print"]
|
25
26
|
def get(base, *values)
|
26
27
|
value = values.size == 1 ? values.first : values.flatten
|
27
28
|
case value
|
28
29
|
when Numeric
|
29
30
|
value.to_i
|
30
31
|
when NSArray
|
31
|
-
value.
|
32
|
-
|
33
|
-
|
32
|
+
unless get(base, value.first).is_a? Fixnum
|
33
|
+
value.map { |v| get(base, v) }
|
34
|
+
else
|
35
|
+
value.reduce { |i, j|
|
36
|
+
get(base, i) | get(base, j)
|
37
|
+
}
|
38
|
+
end
|
34
39
|
else
|
35
40
|
value = value.to_s.camelize
|
36
41
|
Kernel.const_get("#{base}#{value}")
|
37
42
|
end
|
38
43
|
end
|
39
44
|
end
|
40
|
-
end
|
45
|
+
end
|
@@ -205,5 +205,32 @@ describe BubbleWrap::App do
|
|
205
205
|
end
|
206
206
|
|
207
207
|
end
|
208
|
+
|
209
|
+
describe ".can_open_url" do
|
210
|
+
|
211
|
+
it "uses NSURL or converts NSString in NSURL and opens it" do
|
212
|
+
application = UIApplication.sharedApplication
|
213
|
+
def application.url; @url end
|
214
|
+
def application.canOpenURL(url); @url = url; super; end
|
215
|
+
|
216
|
+
url = NSURL.URLWithString('http://localhost')
|
217
|
+
App.can_open_url(url)
|
218
|
+
application.url.should.equal url
|
219
|
+
|
220
|
+
url = 'http://localhost'
|
221
|
+
App.can_open_url(url)
|
222
|
+
application.url.class.should.equal NSURL
|
223
|
+
application.url.description.should.equal url
|
224
|
+
end
|
225
|
+
|
226
|
+
it "returns false when it can't open the given url" do
|
227
|
+
App.can_open_url("inexistent_schema://").should.equal false
|
228
|
+
end
|
229
|
+
|
230
|
+
it "returns true when it can open the given url" do
|
231
|
+
App.can_open_url("http://google.com").should.equal true
|
232
|
+
App.can_open_url("rdar:").should.equal true
|
233
|
+
end
|
234
|
+
end
|
208
235
|
end
|
209
236
|
end
|
@@ -93,12 +93,23 @@ describe BubbleWrap::String do
|
|
93
93
|
|
94
94
|
before do
|
95
95
|
@blue_color = App.osx? ? NSColor.colorWithDeviceRed(0,green:0,blue:1,alpha:1) : UIColor.blueColor
|
96
|
-
r,g,b,a = [1, (
|
97
|
-
@orange_color = App.osx? ? NSColor.colorWithDeviceRed(r, green:g, blue:b, alpha:
|
96
|
+
r,g,b,a = [1, (0x8A.to_f/0xFF.to_f), (0x19/0xFF.to_f), (0x88.to_f/0xFF.to_f)]
|
97
|
+
@orange_color = App.osx? ? NSColor.colorWithDeviceRed(r, green:g, blue:b, alpha: 1.0) :
|
98
|
+
UIColor.colorWithRed(r, green:g, blue:b, alpha:1.0)
|
99
|
+
@orange_alpha_color = App.osx? ? NSColor.colorWithDeviceRed(r, green:g, blue:b, alpha: a) :
|
98
100
|
UIColor.colorWithRed(r, green:g, blue:b, alpha:a)
|
99
101
|
end
|
100
102
|
|
101
103
|
describe "A UIColor should be created from a String with a hex color" do
|
104
|
+
it "with 8 digits" do
|
105
|
+
@orange_color_from_hex = '88FF8A19'.to_color
|
106
|
+
@orange_color_from_hex.should == @orange_alpha_color
|
107
|
+
end
|
108
|
+
|
109
|
+
it "with 8 digits and # sign" do
|
110
|
+
@orange_color_from_hex = '#88FF8A19'.to_color
|
111
|
+
@orange_color_from_hex.should == @orange_alpha_color
|
112
|
+
end
|
102
113
|
|
103
114
|
it "with 6 digits" do
|
104
115
|
@orange_color_from_hex= '#FF8A19'.to_color
|
@@ -7,6 +7,10 @@ describe "CLLocationWrap" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
# monkey patch for testing
|
10
|
+
class BWCLHeading
|
11
|
+
attr_accessor :timestamp, :z, :y, :x, :headingAccuracy, :trueHeading, :magneticHeading
|
12
|
+
end
|
13
|
+
|
10
14
|
class CLLocationManager
|
11
15
|
def self.enable(enable)
|
12
16
|
@enabled = enable
|
@@ -25,6 +29,14 @@ class CLLocationManager
|
|
25
29
|
@stopUpdatingLocation = true
|
26
30
|
end
|
27
31
|
|
32
|
+
def startUpdatingHeading
|
33
|
+
@startUpdatingHeading = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def stopUpdatingHeading
|
37
|
+
@stopUpdatingHeading = true
|
38
|
+
end
|
39
|
+
|
28
40
|
def startMonitoringSignificantLocationChanges
|
29
41
|
@startMonitoringSignificantLocationChanges = true
|
30
42
|
end
|
@@ -88,6 +100,13 @@ describe BubbleWrap::Location do
|
|
88
100
|
location_manager.instance_variable_get("@startUpdatingLocation").should == true
|
89
101
|
end
|
90
102
|
|
103
|
+
it "should use compass update functions" do
|
104
|
+
BW::Location.get_compass do
|
105
|
+
end
|
106
|
+
|
107
|
+
location_manager.instance_variable_get("@startUpdatingHeading").should == true
|
108
|
+
end
|
109
|
+
|
91
110
|
it "should have correct location when succeeding" do
|
92
111
|
to = CLLocation.alloc.initWithLatitude(100, longitude: 50)
|
93
112
|
from = CLLocation.alloc.initWithLatitude(100, longitude: 49)
|
@@ -122,6 +141,38 @@ describe BubbleWrap::Location do
|
|
122
141
|
end
|
123
142
|
end
|
124
143
|
|
144
|
+
describe ".get_compass" do
|
145
|
+
before do
|
146
|
+
reset
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should use compass functions" do
|
150
|
+
BW::Location.get_compass do |result|
|
151
|
+
end
|
152
|
+
|
153
|
+
location_manager.instance_variable_get("@startUpdatingHeading").should == true
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should have correct heading when succeeding" do
|
157
|
+
timestamp = Time.now
|
158
|
+
heading = BWCLHeading.new.tap do |h|
|
159
|
+
h.timestamp = timestamp
|
160
|
+
h.headingAccuracy = 4
|
161
|
+
h.trueHeading = 220
|
162
|
+
h.magneticHeading = 270
|
163
|
+
end
|
164
|
+
|
165
|
+
BW::Location.get_compass do |heading|
|
166
|
+
heading[:magnetic_heading].should == 270
|
167
|
+
heading[:true_heading].should == 220
|
168
|
+
heading[:accuracy].should == 4
|
169
|
+
heading[:timestamp].should == timestamp
|
170
|
+
end
|
171
|
+
|
172
|
+
BW::Location.locationManager(location_manager, didUpdateHeading: heading)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
125
176
|
describe ".get_significant" do
|
126
177
|
before do
|
127
178
|
reset
|
@@ -161,6 +212,15 @@ describe BubbleWrap::Location do
|
|
161
212
|
location_manager.instance_variable_get("@stopUpdatingLocation").should == true
|
162
213
|
end
|
163
214
|
|
215
|
+
it "should use compass update functions" do
|
216
|
+
BW::Location.get_compass do |result|
|
217
|
+
end
|
218
|
+
|
219
|
+
BW::Location.stop
|
220
|
+
|
221
|
+
location_manager.instance_variable_get("@stopUpdatingHeading").should == true
|
222
|
+
end
|
223
|
+
|
164
224
|
it "should use significant update functions with get_significant" do
|
165
225
|
BW::Location.get_significant do
|
166
226
|
end
|
@@ -169,5 +229,10 @@ describe BubbleWrap::Location do
|
|
169
229
|
|
170
230
|
location_manager.instance_variable_get("@stopMonitoringSignificantLocationChanges").should == true
|
171
231
|
end
|
232
|
+
|
233
|
+
it "should not throw an error stopping before it was started" do
|
234
|
+
Proc.new { BW::Location.stop }.should.not.raise Exception
|
235
|
+
end
|
236
|
+
|
172
237
|
end
|
173
238
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
describe BW::NetworkIndicator do
|
2
|
+
|
3
|
+
before do
|
4
|
+
BW::NetworkIndicator.reset!
|
5
|
+
end
|
6
|
+
|
7
|
+
after do
|
8
|
+
BW::NetworkIndicator.instance_variable_set(:@counter, 0)
|
9
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible = false
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should show the indicator immediately' do
|
13
|
+
BW::NetworkIndicator.show
|
14
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should have a counter' do
|
18
|
+
BW::NetworkIndicator.show
|
19
|
+
BW::NetworkIndicator.counter.should == 1
|
20
|
+
BW::NetworkIndicator.hide
|
21
|
+
BW::NetworkIndicator.counter.should == 0
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should show the indicator from any thread' do
|
25
|
+
Dispatch::Queue.concurrent.async do
|
26
|
+
BW::NetworkIndicator.show
|
27
|
+
end
|
28
|
+
wait BW::NetworkIndicator::DELAY do
|
29
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should hide the indicator' do
|
34
|
+
BW::NetworkIndicator.show
|
35
|
+
BW::NetworkIndicator.hide
|
36
|
+
wait BW::NetworkIndicator::DELAY do
|
37
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should hide the indicator after a delay' do
|
42
|
+
BW::NetworkIndicator.show
|
43
|
+
BW::NetworkIndicator.hide
|
44
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
45
|
+
wait BW::NetworkIndicator::DELAY do
|
46
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should not hide the indicator if show/hide/show is called quickly' do
|
51
|
+
BW::NetworkIndicator.show
|
52
|
+
BW::NetworkIndicator.hide
|
53
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
54
|
+
wait BW::NetworkIndicator::DELAY/2 do
|
55
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
56
|
+
BW::NetworkIndicator.show
|
57
|
+
wait BW::NetworkIndicator::DELAY do
|
58
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should keep track of how many times `show` was called' do
|
64
|
+
BW::NetworkIndicator.show
|
65
|
+
BW::NetworkIndicator.show
|
66
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
67
|
+
BW::NetworkIndicator.hide
|
68
|
+
wait BW::NetworkIndicator::DELAY do
|
69
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
70
|
+
BW::NetworkIndicator.hide
|
71
|
+
wait BW::NetworkIndicator::DELAY do
|
72
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should allow `hide` to be called too many times' do
|
78
|
+
BW::NetworkIndicator.show
|
79
|
+
BW::NetworkIndicator.show
|
80
|
+
BW::NetworkIndicator.hide
|
81
|
+
BW::NetworkIndicator.hide
|
82
|
+
wait BW::NetworkIndicator::DELAY do
|
83
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
84
|
+
|
85
|
+
BW::NetworkIndicator.hide
|
86
|
+
BW::NetworkIndicator.hide
|
87
|
+
wait BW::NetworkIndicator::DELAY do
|
88
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
89
|
+
|
90
|
+
BW::NetworkIndicator.show
|
91
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should reset the counter when `reset!` is called' do
|
97
|
+
BW::NetworkIndicator.show
|
98
|
+
BW::NetworkIndicator.show
|
99
|
+
BW::NetworkIndicator.reset!
|
100
|
+
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should have `visible?` method' do
|
104
|
+
BW::NetworkIndicator.show
|
105
|
+
BW::NetworkIndicator.visible?.should == true
|
106
|
+
BW::NetworkIndicator.hide
|
107
|
+
wait BW::NetworkIndicator::DELAY do
|
108
|
+
BW::NetworkIndicator.visible?.should == false
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -9,13 +9,21 @@ describe BubbleWrap::Reactor::Eventable do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
describe '.on' do
|
12
|
-
it 'registers events' do
|
12
|
+
it 'registers events passing a block' do
|
13
13
|
proof = proc { }
|
14
14
|
@subject.on(:foo, &proof)
|
15
15
|
events = @subject.instance_variable_get(:@__events__)
|
16
16
|
events[:foo].member?(proof).should == true
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'registers events passing a Method object' do
|
20
|
+
def bar; end
|
21
|
+
proof = method(:bar)
|
22
|
+
@subject.on(:foo, proof)
|
23
|
+
events = @subject.instance_variable_get(:@__events__)
|
24
|
+
events[:foo].member?(proof).should == true
|
25
|
+
end
|
26
|
+
|
19
27
|
it 'returns the array of blocks for the event' do
|
20
28
|
proof = proc { }
|
21
29
|
@subject.on(:foo, &proof).should == [proof]
|
@@ -23,7 +31,7 @@ describe BubbleWrap::Reactor::Eventable do
|
|
23
31
|
end
|
24
32
|
|
25
33
|
describe '.off' do
|
26
|
-
it 'unregisters events' do
|
34
|
+
it 'unregisters proc events' do
|
27
35
|
proof = proc { }
|
28
36
|
@subject.on(:foo, &proof)
|
29
37
|
events = @subject.instance_variable_get(:@__events__)
|
@@ -31,6 +39,15 @@ describe BubbleWrap::Reactor::Eventable do
|
|
31
39
|
events[:foo].member?(proof).should == false
|
32
40
|
end
|
33
41
|
|
42
|
+
it 'unregisters method events' do
|
43
|
+
def bar; end
|
44
|
+
proof = method(:bar)
|
45
|
+
@subject.on(:foo, proof)
|
46
|
+
events = @subject.instance_variable_get(:@__events__)
|
47
|
+
@subject.off(:foo, proof)
|
48
|
+
events[:foo].member?(proof).should == false
|
49
|
+
end
|
50
|
+
|
34
51
|
it 'calls other event procs when a proc unregisters itself' do
|
35
52
|
@proxy.proof = 0
|
36
53
|
proof1 = proc do |r|
|
@@ -57,6 +74,16 @@ describe BubbleWrap::Reactor::Eventable do
|
|
57
74
|
@proxy.proof.should == true
|
58
75
|
end
|
59
76
|
|
77
|
+
it 'calls event methods' do
|
78
|
+
@proxy.proof = false
|
79
|
+
def bar(r)
|
80
|
+
@proxy.proof = r
|
81
|
+
end
|
82
|
+
@subject.on(:foo, method(:bar))
|
83
|
+
@subject.trigger(:foo, true)
|
84
|
+
@proxy.proof.should == true
|
85
|
+
end
|
86
|
+
|
60
87
|
it 'calls event procs for correct event' do
|
61
88
|
@proxy.proof = false
|
62
89
|
@subject.on(:foo) do |r|
|
@@ -66,6 +93,16 @@ describe BubbleWrap::Reactor::Eventable do
|
|
66
93
|
@proxy.proof.should == false
|
67
94
|
end
|
68
95
|
|
96
|
+
it 'calls event methods for correct event' do
|
97
|
+
@proxy.proof = false
|
98
|
+
def bar(r)
|
99
|
+
@proxy.proof = r
|
100
|
+
end
|
101
|
+
@subject.on(:foo, method(:bar))
|
102
|
+
@subject.trigger(:bar, true)
|
103
|
+
@proxy.proof.should == false
|
104
|
+
end
|
105
|
+
|
69
106
|
it 'calls all the event procs' do
|
70
107
|
@proxy.proof = 0
|
71
108
|
@subject.on(:foo) { |r| @proxy.proof += r }
|
@@ -75,12 +112,27 @@ describe BubbleWrap::Reactor::Eventable do
|
|
75
112
|
@proxy.proof.should == 6
|
76
113
|
end
|
77
114
|
|
115
|
+
it 'calls all the event methods' do
|
116
|
+
def bar(r); @proxy.proof += r; end
|
117
|
+
def baz(r); @proxy.proof += r; end
|
118
|
+
@proxy.proof = 0
|
119
|
+
@subject.on(:foo, method(:baz))
|
120
|
+
@subject.on(:foo, method(:bar))
|
121
|
+
@subject.trigger(:foo, 2)
|
122
|
+
@proxy.proof.should == 4
|
123
|
+
end
|
124
|
+
|
78
125
|
class TestUIViewControllerWithEventable
|
79
126
|
include BubbleWrap::Reactor::Eventable
|
80
127
|
def test_on
|
81
128
|
on(:foo) do
|
82
129
|
end
|
130
|
+
method(:bar)
|
83
131
|
end
|
132
|
+
|
133
|
+
def bar
|
134
|
+
end
|
135
|
+
|
84
136
|
def dealloc
|
85
137
|
$test_dealloc = true
|
86
138
|
super
|