briar 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +29 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +36 -0
  5. data/README.md +25 -0
  6. data/Rakefile +12 -0
  7. data/briar.gemspec +26 -0
  8. data/dotirbc_briar_additions +31 -0
  9. data/features/step_definitions/alerts_and_sheets/action_sheet_steps.rb +8 -0
  10. data/features/step_definitions/alerts_and_sheets/alert_view_steps.rb +25 -0
  11. data/features/step_definitions/bars/navbar_steps.rb +95 -0
  12. data/features/step_definitions/bars/tabbar_steps.rb +32 -0
  13. data/features/step_definitions/bars/toolbar_steps.rb +17 -0
  14. data/features/step_definitions/briar_core_steps.rb +9 -0
  15. data/features/step_definitions/control/button_steps.rb +57 -0
  16. data/features/step_definitions/control/segmented_control_steps.rb +85 -0
  17. data/features/step_definitions/control/slider_steps.rb +9 -0
  18. data/features/step_definitions/email_steps.rb +59 -0
  19. data/features/step_definitions/image_view_steps.rb +9 -0
  20. data/features/step_definitions/keyboard_steps.rb +21 -0
  21. data/features/step_definitions/label_steps.rb +21 -0
  22. data/features/step_definitions/picker/date_picker_steps.rb +216 -0
  23. data/features/step_definitions/picker/picker_steps.rb +58 -0
  24. data/features/step_definitions/scroll_view_steps.rb +20 -0
  25. data/features/step_definitions/table_steps.rb +186 -0
  26. data/features/step_definitions/text_field_steps.rb +37 -0
  27. data/features/step_definitions/text_view_steps.rb +44 -0
  28. data/features/support/env.rb +0 -0
  29. data/features/support/hooks.rb +0 -0
  30. data/features/support/launch.rb +0 -0
  31. data/lib/briar.rb +72 -0
  32. data/lib/briar/alerts_and_sheets/alert_view.rb +16 -0
  33. data/lib/briar/bars/navbar.rb +104 -0
  34. data/lib/briar/bars/tabbar.rb +38 -0
  35. data/lib/briar/bars/toolbar.rb +36 -0
  36. data/lib/briar/briar_core.rb +56 -0
  37. data/lib/briar/briar_steps.rb +26 -0
  38. data/lib/briar/control/button.rb +47 -0
  39. data/lib/briar/control/segmented_control.rb +22 -0
  40. data/lib/briar/control/slider.rb +34 -0
  41. data/lib/briar/cucumber.rb +49 -0
  42. data/lib/briar/email.rb +58 -0
  43. data/lib/briar/gestalt.rb +80 -0
  44. data/lib/briar/image_view.rb +27 -0
  45. data/lib/briar/keyboard.rb +104 -0
  46. data/lib/briar/label.rb +34 -0
  47. data/lib/briar/picker/date_picker.rb +598 -0
  48. data/lib/briar/picker/picker.rb +32 -0
  49. data/lib/briar/picker/picker_shared.rb +34 -0
  50. data/lib/briar/scroll_view.rb +10 -0
  51. data/lib/briar/table.rb +237 -0
  52. data/lib/briar/text_field.rb +57 -0
  53. data/lib/briar/text_view.rb +21 -0
  54. data/lib/briar/version.rb +3 -0
  55. data/spec/briar/gestalt_spec.rb +62 -0
  56. data/spec/spec_helper.rb +17 -0
  57. metadata +164 -0
