sugarcube 0.20.13 → 0.20.15

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sugarcube (0.20.12)
4
+ sugarcube (0.20.15)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -374,7 +374,7 @@ module SugarCube
374
374
  end
375
375
 
376
376
  def root
377
- (UIApplication.sharedApplication.keyWindow || UIApplication.sharedApplication.windows[0]).rootViewController
377
+ UIApplication.sharedApplication.windows[0].rootViewController
378
378
  end
379
379
 
380
380
  ##| RESTORE
@@ -58,7 +58,7 @@ class String
58
58
  end
59
59
 
60
60
  def to_timezone
61
- SugarCube::DateParser.parse_timezone(self)
61
+ SugarCube::DateParser.parse_time_zone(self)
62
62
  end
63
63
 
64
64
  def to_duration
@@ -18,7 +18,9 @@ class NSString
18
18
 
19
19
  # @return [UIImage]
20
20
  def uiimage
21
- UIImage.imageNamed(self)
21
+ UIImage.imageNamed(self).tap do |retval|
22
+ NSLog("No image named #{self}") unless retval
23
+ end
22
24
  end
23
25
 
24
26
  # @return [UIImageView]
@@ -89,4 +91,17 @@ class NSString
89
91
  end
90
92
  alias _ localized
91
93
 
94
+ def nstimezone
95
+ case self
96
+ when /([+-]?\d{4})/
97
+ sec = $1[-4,2].to_i * 3600
98
+ NSTimeZone.timeZoneForSecondsFromGMT(sec)
99
+ when /(GMT|UTC)([+-]\d{1,2})?/
100
+ sec = $2 ? $2.to_i * 3600 : 0
101
+ NSTimeZone.timeZoneForSecondsFromGMT(sec)
102
+ else
103
+ NSTimeZone.timeZoneWithName(self)
104
+ end
105
+ end
106
+
92
107
  end
@@ -62,6 +62,9 @@ class Symbol
62
62
  attr :tableview_cellselectionstyle
63
63
  attr :tableview_cellseparatorstyle
64
64
 
65
+ attr :alert_view_styles
66
+ attr :action_sheet_styles
67
+
65
68
  attr :image_sourcetypes
66
69
  attr :image_capturemode
67
70
  attr :image_cameradevice
@@ -354,6 +357,20 @@ class Symbol
354
357
  etched: UITableViewCellSeparatorStyleSingleLineEtched,
355
358
  }
356
359
 
