cukunity 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitmodules +0 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +60 -0
- data/LICENSE.txt +20 -0
- data/README.md +214 -0
- data/Rakefile +51 -0
- data/Unity/Assets/Demo/Art/Buttons/down.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/down.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/left.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/left.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/ok.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/ok.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/options.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/options.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/play.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/play.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/quit.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/quit.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/retry.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/retry.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/right.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/right.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons/up.png +0 -0
- data/Unity/Assets/Demo/Art/Buttons/up.png.meta +28 -0
- data/Unity/Assets/Demo/Art/Buttons.meta +2 -0
- data/Unity/Assets/Demo/Art/clear.png +0 -0
- data/Unity/Assets/Demo/Art/clear.png.meta +28 -0
- data/Unity/Assets/Demo/Art/options.png +0 -0
- data/Unity/Assets/Demo/Art/options.png.meta +28 -0
- data/Unity/Assets/Demo/Art/sokoban.png +0 -0
- data/Unity/Assets/Demo/Art/sokoban.png.meta +28 -0
- data/Unity/Assets/Demo/Art.meta +2 -0
- data/Unity/Assets/Demo/Cubes/CrateCube.mat +0 -0
- data/Unity/Assets/Demo/Cubes/CrateCube.mat.meta +2 -0
- data/Unity/Assets/Demo/Cubes/CrateCube.prefab +0 -0
- data/Unity/Assets/Demo/Cubes/CrateCube.prefab.meta +2 -0
- data/Unity/Assets/Demo/Cubes/FloorCube.mat +0 -0
- data/Unity/Assets/Demo/Cubes/FloorCube.mat.meta +2 -0
- data/Unity/Assets/Demo/Cubes/FloorCube.prefab +0 -0
- data/Unity/Assets/Demo/Cubes/FloorCube.prefab.meta +2 -0
- data/Unity/Assets/Demo/Cubes/GoalCube.mat +0 -0
- data/Unity/Assets/Demo/Cubes/GoalCube.mat.meta +2 -0
- data/Unity/Assets/Demo/Cubes/GoalCube.prefab +0 -0
- data/Unity/Assets/Demo/Cubes/GoalCube.prefab.meta +2 -0
- data/Unity/Assets/Demo/Cubes/PlayerCube.mat +0 -0
- data/Unity/Assets/Demo/Cubes/PlayerCube.mat.meta +2 -0
- data/Unity/Assets/Demo/Cubes/PlayerCube.prefab +0 -0
- data/Unity/Assets/Demo/Cubes/PlayerCube.prefab.meta +2 -0
- data/Unity/Assets/Demo/Cubes/WallCube.mat +0 -0
- data/Unity/Assets/Demo/Cubes/WallCube.mat.meta +2 -0
- data/Unity/Assets/Demo/Cubes/WallCube.prefab +0 -0
- data/Unity/Assets/Demo/Cubes/WallCube.prefab.meta +2 -0
- data/Unity/Assets/Demo/Cubes.meta +2 -0
- data/Unity/Assets/Demo/Resources/MainMenu.prefab +0 -0
- data/Unity/Assets/Demo/Resources/MainMenu.prefab.meta +2 -0
- data/Unity/Assets/Demo/Resources/OptionsMenu.prefab +0 -0
- data/Unity/Assets/Demo/Resources/OptionsMenu.prefab.meta +2 -0
- data/Unity/Assets/Demo/Resources.meta +2 -0
- data/Unity/Assets/Demo/Scripts/CameraController.js +18 -0
- data/Unity/Assets/Demo/Scripts/CameraController.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/EnterPlayerName.js +21 -0
- data/Unity/Assets/Demo/Scripts/EnterPlayerName.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/GameLeftButton.js +18 -0
- data/Unity/Assets/Demo/Scripts/GameLeftButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/GameQuitButton.js +6 -0
- data/Unity/Assets/Demo/Scripts/GameQuitButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/GameRetryButton.js +7 -0
- data/Unity/Assets/Demo/Scripts/GameRetryButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/GameRightButton.js +18 -0
- data/Unity/Assets/Demo/Scripts/GameRightButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/GameUpButton.js +18 -0
- data/Unity/Assets/Demo/Scripts/GameUpButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/OnTouchGUIElementDown.js +34 -0
- data/Unity/Assets/Demo/Scripts/OnTouchGUIElementDown.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/PlayerData.js +3 -0
- data/Unity/Assets/Demo/Scripts/PlayerData.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/SokobanController.js +240 -0
- data/Unity/Assets/Demo/Scripts/SokobanController.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/TakeScreenShot.js +26 -0
- data/Unity/Assets/Demo/Scripts/TakeScreenShot.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/TitleOptionsButton.js +8 -0
- data/Unity/Assets/Demo/Scripts/TitleOptionsButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/TitleOptionsOkButton.js +8 -0
- data/Unity/Assets/Demo/Scripts/TitleOptionsOkButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/TitlePlayButton.js +6 -0
- data/Unity/Assets/Demo/Scripts/TitlePlayButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/TitleQuitButton.js +7 -0
- data/Unity/Assets/Demo/Scripts/TitleQuitButton.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/UpdateMovesLabel.js +26 -0
- data/Unity/Assets/Demo/Scripts/UpdateMovesLabel.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts/UpdatePlayerName.js +14 -0
- data/Unity/Assets/Demo/Scripts/UpdatePlayerName.js.meta +2 -0
- data/Unity/Assets/Demo/Scripts.meta +2 -0
- data/Unity/Assets/Demo/demo_game.unity +0 -0
- data/Unity/Assets/Demo/demo_game.unity.meta +2 -0
- data/Unity/Assets/Demo/demo_title.unity +0 -0
- data/Unity/Assets/Demo/demo_title.unity.meta +2 -0
- data/Unity/Assets/Demo.meta +2 -0
- data/Unity/Assets/Plugins/CukunityInstance.prefab +0 -0
- data/Unity/Assets/Plugins/CukunityInstance.prefab.meta +2 -0
- data/Unity/Assets/Plugins/CukunityServer.cs +871 -0
- data/Unity/Assets/Plugins/CukunityServer.cs.meta +2 -0
- data/Unity/Assets/Plugins/JsonFx.Json.dll +0 -0
- data/Unity/Assets/Plugins/JsonFx.Json.dll.meta +2 -0
- data/Unity/Assets/Plugins/iOS/CukunityServer.mm +242 -0
- data/Unity/Assets/Plugins/iOS/CukunityServer.mm.meta +2 -0
- data/Unity/Assets/Plugins/iOS.meta +2 -0
- data/Unity/Assets/Plugins.meta +2 -0
- data/Unity/Library/AudioManager.asset +0 -0
- data/Unity/Library/BuildSettings.asset +0 -0
- data/Unity/Library/DynamicsManager.asset +0 -0
- data/Unity/Library/EditorBuildSettings.asset +0 -0
- data/Unity/Library/EditorSettings.asset +0 -0
- data/Unity/Library/EditorUserBuildSettings.asset +0 -0
- data/Unity/Library/EditorUserSettings.asset +0 -0
- data/Unity/Library/InputManager.asset +0 -0
- data/Unity/Library/InspectorExpandedItems.asset +0 -0
- data/Unity/Library/MonoManager.asset +0 -0
- data/Unity/Library/NetworkManager.asset +0 -0
- data/Unity/Library/ProjectSettings.asset +0 -0
- data/Unity/Library/QualitySettings.asset +0 -0
- data/Unity/Library/TagManager.asset +0 -0
- data/Unity/Library/TimeManager.asset +0 -0
- data/Unity/ProjectSettings/AudioManager.asset +0 -0
- data/Unity/ProjectSettings/DynamicsManager.asset +0 -0
- data/Unity/ProjectSettings/EditorBuildSettings.asset +0 -0
- data/Unity/ProjectSettings/EditorSettings.asset +0 -0
- data/Unity/ProjectSettings/InputManager.asset +0 -0
- data/Unity/ProjectSettings/NavMeshLayers.asset +0 -0
- data/Unity/ProjectSettings/NetworkManager.asset +0 -0
- data/Unity/ProjectSettings/ProjectSettings.asset +0 -0
- data/Unity/ProjectSettings/QualitySettings.asset +0 -0
- data/Unity/ProjectSettings/TagManager.asset +0 -0
- data/Unity/ProjectSettings/TimeManager.asset +0 -0
- data/VERSION +1 -0
- data/bin/cukunity +7 -0
- data/cukunity.gemspec +298 -0
- data/features/get_scene_command.feature +39 -0
- data/features/i18n/ja/sokoban_clear.feature +109 -0
- data/features/install.feature +23 -0
- data/features/keyboard_input.feature +26 -0
- data/features/load_level_command.feature +36 -0
- data/features/run.feature +33 -0
- data/features/select_visible.feature +29 -0
- data/features/support/env.rb +11 -0
- data/features/touch_input.feature +96 -0
- data/lib/cukunity/cli/argument_parser.rb +103 -0
- data/lib/cukunity/cli/bootstrap_command.rb +39 -0
- data/lib/cukunity/cli/doctor_command.rb +150 -0
- data/lib/cukunity/cli/features_command.rb +35 -0
- data/lib/cukunity/cli/main.rb +18 -0
- data/lib/cukunity/cli/options.rb +8 -0
- data/lib/cukunity/cli.rb +11 -0
- data/lib/cukunity/cucumber/step_definitions/get_scene_command_steps.rb +37 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/get_scene_command_steps.rb +37 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/install_steps.rb +25 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/keyboard_input_steps.rb +17 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/load_level_command_steps.rb +17 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/run_steps.rb +25 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/select_visible_steps.rb +9 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja/touch_input_steps.rb +19 -0
- data/lib/cukunity/cucumber/step_definitions/i18n/ja.rb +9 -0
- data/lib/cukunity/cucumber/step_definitions/install_steps.rb +33 -0
- data/lib/cukunity/cucumber/step_definitions/keyboard_input_steps.rb +13 -0
- data/lib/cukunity/cucumber/step_definitions/load_level_command_steps.rb +17 -0
- data/lib/cukunity/cucumber/step_definitions/run_steps.rb +32 -0
- data/lib/cukunity/cucumber/step_definitions/select_visible_steps.rb +15 -0
- data/lib/cukunity/cucumber/step_definitions/touch_input_steps.rb +18 -0
- data/lib/cukunity/cucumber/support/platform_helpers.rb +105 -0
- data/lib/cukunity/cucumber/support/spec_helpers.rb +21 -0
- data/lib/cukunity/cucumber/support/transforms.rb +5 -0
- data/lib/cukunity/cucumber/support/unity_helpers.rb +35 -0
- data/lib/cukunity/cucumber.rb +28 -0
- data/lib/cukunity/drivers/android/app.rb +43 -0
- data/lib/cukunity/drivers/android/appkiller/.gitignore +9 -0
- data/lib/cukunity/drivers/android/appkiller/AndroidManifest.xml +17 -0
- data/lib/cukunity/drivers/android/appkiller/ant.properties +17 -0
- data/lib/cukunity/drivers/android/appkiller/build.xml +85 -0
- data/lib/cukunity/drivers/android/appkiller/proguard.cfg +40 -0
- data/lib/cukunity/drivers/android/appkiller/project.properties +11 -0
- data/lib/cukunity/drivers/android/appkiller/res/layout/main.xml +13 -0
- data/lib/cukunity/drivers/android/appkiller/res/values/strings.xml +4 -0
- data/lib/cukunity/drivers/android/appkiller/src/cukunity/appkiller/AppKiller.java +29 -0
- data/lib/cukunity/drivers/android/keyboard_input.rb +149 -0
- data/lib/cukunity/drivers/android/keycodes.rb +531 -0
- data/lib/cukunity/drivers/android/monkey_client.rb +65 -0
- data/lib/cukunity/drivers/android/process.rb +103 -0
- data/lib/cukunity/drivers/android/touch_input.rb +24 -0
- data/lib/cukunity/drivers/android/tunnel_client_methods.rb +22 -0
- data/lib/cukunity/drivers/android/unity_client.rb +27 -0
- data/lib/cukunity/drivers/android/utils.rb +50 -0
- data/lib/cukunity/drivers/android.rb +9 -0
- data/lib/cukunity/drivers/iOS/app.rb +32 -0
- data/lib/cukunity/drivers/iOS/keyboard_input.rb +104 -0
- data/lib/cukunity/drivers/iOS/process.rb +42 -0
- data/lib/cukunity/drivers/iOS/touch_input.rb +18 -0
- data/lib/cukunity/drivers/iOS/tunnel_client_methods.rb +27 -0
- data/lib/cukunity/drivers/iOS/uiautomation.rb +97 -0
- data/lib/cukunity/drivers/iOS/uiautomation_master.rb +152 -0
- data/lib/cukunity/drivers/iOS/uiautomation_slave.js +238 -0
- data/lib/cukunity/drivers/iOS/uiautomation_slave.rb +41 -0
- data/lib/cukunity/drivers/iOS/unity_client.rb +27 -0
- data/lib/cukunity/drivers/iOS/utils.rb +46 -0
- data/lib/cukunity/drivers/iOS.rb +9 -0
- data/lib/cukunity/exceptions.rb +24 -0
- data/lib/cukunity/keyboard_input_methods.rb +35 -0
- data/lib/cukunity/request_line_response_client_methods.rb +80 -0
- data/lib/cukunity/tasks/cucumber.rake +22 -0
- data/lib/cukunity/touch_input_methods.rb +19 -0
- data/lib/cukunity/unity/client_methods.rb +46 -0
- data/lib/cukunity/unity/command_facade.rb +67 -0
- data/lib/cukunity/unity/component.rb +39 -0
- data/lib/cukunity/unity/gameobject.rb +53 -0
- data/lib/cukunity/unity/hint.rb +27 -0
- data/lib/cukunity/unity/json_container.rb +48 -0
- data/lib/cukunity/unity/level.rb +6 -0
- data/lib/cukunity/unity/scene.rb +18 -0
- data/lib/cukunity/unity/screen.rb +45 -0
- data/lib/cukunity/unity/screen_hint_methods.rb +61 -0
- data/lib/cukunity/unity/text_hint_methods.rb +17 -0
- data/lib/cukunity/unity.rb +11 -0
- data/lib/cukunity/utils.rb +56 -0
- data/lib/cukunity.rb +19 -0
- metadata +411 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
|
3
|
+
module Cukunity
|
4
|
+
module CLI
|
5
|
+
class DoctorCommand
|
6
|
+
def initialize(parser)
|
7
|
+
@parser = parser
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute
|
11
|
+
check_ruby
|
12
|
+
check_cucumber
|
13
|
+
check_ios if @parser.options.ios
|
14
|
+
check_android if @parser.options.android
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def check_platform(platform)
|
19
|
+
puts '==>'.blue + " Checking #{platform}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_ok(item, path)
|
23
|
+
puts '===>'.blue + " #{item} (#{path.green})"
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_error(item, path, solution)
|
27
|
+
$stdout.puts '===>'.red + " #{item} (#{path.red})"
|
28
|
+
solution.each_line do |line|
|
29
|
+
$stdout.puts '::::: '.red + " #{line}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_ruby
|
34
|
+
check_platform('Ruby')
|
35
|
+
ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']).sub(/.*\s.*/m, '"\&"')
|
36
|
+
if RbConfig::CONFIG['MAJOR'].to_i < 1 or RbConfig::CONFIG['MAJOR'].to_i <= 1 and
|
37
|
+
RbConfig::CONFIG['MINOR'].to_i < 9
|
38
|
+
solution = <<-eos
|
39
|
+
|
40
|
+
Please install Ruby 1.9.x or above using RVM by following the instructions
|
41
|
+
at http://beginrescueend.com .
|
42
|
+
|
43
|
+
eos
|
44
|
+
|
45
|
+
check_error(ruby, 'Ruby 1.8.x and below is not supported.', solution.gsub(/^ +/, ''))
|
46
|
+
else
|
47
|
+
check_ok('Ruby', ruby)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_cucumber
|
52
|
+
check_platform('Cucumber')
|
53
|
+
|
54
|
+
check_file 'cucumber', <<-eos
|
55
|
+
|
56
|
+
Please install cucumber gem from a terminal by executing:
|
57
|
+
|
58
|
+
# gem install cucumber
|
59
|
+
|
60
|
+
or, if you use bundler, just add the following to your Gemfile:
|
61
|
+
|
62
|
+
gem 'cucumber'
|
63
|
+
|
64
|
+
eos
|
65
|
+
end
|
66
|
+
|
67
|
+
def check_ios
|
68
|
+
check_platform('iOS')
|
69
|
+
|
70
|
+
check_file 'mobiledevice', <<-eos
|
71
|
+
|
72
|
+
Please install "mobiledevice" from http://github.com/imkira/mobiledevice
|
73
|
+
from a terminal by executing:
|
74
|
+
|
75
|
+
# git clone git://github.com/imkira/mobiledevice.git
|
76
|
+
# cd mobiledevice
|
77
|
+
# rake install
|
78
|
+
|
79
|
+
eos
|
80
|
+
|
81
|
+
check_file 'instruments', <<-eos
|
82
|
+
|
83
|
+
Please install XCode 4.2 or above from https://developer.apple.com/xcode/ .
|
84
|
+
|
85
|
+
eos
|
86
|
+
|
87
|
+
check_file ['/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate', '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate'], <<-eos
|
88
|
+
|
89
|
+
Please install XCode 4.2 or above from https://developer.apple.com/xcode/ .
|
90
|
+
Also, make sure you have iOS 5 SDK installed.
|
91
|
+
|
92
|
+
eos
|
93
|
+
end
|
94
|
+
|
95
|
+
def check_android
|
96
|
+
check_platform('Android')
|
97
|
+
|
98
|
+
check_file 'android', <<-eos
|
99
|
+
|
100
|
+
Please install the "Android SDK" from http://developer.android.com/sdk/ .
|
101
|
+
|
102
|
+
If you use "brew" ( http://mxcl.github.com/homebrew/ ), you can install it with:
|
103
|
+
# brew install android-sdk
|
104
|
+
|
105
|
+
eos
|
106
|
+
|
107
|
+
['adb', 'aapt'].each do |tool|
|
108
|
+
check_file tool, <<-eos
|
109
|
+
|
110
|
+
Please install the "Android SDK tools" from the "Android SDK Manager".
|
111
|
+
|
112
|
+
You can launch the manager from a terminal by executing:
|
113
|
+
# android
|
114
|
+
|
115
|
+
Within the manager, you can install the "Android SDK Tools" package from Google.
|
116
|
+
|
117
|
+
After installation, make sure "platform-tools" folder is in your PATH environment.
|
118
|
+
|
119
|
+
eos
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def check_file(items, solution)
|
124
|
+
items = [items] unless items.is_a? Array
|
125
|
+
items.each do |item|
|
126
|
+
full_path = env_path(item)
|
127
|
+
full_path = File.expand_path(item) unless full_path
|
128
|
+
if full_path and File.exists?(full_path)
|
129
|
+
if File.file?(full_path)
|
130
|
+
check_ok(item, full_path)
|
131
|
+
return
|
132
|
+
end
|
133
|
+
check_error(item, 'Found expecting a file', solution.gsub(/^ +/, ''))
|
134
|
+
else
|
135
|
+
end
|
136
|
+
end
|
137
|
+
check_error(items.join(' , '), 'Not found', solution.gsub(/^ +/, ''))
|
138
|
+
end
|
139
|
+
|
140
|
+
def env_path(path)
|
141
|
+
ENV['PATH'].split(':').each do |dir|
|
142
|
+
if File.exists?(File.join(dir, path))
|
143
|
+
return File.expand_path(File.join(dir, path))
|
144
|
+
end
|
145
|
+
end
|
146
|
+
nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Cukunity
|
5
|
+
module CLI
|
6
|
+
class FeaturesCommand
|
7
|
+
def initialize(parser)
|
8
|
+
@parser = parser
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute
|
12
|
+
path = @parser.remaining_args.first
|
13
|
+
if path.nil?
|
14
|
+
path = Dir.pwd
|
15
|
+
path = File.join(path, 'features') if File.directory?(File.join(path, 'features'))
|
16
|
+
end
|
17
|
+
if @parser.options.ios
|
18
|
+
if @parser.options.android
|
19
|
+
abort 'You cannot test both iOS and Android simultaneously. ' \
|
20
|
+
'Please disable one of the platforms by using ' \
|
21
|
+
'--no-ios or --no-android'
|
22
|
+
end
|
23
|
+
platform_flags = '~@android,@ios'
|
24
|
+
elsif @parser.options.android
|
25
|
+
platform_flags = '~@ios,@android'
|
26
|
+
else
|
27
|
+
abort 'You should specify which platform you want to test by specifying ' \
|
28
|
+
'either --ios or --android'
|
29
|
+
end
|
30
|
+
cukunity = File.expand_path(File.join(File.dirname(__FILE__), '..', 'cucumber.rb'))
|
31
|
+
system %Q[cucumber --require "#{cukunity}" --require "#{path}" --format pretty -t "#{platform_flags}"]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Cukunity
|
2
|
+
module CLI
|
3
|
+
class Main
|
4
|
+
def self.execute!(args = ARGV)
|
5
|
+
new(args).execute
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@args = args.dup
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute
|
13
|
+
command = Cukunity::CLI::ArgumentParser.parse(@args)
|
14
|
+
command.execute unless command.nil?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/cukunity/cli.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'term/ansicolor'
|
3
|
+
class String
|
4
|
+
include Term::ANSIColor
|
5
|
+
end
|
6
|
+
require 'cukunity/cli/main'
|
7
|
+
require 'cukunity/cli/options'
|
8
|
+
require 'cukunity/cli/argument_parser'
|
9
|
+
require 'cukunity/cli/doctor_command'
|
10
|
+
require 'cukunity/cli/bootstrap_command'
|
11
|
+
require 'cukunity/cli/features_command'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Then /^I should( not)? have an? (\w+) (?:named|called|component on|on) "([^"]*)"$/ do |negation, type, name|
|
4
|
+
set_current_gameobject(gameobject(name))
|
5
|
+
if type == 'GameObject'
|
6
|
+
should !negation, current_gameobject, be_nil
|
7
|
+
elsif !negation or !current_gameobject.nil?
|
8
|
+
should negation, current_gameobject, have_component(:type => type)
|
9
|
+
set_current_component(current_gameobject.component(:type => type))
|
10
|
+
should !negation, current_component, be_nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Then /^I should( not)? have a "([^"]*)"$/ do |negation, name|
|
15
|
+
step %[I should#{negation} have a GameObject named "#{name}"]
|
16
|
+
end
|
17
|
+
|
18
|
+
Then /^it should( not)? have an? (\w+)(?: component)$/ do |negation, type|
|
19
|
+
should !negation, current_gameobject.component(:type => type), be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
Then /^it should( not)? have (?:a )property (?:named|called) "(\w+)"$/ do |negation, name|
|
23
|
+
should negation, current_object.has_property?(name), be_true
|
24
|
+
end
|
25
|
+
|
26
|
+
Then /^it should( not)? have "(\w+)"(?: property)? (?:as|equal to) "([^"]*)"$/ do |negation, name, value|
|
27
|
+
step %Q[it should have a property named "#{name}"] unless negation
|
28
|
+
should negation, current_object.property(name).to_s, eql(value)
|
29
|
+
end
|
30
|
+
|
31
|
+
Then /^it should( not)? have (\w+)(?: property)? (?:as|equal to) "([^"]*)"$/ do |negation, name, value|
|
32
|
+
step %Q[it should have "#{name}" property equal to "#{value}"]
|
33
|
+
end
|
34
|
+
|
35
|
+
Then /^it should( not)? be "([^"]*)"$/ do |negation, bool_name|
|
36
|
+
should negation, current_object.property(bool_name), eql(true)
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Then /^"([^"]*)"という(\w+)が存在してい(る|ない)(?:こと)?$/ do |name, type, negation|
|
4
|
+
step %[I should#{negation} have a #{type} named "#{name}"]
|
5
|
+
end
|
6
|
+
|
7
|
+
Then /^"([^"]*)"が存在してい(る|ない)(?:こと)?$/ do |name, negation|
|
8
|
+
step %[I should#{negation} have a GameObject named "#{name}"]
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^その中に(\w+)(?:コンポーネント)?が存在してい(る|ない)(?:こと)?$/ do |type, negation|
|
12
|
+
step %[it should#{negation} have a #{type} component]
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^その中に(\w+)というプロパティーが存在してい(る|ない)(?:こと)?$/ do |name, negation|
|
16
|
+
step %[it should#{negation} have a property named "#{name}"]
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /^その中に"(\w+)"というプロパティーが存在してい(る|ない)(?:こと)?$/ do |name, negation|
|
20
|
+
step %[it should#{negation} have a property named "#{name}"]
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^その中に(\w+)(?:というプロパティー)?が"([^"]*)"(?:と|に)一致してい(る|ない)(?:こと)?$/ do |name, value, negation|
|
24
|
+
step %Q[it should#{negation} have "#{name}" property equal to "#{value}"]
|
25
|
+
end
|
26
|
+
|
27
|
+
Then /^その中に"(\w+)"(?:というプロパティー)?が"([^"]*)"(?:と|に)一致してい(る|ない)(?:こと)?$/ do |name, value, negation|
|
28
|
+
step %Q[it should#{negation} have "#{name}" property equal to "#{value}"]
|
29
|
+
end
|
30
|
+
|
31
|
+
Then /^その中に"(\w+)"(?:というプロパティー)?が有効になってい(る|ない)(?:こと)?$/ do |bool_name, negation|
|
32
|
+
step %Q[it should#{negation} be "#{bool_name}"]
|
33
|
+
end
|
34
|
+
|
35
|
+
Then /^その中に(\w+)(?:というプロパティー)?が有効になってい(る|ない)(?:こと)?$/ do |bool_name, negation|
|
36
|
+
step %Q[it should#{negation} be "#{bool_name}"]
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^"([^"]*)"(?:から)?(?:アプリ|ゲーム)を(再)?インストール(?:している)?$/ do |path, reinstall|
|
4
|
+
step %Q[I #{reinstall}install the app "#{path}"]
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^(?:その|同)?(?:アプリ|ゲーム)を(再)?インストール(?:している)?$/ do |reinstall|
|
8
|
+
step %Q[I #{reinstall}install the app "#{current_app}"]
|
9
|
+
end
|
10
|
+
|
11
|
+
Given /^"([^"]*)"(?:アプリ|ゲーム)をアンインストール(?:している)?$/ do |path|
|
12
|
+
step %Q[I uninstall the app "#{path}"]
|
13
|
+
end
|
14
|
+
|
15
|
+
Given /^(?:その|同)?(?:アプリ|ゲーム)をアンインストール(?:している)?$/ do
|
16
|
+
step %Q[I uninstall the app "#{current_app}"]
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /^"([^"]*)"(?:アプリ|ゲーム)がいインストールされていい(る|ない)(?:こと)?$/ do |path, negation|
|
20
|
+
step %Q[the app "#{path}" should#{negation} be installed]
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^(?:その|同)?(?:アプリ|ゲーム)がインストールされてい(る|ない)(?:こと)?$/ do |negation|
|
24
|
+
step %Q[the app "#{current_app}" should#{negation} be installed]
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
When /^(?:"([^"]*)"という入力方法で)?"([^"]*)"と入力(?:したら)?$/ do |method, text|
|
4
|
+
if method.nil?
|
5
|
+
step %Q[I type "#{text}"]
|
6
|
+
else
|
7
|
+
step %Q[I type "#{text}" using "#{method}"]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^(?:"([^"]*)"という入力方法で)?"([^"]*)"と加えて入力(?:したら)?$/ do |method, text|
|
12
|
+
if method.nil?
|
13
|
+
step %Q[I append "#{text}"]
|
14
|
+
else
|
15
|
+
step %Q[I append "#{text}" using "#{method}"]
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^レベル"([^"]*)"をロード(?:している)?$/ do |name|
|
4
|
+
step %Q[I load "#{name}" level]
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^レベル(\d+)をロード(?:している)?$/ do |number|
|
8
|
+
step %Q[I load level #{number}]
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^レベル"([^"]*)"が(?:ロード|再生)されてい(る|ない)(?:こと)?$/ do |name, negation|
|
12
|
+
step %Q[it should#{negation} be playing "#{name}" level]
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^レベル(\d+)が(?:ロード|再生)されてい(る|ない)(?:こと)?$/ do |number, negation|
|
16
|
+
step %Q[it should#{negation} be playing level #{number}]
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^"([^"]*)"(?:から)?(?:アプリ|ゲーム)を(再)?起動(?:している)?$/ do |path, relaunch|
|
4
|
+
step %Q[I #{relaunch}launch the app "#{path}"]
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^(?:その|同)?(?:アプリ|ゲーム)を(再)?起動(?:している)?$/ do |relaunch|
|
8
|
+
step %Q[I #{relaunch}launch the app "#{current_app}"]
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^"([^"]*)"(?:アプリ|ゲーム)が(?:実行|動作)してい(る|ない)(?:こと)?$/ do |path, negation|
|
12
|
+
step %Q[the app "#{path}" should#{negation} be running]
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^(?:その|同)?(?:アプリ|ゲーム)が(?:実行|動作)してい(る|ない)(?:こと)?$/ do |negation|
|
16
|
+
step %Q[the app "#{current_app}" should#{negation} be running]
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /^"([^"]*)"(?:アプリ|ゲーム)がフォアグラウンドで(?:実行|動作)してい(る|ない)(?:こと)?$/ do |path, negation|
|
20
|
+
step %Q[the app "#{path}" should#{negation} be running on foreground]
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^(?:その|同)?(?:アプリ|ゲーム)がフォアグラウンドで(?:実行|動作)してい(る|ない)(?:こと)?$/ do |negation|
|
24
|
+
step %Q[the app "#{current_app}" should#{negation} be running on foreground]
|
25
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Then /^"([^"]*)"(?:というGameObject)?を表示してい(る|ない)(?:こと)?$/ do |name, negation|
|
4
|
+
step %Q[I should#{negation} see "#{name}"]
|
5
|
+
end
|
6
|
+
|
7
|
+
Then /^"([^"]*)"と表示してい(る|ない)(?:こと)?$/ do |text, negation|
|
8
|
+
step %Q[I should#{negation} read "#{text}"]
|
9
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
# FIXME:
|
4
|
+
When /^I tap the screen(down up|down and up| down| up)? at coordinates (\d+), (\d+)$/ do |type, x, y|
|
5
|
+
type = (type || ' down and up').strip.gsub(/ /, '_').downcase
|
6
|
+
screen.tap :x => x.to_i, :y => y.to_i
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^"([^"]*)"をタップ(?:して|したら)?((?:\d+(?:\.\d+)?)秒待ったら)?$/ do |name, time|
|
10
|
+
if time.nil?
|
11
|
+
step %Q[I tap "#{name}"]
|
12
|
+
else
|
13
|
+
step %Q[I tap "#{name}" and wait #{time} seconds]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^タップした後に発生する遅延時間を((?:\d+(?:\.\d+)?)秒)に変更(?:したら)?$/ do |time|
|
18
|
+
step %Q[I set the default tap delay to #{time} seconds]
|
19
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^I (re)?install the (?:app|game)(?: from)? "([^"]*)"$/ do |reinstall, path|
|
4
|
+
set_current_app(path)
|
5
|
+
if not installed?(current_app)
|
6
|
+
install(current_app)
|
7
|
+
elsif reinstall
|
8
|
+
uninstall(current_app)
|
9
|
+
install(current_app)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Given /^I (re)?install it$/ do |reinstall|
|
14
|
+
step %Q[I #{reinstall}install the app "#{current_app}"]
|
15
|
+
end
|
16
|
+
|
17
|
+
Given /^I uninstall the (?:app|game) "([^"]*)"$/ do |path|
|
18
|
+
set_current_app(path)
|
19
|
+
uninstall(current_app) if installed?(current_app)
|
20
|
+
end
|
21
|
+
|
22
|
+
Given /^I uninstall it$/ do
|
23
|
+
step %Q[I uninstall the app "#{current_app}"]
|
24
|
+
end
|
25
|
+
|
26
|
+
Then /^the (?:app|game) "([^"]*)" should( not)? be installed$/ do |path, negation|
|
27
|
+
set_current_app(path)
|
28
|
+
should negation, app, be_installed(current_app)
|
29
|
+
end
|
30
|
+
|
31
|
+
Then /^it should( not)? be installed$/ do |negation|
|
32
|
+
step %Q[the app "#{current_app}" should#{negation} be installed]
|
33
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
When /^I type "([^"]*)"(?: using "([^"]*)")?$/ do |text, method|
|
4
|
+
keyboard.open(:clear => true, :method => method) do |k|
|
5
|
+
k.type_text text
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^I append "([^"]*)"(?: using "([^"]*)")?$/ do |text, method|
|
10
|
+
keyboard.open(:clear => false, :method => method) do |k|
|
11
|
+
k.type_text text
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^I load(?: the)? "([^"]*)" level$/ do |name|
|
4
|
+
load_level(name)
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^I load level (\d+)$/ do |number|
|
8
|
+
load_level(number.to_i)
|
9
|
+
end
|
10
|
+
|
11
|
+
Then /^it should( not)? be playing(?: the)? "([^"]*)" level$/ do |negation, name|
|
12
|
+
should_equal negation, level.name, name
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^it should( not)? be playing level (\d+)$/ do |negation, number|
|
16
|
+
should_equal negation, level.number, number.to_i
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Given /^I (re)?(?:launch|run) the app "([^"]*)"$/ do |relaunch, path|
|
4
|
+
set_current_app(path)
|
5
|
+
if not running?(current_app)
|
6
|
+
launch(current_app)
|
7
|
+
elsif relaunch
|
8
|
+
relaunch(current_app)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Given /^I (re)?launch it$/ do |relaunch|
|
13
|
+
step %Q[I #{relaunch}launch the app "#{current_app}"]
|
14
|
+
end
|
15
|
+
|
16
|
+
Then /^the app "([^"]*)" should( not)? be running$/ do |path, negation|
|
17
|
+
set_current_app(path)
|
18
|
+
should negation, process, be_running(current_app)
|
19
|
+
end
|
20
|
+
|
21
|
+
Then /^it should( not)? be running$/ do |negation|
|
22
|
+
step %Q[the app "#{current_app}" should#{negation} be running]
|
23
|
+
end
|
24
|
+
|
25
|
+
Then /^the app "([^"]*)" should( not)? be running on (?:foreground|screen)$/ do |path, negation|
|
26
|
+
set_current_app(path)
|
27
|
+
should negation, process, be_foreground(current_app)
|
28
|
+
end
|
29
|
+
|
30
|
+
Then /^it should( not)? be running on (?:foreground|screen)$/ do |negation|
|
31
|
+
step %Q[the app "#{current_app}" should#{negation} be running on foreground]
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
Then /^I should( not)? see "([^"]*)"$/ do |negation, name|
|
4
|
+
screenable = hint(:type => 'screen') do |hint|
|
5
|
+
hint.gameobject.name == name and hint.on_screen?
|
6
|
+
end
|
7
|
+
should !negation, screenable, be_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
Then /^I should( not)? read "([^"]*)"$/ do |negation, text|
|
11
|
+
textual = hint(:type => 'text') do |hint|
|
12
|
+
hint.reads_as?(text)
|
13
|
+
end
|
14
|
+
should !negation, textual, be_nil
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
When /^I tap the screen(down up|down and up| down| up)? at coordinates (\d+), (\d+)$/ do |type, x, y|
|
4
|
+
type = (type || ' down and up').strip.gsub(/ /, '_').downcase
|
5
|
+
screen.tap :x => x.to_i, :y => y.to_i
|
6
|
+
end
|
7
|
+
|
8
|
+
When /^I tap "([^"]*)"(?: and wait ((?:\d+(?:\.\d+)?)\s*s(?:ecs?|econds?)))?$/ do |name, time|
|
9
|
+
screenable = hint(:type => 'screen') do |hint|
|
10
|
+
hint.gameobject.name == name and hint.on_screen?
|
11
|
+
end
|
12
|
+
should 'not', screenable, be_nil
|
13
|
+
screenable.tap :wait => (time || touch.default_tap_delay).to_f
|
14
|
+
end
|
15
|
+
|
16
|
+
When /^I set the default tap (?:wait|delay) to ((?:\d+(?:\.\d+)?)\s*s(?:ecs?|econds?))$/ do |time|
|
17
|
+
touch.set_default_tap_delay(time.to_f)
|
18
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Cukunity
|
2
|
+
module PlatformHelpers
|
3
|
+
extend Forwardable
|
4
|
+
def_delegator :app, :install
|
5
|
+
def_delegator :app, :uninstall
|
6
|
+
def_delegator :app, :installed
|
7
|
+
def_delegator :app, :installed?
|
8
|
+
def_delegator :process, :launch
|
9
|
+
def_delegator :process, :running
|
10
|
+
def_delegator :process, :foreground
|
11
|
+
def_delegator :process, :foreground?
|
12
|
+
def_delegator :process, :running?
|
13
|
+
def_delegator :process, :pids
|
14
|
+
def_delegator :process, :relaunch
|
15
|
+
def_delegator :input, :touch_screen
|
16
|
+
def_delegator :keyboard, :keyboard
|
17
|
+
|
18
|
+
def current_app
|
19
|
+
raise Exception::InvalidApp.new if @current_app.nil?
|
20
|
+
@current_app
|
21
|
+
end
|
22
|
+
|
23
|
+
def current_app=(path)
|
24
|
+
case File.extname(path).downcase
|
25
|
+
when '.app'
|
26
|
+
set_current_app_ios(path)
|
27
|
+
when '.apk'
|
28
|
+
set_current_app_android(path)
|
29
|
+
else
|
30
|
+
# @ios is defined as a tag?
|
31
|
+
tags = @@__tags__
|
32
|
+
if tags.include?('@ios') or tags.include?('@~android')
|
33
|
+
path = set_current_app_ios("#{path}.app")
|
34
|
+
# @android is defined as a tag?
|
35
|
+
elsif tags.include?('@android') or tags.include?('@~ios')
|
36
|
+
path = set_current_app_android("#{path}.apk")
|
37
|
+
else
|
38
|
+
raise Exception::InvalidApp.new(path)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@current_app = path
|
42
|
+
end
|
43
|
+
|
44
|
+
def set_current_app(path)
|
45
|
+
self.current_app = path
|
46
|
+
end
|
47
|
+
|
48
|
+
def platform_defined?
|
49
|
+
not @platform.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def app
|
53
|
+
raise Exception::UnspecifiedPlatform.new if @platform.nil?
|
54
|
+
@platform::App
|
55
|
+
end
|
56
|
+
|
57
|
+
def process
|
58
|
+
raise Exception::UnspecifiedPlatform.new if @platform.nil?
|
59
|
+
@platform::Process
|
60
|
+
end
|
61
|
+
|
62
|
+
def touch
|
63
|
+
raise Exception::UnspecifiedPlatform.new if @platform.nil?
|
64
|
+
@platform::TouchInput
|
65
|
+
end
|
66
|
+
|
67
|
+
def keyboard
|
68
|
+
raise Exception::UnspecifiedPlatform.new if @platform.nil?
|
69
|
+
@platform::KeyboardInput
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.__tags__=(tags)
|
73
|
+
@@__tags__ = tags
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def set_current_app_ios(path)
|
78
|
+
raise Exception::InvalidApp.new(path) unless File.directory?(path)
|
79
|
+
@platform = Cukunity::IOS
|
80
|
+
path
|
81
|
+
end
|
82
|
+
|
83
|
+
def set_current_app_android(path)
|
84
|
+
raise Exception::InvalidApp.new(path) unless File.file?(path)
|
85
|
+
@platform = Cukunity::Android
|
86
|
+
path
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
World(Cukunity::PlatformHelpers)
|
92
|
+
|
93
|
+
AfterConfiguration do |config|
|
94
|
+
# FIXME: we should not use an undocumented/deprecated member.
|
95
|
+
# gherkin's tag_expressions method does not allow us to inspect the list
|
96
|
+
# of defined tags or to eval against a subset of tags.
|
97
|
+
# If the user defines new tags we would't know about as a consequence
|
98
|
+
# tag_expressions.eval(_the_tags_we_know_) will probably fail.
|
99
|
+
# Therefore, we access @options[:tag_expressions] directly.
|
100
|
+
options = config.instance_variable_get('@options')
|
101
|
+
tags = options[:tag_expressions].inject([]) do |tags, tag|
|
102
|
+
tags += tag.split(/\s*,\s*/)
|
103
|
+
end
|
104
|
+
Cukunity::PlatformHelpers.__tags__ = tags
|
105
|
+
end
|