gametel 0.1 → 0.2

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 (54) hide show
  1. data/.gitignore +4 -3
  2. data/ApiDemos/res/layout/buttons_1.xml +6 -0
  3. data/ApiDemos/res/layout/controls_1.xml +1 -0
  4. data/ApiDemos/res/values/strings.xml +1 -0
  5. data/ApiDemos/src/com/example/android/apis/accessibility/ClockBackActivity.java +0 -1
  6. data/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.java +0 -1
  7. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListActivity.java +0 -1
  8. data/ApiDemos/src/com/example/android/apis/accessibility/TaskListView.java +0 -4
  9. data/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java +0 -1
  10. data/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java +0 -4
  11. data/ApiDemos/src/com/example/android/apis/app/LoaderCursor.java +1 -1
  12. data/ApiDemos/src/com/example/android/apis/app/LoaderCustom.java +5 -6
  13. data/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java +0 -4
  14. data/ApiDemos/src/com/example/android/apis/content/FileProvider.java +0 -1
  15. data/ApiDemos/src/com/example/android/apis/view/GameControllerInput.java +4 -11
  16. data/ApiDemos/src/com/example/android/apis/view/Hover.java +1 -11
  17. data/ApiDemos/src/com/example/android/apis/view/Switches.java +0 -1
  18. data/ChangeLog +10 -0
  19. data/README.md +14 -1
  20. data/cucumber.yml +10 -2
  21. data/features/button.feature +5 -0
  22. data/features/checkbox.feature +4 -0
  23. data/features/is_enabled.feature +9 -0
  24. data/features/list_item.feature +4 -0
  25. data/features/main_screen.feature +5 -0
  26. data/features/radio_button.feature +3 -0
  27. data/features/step_definitions/button_steps.rb +4 -0
  28. data/features/step_definitions/controls_steps.rb +12 -3
  29. data/features/step_definitions/is_enabled_steps.rb +7 -0
  30. data/features/step_definitions/list_item_steps.rb +4 -0
  31. data/features/step_definitions/main_screen_steps.rb +6 -0
  32. data/features/step_definitions/view_steps.rb +20 -0
  33. data/features/support/app_installation_hooks.rb +9 -17
  34. data/features/support/app_life_cycle_hooks.rb +4 -21
  35. data/features/support/screens/alert_dialogs_screen.rb +5 -0
  36. data/features/support/screens/app_menu_screen.rb +6 -0
  37. data/features/support/screens/auto_complete_menu_screen.rb +11 -0
  38. data/features/support/screens/auto_complete_screen_top_screen.rb +7 -0
  39. data/features/support/screens/buttons_screen.rb +1 -0
  40. data/features/support/screens/controls_screen.rb +5 -2
  41. data/features/support/screens/custom_views_screen.rb +7 -0
  42. data/features/support/screens/main_menu_screen.rb +1 -0
  43. data/features/text.feature +33 -3
  44. data/features/view.feature +11 -0
  45. data/gametel.gemspec +2 -2
  46. data/lib/gametel.rb +14 -0
  47. data/lib/gametel/accessors.rb +40 -3
  48. data/lib/gametel/platforms/calabash.rb +42 -3
  49. data/lib/gametel/version.rb +1 -1
  50. data/spec/lib/gametel/accessors_spec.rb +102 -32
  51. data/spec/lib/gametel_spec.rb +10 -0
  52. metadata +23 -13
  53. data/ApiDemos/bin/ApiDemos.apk +0 -0
  54. data/ApiDemos/local.properties +0 -10
@@ -0,0 +1,9 @@
1
+ Feature: Determining whether or not a view is enabled
2
+
3
+ Scenario: Identifying a disabled view
4
+ When I'm on the buttons screen
5
+ Then I can tell when buttons are disabled
6
+
7
+ Scenario: Identifying an enabled view
8
+ When I'm on the buttons screen
9
+ Then I can tell when buttons are enabled
@@ -11,3 +11,7 @@ Feature: Interacting with the list item control
11
11
  Scenario: Should be able to click a list item when it is not visible on the screen
12
12
  When I click the list item "Views" from the main menu
13
13
  Then I should see the "Controls" list item