360
+ @alert_view_styles = {
361
+ default: UIAlertViewStyleDefault,
362
+ secure_text_input: UIAlertViewStyleSecureTextInput,
363
+ plain_text_input: UIAlertViewStylePlainTextInput,
364
+ login_and_password_input: UIAlertViewStyleLoginAndPasswordInput,
365
+ }
366
+
367
+ @action_sheet_styles = {
368
+ automatic: UIActionSheetStyleAutomatic,
369
+ default: UIActionSheetStyleDefault,
370
+ black_translucent: UIActionSheetStyleBlackTranslucent,
371
+ black_opaque: UIActionSheetStyleBlackOpaque,
372
+ }
373
+
357
374
  @statusbar_styles = {
358
375
  default: UIStatusBarStyleDefault,
359
376
  black: UIStatusBarStyleBlackOpaque,
@@ -628,6 +645,16 @@ class Symbol
628
645
  sugarcube_look_in(Symbol.tableview_cellseparatorstyle)
629
646
  end
630
647
 
648
+ def uialertstyle
649
+ sugarcube_look_in(Symbol.alert_view_styles)
650
+ end
651
+ alias uialertviewstyle uialertstyle
652
+
653
+ def uiactionstyle
654
+ sugarcube_look_in(Symbol.action_sheet_styles)
655
+ end
656
+ alias uiactionsheetstyle uiactionstyle
657
+
631
658
  def uistatusbarstyle
632
659
  sugarcube_look_in(Symbol.statusbar_styles)
633
660
  end
@@ -1,18 +1,26 @@
1
1
  class UIActionSheet
2
2
 
3
- # UIActionSheet.alert("title",
4
- # # The first button is considered the 'cancel' button, for the purposes of
5
- # # whether the cancel or success handler gets called, the second button is
6
- # # the 'destructive' button, and the rest are plain old buttons.
7
- # buttons: %w"Cancel OK No-way",
8
- # cancel: proc{ puts "nevermind" },
9
- # destructive: proc{ puts "OHHH YEAAH!" },
10
- # success: proc{ |pressed| puts "pressed: #{pressed}" },
11
- # )
3
+ # For the purposes of whether the cancel or success handler gets called, the
4
+ # first button is considered the 'cancel' button, the second button is the
5
+ # 'destructive' button, and the rest are plain old buttons.
6
+ #
7
+ # If you use just one block, it will be used for *all* of the buttons.
8
+ #
9
+ # @example
10
+ # # use a different handler for each button type
11
+ # UIActionSheet.alert("title",
12
+ # buttons: %w"Cancel Delete No-way",
13
+ # cancel: proc{ puts "nevermind" },
14
+ # destructive: proc{ puts "OHHH YEAAH!" },
15
+ # success: proc{ |pressed| puts "pressed: #{pressed}" },
16
+ # )
17
+ # # use one handler for all buttons
18
+ # UIActionSheet.alert("title", buttons: [...]) { |button| }
12
19
  def self.alert(title, options={}, &block)
13
20
  # create the delegate
14
21
  delegate = SugarCube::ActionSheetDelegate.new
15
- delegate.on_success = options[:success] || block
22
+ delegate.on_default = block
23
+ delegate.on_success = options[:success]
16
24
  delegate.on_destructive = options[:destructive]
17
25
  delegate.on_cancel = options[:cancel]
18
26
  delegate.send(:retain)
@@ -24,61 +32,87 @@ class UIActionSheet
24
32
  buttons.concat(options[:buttons]) if options[:buttons]
25
33
 
26
34
  if buttons.empty?
27
- # cancelButtonTitle: is first, so check for cancel handler
28
- if options[:cancel]
29
- buttons << 'Cancel'
30
- else
31
- buttons << nil
32
- end
33
-
34
- # destructiveButtonTitle, check for destructive handler
35
- if options[:destructive]
36
- buttons << 'Delete'
37
- else
38
- buttons << nil
39
- end
40
- elsif buttons.length == 1 and (options[:cancel] or options[:destructive])
41
- raise 'If you only have one button, use a :success handler, not :cancel or :destructive'
42
- end
43
-
44
- # uses localized buttons in the actual alert
45
- if buttons.length == 0
46
- buttons = [nil, nil]
47
- elsif buttons.length == 1
35
+ # cancelButtonTitle:
48
36
  buttons << nil
49
- end
50
37
 
51
- last_index = buttons.length - 1
52
- offset = 0
53
-
54
- button_index_map = {}
55
- if buttons[1] # destructive
56
- button_index_map[0] = buttons[1]
57
- offset += 1
58
- else
59
- last_index -= 1
60
- end
38
+ # destructiveButtonTitle
39
+ buttons << nil
61
40
 
62
- if buttons[0] # cancel
63
- button_index_map[last_index] = buttons[0]
41
+ # otherButtonTitles:
42
+ buttons << 'OK'
43
+ elsif buttons.length == 1 && (options[:cancel] || options[:destructive])
44
+ raise 'If you only have one button, use a :success handler, not :cancel or :destructive'
64
45
  end
65
46
 
66
- buttons[2..-1].each_with_index { |button, index|
67
- button_index_map[index + offset] = button
68
- }
69
- # the button titles, mapped to how UIActionSheet orders them. These are passed to the success handler.
70
- delegate.button_index_map = button_index_map
71
-
47
+ # cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:
72
48
  args.concat(buttons.map{ |s| s ? s.localized : nil })
73
49
  args << nil # otherButtonTitles:..., nil
74
50
 
51
+ # the button titles, mapped to how UIActionSheet orders them. These are
52
+ # passed to the success handler.
53
+ buttons_mapped = {}
54
+ if args[2] && args[3] # cancel && destructive buttons
55
+ buttons_mapped[0] = buttons[1] # destructiveIndex == 0, button == 1
56
+ buttons_mapped[buttons.length - 1] = buttons[0] # cancelIndex == last, button == 0
57
+ # from first+1 to last-1
58
+ buttons[2..-1].each_with_index do |button,index|
59
+ buttons_mapped[index + 1] = button
60
+ end
61
+ elsif args[3] # destructive button
62
+ buttons_mapped[0] = buttons[1] # destructiveIndex == 0, button == 1
63
+ # from first+1 to last-1
64
+ buttons[2..-1].each_with_index do |button,index|
65
+ buttons_mapped[index + 1] = button
66
+ end
67
+ elsif args[2] # cancel button
68
+ buttons_mapped[buttons.length - 2] = buttons[0] # cancelIndex == last, button == 0
69
+ buttons[2..-1].each_with_index do |button,index|
70
+ buttons_mapped[index] = button
71
+ end
72
+ else
73
+ buttons[2..-1].each_with_index do |button,index|
74
+ buttons_mapped[index] = button
75
+ end
76
+ end
77
+ delegate.buttons = buttons_mapped
78
+
75
79
  alert = self.alloc
76
80
  alert.send('initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:', *args)
77
- window = UIApplication.sharedApplication.keyWindow || UIApplication.sharedApplication.windows[0]
78
- alert.showInView(window)
81
+ if options.key?(:style)
82
+ style = options[:style]
83
+ style = style.uiactionstyle unless style.is_a?(Fixnum)
84
+ alert.actionSheetStyle = style
85
+ end
86
+ if options.fetch(:show, true)
87
+ if options.key?(:from)
88
+ from = options[:from]
89
+ else
90
+ from = UIApplication.sharedApplication.windows[0]
91
+ end
92
+
93
+ case from
94
+ when CGRect
95
+ view = UIApplication.sharedApplication.windows[0]
96
+ alert.showInRect(from, inView: view, animated: true)
97
+ when UIBarButtonItem
98
+ alert.showFromBarButtonItem(from)
99
+ when UIToolbar
100
+ alert.showFromToolbar(from)
101
+ when UITabBar
102
+ alert.showFromTabBar(from)
103
+ when UIView
104
+ alert.showInView(from)
105
+ else
106
+ raise "Unknown :from option #{from.inspect}"
107
+ end
108
+ end
79
109
  alert
80
110
  end
81
111
 
112
+ def <<(title)
113
+ addButtonWithTitle(title)
114
+ end
115
+
82
116
  private
83
117
  def dummy
84
118
  self.initWithTitle(nil, delegate:nil, cancelButtonTitle:nil, destructiveButtonTitle:nil, otherButtonTitles:nil)
@@ -89,22 +123,28 @@ end
89
123
 
90
124
  module SugarCube
91
125
  class ActionSheetDelegate
92
- attr_accessor :button_index_map
126
+ attr_accessor :buttons
127
+ attr_accessor :on_default
93
128
  attr_accessor :on_cancel
94
129
  attr_accessor :on_destructive
95
130
  attr_accessor :on_success
96
131
 
97
132
  def actionSheet(alert, didDismissWithButtonIndex:index)
133
+ handler = nil
98
134
  if index == alert.destructiveButtonIndex && on_destructive
99
- on_destructive.call
135
+ handler = on_destructive || on_default
100
136
  elsif index == alert.cancelButtonIndex && on_cancel
101
- on_cancel.call
102
- elsif on_success
103
- if on_success.arity == 0
104
- on_success.call
137
+ handler = on_cancel || on_default
138
+ else
139
+ handler = on_success || on_default
140
+ end
141
+
142
+ if handler
143
+ if handler.arity == 0
144
+ handler.call
105
145
  else
106
- button = button_index_map[index]
107
- on_success.call(button)
146
+ button = buttons[index]
147
+ handler.call(button)
108
148
  end
109
149
  end
110
150
 
@@ -8,9 +8,12 @@ class UIAlertView
8
8
  # cancel: proc{ puts "nevermind" },
9
9
  # success: proc{ |pressed| puts "pressed: #{pressed}" },
10
10
  # )
11
- def self.alert(title, options={}, &block)
11
+ #
12
+ # If you choose
13
+ def self.alert(title, options={}, more_options={}, &block)
12
14
  if options.is_a? String
13
- options = {message: options}
15
+ more_options[:message] = options
16
+ options = more_options
14
17
  end
15
18
 
16
19
  # create the delegate
@@ -33,7 +36,7 @@ class UIAlertView
33
36
 
34
37
  # otherButtonTitles:
35
38
  if buttons.empty?
36
- buttons << nil # cancel button => nil
39
+ args << nil # cancel button => nil
37
40
  buttons << "OK" # other buttons => "OK"
38
41
  elsif options[:success]
39
42
  buttons << "OK"
@@ -51,10 +54,21 @@ class UIAlertView
51
54
 
52
55
  alert = self.alloc
53
56
  alert.send(:"initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:", *args)
54
- alert.show
57
+ if options.key?(:style)
58
+ style = options[:style]
59
+ style = style.uialertstyle unless style.is_a?(Fixnum)
60
+ alert.alertViewStyle = style
61
+ end
62
+ if options.fetch(:show, true)
63
+ alert.show
64
+ end
55
65
  alert
56
66
  end
57
67
 
68
+ def <<(title)
69
+ addButtonWithTitle(title)
70
+ end
71
+
58
72
  private
59
73
  def dummy
60
74
  self.initWithTitle(nil, message:nil, delegate:nil, cancelButtonTitle:nil, otherButtonTitles:nil)
@@ -82,12 +96,20 @@ module SugarCube
82
96
  end
83
97
 
84
98
  if handler
85
- if handler.arity == 0
86
- handler.call
87
- else
88
- button = buttons[index]
89
- handler.call(button)
99
+ # construct all the possible arguments you could send
100
+ args = [buttons[index]]
101
+ # add the first input if this is not the default
102
+ if alert.alertViewStyle != :default.uialertstyle
103
+ args << alert.textFieldAtIndex(0).text
104
+ end
105
+ # add the second one if this is a login+password input
106
+ if alert.alertViewStyle == :login_and_password_input.uialertstyle
107
+ args << alert.textFieldAtIndex(1).text
90
108
  end
109
+
110
+ # but only send the ones they asked for
111
+ args = args[0...handler.arity]
112
+ handler.call(*args)
91
113
  end
92
114
 
93
115
  self.send(:autorelease)
@@ -240,6 +240,32 @@ class UIView
240
240
  self
241
241
  end
242
242
 
243
+ def resize_to(size, options={}, &after)
244
+ if options.is_a? Numeric
245
+ options = { duration: options }
246
+ end
247
+
248
+ options[:after] = after
249
+
250
+ animate(options) {
251
+ f = self.frame
252
+ f.size = SugarCube::CoreGraphics::Size(size)
253
+ self.frame = f
254
+ }
255
+ end
256
+
257
+ def reframe_to(frame, options={}, &after)
258
+ if options.is_a? Numeric
259
+ options = { duration: options }
260
+ end
261
+
262
+ options[:after] = after
263
+
264
+ animate(options) {
265
+ self.frame = frame
266
+ }
267
+ end
268
+
243
269
  # Changes the current rotation to `new_angle`
244
270
  # (`rotate` rotates relative to the current rotation)
245
271
  def rotate_to(options={}, more_options={}, &after)
@@ -368,7 +394,7 @@ class UIView
368
394
  end
369
395
 
370
396
  self.animate(options) {
371
- window = UIApplication.sharedApplication.keyWindow || UIApplication.sharedApplication.windows[0]
397
+ window = UIApplication.sharedApplication.windows[0]
372
398
  top = self.convertPoint([0, 0], toView:nil).y
373
399
  height = window.frame.size.height - top
374
400
  offset = CGPoint.new(0, height * 1.5)
@@ -1,3 +1,3 @@
1
1
  module SugarCube
2
- Version = '0.20.13'
2
+ Version = '0.20.15'
3
3
  end
@@ -0,0 +1,23 @@
1
+ describe "NSString to NSTimeZone" do
2
+
3
+ it "should parse timezone as UTC" do
4
+ "UTC".nstimezone.secondsFromGMT.should == 0
5
+ end
6
+
7
+ it "should parse timezone as Asia/Tokyo" do
8
+ "Asia/Tokyo".nstimezone.secondsFromGMT.should == 9 * 60 * 60
9
+ end
10
+
11
+ it "should parse timezone as Asia/Tokyo" do
12
+ "UTC+9".nstimezone.secondsFromGMT.should == 9 * 60 * 60
13
+ end
14
+
15
+ it "should parse timezone as Asia/Tokyo" do
16
+ "GMT+9".nstimezone.secondsFromGMT.should == 9 * 60 * 60
17
+ end
18
+
19
+ it "should parse timezone as Asia/Tokyo" do
20
+ "+0900".nstimezone.secondsFromGMT.should == 9 * 60 * 60
21
+ end
22
+
23
+ end
@@ -0,0 +1,253 @@
1
+ describe 'UIActionSheet' do
2
+ tests UIViewController # this is just needed so that a window is available
3
+
4
+ before do
5
+ @touched = nil
6
+ end
7
+
8
+ it 'should have :show option (show: false)' do
9
+ alert = UIActionSheet.alert('test', show: false)
10
+ proper_wait 0.6
11
+ alert.visible?.should == false
12
+ end
13
+
14
+ it 'should have :show option (show: true)' do
15
+ alert = UIActionSheet.alert('test', show: true)
16
+ proper_wait 0.6
17
+ alert.visible?.should == true
18
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
19
+ end
20
+
21
+ it 'should show by default' do
22
+ alert = UIActionSheet.alert('test')
23
+ proper_wait 0.6
24
+ alert.visible?.should == true
25
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
26
+ end
27
+
28
+ it 'should assign the title' do
29
+ alert = UIActionSheet.alert('test title', show: false)
30
+ alert.title.should == 'test title'
31
+ end
32
+
33
+ it 'should have << method' do
34
+ alert = UIActionSheet.alert('test', show: false)
35
+ -> {
36
+ alert << 'title'
37
+ }.should.not.raise
38
+ end
39
+
40
+ it 'should have :style option' do
41
+ Symbol.action_sheet_styles.each do |style, value|
42
+ # as symbol
43
+ alert = UIActionSheet.alert('test', show: false, style: style)
44
+ alert.actionSheetStyle.should == value
45
+
46
+ # as constant
47
+ alert = UIActionSheet.alert('test', show: false, style: value)
48
+ alert.actionSheetStyle.should == value
49
+ end
50
+ end
51
+
52
+ it 'should add a button with << method' do
53
+ alert = UIActionSheet.alert('test', show: false)
54
+ alert << 'title'
55
+ alert.buttonTitleAtIndex(alert.firstOtherButtonIndex + 1).should == 'title'
56
+ end
57
+
58
+ it 'should show "OK" by default' do
59
+ alert = UIActionSheet.alert('test', show: false)
60
+ alert.cancelButtonIndex.should == -1
61
+ alert.destructiveButtonIndex.should == -1
62
+ alert.firstOtherButtonIndex.should == 0
63
+ alert.buttonTitleAtIndex(alert.firstOtherButtonIndex).should == 'OK'
64
+ end
65
+
66
+ it 'should call block when pressed' do
67
+ alert = UIActionSheet.alert('test') { @touched = true }
68
+ proper_wait 0.6
69
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
70
+ @touched.should == true
71
+ end
72
+
73
+ it 'should call block with "OK" pressed' do
74
+ alert = UIActionSheet.alert('test') { |button| @touched = button }
75
+ proper_wait 0.6
76
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
77
+ @touched.should == 'OK'
78
+ end
79
+
80
+ describe 'with all :buttons defined' do
81
+
82
+ before do
83
+ @touched = nil
84
+ @alert = UIActionSheet.alert('test', buttons: ['cancel', 'destructive', 'ok']) { |button| @touched = button }
85
+ proper_wait 0.6
86
+ end
87
+
88
+ it 'should call block with "cancel" when cancel button is pressed' do
89
+ @alert.cancelButtonIndex.should == 2
90
+ @alert.dismissWithClickedButtonIndex(@alert.cancelButtonIndex, animated: false)
91
+ @touched.should == 'cancel'
92
+ end
93
+
94
+ it 'should call block with "destructive" when destructive button is pressed' do
95
+ @alert.destructiveButtonIndex.should == 0
96
+ @alert.dismissWithClickedButtonIndex(@alert.destructiveButtonIndex, animated: false)
97
+ @touched.should == 'destructive'
98
+ end
99
+
100
+ it 'should call block with "ok" when other button is pressed' do
101
+ @alert.firstOtherButtonIndex.should == 1
102
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
103
+ @touched.should == 'ok'
104
+ end
105
+
106
+ end
107
+
108
+ describe 'with cancel and destructive :buttons defined' do
109
+
110
+ before do
111
+ @touched = nil
112
+ @alert = UIActionSheet.alert('test', buttons: ['cancel', 'destructive']) { |button| @touched = button }
113
+ proper_wait 0.6
114
+ end
115
+
116
+ it 'should call block with "cancel" when cancel button is pressed' do
117
+ @alert.cancelButtonIndex.should == 1
118
+ @alert.dismissWithClickedButtonIndex(@alert.cancelButtonIndex, animated: false)
119
+ @touched.should == 'cancel'
120
+ end
121
+
122
+ it 'should call block with "destructive" when destructive button is pressed' do
123
+ @alert.destructiveButtonIndex.should == 0
124
+ @alert.dismissWithClickedButtonIndex(@alert.destructiveButtonIndex, animated: false)
125
+ @touched.should == 'destructive'
126
+ end
127
+
128
+ it 'should not have other buttons' do
129
+ @alert.firstOtherButtonIndex.should == -1
130
+ end
131
+
132
+ end
133
+
134
+ describe 'with cancel and other :buttons defined' do
135
+
136
+ before do
137
+ @touched = nil
138
+ @alert = UIActionSheet.alert('test', buttons: ['cancel', nil, 'ok']) { |button| @touched = button }
139
+ proper_wait 0.6
140
+ end
141
+
142
+ it 'should call block with "cancel" when cancel button is pressed' do
143
+ @alert.cancelButtonIndex.should == 1
144
+ @alert.dismissWithClickedButtonIndex(@alert.cancelButtonIndex, animated: false)
145
+ @touched.should == 'cancel'
146
+ end
147
+
148
+ it 'should not have destructive button' do
149
+ @alert.destructiveButtonIndex.should == -1
150
+ end
151
+
152
+ it 'should call block with "ok" when other button is pressed' do
153
+ @alert.firstOtherButtonIndex.should == 0
154
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
155
+ @touched.should == 'ok'
156
+ end
157
+
158
+ end
159
+
160
+ describe 'with destructive and other :buttons defined' do
161
+
162
+ before do
163
+ @touched = nil
164
+ @alert = UIActionSheet.alert('test', buttons: [nil, 'destructive', 'ok']) { |button| @touched = button }
165
+ proper_wait 0.6
166
+ end
167
+
168
+ it 'should call block with "cancel" when cancel button is pressed' do
169
+ @alert.cancelButtonIndex.should == -1
170
+ end
171
+
172
+ it 'should not have destructive button' do
173
+ @alert.destructiveButtonIndex.should == 0
174
+ @alert.dismissWithClickedButtonIndex(@alert.destructiveButtonIndex, animated: false)
175
+ @touched.should == 'destructive'
176
+ end
177
+
178
+ it 'should call block with "ok" when other button is pressed' do
179
+ @alert.firstOtherButtonIndex.should == 1
180
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
181
+ @touched.should == 'ok'
182
+ end
183
+
184
+ end
185
+
186
+ describe 'with other :buttons defined' do
187
+
188
+ before do
189
+ @touched = nil
190
+ @alert = UIActionSheet.alert('test', buttons: [nil, nil, 'test1', 'test2']) { |button| @touched = button }
191
+ proper_wait 0.6
192
+ end
193
+
194
+ it 'should call block with "cancel" when cancel button is pressed' do
195
+ @alert.cancelButtonIndex.should == -1
196
+ end
197
+
198
+ it 'should not have destructive button' do
199
+ @alert.destructiveButtonIndex.should == -1
200
+ end
201
+
202
+ it 'should call block with "test1" when first button is pressed' do
203
+ @alert.firstOtherButtonIndex.should == 0
204
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
205
+ @touched.should == 'test1'
206
+ end
207
+
208
+ it 'should call block with "test2" when second button is pressed' do
209
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex + 1, animated: false)
210
+ @touched.should == 'test2'
211
+ end
212
+
213
+ end
214
+
215
+ describe 'with all handlers defined' do
216
+
217
+ before do
218
+ @touched = nil
219
+ @alert = UIActionSheet.alert('test',
220
+ buttons: ['cancel', 'destructive', 'test1', 'test2'],
221
+ cancel: ->{ @touched = :cancel },
222
+ destructive: ->{ @touched = :destructive },
223
+ success: ->(button){ @touched = button },
224
+ )
225
+ proper_wait 0.6
226
+ end
227
+
228
+ it 'should call block with "cancel" when cancel button is pressed' do
229
+ @alert.cancelButtonIndex.should == 3
230
+ @alert.dismissWithClickedButtonIndex(@alert.cancelButtonIndex, animated: false)
231
+ @touched.should == :cancel
232
+ end
233
+
234
+ it 'should call block with "destructive" when destructive button is pressed' do
235
+ @alert.destructiveButtonIndex.should == 0
236
+ @alert.dismissWithClickedButtonIndex(@alert.destructiveButtonIndex, animated: false)
237
+ @touched.should == :destructive
238
+ end
239
+
240
+ it 'should call block with "test1" when first button is pressed' do
241
+ @alert.firstOtherButtonIndex.should == 1
242
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
243
+ @touched.should == 'test1'
244
+ end
245
+
246
+ it 'should call block with "test2" when second button is pressed' do
247
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex + 1, animated: false)
248
+ @touched.should == 'test2'
249
+ end
250
+
251
+ end
252
+
253
+ end
@@ -0,0 +1,187 @@
1
+ describe 'UIAlertView' do
2
+ tests UIViewController # this is just needed so that a window is available
3
+
4
+ it 'should have :show option (show: false)' do
5
+ alert = UIAlertView.alert('test', show: false)
6
+ proper_wait 0.6
7
+ alert.visible?.should == false
8
+ end
9
+
10
+ it 'should have :show option (show: true)' do
11
+ alert = UIAlertView.alert('test', show: true)
12
+ proper_wait 0.6
13
+ alert.visible?.should == true
14
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
15
+ end
16
+
17
+ it 'should show by default' do
18
+ alert = UIAlertView.alert('test')
19
+ proper_wait 0.6
20
+ alert.visible?.should == true
21
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
22
+ end
23
+
24
+ it 'should assign the title' do
25
+ alert = UIAlertView.alert('test title', show: false)
26
+ alert.title.should == 'test title'
27
+ end
28
+
29
+ it 'should support three args' do
30
+ alert = UIAlertView.alert('test title', 'test message', show: false)
31
+ alert.visible?.should == false
32
+ end
33
+
34
+ describe 'should assign the message' do
35
+
36
+ it 'should use the second arg' do
37
+ alert = UIAlertView.alert('test title', 'test message', show: false)
38
+ alert.message.should == 'test message'
39
+ end
40
+
41
+ it 'should use the :message option' do
42
+ alert = UIAlertView.alert('test title', message: 'test message', show: false)
43
+ alert.message.should == 'test message'
44
+ end
45
+
46
+ end
47
+
48
+ it 'should have << method' do
49
+ alert = UIAlertView.alert('test', show: false)
50
+ -> {
51
+ alert << 'title'
52
+ }.should.not.raise
53
+ end
54
+
55
+ it 'should add a button with << method' do
56
+ alert = UIAlertView.alert('test', show: false)
57
+ alert << 'title'
58
+ alert.buttonTitleAtIndex(alert.firstOtherButtonIndex + 1).should == 'title'
59
+ end
60
+
61
+ it 'should display "OK" when no buttons are specified' do
62
+ alert = UIAlertView.alert('test', show: false)
63
+ alert.cancelButtonIndex.should == -1
64
+ alert.buttonTitleAtIndex(alert.firstOtherButtonIndex).should == 'OK'
65
+ end
66
+
67
+ it 'should use a cancel button if any buttons are specified' do
68
+ alert = UIAlertView.alert('test', buttons: ['a', 'b'], show: false)
69
+ alert.buttonTitleAtIndex(alert.cancelButtonIndex).should == 'a'
70
+ alert.buttonTitleAtIndex(alert.firstOtherButtonIndex).should == 'b'
71
+ end
72
+
73
+ it 'should have :style option' do
74
+ Symbol.alert_view_styles.each do |style, value|
75
+ # as symbol
76
+ alert = UIAlertView.alert('test', show: false, style: style)
77
+ alert.alertViewStyle.should == value
78
+
79
+ # as constant
80
+ alert = UIAlertView.alert('test', show: false, style: value)
81
+ alert.alertViewStyle.should == value
82
+ end
83
+ end
84
+
85
+ it 'should call the block when dismissed' do
86
+ alert = UIAlertView.alert('test') { @touched = true }
87
+ alert.numberOfButtons.should == 1
88
+ proper_wait 0.6
89
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
90
+
91
+ @touched.should == true
92
+ end
93
+
94
+ it 'should call the block and pass the button when dismissed' do
95
+ alert = UIAlertView.alert('test') { |button| @touched = button }
96
+ proper_wait 0.6
97
+ alert.dismissWithClickedButtonIndex(alert.firstOtherButtonIndex, animated: false)
98
+
99
+ @touched.should == 'OK'
100
+ end
101
+
102
+ it 'should call the block when dismissed no matter when cancel button pressed' do
103
+ alert = UIAlertView.alert('test', buttons:['cancel','ok']) { @touched = true }
104
+ alert.numberOfButtons.should == 2
105
+ proper_wait 0.6
106
+ alert.dismissWithClickedButtonIndex(alert.cancelButtonIndex, animated: false)
107
+
108
+ @touched.should == true
109
+ end
110
+
111
+ it 'should call the block and pass the button when dismissed with multiple buttons' do
112
+ alert = UIAlertView.alert('test', buttons: ['cancel', 'ok']) { |button| @touched = button }
113
+ proper_wait 0.6
114
+ alert.dismissWithClickedButtonIndex(alert.cancelButtonIndex, animated: false)
115
+
116
+ @touched.should == 'cancel'
117
+ end
118
+
119
+ describe 'Should call the appropriate block when :cancel and :success handlers are used' do
120
+
121
+ before do
122
+ @touched = nil
123
+ @alert = UIAlertView.alert('test', buttons: ['cancel', 'ok'],
124
+ cancel: ->{ @touched = :cancel },
125
+ success: ->{ @touched = :success }
126
+ )
127
+ end
128
+
129
+ it 'should work for :cancel' do
130
+ proper_wait 0.6
131
+ @alert.dismissWithClickedButtonIndex(@alert.cancelButtonIndex, animated: false)
132
+
133
+ @touched.should == :cancel
134
+ end
135
+
136
+ it 'should work for :success' do
137
+ proper_wait 0.6
138
+ @alert.dismissWithClickedButtonIndex(@alert.firstOtherButtonIndex, animated: false)
139
+
140
+ @touched.should == :success
141
+ end
142
+
143
+ end
144
+
145
+ describe 'should call the block and pass the button and inputs' do
146
+
147
+ before do
148
+ @text = nil
149
+ end
150
+
151
+ it 'should work with :secure_text_input' do
152
+ alert = UIAlertView.alert('test', buttons: ['cancel', 'ok'], style: :secure_text_input) { |button, text|
153
+ @text = text
154
+ }
155
+ proper_wait 0.6
156
+ alert.textFieldAtIndex(0).text = 'test text'
157
+ alert.dismissWithClickedButtonIndex(alert.cancelButtonIndex, animated: false)
158
+
159
+ @text.should == 'test text'
160
+ end
161
+
162
+ it 'should work with :plain_text_input' do
163
+ alert = UIAlertView.alert('test', buttons: ['cancel', 'ok'], style: :plain_text_input) { |button, text|
164
+ @text = text
165
+ }
166
+ proper_wait 0.6
167
+ alert.textFieldAtIndex(0).text = 'test text'
168
+ alert.dismissWithClickedButtonIndex(alert.cancelButtonIndex, animated: false)
169
+
170
+ @text.should == 'test text'
171
+ end
172
+
173
+ it 'should work with :login_and_password_input' do
174
+ alert = UIAlertView.alert('test', buttons: ['cancel', 'ok'], style: :login_and_password_input) { |button, text1, text2|
175
+ @text = "#{text1} + #{text2}"
176
+ }
177
+ proper_wait 0.6
178
+ alert.textFieldAtIndex(0).text = 'test text 1'
179
+ alert.textFieldAtIndex(1).text = 'test text 2'
180
+ alert.dismissWithClickedButtonIndex(alert.cancelButtonIndex, animated: false)
181
+
182
+ @text.should == 'test text 1 + test text 2'
183
+ end
184
+
185
+ end
186
+
187
+ end
@@ -7,7 +7,15 @@ describe "UIView animation methods" do
7
7
  @view.delta_to([1,2]).frame.should == CGRectMake(2,4,3,4)
