briar 0.0.5 → 0.0.6
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.
- checksums.yaml +15 -0
- data/LICENSE.txt +1 -6
- data/README.md +8 -0
- data/bin/briar +44 -0
- data/bin/briar_helpers.rb +14 -0
- data/briar.gemspec +15 -12
- data/cucumber.yml.example +4 -0
- data/features/step_definitions/alerts_and_sheets/alert_view_steps.rb +3 -3
- data/features/step_definitions/bars/navbar_steps.rb +8 -8
- data/features/step_definitions/bars/tabbar_steps.rb +20 -14
- data/features/step_definitions/briar_core_steps.rb +3 -3
- data/features/step_definitions/control/button_steps.rb +10 -35
- data/features/step_definitions/email_steps.rb +55 -28
- data/features/step_definitions/keyboard_steps.rb +15 -2
- data/features/step_definitions/picker/date_picker_steps.rb +82 -68
- data/features/step_definitions/picker/picker_steps.rb +3 -3
- data/features/step_definitions/scroll_view_steps.rb +13 -12
- data/features/step_definitions/table_steps.rb +15 -10
- data/features/step_definitions/text_field_steps.rb +3 -3
- data/features/step_definitions/text_view_steps.rb +1 -7
- data/lib/briar.rb +2 -0
- data/lib/briar/alerts_and_sheets/alert_view.rb +17 -1
- data/lib/briar/bars/navbar.rb +16 -12
- data/lib/briar/bars/tabbar.rb +16 -4
- data/lib/briar/briar_core.rb +9 -3
- data/lib/briar/briar_steps.rb +19 -18
- data/lib/briar/control/button.rb +0 -1
- data/lib/briar/cucumber.rb +2 -0
- data/lib/briar/email.rb +34 -19
- data/lib/briar/keyboard.rb +25 -25
- data/lib/briar/picker/date_picker.rb +152 -107
- data/lib/briar/table.rb +18 -21
- data/lib/briar/version.rb +1 -1
- data/run-tests.sh +4 -0
- metadata +46 -20
@@ -2,8 +2,24 @@ require 'calabash-cucumber'
|
|
2
2
|
|
3
3
|
module Briar
|
4
4
|
module Alerts_and_Sheets
|
5
|
+
def alert_exists? (alert_id)
|
6
|
+
!query("alertView marked:'#{alert_id}'").empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
def should_see_alert (alert_id)
|
10
|
+
unless alert_exists? alert_id
|
11
|
+
screenshot_and_raise "should see alert view marked '#{alert_id}'"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def should_not_see_alert (alert_id)
|
16
|
+
if alert_exists? alert_id
|
17
|
+
screenshot_and_raise "should not see alert view marked '#{alert_id}'"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
5
21
|
def alert_button_exists? (button_id)
|
6
|
-
query(
|
22
|
+
query('alertView child button child label', :text).include?(button_id)
|
7
23
|
end
|
8
24
|
|
9
25
|
def should_see_alert_button (button_id)
|
data/lib/briar/bars/navbar.rb
CHANGED
@@ -7,25 +7,25 @@ module Briar
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def navbar_has_back_button?
|
10
|
-
|
10
|
+
!query('navigationItemButtonView').empty?
|
11
11
|
end
|
12
12
|
|
13
13
|
def should_see_navbar_back_button
|
14
14
|
unless navbar_has_back_button?
|
15
|
-
screenshot_and_raise
|
15
|
+
screenshot_and_raise 'there is no navigation bar back button'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def should_not_see_navbar_back_button
|
20
20
|
if navbar_has_back_button?
|
21
|
-
screenshot_and_raise
|
21
|
+
screenshot_and_raise 'i should not see navigation bar back button'
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
|
26
26
|
# will not work to detect left/right buttons
|
27
27
|
def index_of_navbar_button (name)
|
28
|
-
titles = query(
|
28
|
+
titles = query('navigationButton', :accessibilityLabel)
|
29
29
|
titles.index(name)
|
30
30
|
end
|
31
31
|
|
@@ -44,22 +44,22 @@ module Briar
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def date_is_in_navbar (date)
|
47
|
-
with_leading = date.strftime(
|
47
|
+
with_leading = date.strftime('%a %b %d')
|
48
48
|
without_leading = date.strftime("%a %b #{date.day}")
|
49
|
-
items = query(
|
49
|
+
items = query('navigationItemView', :accessibilityLabel)
|
50
50
|
items.include?(with_leading) || items.include?(without_leading)
|
51
51
|
end
|
52
52
|
|
53
53
|
|
54
54
|
def go_back_after_waiting
|
55
55
|
wait_for_animation
|
56
|
-
touch(
|
56
|
+
touch('navigationItemButtonView first')
|
57
57
|
step_pause
|
58
58
|
end
|
59
59
|
|
60
60
|
def go_back_and_wait_for_view (view)
|
61
61
|
wait_for_animation
|
62
|
-
touch_transition(
|
62
|
+
touch_transition('navigationItemButtonView first',
|
63
63
|
"view marked:'#{view}'",
|
64
64
|
{:timeout=>TOUCH_TRANSITION_TIMEOUT,
|
65
65
|
:retry_frequency=>TOUCH_TRANSITION_RETRY_FREQ})
|
@@ -73,7 +73,7 @@ module Briar
|
|
73
73
|
touch("navigationButton index:#{idx}")
|
74
74
|
step_pause
|
75
75
|
else
|
76
|
-
screenshot_and_raise "could not find navbar item #{name}"
|
76
|
+
screenshot_and_raise "could not find navbar item '#{name}'"
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -88,17 +88,21 @@ module Briar
|
|
88
88
|
end
|
89
89
|
|
90
90
|
|
91
|
-
def navbar_has_title (title)
|
91
|
+
def navbar_has_title? (title)
|
92
92
|
wait_for_animation
|
93
93
|
query('navigationItemView', :accessibilityLabel).include?(title)
|
94
94
|
end
|
95
95
|
|
96
|
-
def
|
97
|
-
unless navbar_has_title title
|
96
|
+
def should_see_navbar_with_title(title)
|
97
|
+
unless navbar_has_title? title
|
98
98
|
screenshot_and_raise "after waiting, i did not see navbar with title #{title}"
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
+
|
103
|
+
def navbar_should_have_title(title)
|
104
|
+
pending "deprecated 0.0.6 - use should_see_navbar_with_title '#{title}'"
|
105
|
+
end
|
102
106
|
end
|
103
107
|
end
|
104
108
|
|
data/lib/briar/bars/tabbar.rb
CHANGED
@@ -3,12 +3,18 @@ require 'calabash-cucumber'
|
|
3
3
|
module Briar
|
4
4
|
module Bars
|
5
5
|
def tabbar_visible?
|
6
|
-
element_exists(
|
6
|
+
element_exists('tabBar')
|
7
7
|
end
|
8
8
|
|
9
9
|
def should_see_tabbar
|
10
10
|
unless tabbar_visible?
|
11
|
-
screenshot_and_raise
|
11
|
+
screenshot_and_raise 'i should see the tabbar'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def should_not_see_tabbar
|
16
|
+
if tabbar_visible?
|
17
|
+
screenshot_and_raise 'i should not see the tabbar'
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
@@ -29,9 +35,15 @@ module Briar
|
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
32
|
-
def
|
38
|
+
def should_see_tab_at_index(name, index)
|
33
39
|
tabs = query('tabBarButton', :accessibilityLabel)
|
34
|
-
tabs.index(name) == index.to_i
|
40
|
+
unless tabs.index(name) == index.to_i
|
41
|
+
screenshot_and_raise "should have seen tab named '#{name}' at index '#{index}' but found these: '#{tabs}'"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def tabbar_item_is_at_index(name, index)
|
46
|
+
pending "deprecated 0.0.6 - use should_see_tab_at_index '#{name}', '#{index}'"
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
data/lib/briar/briar_core.rb
CHANGED
@@ -20,7 +20,13 @@ module Briar
|
|
20
20
|
|
21
21
|
def should_see_view (view_id)
|
22
22
|
unless view_exists? view_id
|
23
|
-
screenshot_and_raise "
|
23
|
+
screenshot_and_raise "should see view with id '#{view_id}'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def should_not_see_view (view_id)
|
28
|
+
if view_exists? view_id
|
29
|
+
screenshot_and_raise "should not see view with id '#{view_id}'"
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
@@ -37,14 +43,14 @@ module Briar
|
|
37
43
|
def should_not_see_view_after_animation (view_id)
|
38
44
|
wait_for_animation
|
39
45
|
if view_exists? view_id
|
40
|
-
screenshot_and_raise "
|
46
|
+
screenshot_and_raise "should not see view with id '#{view_id}'"
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
44
50
|
def should_see_view_with_text (text)
|
45
51
|
res = view_exists_with_text? text
|
46
52
|
unless res
|
47
|
-
screenshot_and_raise "
|
53
|
+
screenshot_and_raise "should see view with text '#{text}'"
|
48
54
|
end
|
49
55
|
end
|
50
56
|
|
data/lib/briar/briar_steps.rb
CHANGED
@@ -1,26 +1,27 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'briar_core_steps')
|
2
2
|
|
3
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
4
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
3
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'alerts_and_sheets', 'action_sheet_steps')
|
4
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'alerts_and_sheets', 'alert_view_steps')
|
5
5
|
|
6
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
7
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
8
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
6
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'bars', 'tabbar_steps')
|
7
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'bars', 'navbar_steps')
|
8
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'bars', 'toolbar_steps')
|
9
9
|
|
10
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
11
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
12
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
10
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'control', 'button_steps')
|
11
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'control', 'segmented_control_steps')
|
12
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'control', 'slider_steps')
|
13
13
|
|
14
14
|
|
15
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
16
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
15
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'picker', 'picker_steps')
|
16
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'picker', 'date_picker_steps')
|
17
17
|
|
18
18
|
|
19
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
20
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
21
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
22
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
23
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
19
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'email_steps')
|
20
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'image_view_steps')
|
21
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'keyboard_steps')
|
22
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'label_steps')
|
23
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'scroll_view_steps')
|
24
24
|
|
25
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
26
|
-
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions',
|
25
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'table_steps')
|
26
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'text_field_steps')
|
27
|
+
require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', 'text_view_steps')
|
data/lib/briar/control/button.rb
CHANGED
data/lib/briar/cucumber.rb
CHANGED
data/lib/briar/email.rb
CHANGED
@@ -2,56 +2,71 @@ require 'calabash-cucumber'
|
|
2
2
|
|
3
3
|
module Briar
|
4
4
|
module Email
|
5
|
-
|
5
|
+
|
6
|
+
def email_body
|
7
|
+
query("view:'MFComposeTextContentView'", :text)
|
8
|
+
end
|
9
|
+
|
10
|
+
def email_body_contains? (text)
|
6
11
|
if gestalt.is_ios6?
|
7
|
-
puts
|
12
|
+
puts 'WARN: cannot test for email body text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion'
|
8
13
|
else
|
9
|
-
|
10
|
-
actual_tokens.include?(text)
|
14
|
+
!query("view:'MFComposeTextContentView' {text LIKE '*#{text}*'}").empty?
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
18
|
+
def email_subject
|
19
|
+
query("view:'MFComposeSubjectView'", :text).first
|
20
|
+
end
|
21
|
+
|
14
22
|
def email_subject_is? (text)
|
15
23
|
if gestalt.is_ios6?
|
16
|
-
puts
|
24
|
+
puts 'WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion'
|
17
25
|
else
|
18
|
-
|
19
|
-
actual.length == 1 && actual.first.eql?(text)
|
26
|
+
email_subject.eql? text
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
23
30
|
def email_subject_has_text_like? (text)
|
24
31
|
if gestalt.is_ios6?
|
25
|
-
puts
|
32
|
+
puts 'WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion'
|
26
33
|
else
|
27
|
-
!query("view
|
34
|
+
!query("view:'MFComposeSubjectView' {text LIKE '*#{text}*'}").empty?
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
38
|
+
def email_to
|
39
|
+
query("view:'_MFMailRecipientTextField'", :text).first
|
40
|
+
end
|
41
|
+
|
31
42
|
def email_to_field_is? (text)
|
32
43
|
if gestalt.is_ios6?
|
33
44
|
puts "WARN: iOS6 detected - cannot test for email 'to' field on iOS simulator or devices"
|
34
45
|
else
|
35
|
-
|
36
|
-
actual.length == 1 && actual.first.eql?(text)
|
46
|
+
email_to.eql? text
|
37
47
|
end
|
38
48
|
end
|
39
49
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
def email_to_contains? (address)
|
51
|
+
addrs = email_to.split(/, ?/)
|
52
|
+
addrs.include? address
|
53
|
+
end
|
54
|
+
|
55
|
+
def is_ios5_mail_view
|
56
|
+
query("layoutContainerView descendant view:'MFMailComposeView'").count == 1
|
44
57
|
end
|
45
58
|
|
46
|
-
def is_ios6_mail_view
|
47
|
-
|
48
|
-
|
59
|
+
def is_ios6_mail_view
|
60
|
+
gestalt.is_ios6?
|
61
|
+
# sometimes this is returning false
|
62
|
+
# access_ids = query("view", :accessibilityIdentifier)
|
63
|
+
# access_ids.member?("RemoteViewBridge")
|
49
64
|
end
|
50
65
|
|
51
66
|
def should_see_mail_view
|
52
67
|
wait_for_animation
|
53
68
|
unless is_ios5_mail_view || is_ios6_mail_view
|
54
|
-
screenshot_and_raise
|
69
|
+
screenshot_and_raise 'expected to see email view'
|
55
70
|
end
|
56
71
|
end
|
57
72
|
end
|
data/lib/briar/keyboard.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'calabash-cucumber'
|
2
2
|
|
3
3
|
module Briar
|
4
4
|
module Keyboard
|
@@ -15,37 +15,37 @@ module Briar
|
|
15
15
|
|
16
16
|
|
17
17
|
def should_see_keyboard
|
18
|
-
res = element_exists(
|
18
|
+
res = element_exists('keyboardAutomatic')
|
19
19
|
unless res
|
20
|
-
screenshot_and_raise
|
20
|
+
screenshot_and_raise 'Expected keyboard to be visible.'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def should_not_see_keyboard
|
25
|
-
res = element_exists(
|
25
|
+
res = element_exists('keyboardAutomatic')
|
26
26
|
if res
|
27
|
-
screenshot_and_raise
|
27
|
+
screenshot_and_raise 'Expected keyboard to not be visible.'
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# is it possible to find what view the keyboard is responding to?
|
32
32
|
def autocapitalization_type ()
|
33
|
-
if !query(
|
34
|
-
query(
|
35
|
-
elsif !query(
|
36
|
-
query(
|
33
|
+
if !query('textView index:0').empty?
|
34
|
+
query('textView index:0', :autocapitalizationType).first.to_i
|
35
|
+
elsif !query('textField index:0').empty?
|
36
|
+
query('textField index:0', :autocapitalizationType).first.to_i
|
37
37
|
else
|
38
|
-
screenshot_and_raise
|
38
|
+
screenshot_and_raise 'could not find a text view or text field'
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def set_autocapitalization (type)
|
43
|
-
if !query(
|
44
|
-
query(
|
45
|
-
elsif !query(
|
46
|
-
query(
|
43
|
+
if !query('textView index:0').empty?
|
44
|
+
query('textView index:0', [{setAutocapitalizationType:type}])
|
45
|
+
elsif !query('textField index:0').empty?
|
46
|
+
query('textField index:0', [{setAutocapitalizationType:type}])
|
47
47
|
else
|
48
|
-
screenshot_and_raise
|
48
|
+
screenshot_and_raise 'could not find a text view or text field'
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -54,12 +54,12 @@ module Briar
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def set_autocorrect (type)
|
57
|
-
if !query(
|
58
|
-
query(
|
59
|
-
elsif !query(
|
60
|
-
query(
|
57
|
+
if !query('textView index:0').empty?
|
58
|
+
query('textView index:0', [{setAutocorrectionType:type}])
|
59
|
+
elsif !query('textField index:0').empty?
|
60
|
+
query('textField index:0', [{setAutocorrectionType:type}])
|
61
61
|
else
|
62
|
-
screenshot_and_raise
|
62
|
+
screenshot_and_raise 'could not find a text view or text field'
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -68,12 +68,12 @@ module Briar
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def turn_spell_correct_off
|
71
|
-
if !query(
|
72
|
-
query(
|
73
|
-
elsif !query(
|
74
|
-
query(
|
71
|
+
if !query('textView index:0').empty?
|
72
|
+
query('textView index:0', [{setSpellCheckingType:UITextSpellCheckingTypeNo}])
|
73
|
+
elsif !query('textField index:0').empty?
|
74
|
+
query('textField index:0', [{setSpellCheckingType:UITextSpellCheckingTypeNo}])
|
75
75
|
else
|
76
|
-
screenshot_and_raise
|
76
|
+
screenshot_and_raise 'could not find a text view or text field'
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -1,6 +1,49 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'calabash-cucumber'
|
3
3
|
|
4
|
+
# 0.2 is too fast because the picker does not pause at the date long enough for
|
5
|
+
# the date to change. 0.3 seems to work, but 0.4 is best i think.
|
6
|
+
PICKER_STEP_PAUSE = 0.4.to_f
|
7
|
+
PICKER_AM = 'AM'
|
8
|
+
PICKER_PM = 'PM'
|
9
|
+
|
10
|
+
# most locales and situations prefer _not_ to have leading zeros on hours in 24h
|
11
|
+
# see usage below to find out when and if the zeros are stripped
|
12
|
+
PICKER_24H_TIME_FMT = '%H:%M'
|
13
|
+
PICKER_12H_TIME_FMT = '%l:%M %p'
|
14
|
+
PICKER_ISO8601_TIME_FMT = '%H:%M'
|
15
|
+
|
16
|
+
PICKER_REMOVE_LEADING_ZERO_REGEX = /\A^0/
|
17
|
+
|
18
|
+
# 24h locales - Fri 16 Nov - 24h locales
|
19
|
+
PICKER_24H_DATE_FMT = '%a %e %b'
|
20
|
+
# common format for US Fri Nov 16
|
21
|
+
PICKER_12H_DATE_FMT = '%a %b %e'
|
22
|
+
|
23
|
+
# our canonical format for testing if two dates are the same
|
24
|
+
PICKER_ISO8601_DATE_FMT = '%Y-%m-%d'
|
25
|
+
PICKER_ISO8601_DATE_TIME_FMT = '%Y-%m-%d %H:%M'
|
26
|
+
|
27
|
+
# when we are using the date picker category, this is the format of the string
|
28
|
+
# we will send to setDateWithString:animated:
|
29
|
+
#
|
30
|
+
# ex. 2012_11_18_16_45
|
31
|
+
PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT_ZONED = '%Y_%m_%d_%H_%M_%z'
|
32
|
+
PICKER__OBJC___SET_PICKER_DATE__DATE_AND_TIME_FMT_ZONED = 'yyyy_MM_dd_HH_mm_Z'
|
33
|
+
PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT = '%Y_%m_%d_%H_%M'
|
34
|
+
PICKER__OBJC___SET_PICKER_DATE__DATE_AND_TIME_FMT = 'yyyy_MM_dd_HH_mm'
|
35
|
+
|
36
|
+
|
37
|
+
# iOS 5
|
38
|
+
PICKER_VIEW_CLASS_IOS5 = 'datePickerView'
|
39
|
+
PICKER_VIEW_CLASS_IOS6 = "view:'_UIDatePickerView'"
|
40
|
+
|
41
|
+
UIDatePickerModeTime = 0
|
42
|
+
UIDatePickerModeDate = 1
|
43
|
+
UIDatePickerModeDateAndTime = 2
|
44
|
+
UIDatePickerModeCountDownTimer = 3
|
45
|
+
|
46
|
+
|
4
47
|
module Briar
|
5
48
|
module Picker
|
6
49
|
module Date
|
@@ -102,39 +145,39 @@ to use the automatic mode, include this category in your CALABASH target
|
|
102
145
|
|
103
146
|
=end
|
104
147
|
|
105
|
-
|
106
|
-
|
107
|
-
PICKER_STEP_PAUSE = 0.4.to_f
|
108
|
-
PICKER_AM =
|
109
|
-
PICKER_PM =
|
110
|
-
|
111
|
-
# most locales and situations prefer _not_ to have leading zeros on hours in 24h
|
112
|
-
# see usage below to find out when and if the zeros are stripped
|
113
|
-
PICKER_24H_TIME_FMT = '%H:%M'
|
114
|
-
PICKER_12H_TIME_FMT = '%l:%M %p'
|
115
|
-
PICKER_ISO8601_TIME_FMT = '%H:%M'
|
116
|
-
|
117
|
-
PICKER_REMOVE_LEADING_ZERO_REGEX = /\A^0/
|
118
|
-
|
119
|
-
# 24h locales - Fri 16 Nov - 24h locales
|
120
|
-
PICKER_24H_DATE_FMT = '%a %e %b'
|
121
|
-
# common format for US Fri Nov 16
|
122
|
-
PICKER_12H_DATE_FMT = '%a %b %e'
|
123
|
-
|
124
|
-
# our canonical format for testing if two dates are the same
|
125
|
-
PICKER_ISO8601_DATE_FMT = '%Y-%m-%d'
|
126
|
-
PICKER_ISO8601_DATE_TIME_FMT = '%Y-%m-%d %H:%M'
|
127
|
-
|
128
|
-
# when we are using the date picker category, this is the format of the string
|
129
|
-
# we will send to setDateWithString:animated:
|
148
|
+
## 0.2 is too fast because the picker does not pause at the date long enough for
|
149
|
+
## the date to change. 0.3 seems to work, but 0.4 is best i think.
|
150
|
+
# PICKER_STEP_PAUSE = 0.4.to_f
|
151
|
+
# PICKER_AM = 'AM'
|
152
|
+
# PICKER_PM = 'PM'
|
130
153
|
#
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
#
|
136
|
-
|
137
|
-
|
154
|
+
## most locales and situations prefer _not_ to have leading zeros on hours in 24h
|
155
|
+
## see usage below to find out when and if the zeros are stripped
|
156
|
+
# PICKER_24H_TIME_FMT = '%H:%M'
|
157
|
+
# PICKER_12H_TIME_FMT = '%l:%M %p'
|
158
|
+
# PICKER_ISO8601_TIME_FMT = '%H:%M'
|
159
|
+
#
|
160
|
+
# PICKER_REMOVE_LEADING_ZERO_REGEX = /\A^0/
|
161
|
+
#
|
162
|
+
## 24h locales - Fri 16 Nov - 24h locales
|
163
|
+
# PICKER_24H_DATE_FMT = '%a %e %b'
|
164
|
+
## common format for US Fri Nov 16
|
165
|
+
# PICKER_12H_DATE_FMT = '%a %b %e'
|
166
|
+
#
|
167
|
+
## our canonical format for testing if two dates are the same
|
168
|
+
# PICKER_ISO8601_DATE_FMT = '%Y-%m-%d'
|
169
|
+
# PICKER_ISO8601_DATE_TIME_FMT = '%Y-%m-%d %H:%M'
|
170
|
+
#
|
171
|
+
## when we are using the date picker category, this is the format of the string
|
172
|
+
## we will send to setDateWithString:animated:
|
173
|
+
##
|
174
|
+
## ex. 2012_11_18_16_45
|
175
|
+
# PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT = '%Y_%m_%d_%H_%M_%z'
|
176
|
+
# PICKER__OBJC___SET_PICKER_DATE__DATE_AND_TIME_FMT = 'yyyy_MM_dd_HH_mm_Z'
|
177
|
+
#
|
178
|
+
## iOS 5
|
179
|
+
# PICKER_VIEW_CLASS_IOS5 = 'datePickerView'
|
180
|
+
# PICKER_VIEW_CLASS_IOS6 = "view:'_UIDatePickerView'"
|
138
181
|
|
139
182
|
# testing for existence
|
140
183
|
def should_see_date_picker (picker_id)
|
@@ -147,24 +190,24 @@ to use the automatic mode, include this category in your CALABASH target
|
|
147
190
|
# getting dates from the picker
|
148
191
|
|
149
192
|
def picker_date_time
|
150
|
-
res = query(
|
151
|
-
screenshot_and_raise
|
193
|
+
res = query('datePicker', :date)
|
194
|
+
screenshot_and_raise 'expected to see a date picker' if res.empty?
|
152
195
|
DateTime.parse(res.first)
|
153
196
|
end
|
154
197
|
|
155
198
|
# appledoc ==> The property is an NSDate object or nil (the default), which
|
156
199
|
# means no maximum date.
|
157
200
|
def picker_maximum_date_time
|
158
|
-
res = query(
|
159
|
-
screenshot_and_raise
|
201
|
+
res = query('datePicker', :maximumDate)
|
202
|
+
screenshot_and_raise 'expected to see a date picker' if res.empty?
|
160
203
|
res.first != nil ? DateTime.parse(res.first) : nil
|
161
204
|
end
|
162
205
|
|
163
206
|
# appledoc ==> The property is an NSDate object or nil (the default), which
|
164
207
|
# means no minimum date.
|
165
208
|
def picker_minimum_date_time
|
166
|
-
res = query(
|
167
|
-
screenshot_and_raise
|
209
|
+
res = query('datePicker', :minimumDate)
|
210
|
+
screenshot_and_raise 'expected to see a date picker' if res.empty?
|
168
211
|
res.first != nil ? DateTime.parse(res.first) : nil
|
169
212
|
end
|
170
213
|
|
@@ -173,9 +216,9 @@ to use the automatic mode, include this category in your CALABASH target
|
|
173
216
|
# checking to see if the picker is visible and has the calabash category
|
174
217
|
# additions
|
175
218
|
def picker_has_calabash_additions
|
176
|
-
success_value =
|
177
|
-
res = query(
|
178
|
-
screenshot_and_raise
|
219
|
+
success_value = '1'
|
220
|
+
res = query('datePicker', [{hasCalabashAdditions:success_value}])
|
221
|
+
screenshot_and_raise 'picker is not visible' if res.empty?
|
179
222
|
res.first.eql? success_value
|
180
223
|
end
|
181
224
|
|
@@ -188,40 +231,43 @@ to use the automatic mode, include this category in your CALABASH target
|
|
188
231
|
!date_str[-1, 1].scan(/^[a-zA-Z]/).empty?
|
189
232
|
end
|
190
233
|
|
191
|
-
def date_str_to_send_to_picker_from_time_str (time_str)
|
234
|
+
def date_str_to_send_to_picker_from_time_str (time_str, format=PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT)
|
192
235
|
time_in_24h = date_time_or_time_str_is_in_24h time_str
|
193
236
|
time_fmt = time_in_24h ? PICKER_24H_TIME_FMT : PICKER_12H_TIME_FMT
|
194
237
|
date_fmt = time_in_24h ? PICKER_24H_DATE_FMT : PICKER_12H_DATE_FMT
|
195
|
-
date_str = picker_date_time.strftime(date_fmt).squeeze(
|
238
|
+
date_str = picker_date_time.strftime(date_fmt).squeeze(' ').strip
|
196
239
|
|
197
240
|
date_time_str = "#{date_str} #{time_str}"
|
198
241
|
date_time_fmt = "#{date_fmt} #{time_fmt}"
|
199
242
|
|
200
243
|
date_time = DateTime.strptime(date_time_str, date_time_fmt)
|
201
|
-
date_time.strftime(
|
244
|
+
date_time.strftime(format).squeeze(' ').strip
|
202
245
|
end
|
203
246
|
|
204
247
|
|
205
|
-
def date_str_to_send_to_picker_from_date_str (date_str)
|
248
|
+
def date_str_to_send_to_picker_from_date_str (date_str, format=PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT)
|
206
249
|
date_in_24h = date_str_is_in_24h (date_str)
|
207
250
|
time_fmt = date_in_24h ? PICKER_24H_TIME_FMT : PICKER_12H_TIME_FMT
|
208
251
|
date_fmt = date_in_24h ? PICKER_24H_DATE_FMT : PICKER_12H_DATE_FMT
|
209
|
-
time_str = picker_date_time.strftime(time_fmt).squeeze(
|
252
|
+
time_str = picker_date_time.strftime(time_fmt).squeeze(' ').strip
|
210
253
|
date_time_str = "#{date_str} #{time_str}"
|
211
254
|
date_time_fmt = "#{date_fmt} #{time_fmt}"
|
255
|
+
|
212
256
|
date_time = DateTime.strptime(date_time_str, date_time_fmt)
|
213
|
-
|
257
|
+
|
258
|
+
date_time.strftime(format).squeeze(' ').strip
|
214
259
|
end
|
215
260
|
|
216
261
|
|
217
|
-
def set_picker_date_with_date_time_str (date_time_str, animated
|
218
|
-
|
262
|
+
def set_picker_date_with_date_time_str (date_time_str, opts={:animated => 1,
|
263
|
+
:objc_format => PICKER__OBJC___SET_PICKER_DATE__DATE_AND_TIME_FMT})
|
264
|
+
query('datePicker', [{respondsToSelector: 'minuteInterval'}])
|
219
265
|
|
266
|
+
res = query('datePicker', [{setDateWithString:date_time_str},
|
267
|
+
{format:"#{opts[:objc_format]}"},
|
268
|
+
{animated:opts[:animated]}])
|
220
269
|
|
221
|
-
|
222
|
-
{format:"#{PICKER__OBJC___SET_PICKER_DATE__DATE_AND_TIME_FMT}"},
|
223
|
-
{animated:animated.to_i}])
|
224
|
-
screenshot_and_raise "could not find a date picker to query" if res.empty?
|
270
|
+
screenshot_and_raise 'could not find a date picker to query' if res.empty?
|
225
271
|
if res.first.to_i == 0
|
226
272
|
screenshot_and_raise "could not set the picker date with '#{date_time_str}' and '#{PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT}'"
|
227
273
|
end
|
@@ -232,17 +278,19 @@ to use the automatic mode, include this category in your CALABASH target
|
|
232
278
|
# the query does not create a UIControlEventValueChanged event, so we have to
|
233
279
|
# to a touch event
|
234
280
|
|
281
|
+
# not true :(
|
235
282
|
# if the picker is in time mode, then we dont need to worry about min/max
|
283
|
+
|
236
284
|
# if the picker is date or date time mode, i think the first column is
|
237
285
|
# always scrollable up _and_ it sends an event even if the date is beyond
|
238
286
|
# the maximum date
|
239
|
-
|
287
|
+
#
|
240
288
|
#picker_max_date = picker_maximum_date_time
|
241
289
|
#picker_min_date = picker_minimum_date_time
|
242
290
|
#target_date = DateTime.strptime(date_time_str, PICKER__RUBY___SET_PICKER_DATE__DATE_AND_TIME_FMT)
|
243
|
-
|
291
|
+
#
|
244
292
|
#column_one_index = picker_current_index_for_column 0
|
245
|
-
#query(
|
293
|
+
#query('pickerTableView index:0', [{selectRow:column_one_index}, {animated:1}, {notify:1}])
|
246
294
|
|
247
295
|
picker_scroll_down_on_column 0
|
248
296
|
sleep(PICKER_STEP_PAUSE)
|
@@ -268,10 +316,10 @@ to use the automatic mode, include this category in your CALABASH target
|
|
268
316
|
# if it is not, the default value is used. The default and minimum values are 1;
|
269
317
|
# the maximum value is 30.
|
270
318
|
def picker_minute_interval
|
271
|
-
screenshot_and_raise
|
272
|
-
screenshot_and_raise
|
273
|
-
res = query(
|
274
|
-
screenshot_and_raise
|
319
|
+
screenshot_and_raise 'there is no minute in date mode' if picker_is_in_date_mode
|
320
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
321
|
+
res = query('datePicker', :minuteInterval)
|
322
|
+
screenshot_and_raise 'expected to see a date picker' if res.empty?
|
275
323
|
@picker_minute_interval = res.first
|
276
324
|
end
|
277
325
|
|
@@ -290,21 +338,18 @@ to use the automatic mode, include this category in your CALABASH target
|
|
290
338
|
end while ((minute % interval) != 0)
|
291
339
|
time = time + (count * 60)
|
292
340
|
|
293
|
-
{:h12 => time.strftime(PICKER_12H_TIME_FMT).squeeze(
|
294
|
-
:h24 => time.strftime(PICKER_24H_TIME_FMT).squeeze(
|
341
|
+
{:h12 => time.strftime(PICKER_12H_TIME_FMT).squeeze(' ').strip,
|
342
|
+
:h24 => time.strftime(PICKER_24H_TIME_FMT).squeeze(' ').strip.sub(PICKER_REMOVE_LEADING_ZERO_REGEX, ''),
|
295
343
|
:time => time}
|
296
344
|
end
|
297
345
|
|
298
346
|
# picker modes
|
299
347
|
|
300
|
-
|
301
|
-
UIDatePickerModeDate = 1
|
302
|
-
UIDatePickerModeDateAndTime = 2
|
303
|
-
UIDatePickerModeCountDownTimer = 3
|
348
|
+
|
304
349
|
|
305
350
|
def picker_mode
|
306
|
-
res = query(
|
307
|
-
screenshot_and_raise
|
351
|
+
res = query('datePicker', :datePickerMode)
|
352
|
+
screenshot_and_raise 'expected to see a date picker' if res.empty?
|
308
353
|
res.first
|
309
354
|
end
|
310
355
|
|
@@ -327,27 +372,27 @@ to use the automatic mode, include this category in your CALABASH target
|
|
327
372
|
# columns for different modes
|
328
373
|
|
329
374
|
def picker_column_for_hour
|
330
|
-
screenshot_and_raise
|
331
|
-
screenshot_and_raise
|
375
|
+
screenshot_and_raise 'there is no hour column in date mode' if picker_is_in_date_mode
|
376
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
332
377
|
picker_is_in_time_mode ? 0 : 1
|
333
378
|
end
|
334
379
|
|
335
380
|
def picker_column_for_minute
|
336
|
-
screenshot_and_raise
|
337
|
-
screenshot_and_raise
|
381
|
+
screenshot_and_raise 'there is no minute column in date mode' if picker_is_in_date_mode
|
382
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
338
383
|
picker_is_in_time_mode ? 1 : 2
|
339
384
|
end
|
340
385
|
|
341
386
|
def picker_column_for_period
|
342
|
-
screenshot_and_raise
|
343
|
-
screenshot_and_raise
|
387
|
+
screenshot_and_raise 'there is no period column in date mode' if picker_is_in_date_mode
|
388
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
344
389
|
picker_is_in_time_mode ? 2 : 3
|
345
390
|
end
|
346
391
|
|
347
392
|
# 12h or 24h locale
|
348
393
|
|
349
394
|
def picker_is_in_12h_locale
|
350
|
-
screenshot_and_raise
|
395
|
+
screenshot_and_raise '12h/24h mode is not applicable to this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
351
396
|
column = picker_column_for_period
|
352
397
|
!query("pickerTableView index:#{column}").empty?
|
353
398
|
end
|
@@ -362,42 +407,42 @@ to use the automatic mode, include this category in your CALABASH target
|
|
362
407
|
# pt (lisbon) - a.m./p.m.
|
363
408
|
# de - nach/vor
|
364
409
|
def picker_period
|
365
|
-
screenshot_and_raise
|
410
|
+
screenshot_and_raise 'picker is not in 12h mode' if picker_is_in_24h_locale
|
366
411
|
date = picker_date_time
|
367
412
|
date_str = date.strftime(PICKER_12H_TIME_FMT)
|
368
|
-
tokens = date_str.split(
|
413
|
+
tokens = date_str.split(' ')
|
369
414
|
tokens.last
|
370
415
|
end
|
371
416
|
|
372
417
|
def picker_period_is_am?
|
373
|
-
picker_period.eql?(
|
418
|
+
picker_period.eql?('AM')
|
374
419
|
end
|
375
420
|
|
376
421
|
def picker_period_is_pm?
|
377
|
-
picker_period.eql?(
|
422
|
+
picker_period.eql?('PM')
|
378
423
|
end
|
379
424
|
|
380
425
|
# weekday, month, day, etc
|
381
426
|
|
382
427
|
def picker_weekday
|
383
|
-
screenshot_and_raise
|
384
|
-
res = query(
|
428
|
+
screenshot_and_raise 'weekday is not applicable to this mode' if picker_is_in_time_mode or picker_is_in_countdown_mode
|
429
|
+
res = query('datePickerWeekMonthDayView', :weekdayLabel, :text)[2]
|
385
430
|
# need to guard against Today showing
|
386
431
|
res == nil ? Date.today.strftime('%a') : res
|
387
432
|
end
|
388
433
|
|
389
434
|
def picker_month_day
|
390
|
-
screenshot_and_raise
|
391
|
-
res = query(
|
392
|
-
picker_iso = picker_date_time.strftime(PICKER_ISO8601_DATE_FMT).squeeze(
|
435
|
+
screenshot_and_raise 'month/day is not applicable to this mode' if picker_is_in_time_mode or picker_is_in_countdown_mode
|
436
|
+
res = query('datePickerWeekMonthDayView', :dateLabel, :text)[2]
|
437
|
+
picker_iso = picker_date_time.strftime(PICKER_ISO8601_DATE_FMT).squeeze(' ').strip
|
393
438
|
today = Date.today
|
394
|
-
today_iso = today.strftime(PICKER_ISO8601_DATE_FMT).squeeze(
|
439
|
+
today_iso = today.strftime(PICKER_ISO8601_DATE_FMT).squeeze(' ').strip
|
395
440
|
fmt = picker_is_in_24h_locale ? '%e %b' : '%b %e'
|
396
441
|
(picker_iso.eql? today_iso) ? today.strftime(fmt) : res
|
397
442
|
end
|
398
443
|
|
399
444
|
def picker_date_str
|
400
|
-
"#{picker_weekday} #{picker_month_day}".strip.squeeze(
|
445
|
+
"#{picker_weekday} #{picker_month_day}".strip.squeeze(' ')
|
401
446
|
end
|
402
447
|
|
403
448
|
def picker_weekday_month_day_is (weekday_month_day)
|
@@ -407,7 +452,7 @@ to use the automatic mode, include this category in your CALABASH target
|
|
407
452
|
# dealing with time
|
408
453
|
|
409
454
|
def picker_hour_24h
|
410
|
-
screenshot_and_raise
|
455
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
411
456
|
# query always returns as 24h
|
412
457
|
res_ios5 = query(PICKER_VIEW_CLASS_IOS5, :hour).first
|
413
458
|
res_ios6 = query(PICKER_VIEW_CLASS_IOS6, :hour).first
|
@@ -416,19 +461,19 @@ to use the automatic mode, include this category in your CALABASH target
|
|
416
461
|
end
|
417
462
|
|
418
463
|
def picker_hour_24h_str
|
419
|
-
screenshot_and_raise
|
420
|
-
|
464
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
465
|
+
'%02d' % picker_hour_24h
|
421
466
|
end
|
422
467
|
|
423
468
|
def picker_hour_12h
|
424
|
-
screenshot_and_raise
|
469
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
425
470
|
hour_24h = picker_hour_24h
|
426
471
|
return 12 if hour_24h == 0
|
427
472
|
hour_24h > 12 ? hour_24h - 12 : hour_24h
|
428
473
|
end
|
429
474
|
|
430
475
|
def picker_hour_12h_str
|
431
|
-
screenshot_and_raise
|
476
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
432
477
|
"#{picker_hour_12h}"
|
433
478
|
end
|
434
479
|
|
@@ -445,7 +490,7 @@ to use the automatic mode, include this category in your CALABASH target
|
|
445
490
|
end
|
446
491
|
|
447
492
|
def picker_minute
|
448
|
-
screenshot_and_raise
|
493
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
449
494
|
res_ios5 = query(PICKER_VIEW_CLASS_IOS5, :minute).first
|
450
495
|
res_ios6 = query(PICKER_VIEW_CLASS_IOS6, :minute).first
|
451
496
|
return res_ios5 != nil ? res_ios5 : res_ios6
|
@@ -453,8 +498,8 @@ to use the automatic mode, include this category in your CALABASH target
|
|
453
498
|
end
|
454
499
|
|
455
500
|
def picker_minute_str
|
456
|
-
screenshot_and_raise
|
457
|
-
|
501
|
+
screenshot_and_raise 'hour is not applicable to this mode' if picker_is_in_countdown_mode or picker_is_in_date_mode
|
502
|
+
'%02d' % picker_minute
|
458
503
|
#"%02d" % query("datePickerView", :minute).first
|
459
504
|
end
|
460
505
|
|
@@ -463,35 +508,35 @@ to use the automatic mode, include this category in your CALABASH target
|
|
463
508
|
end
|
464
509
|
|
465
510
|
def picker_time_24h_str
|
466
|
-
screenshot_and_raise
|
467
|
-
"#{picker_hour_24h_str}:#{picker_minute_str}".strip.sub(PICKER_REMOVE_LEADING_ZERO_REGEX,
|
511
|
+
screenshot_and_raise 'the time is not applicable for this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
512
|
+
"#{picker_hour_24h_str}:#{picker_minute_str}".strip.sub(PICKER_REMOVE_LEADING_ZERO_REGEX, '')
|
468
513
|
end
|
469
514
|
|
470
515
|
def picker_time_12h_str
|
471
|
-
screenshot_and_raise
|
516
|
+
screenshot_and_raise 'the time is not applicable for this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
472
517
|
"#{picker_hour_12h_str}:#{picker_minute_str} #{picker_period}"
|
473
518
|
end
|
474
519
|
|
475
520
|
def picker_time_str
|
476
|
-
screenshot_and_raise
|
521
|
+
screenshot_and_raise 'the time is not applicable for this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
477
522
|
picker_is_in_24h_locale ? picker_time_24h_str : picker_time_12h_str
|
478
523
|
end
|
479
524
|
|
480
525
|
def picker_time_for_other_locale
|
481
526
|
time_str = picker_is_in_24h_locale ? picker_time_24h_str : picker_time_12h_str
|
482
527
|
fmt_str = picker_is_in_24h_locale ? PICKER_12H_TIME_FMT : PICKER_24H_TIME_FMT
|
483
|
-
Time.parse(time_str).strftime(fmt_str).squeeze(
|
528
|
+
Time.parse(time_str).strftime(fmt_str).squeeze(' ').strip.sub(PICKER_REMOVE_LEADING_ZERO_REGEX, '')
|
484
529
|
end
|
485
530
|
|
486
531
|
# date and time
|
487
532
|
|
488
533
|
def picker_date_and_time_str_24h
|
489
|
-
screenshot_and_raise
|
534
|
+
screenshot_and_raise 'the time is not applicable for this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
490
535
|
"#{picker_date_str} #{picker_time_24h_str}"
|
491
536
|
end
|
492
537
|
|
493
538
|
def picker_date_and_time_str_12h
|
494
|
-
screenshot_and_raise
|
539
|
+
screenshot_and_raise 'the time is not applicable for this mode' if picker_is_in_date_mode or picker_is_in_countdown_mode
|
495
540
|
"#{picker_date_str} #{picker_time_12h_str}"
|
496
541
|
end
|
497
542
|
|
@@ -507,8 +552,8 @@ to use the automatic mode, include this category in your CALABASH target
|
|
507
552
|
|
508
553
|
def now_times_map
|
509
554
|
now = Time.new
|
510
|
-
{:h12 => now.strftime(PICKER_12H_TIME_FMT).squeeze(
|
511
|
-
:h24 => now.strftime(PICKER_24H_TIME_FMT).squeeze(
|
555
|
+
{:h12 => now.strftime(PICKER_12H_TIME_FMT).squeeze(' ').strip,
|
556
|
+
:h24 => now.strftime(PICKER_24H_TIME_FMT).squeeze(' ').strip.sub(PICKER_REMOVE_LEADING_ZERO_REGEX, ''),
|
512
557
|
:time => now}
|
513
558
|
end
|
514
559
|
|
@@ -523,7 +568,7 @@ to use the automatic mode, include this category in your CALABASH target
|
|
523
568
|
# scrolling picker
|
524
569
|
|
525
570
|
def picker_scroll_to_hour (target_hour_int_24h_notation)
|
526
|
-
screenshot_and_raise
|
571
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
527
572
|
column = picker_column_for_hour
|
528
573
|
limit = 25
|
529
574
|
count = 0
|
@@ -540,7 +585,7 @@ to use the automatic mode, include this category in your CALABASH target
|
|
540
585
|
end
|
541
586
|
|
542
587
|
def picker_scroll_to_minute (target_minute_int)
|
543
|
-
screenshot_and_raise
|
588
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
544
589
|
column = picker_column_for_minute
|
545
590
|
limit = 61
|
546
591
|
count = 0
|
@@ -557,8 +602,8 @@ to use the automatic mode, include this category in your CALABASH target
|
|
557
602
|
end
|
558
603
|
|
559
604
|
def picker_scroll_to_period(target_period_str)
|
560
|
-
screenshot_and_raise
|
561
|
-
screenshot_and_raise
|
605
|
+
screenshot_and_raise 'nyi' if picker_is_in_countdown_mode
|
606
|
+
screenshot_and_raise 'period is not applicable to 24h locale' if picker_is_in_24h_locale
|
562
607
|
column = picker_column_for_period
|
563
608
|
limit = 3
|
564
609
|
count = 0
|