14
+
15
+ Scenario: Should be able to click a list item from a specific list
16
+ When I click the first list item by index on the first list
17
+ Then I should see the "Accessibility Service" list item
@@ -16,3 +16,8 @@ Feature: Interacting with the elements on the main screen
16
16
  Then I should see the "Views" list item
17
17
  When I scroll up to the top of the screen
18
18
  Then I should see the "Accessibility" list item
19
+
20
+ Scenario: Pressing the enter key
21
+ When I hit the enter key twice
22
+ Then I should see the "Accessibility Service" list item
23
+
@@ -4,3 +4,6 @@ Feature: Interacting with Radio Buttons
4
4
  Given I'm on the controls screen
5
5
  Then I should be able to click a radio button by "text"
6
6
 
7
+ Scenario: Clicking on a radio button by id
8
+ Given I'm on the controls screen
9
+ Then I should be able to click a radio button by "id"
@@ -20,3 +20,7 @@ end
20
20
  Then /^I should see the text "(.*?)" on the screen$/ do |text|
21
21
  on(ButtonScreen).should have_text text
22
22
  end
23
+
24
+ When /^I click the on\/off button by "(.*?)"$/ do |how|
25
+ on(ButtonScreen).send "on_off_#{how}"
26
+ end
@@ -8,12 +8,21 @@ Given /^I\'m on the controls screen$/ do
8
8
  screen.wait_for_text 'Light Theme'
9
9
  end
10
10
  on(ControlsMenuScreen).light_theme
11
+ on(ControlsScreen).wait_for_text 'Views/Controls'
11
12
  end
12
13
 
13
- When /^I enter "(.*?)" into the text field$/ do |text_value|
14
- on(ControlsScreen).text_field = text_value
14
+ When /^I enter "(.*?)" into the text field identified by "(.*?)"$/ do |text_value, how|
15
+ on(ControlsScreen).send "text_field_#{how}=", text_value
15
16
  end
16
17
 
17
- Then /^I should have the value "(.*?)" on the screen$/ do |text_value|
18
+ Then /^I should have the value "(.*?)" on the control screen$/ do |text_value|
18
19
  on(ControlsScreen).should have_text text_value
19
20
  end
21
+
22
+ When /^I clear the text from the text field identified by "(.*?)"$/ do |how|
23
+ on(ControlsScreen).send "clear_text_field_#{how}"
24
+ end
25
+
26
+ Then /^I should not have the value "(.*?)" on the control screen$/ do |text_value|
27
+ on(ControlsScreen).should_not have_text text_value
28
+ end
@@ -0,0 +1,7 @@
1
+ Then /^I can tell when buttons are disabled$/ do
2
+ on(ButtonScreen).should_not be_enabled('button_disabled')
3
+ end
4
+
5
+ Then /^I can tell when buttons are enabled$/ do
6
+ on(ButtonScreen).should be_enabled('button_normal')
7
+ end
@@ -5,3 +5,7 @@ end
5
5
  When /^I click the list item "(.*?)" from the main menu$/ do |list_item|
6
6
  on(MainMenuScreen).send "#{list_item.downcase}"
7
7
  end
8
+
9
+ When /^I click the first list item by index on the first list$/ do
10
+ on(MainMenuScreen).first_list_item_index_list
11
+ end
@@ -20,3 +20,9 @@ end
20
20
  When /^I scroll up to the top of the screen$/ do
21
21
  on(MainMenuScreen).scroll_up
22
22
  end
23
+
24
+ When /^I hit the enter key twice$/ do
25
+ on(MainMenuScreen).enter
26
+ on(MainMenuScreen).enter
27
+ end
28
+
@@ -0,0 +1,20 @@
1
+ When /^I am perusing options for Alert Dialogs$/ do
2
+ on(MainMenuScreen).app
3
+ on(AppScreen).alert_dialogs
4
+ end
5
+
6
+ When /^I choose the List Dialogs button by id$/ do
7
+ on(AlertDialogsScreen).list_dialog
8
+ end
9
+
10
+ When /^I am observing custom views$/ do
11
+ on(MainMenuScreen) do |screen|
12
+ screen.scroll_down
13
+ screen.views
14
+ end
15
+ on(ViewsMenuScreen).custom
16
+ end
17
+
18
+ Then /^I should see the "(.*?)" custom view$/ do |view_text|
19
+ on(CustomViewScreen).send view_text
20
+ end
@@ -5,23 +5,15 @@ AfterConfiguration do |config|
5
5
  end