@@ -0,0 +1,38 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Bars
5
+ def tabbar_visible?
6
+ element_exists("tabBar")
7
+ end
8
+
9
+ def should_see_tabbar
10
+ unless tabbar_visible?
11
+ screenshot_and_raise "i do not see the tabbar"
12
+ end
13
+ end
14
+
15
+ def index_of_tabbar_item(name)
16
+ if tabbar_visible?
17
+ tabs = query('tabBarButton', :accessibilityLabel)
18
+ tabs.index(name)
19
+ end
20
+ end
21
+
22
+ def touch_tabbar_item(name)
23
+ idx = index_of_tabbar_item name
24
+ if idx
25
+ touch "tabBarButton index:#{idx}"
26
+ step_pause
27
+ else
28
+ screenshot_and_raise "tabbar button with name #{name} does not exist"
29
+ end
30
+ end
31
+
32
+ def tabbar_item_is_at_index(name, index)
33
+ tabs = query('tabBarButton', :accessibilityLabel)
34
+ tabs.index(name) == index.to_i
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,36 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Bars
5
+ def toolbar_exists? (id)
6
+ !query("toolbar marked:'#{id}'").empty?
7
+ end
8
+
9
+ def should_see_toolbar (id)
10
+ screenshot_and_raise "expected to see toolbar with id '#{id}'" unless toolbar_exists? id
11
+ end
12
+
13
+ def should_not_see_toolbar (id)
14
+ screenshot_and_raise "did not expect to see toolbar with id '#{id}'" if toolbar_exists? id
15
+ end
16
+
17
+ def toolbar_button_exists? (name_or_id)
18
+ query("toolbar descendant view marked:#{name_or_id}")
19
+ ## look for text button
20
+ #text_button_arr = query("toolbar child toolbarTextButton child button child buttonLabel", :text)
21
+ #has_text_button = text_button_arr.index(name_or_id) != nil
22
+ ## look for non_text button
23
+ #toolbar_button_arr = query("toolbar child toolbarButton", :accessibilityLabel)
24
+ #has_toolbar_button = toolbar_button_arr.index(name_or_id) != nil
25
+ #
26
+ #has_text_button or has_toolbar_button
27
+ end
28
+
29
+ def should_see_toolbar_button (name_or_id)
30
+ res = toolbar_button_exists? name_or_id
31
+ unless res
32
+ screenshot_and_raise "could not see toolbar button with name '#{name_or_id}'"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Core
5
+ STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.4).to_f
6
+ ANIMATION_PAUSE = (ENV['ANIMATION_PAUSE'] || 0.6).to_f
7
+
8
+ def step_pause
9
+ sleep(STEP_PAUSE)
10
+ end
11
+
12
+ def wait_for_animation
13
+ sleep(ANIMATION_PAUSE)
14
+ end
15
+
16
+
17
+ def view_exists? (view_id)
18
+ !query("view marked:'#{view_id}'").empty?
19
+ end
20
+
21
+ def should_see_view (view_id)
22
+ unless view_exists? view_id
23
+ screenshot_and_raise "no view found with id #{view_id}"
24
+ end
25
+ end
26
+
27
+ def view_exists_with_text? (text)
28
+ element_exists("view text:'#{text}'")
29
+ end
30
+
31
+
32
+ def should_see_view_after_animation (view_id)
33
+ wait_for_animation
34
+ should_see_view view_id
35
+ end
36
+
37
+ def should_not_see_view_after_animation (view_id)
38
+ wait_for_animation
39
+ if view_exists? view_id
40
+ screenshot_and_raise "did not expect to see view '#{view_id}'"
41
+ end
42
+ end
43
+
44
+ def should_see_view_with_text (text)
45
+ res = view_exists_with_text? text
46
+ unless res
47
+ screenshot_and_raise "No view found with text #{text}"
48
+ end
49
+ end
50
+
51
+ def touch_view_named(view_id)
52
+ touch("view marked:'#{view_id}'")
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..','features','step_definitions', "briar_core_steps")
2
+
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
+
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
+
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
+
14
+
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
+
18
+
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
+
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")
@@ -0,0 +1,47 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Control
5
+ module Button
6
+ include Briar::Core
7
+ def button_exists? (name)
8
+ res = query("button marked:'#{name}'", :alpha)
9
+ if res.empty?
10
+ false
11
+ else
12
+ res.first.to_i != 0
13
+ end
14
+ end
15
+
16
+ def should_see_button (name)
17
+ unless button_exists? name
18
+ screenshot_and_raise "i did not see a button with marked #{name}"
19
+ end
20
+ end
21
+
22
+ def should_not_see_button (button_id)
23
+ screenshot_and_raise "i should not see button marked '#{button_id}'" if button_exists?(button_id)
24
+ end
25
+
26
+ def button_is_enabled (name)
27
+ enabled = query("button marked:'#{name}' isEnabled:1", :accessibilityIdentifier).first
28
+ enabled.eql? name
29
+ end
30
+
31
+ def should_see_button_with_title(name, title)
32
+ should_see_button name
33
+ if query("button marked:'#{title}' child label", :text).empty?
34
+ screenshot_and_raise "i do not see a button marked #{name} with title #{title}"
35
+ end
36
+ end
37
+
38
+ def touch_button (name)
39
+ should_see_button name
40
+ touch("button marked:'#{name}'")
41
+ step_pause
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,22 @@
1
+ require "calabash-cucumber"
2
+
3
+ module Briar
4
+ module Control
5
+ module Segmented_Control
6
+ def index_of_control_with_name (control_name)
7
+ controls = query("segmentedControl", :accessibilityIdentifier)
8
+ controls.index(control_name)
9
+ end
10
+
11
+ def index_of_segment_with_name_in_control_with_name(segment_name, control_name)
12
+ control_idx = index_of_control_with_name (control_name)
13
+ if control_idx
14
+ titles = query("segmentedControl index:#{control_idx} child segment child segmentLabel", :text).reverse
15
+ titles.index(segment_name)
16
+ else
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Control
5
+ module Slider
6
+ def change_slider_value_to(slider_id, value)
7
+ target = value.to_f
8
+ if target < 0
9
+ pending "value '#{value}' must be >= 0"
10
+ end
11
+ min_val = query("slider marked:'#{slider_id}'", :minimumValue).first
12
+ # will not work for min_val != 0
13
+ if min_val != 0
14
+ pending "sliders with non-zero minimum values are not supported - slider '#{slider_id}' has minimum value of '#{min_val}'"
15
+ end
16
+ max_val = query("slider marked:'#{slider_id}'", :maximumValue).first
17
+ if target > max_val
18
+ screenshot_and_raise "cannot change slider '#{slider_id}' to '#{value}' because the maximum allowed value is '#{max_val}'"
19
+ end
20
+ # the x offset is from the middle of the slider.
21
+ # ex. slider from 0 to 5
22
+ # to touch 3, x must be 0
23
+ # to touch 0, x must be -2.5
24
+ # to touch 5, x must be 2.5
25
+ half_val = (max_val/2)
26
+ width = query("slider marked:'#{slider_id}'", :frame).first["Width"]
27
+ x = ((width/2) * ((target - half_val)/half_val)).ceil
28
+ touch("slider marked:'#{slider_id}'", {:offset => {:x => x, :y => 0}})
29
+ #current = query("slider marked:'#{slider_id}'", :value).first
30
+ #puts "current => at '#{current}' with x => '#{x}'"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,49 @@
1
+ require 'briar/gestalt'
2
+ require 'briar/briar_core'
3
+
4
+ require 'briar/alerts_and_sheets/alert_view'
5
+
6
+ require 'briar/bars/tabbar'
7
+ require 'briar/bars/navbar'
8
+ require 'briar/bars/toolbar'
9
+
10
+ require 'briar/control/button'
11
+ require 'briar/control/segmented_control'
12
+ require 'briar/control/slider'
13
+
14
+ require 'briar/picker/picker_shared'
15
+ require 'briar/picker/picker'
16
+ require 'briar/picker/date_picker'
17
+
18
+ require 'briar/email'
19
+ require 'briar/image_view'
20
+ require 'briar/keyboard'
21
+ require 'briar/label'
22
+ require 'briar/scroll_view'
23
+
24
+ require 'briar/table'
25
+ require 'briar/text_field'
26
+ require 'briar/text_view'
27
+
28
+ World(Briar)
29
+ World(Briar::Core)
30
+ World(Briar::Alerts_and_Sheets)
31
+ World(Briar::Bars)
32
+ World(Briar::Control::Button)
33
+ World(Briar::Control::Segmented_Control)
34
+ World(Briar::Control::Slider)
35
+ World(Briar::Picker::Date)
36
+ World(Briar::Picker_Shared)
37
+ World(Briar::Picker)
38
+ World(Briar::Email)
39
+ World(Briar::ImageView)
40
+ World(Briar::Keyboard)
41
+ World(Briar::Label)
42
+ World(Briar::ScrollView)
43
+ World(Briar::Table)
44
+ World(Briar::TextField)
45
+ World(Briar::TextView)
46
+
47
+ AfterConfiguration do
48
+ require 'briar/briar_steps'
49
+ end
@@ -0,0 +1,58 @@
1
+ require 'calabash-cucumber'
2
+
3
+ module Briar
4
+ module Email
5
+ def email_body_first_line_is? (text)
6
+ if gestalt.is_ios6?
7
+ puts "WARN: cannot test for email body text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
8
+ else
9
+ actual_tokens = query("view:'MFComposeTextContentView'", :text).first.split("\n")
10
+ actual_tokens.include?(text)
11
+ end
12
+ end
13
+
14
+ def email_subject_is? (text)
15
+ if gestalt.is_ios6?
16
+ puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
17
+ else
18
+ actual = query("view marked:'subjectField'", :text)
19
+ actual.length == 1 && actual.first.eql?(text)
20
+ end
21
+ end
22
+
23
+ def email_subject_has_text_like? (text)
24
+ if gestalt.is_ios6?
25
+ puts "WARN: cannot test for email subject text on iOS 6 - see https://groups.google.com/d/topic/calabash-ios/Ff3XFsjp-B0/discussion"
26
+ else
27
+ !query("view marked:'subjectField' {text LIKE '*#{text}*'}").empty?
28
+ end
29
+ end
30
+
31
+ def email_to_field_is? (text)
32
+ if gestalt.is_ios6?
33
+ puts "WARN: iOS6 detected - cannot test for email 'to' field on iOS simulator or devices"
34
+ else
35
+ actual = query("view marked:'toField'", :text)
36
+ actual.length == 1 && actual.first.eql?(text)
37
+ end
38
+ end
39
+
40
+ def is_ios5_mail_view ()
41
+ query("view:'MFMailComposeRecipientView'").count == 3
42
+ #access_ids = query("view", :accessibilityIdentifier)
43
+ #access_ids.member?("toField") || access_ids.member?("subjectField")
44
+ end
45
+
46
+ def is_ios6_mail_view()
47
+ access_ids = query("view", :accessibilityIdentifier)
48
+ access_ids.member?("RemoteViewBridge")
49
+ end
50
+
51
+ def should_see_mail_view
52
+ wait_for_animation
53
+ unless is_ios5_mail_view || is_ios6_mail_view
54
+ screenshot_and_raise "expected to see email view"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,80 @@
1
+ require 'json'
2
+
3
+ module Briar
4
+ GESTALT_IPHONE = "iPhone"
5
+ GESTALT_IPAD = "iPad"
6
+ GESTALT_IPHONE5 = "Retina 4-inch"
7
+ GESTALT_SIM_SYS = "x86_64"
8
+
9
+ class Gestalt
10
+
11
+ attr_accessor :device_family
12
+ attr_accessor :simulator_details, :ios_version
13
+ attr_accessor :system
14
+
15
+ def initialize (json)
16
+ ht = JSON.parse json
17
+ simulator_device = ht["simulator_device"]
18
+ @system = ht["system"]
19
+ @device_family = @system.eql?(GESTALT_SIM_SYS) ? simulator_device : @system.split(/[\d,.]/).first
20
+ @simulator_details = ht["simulator"]
21
+ @ios_version = ht["iOS_version"]
22
+ end
23
+
24
+ def is_simulator?
25
+ self.system.eql?(GESTALT_SIM_SYS)
26
+ end
27
+
28
+ def is_device?
29
+ not self.is_simulator?
30
+ end
31
+
32
+ def is_iphone?
33
+ self.device_family.eql? GESTALT_IPHONE
34
+ end
35
+
36
+ def is_ipad?
37
+ self.device_family.eql? GESTALT_IPAD
38
+ end
39
+
40
+ def is_iphone_5?
41
+ return self.simulator_details.split(/[(),]/)[3].eql? GESTALT_IPHONE5 if self.is_simulator?
42
+ return self.system.split(/[\D]/).delete_if { |x| x.eql?("") }.first.eql?("5") if self.is_device?
43
+ end
44
+
45
+ def version_hash (version_str)
46
+ tokens = version_str.split(/[,.]/)
47
+ {:major_version => tokens[0],
48
+ :minor_version => tokens[1],
49
+ :bug_version => tokens[2]}
50
+ end
51
+
52
+ def ios_major_version
53
+ self.version_hash(self.ios_version)[:major_version]
54
+ end
55
+
56
+ def is_ios6?
57
+ self.version_hash(self.ios_version)[:major_version].eql?("6")
58
+ end
59
+
60
+ def is_ios5?
61
+ self.version_hash(self.ios_version)[:major_version].eql?("5")
62
+ end
63
+
64
+ end
65
+ end
66
+
67
+ #{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"5.1.1","app_version":"1.0","system":"iPad1,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}=> true
68
+
69
+ # "iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)".split(/[(),]/)
70
+ # => ["iPhone Simulator 358.4", " iPhone OS 6.0 ", "iPhone ", "Retina 4-inch", "/10A403"]
71
+
72
+ # system ("curl --insecure #{url}")
73
+ # {"outcome":"SUCCESS","app_name":"Rise Up CAL","simulator_device":"iPhone","iOS_version":"6.0",
74
+ #"app_version":"1.0","system":"x86_64","app_id":"org.recoverywarrriors.RiseUp-cal",
75
+ #"version":"0.9.126","simulator":"iPhone Simulator 358.4, iPhone OS 6.0 (iPhone (Retina 4-inch)\/10A403)"}=> true
76
+
77
+ #{"outcome":"SUCCESS","app_name":"Rise Up CAL","iOS_version":"6.0.1","app_version":"1.0",
78
+ #"system":"iPhone4,1","app_id":"org.recoverywarrriors.RiseUp-cal","version":"0.9.125"}
79
+
80
+