8
8
  end
9
9
 
10
- it 'should delta_to x:1 y:2' do
10
+ it 'should resize_to w:5 h:6' do
11
+ @view.resize_to([5,6]).frame.should == CGRectMake(1,2,5,6)
12
+ end
13
+
14
+ it 'should reframe_to ' do
15
+ @view.reframe_to([[2,4],[5,6]]).frame.should == CGRectMake(2,4,5,6)
16
+ end
17
+
18
+ it 'should move_to x:2 y:4' do
11
19
  @view.move_to([2,4]).frame.should == CGRectMake(2,4,3,4)
12
20
  end
13
21
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sugarcube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.13
4
+ version: 0.20.15
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-04-22 00:00:00.000000000 Z
16
+ date: 2013-04-24 00:00:00.000000000 Z
17
17
  dependencies: []
18
18
  description: ! '== Description
19
19
 
@@ -155,11 +155,14 @@ files:
155
155
  - spec/nsset_spec.rb
156
156
  - spec/nsstring_files_spec.rb
157
157
  - spec/nsstring_spec.rb
158
+ - spec/nsstring_timezone_spec.rb
158
159
  - spec/nsurl_spec.rb
159
160
  - spec/numeric_spec.rb
160
161
  - spec/symbol_spec.rb
161
162
  - spec/symbol_uicolor_spec.rb
162
163
  - spec/timer_spec.rb
164
+ - spec/uiactionsheet_spec.rb
165
+ - spec/uialertview_spec.rb
163
166
  - spec/uibarbuttonitem_spec.rb
164
167
  - spec/uicolor_components_spec.rb
165
168
  - spec/uicolor_other_representations_spec.rb
@@ -221,11 +224,14 @@ test_files:
221
224
  - spec/nsset_spec.rb
222
225
  - spec/nsstring_files_spec.rb
223
226
  - spec/nsstring_spec.rb
227
+ - spec/nsstring_timezone_spec.rb
224
228
  - spec/nsurl_spec.rb
225
229
  - spec/numeric_spec.rb
226
230
  - spec/symbol_spec.rb
227
231
  - spec/symbol_uicolor_spec.rb
228
232
  - spec/timer_spec.rb
233
+ - spec/uiactionsheet_spec.rb
234
+ - spec/uialertview_spec.rb
229
235
  - spec/uibarbuttonitem_spec.rb
230
236
  - spec/uicolor_components_spec.rb
231
237
  - spec/uicolor_other_representations_spec.rb