6
6
 
7
7
  Before do |scenario|
8
- deploy_app unless already_installed
9
- FeatureNameMemory.feature_name = scenario.feature.name
10
- end
11
-
12
- at_exit do
13
- # uninstall_apps
14
- end
15
-
16
- def already_installed()
17
- !FeatureNameMemory.feature_name.nil?
18
- end
19
-
20
- def deploy_app()
21
- log "Is first scenario - reinstalling apps"
22
- uninstall_apps
23
- install_app(ENV["TEST_APP_PATH"])
24
- install_app(ENV["APP_PATH"])
8
+ feature_name = scenario.feature.name
9
+ if FeatureNameMemory.feature_name != feature_name
10
+ log "Is first scenario - reinstalling apps"
11
+
12
+ uninstall_apps
13
+ install_app(ENV["TEST_APP_PATH"])
14
+ install_app(ENV["APP_PATH"])
15
+ FeatureNameMemory.feature_name = feature_name
16
+ end
25
17
  end
26
18
 
27
19
  FeatureNameMemory = Class.new
@@ -3,26 +3,9 @@ require 'calabash-android/management/adb'
3
3
  Before do |scenario|
4
4
 
5
5
  return if scenario.failed? #No need to start the server is anything before this has failed.
6
- cmd = "#{adb_command} shell am instrument -w -e class sh.calaba.instrumentationbackend.InstrumentationBackend #{ENV['TEST_PACKAGE_NAME']}/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
7
- log "Starting test server using:"
8
- log cmd
9
- if is_windows?
10
- system(%Q(start /MIN cmd /C #{cmd}))
11
- else
12
- `#{cmd} 1>&2 &`
13
- end
14
-
15
- sleep 2
16
- begin
17
- connect_to_test_server
18
- log "Connection established"
19
- rescue Exception => e
20
- log "Exception:#{e.backtrace}"
21
- end
6
+ start_test_server_in_background
22
7
  end
23
8
 
24
-
25
-
26
- After do |scenario|
27
- disconnect_from_test_server
28
- end
9
+ After do
10
+ shutdown_test_server
11
+ end
@@ -0,0 +1,5 @@
1
+ class AlertDialogsScreen
2
+ include Gametel
3
+
4
+ view(:list_dialog, :id => 'select_button')
5
+ end
@@ -0,0 +1,6 @@
1
+ class AppScreen
2
+ include Gametel
3
+
4
+ list_item(:alert_dialogs, :text => 'Alert Dialogs')
5
+ view(:list_dialog, :id => 'select_button')
6
+ end
@@ -0,0 +1,11 @@
1
+ class AutoCompleteMenuScreen
2
+ include Gametel
3
+
4
+ list_item(:screen_top, :text => '1. Screen Top')
5
+ list_item(:screen_bottom, :text => '2. Screen Bottom')
6
+ list_item(:scroll, :text => '3. Scroll')
7
+ list_item(:contacts, :text => '4. Contacts')
8
+ list_item(:contacts_with_hint, :text => '5. Contacts with Hint')
9
+ list_item(:multiple_items, :text => '6. Multiple items')
10
+
11
+ end
@@ -0,0 +1,7 @@
1
+ class AutoCompleteScreenTopScreen
2
+ include Gametel
3
+
4
+ text(:country, :id => 'edit')
5
+ button(:give_me_focus, :text => 'Give me Focus')
6
+
7
+ end
@@ -5,5 +5,6 @@ class ButtonScreen
5
5
  button(:normal_index, :index => 0)
6
6
  button(:small, :text => 'Small')
7
7
  button(:on_off, :index => 2)
8
+ button(:on_off_id, :id => 'button_toggle')
8
9
 
9
10
  end
@@ -1,11 +1,14 @@
1
1
  class ControlsScreen
2
2
  include Gametel
3
3
 
4
- text(:text_field, :index => 0)
4
+ text(:text_field_index, :index => 0)
5
+ text(:text_field_id, :id => 'edit')
6
+ text(:text_field_name, :content_description => 'Edit Description')
5
7
  button(:enabled_save, :index => 0)
6
8
  button(:disabled_save, :index => 1)
7
9
  checkbox(:checkbox_index, :index => 0)
8
10
  checkbox(:checkbox_text, :text => 'Checkbox 2')
11
+ checkbox(:checkbox_id, :id => 'check1')
9
12
  radio_button(:radio_button_text, :text => 'RadioButton 1')
10
-
13
+ radio_button(:radio_button_id, :id => 'radio2')
11
14
  end
@@ -0,0 +1,7 @@
1
+ class CustomViewScreen
2
+ include Gametel
3
+
4
+ view(:red, :text => 'Red')
5
+ view(:blue, :text => 'Blue')
6
+ view(:green, :text => 'Green')
7
+ end
@@ -3,6 +3,7 @@ class MainMenuScreen
3
3
 
4
4
  list_item(:first_list_item_text, :text => 'Accessibility')
5
5
  list_item(:first_list_item_index, :index => 0)
6
+ list_item(:first_list_item_index_list, :index => 0, :list => 0)
6
7
  list_item(:app, :text => 'App')
7
8
  list_item(:content, :text => 'Content')
8
9
  list_item(:graphics, :text => 'Graphics')
@@ -1,7 +1,37 @@
1
1
  Feature: Interacting with the standard text field
2
2
 
3
- Scenario: Entering text into a text field
3
+ Scenario: Entering text into a text field identified by index
4
4
  Given I'm on the controls screen
5
- When I enter "example text" into the text field
6
- Then I should have the value "example text" on the screen
5
+ When I enter "example text" into the text field identified by "index"
6
+ Then I should have the value "example text" on the control screen
7
7
 
8
+ Scenario: Entering text into a text field identified by id
9
+ Given I'm on the controls screen
10
+ When I enter "example text" into the text field identified by "id"
11
+ Then I should have the value "example text" on the control screen
12
+
13
+ Scenario: Entering text into a text field identified by name
14
+ Given I'm on the controls screen
15
+ When I enter "example text" into the text field identified by "name"
16
+ Then I should have the value "example text" on the control screen
17
+
18
+ Scenario: Clearing the text from a text field identified by index
19
+ Given I'm on the controls screen
20
+ When I enter "example text" into the text field identified by "index"
21
+ Then I should have the value "example text" on the control screen
22
+ When I clear the text from the text field identified by "index"
23
+ Then I should not have the value "example text" on the control screen
24
+
25
+ Scenario: Clearing the text from a text field identified by id
26
+ Given I'm on the controls screen
27
+ When I enter "example text" into the text field identified by "id"
28
+ Then I should have the value "example text" on the control screen
29
+ When I clear the text from the text field identified by "id"
30
+ Then I should not have the value "example text" on the control screen
31
+
32
+ Scenario: Clearing the text from a text field identified by name
33
+ Given I'm on the controls screen
34
+ When I enter "example text" into the text field identified by "name"
35
+ Then I should have the value "example text" on the control screen
36
+ When I clear the text from the text field identified by "name"
37
+ Then I should not have the value "example text" on the control screen
@@ -0,0 +1,11 @@
1
+ Feature: Interacting with view elements
2
+
3
+ Scenario: Clicking on views by their id
4
+ When I am perusing options for Alert Dialogs
5
+ And I choose the List Dialogs button by id
6
+ Then I should see the "Command one" list item
7
+
8
+ @ignore
9
+ Scenario: Clicking on view by their text
10
+ When I am observing custom views
11
+ Then I should see the "blue" custom view
data/gametel.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["jeff.morgan@leandog.com", "levi@leandog.com"]
7
7
  gem.description = %q{High level wrapper around android drivers}
8
8
  gem.summary = %q{High level wrapper around android drivers}
9
- gem.homepage = ""
9
+ gem.homepage = "http://github.com/leandog/gametel"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Gametel::VERSION
17
17
 
18
- gem.add_dependency 'calabash-android', '>= 0.1.0'
18
+ gem.add_dependency 'calabash-android', '>= 0.2.11'
19
19
 
20
20
  gem.add_development_dependency 'rspec', '>= 2.6.0'
21
21
  gem.add_development_dependency 'cucumber'
data/lib/gametel.rb CHANGED
@@ -23,6 +23,13 @@ module Gametel
23
23
  platform.has_text?(text)
24
24
  end
25
25
 
26
+ #
27
+ # Returns true if the view is enabled
28
+ #
29
+ def enabled?(locator)
30
+ platform.enabled?(locator)
31
+ end
32
+
26
33
  #
27
34
  # Press the back button
28
35
  #
@@ -30,6 +37,13 @@ module Gametel
30
37
  platform.back
31
38
  end
32
39
 
40
+ #
41
+ # Press the enter key
42
+ #
43
+ def enter
44
+ platform.enter
45
+ end
46
+
33
47
  #
34
48
  # scroll down
35
49
  #
@@ -1,22 +1,27 @@
1
1
  module Gametel
2
2
  module Accessors
3
3
  #
4
- # Generates one method to enter text into a text field.
4
+ # Generates two method to enter text into a text field and to
5
+ # clear the text field
5
6
  #
6
7
  # @example
7
8
  # text(:first_name, :index => 0)
8
- # # will generate 'first_name=" method
9
+ # # will generate 'first_name=' and 'clear_first_name' methods
9
10
  #
10
11
  # @param [String] the name used for the generated methods
11
12
  # @param [Hash] locator for how the text is found The valid
12
13
  # keys are:
13
- # * :name
14
+ # * :content_description
15
+ # * :id
14
16
  # * :index
15
17
  #
16
18
  def text(name, locator)
17
19
  define_method("#{name}=") do |value|
18
20
  platform.enter_text(value, locator)
19
21
  end
22
+ define_method("clear_#{name}") do
23
+ platform.clear_text(locator)
24
+ end
20
25
  end
21
26
 
22
27
  #
@@ -31,6 +36,7 @@ module Gametel
31
36
  # keys are:
32
37
  # * :text
33
38
  # * :index
39
+ # * :id
34
40
  #
35
41
  def button(name, locator)
36
42
  define_method(name) do
@@ -45,11 +51,23 @@ module Gametel
45
51
  # list_item(:details, :text => 'Details')
46
52
  # # will generate 'details' method
47
53
  #
54
+ # @example
55
+ # list_item(:details, :index => 1, :list => 1)
56
+ # # will generate 'details' method to select second item in the
57
+ # # second list
58
+ #
59
+ # @example
60
+ # list_item(:details, :index => 2)
61
+ # # will generate 'details' method to select third item in the
62
+ # # first list
63
+ #
48
64
  # @param [String] the name used for the generated methods
49
65
  # @param [Hash] locator for how the list item is found The valid
50
66
  # keys are:
51
67
  # * :text
52
68
  # * :index
69
+ # * :list - only us with :index to indicate which list to use on
70
+ # the screen. Default is 0
53
71
  #
54
72
  def list_item(name, locator)
55
73
  define_method(name) do
@@ -69,6 +87,7 @@ module Gametel
69
87
  # keys are:
70
88
  # * :text
71
89
  # * :index
90
+ # * :id
72
91
  #
73
92
  def checkbox(name, locator)
74
93
  define_method(name) do
@@ -87,12 +106,30 @@ module Gametel
87
106
  # @param [Hash] locator for how the checkbox is found The valid
88
107
  # keys are:
89
108
  # * :text
109
+ # * :id
90
110
  #
91
111
  def radio_button(name, locator)
92
112
  define_method(name) do
93
113
  platform.click_radio_button(locator)
94
114
  end
95
115
  end
116
+
117
+ #
118
+ # Generates one method to click a view.
119
+ # @example
120
+ # view(:clickable_text, :id => 'id_name_of_your_control')
121
+ # # will generate 'clickable_text' method
122
+ #
123
+ # @param [String] the name used for the generated methods
124
+ # @param [Hash] locator indicating an id for how the view is found.
125
+ # The only valid keys are:
126
+ # * :id
127
+ #
128
+ def view(name, locator)
129
+ define_method(name) do
130
+ platform.click_view(locator)
131
+ end
132
+ end
96
133
  end
97
134
  end
98
135