cukunity 0.1.0

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 (226) hide show
  1. data/.document +5 -0
  2. data/.gitmodules +0 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +15 -0
  5. data/Gemfile.lock +60 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +214 -0
  8. data/Rakefile +51 -0
  9. data/Unity/Assets/Demo/Art/Buttons/down.png +0 -0
  10. data/Unity/Assets/Demo/Art/Buttons/down.png.meta +28 -0
  11. data/Unity/Assets/Demo/Art/Buttons/left.png +0 -0
  12. data/Unity/Assets/Demo/Art/Buttons/left.png.meta +28 -0
  13. data/Unity/Assets/Demo/Art/Buttons/ok.png +0 -0
  14. data/Unity/Assets/Demo/Art/Buttons/ok.png.meta +28 -0
  15. data/Unity/Assets/Demo/Art/Buttons/options.png +0 -0
  16. data/Unity/Assets/Demo/Art/Buttons/options.png.meta +28 -0
  17. data/Unity/Assets/Demo/Art/Buttons/play.png +0 -0
  18. data/Unity/Assets/Demo/Art/Buttons/play.png.meta +28 -0
  19. data/Unity/Assets/Demo/Art/Buttons/quit.png +0 -0
  20. data/Unity/Assets/Demo/Art/Buttons/quit.png.meta +28 -0
  21. data/Unity/Assets/Demo/Art/Buttons/retry.png +0 -0
  22. data/Unity/Assets/Demo/Art/Buttons/retry.png.meta +28 -0
  23. data/Unity/Assets/Demo/Art/Buttons/right.png +0 -0
  24. data/Unity/Assets/Demo/Art/Buttons/right.png.meta +28 -0
  25. data/Unity/Assets/Demo/Art/Buttons/up.png +0 -0
  26. data/Unity/Assets/Demo/Art/Buttons/up.png.meta +28 -0
  27. data/Unity/Assets/Demo/Art/Buttons.meta +2 -0
  28. data/Unity/Assets/Demo/Art/clear.png +0 -0
  29. data/Unity/Assets/Demo/Art/clear.png.meta +28 -0
  30. data/Unity/Assets/Demo/Art/options.png +0 -0
  31. data/Unity/Assets/Demo/Art/options.png.meta +28 -0
  32. data/Unity/Assets/Demo/Art/sokoban.png +0 -0
  33. data/Unity/Assets/Demo/Art/sokoban.png.meta +28 -0
  34. data/Unity/Assets/Demo/Art.meta +2 -0
  35. data/Unity/Assets/Demo/Cubes/CrateCube.mat +0 -0
  36. data/Unity/Assets/Demo/Cubes/CrateCube.mat.meta +2 -0
  37. data/Unity/Assets/Demo/Cubes/CrateCube.prefab +0 -0
  38. data/Unity/Assets/Demo/Cubes/CrateCube.prefab.meta +2 -0
  39. data/Unity/Assets/Demo/Cubes/FloorCube.mat +0 -0
  40. data/Unity/Assets/Demo/Cubes/FloorCube.mat.meta +2 -0
  41. data/Unity/Assets/Demo/Cubes/FloorCube.prefab +0 -0
  42. data/Unity/Assets/Demo/Cubes/FloorCube.prefab.meta +2 -0
  43. data/Unity/Assets/Demo/Cubes/GoalCube.mat +0 -0
  44. data/Unity/Assets/Demo/Cubes/GoalCube.mat.meta +2 -0
  45. data/Unity/Assets/Demo/Cubes/GoalCube.prefab +0 -0
  46. data/Unity/Assets/Demo/Cubes/GoalCube.prefab.meta +2 -0
  47. data/Unity/Assets/Demo/Cubes/PlayerCube.mat +0 -0
  48. data/Unity/Assets/Demo/Cubes/PlayerCube.mat.meta +2 -0
  49. data/Unity/Assets/Demo/Cubes/PlayerCube.prefab +0 -0
  50. data/Unity/Assets/Demo/Cubes/PlayerCube.prefab.meta +2 -0
  51. data/Unity/Assets/Demo/Cubes/WallCube.mat +0 -0
  52. data/Unity/Assets/Demo/Cubes/WallCube.mat.meta +2 -0
  53. data/Unity/Assets/Demo/Cubes/WallCube.prefab +0 -0
  54. data/Unity/Assets/Demo/Cubes/WallCube.prefab.meta +2 -0
  55. data/Unity/Assets/Demo/Cubes.meta +2 -0
  56. data/Unity/Assets/Demo/Resources/MainMenu.prefab +0 -0
  57. data/Unity/Assets/Demo/Resources/MainMenu.prefab.meta +2 -0
  58. data/Unity/Assets/Demo/Resources/OptionsMenu.prefab +0 -0
  59. data/Unity/Assets/Demo/Resources/OptionsMenu.prefab.meta +2 -0
  60. data/Unity/Assets/Demo/Resources.meta +2 -0
  61. data/Unity/Assets/Demo/Scripts/CameraController.js +18 -0
  62. data/Unity/Assets/Demo/Scripts/CameraController.js.meta +2 -0
  63. data/Unity/Assets/Demo/Scripts/EnterPlayerName.js +21 -0
  64. data/Unity/Assets/Demo/Scripts/EnterPlayerName.js.meta +2 -0
  65. data/Unity/Assets/Demo/Scripts/GameLeftButton.js +18 -0
  66. data/Unity/Assets/Demo/Scripts/GameLeftButton.js.meta +2 -0
  67. data/Unity/Assets/Demo/Scripts/GameQuitButton.js +6 -0
  68. data/Unity/Assets/Demo/Scripts/GameQuitButton.js.meta +2 -0
  69. data/Unity/Assets/Demo/Scripts/GameRetryButton.js +7 -0
  70. data/Unity/Assets/Demo/Scripts/GameRetryButton.js.meta +2 -0
  71. data/Unity/Assets/Demo/Scripts/GameRightButton.js +18 -0
  72. data/Unity/Assets/Demo/Scripts/GameRightButton.js.meta +2 -0
  73. data/Unity/Assets/Demo/Scripts/GameUpButton.js +18 -0
  74. data/Unity/Assets/Demo/Scripts/GameUpButton.js.meta +2 -0
  75. data/Unity/Assets/Demo/Scripts/OnTouchGUIElementDown.js +34 -0
  76. data/Unity/Assets/Demo/Scripts/OnTouchGUIElementDown.js.meta +2 -0
  77. data/Unity/Assets/Demo/Scripts/PlayerData.js +3 -0
  78. data/Unity/Assets/Demo/Scripts/PlayerData.js.meta +2 -0
  79. data/Unity/Assets/Demo/Scripts/SokobanController.js +240 -0
  80. data/Unity/Assets/Demo/Scripts/SokobanController.js.meta +2 -0
  81. data/Unity/Assets/Demo/Scripts/TakeScreenShot.js +26 -0
  82. data/Unity/Assets/Demo/Scripts/TakeScreenShot.js.meta +2 -0
  83. data/Unity/Assets/Demo/Scripts/TitleOptionsButton.js +8 -0
  84. data/Unity/Assets/Demo/Scripts/TitleOptionsButton.js.meta +2 -0
  85. data/Unity/Assets/Demo/Scripts/TitleOptionsOkButton.js +8 -0
  86. data/Unity/Assets/Demo/Scripts/TitleOptionsOkButton.js.meta +2 -0
  87. data/Unity/Assets/Demo/Scripts/TitlePlayButton.js +6 -0
  88. data/Unity/Assets/Demo/Scripts/TitlePlayButton.js.meta +2 -0
  89. data/Unity/Assets/Demo/Scripts/TitleQuitButton.js +7 -0
  90. data/Unity/Assets/Demo/Scripts/TitleQuitButton.js.meta +2 -0
  91. data/Unity/Assets/Demo/Scripts/UpdateMovesLabel.js +26 -0
  92. data/Unity/Assets/Demo/Scripts/UpdateMovesLabel.js.meta +2 -0
  93. data/Unity/Assets/Demo/Scripts/UpdatePlayerName.js +14 -0
  94. data/Unity/Assets/Demo/Scripts/UpdatePlayerName.js.meta +2 -0
  95. data/Unity/Assets/Demo/Scripts.meta +2 -0
  96. data/Unity/Assets/Demo/demo_game.unity +0 -0
  97. data/Unity/Assets/Demo/demo_game.unity.meta +2 -0
  98. data/Unity/Assets/Demo/demo_title.unity +0 -0
  99. data/Unity/Assets/Demo/demo_title.unity.meta +2 -0
  100. data/Unity/Assets/Demo.meta +2 -0
  101. data/Unity/Assets/Plugins/CukunityInstance.prefab +0 -0
  102. data/Unity/Assets/Plugins/CukunityInstance.prefab.meta +2 -0
  103. data/Unity/Assets/Plugins/CukunityServer.cs +871 -0
  104. data/Unity/Assets/Plugins/CukunityServer.cs.meta +2 -0
  105. data/Unity/Assets/Plugins/JsonFx.Json.dll +0 -0
  106. data/Unity/Assets/Plugins/JsonFx.Json.dll.meta +2 -0
  107. data/Unity/Assets/Plugins/iOS/CukunityServer.mm +242 -0
  108. data/Unity/Assets/Plugins/iOS/CukunityServer.mm.meta +2 -0
  109. data/Unity/Assets/Plugins/iOS.meta +2 -0
  110. data/Unity/Assets/Plugins.meta +2 -0
  111. data/Unity/Library/AudioManager.asset +0 -0
  112. data/Unity/Library/BuildSettings.asset +0 -0
  113. data/Unity/Library/DynamicsManager.asset +0 -0
  114. data/Unity/Library/EditorBuildSettings.asset +0 -0
  115. data/Unity/Library/EditorSettings.asset +0 -0
  116. data/Unity/Library/EditorUserBuildSettings.asset +0 -0
  117. data/Unity/Library/EditorUserSettings.asset +0 -0
  118. data/Unity/Library/InputManager.asset +0 -0
  119. data/Unity/Library/InspectorExpandedItems.asset +0 -0
  120. data/Unity/Library/MonoManager.asset +0 -0
  121. data/Unity/Library/NetworkManager.asset +0 -0
  122. data/Unity/Library/ProjectSettings.asset +0 -0
  123. data/Unity/Library/QualitySettings.asset +0 -0
  124. data/Unity/Library/TagManager.asset +0 -0
  125. data/Unity/Library/TimeManager.asset +0 -0
  126. data/Unity/ProjectSettings/AudioManager.asset +0 -0
  127. data/Unity/ProjectSettings/DynamicsManager.asset +0 -0
  128. data/Unity/ProjectSettings/EditorBuildSettings.asset +0 -0
  129. data/Unity/ProjectSettings/EditorSettings.asset +0 -0
  130. data/Unity/ProjectSettings/InputManager.asset +0 -0
  131. data/Unity/ProjectSettings/NavMeshLayers.asset +0 -0
  132. data/Unity/ProjectSettings/NetworkManager.asset +0 -0
  133. data/Unity/ProjectSettings/ProjectSettings.asset +0 -0
  134. data/Unity/ProjectSettings/QualitySettings.asset +0 -0
  135. data/Unity/ProjectSettings/TagManager.asset +0 -0
  136. data/Unity/ProjectSettings/TimeManager.asset +0 -0
  137. data/VERSION +1 -0
  138. data/bin/cukunity +7 -0
  139. data/cukunity.gemspec +298 -0
  140. data/features/get_scene_command.feature +39 -0
  141. data/features/i18n/ja/sokoban_clear.feature +109 -0
  142. data/features/install.feature +23 -0
  143. data/features/keyboard_input.feature +26 -0
  144. data/features/load_level_command.feature +36 -0
  145. data/features/run.feature +33 -0
  146. data/features/select_visible.feature +29 -0
  147. data/features/support/env.rb +11 -0
  148. data/features/touch_input.feature +96 -0
  149. data/lib/cukunity/cli/argument_parser.rb +103 -0
  150. data/lib/cukunity/cli/bootstrap_command.rb +39 -0
  151. data/lib/cukunity/cli/doctor_command.rb +150 -0
  152. data/lib/cukunity/cli/features_command.rb +35 -0
  153. data/lib/cukunity/cli/main.rb +18 -0
  154. data/lib/cukunity/cli/options.rb +8 -0
  155. data/lib/cukunity/cli.rb +11 -0
  156. data/lib/cukunity/cucumber/step_definitions/get_scene_command_steps.rb +37 -0
  157. data/lib/cukunity/cucumber/step_definitions/i18n/ja/get_scene_command_steps.rb +37 -0
  158. data/lib/cukunity/cucumber/step_definitions/i18n/ja/install_steps.rb +25 -0
  159. data/lib/cukunity/cucumber/step_definitions/i18n/ja/keyboard_input_steps.rb +17 -0
  160. data/lib/cukunity/cucumber/step_definitions/i18n/ja/load_level_command_steps.rb +17 -0
  161. data/lib/cukunity/cucumber/step_definitions/i18n/ja/run_steps.rb +25 -0
  162. data/lib/cukunity/cucumber/step_definitions/i18n/ja/select_visible_steps.rb +9 -0
  163. data/lib/cukunity/cucumber/step_definitions/i18n/ja/touch_input_steps.rb +19 -0
  164. data/lib/cukunity/cucumber/step_definitions/i18n/ja.rb +9 -0
  165. data/lib/cukunity/cucumber/step_definitions/install_steps.rb +33 -0
  166. data/lib/cukunity/cucumber/step_definitions/keyboard_input_steps.rb +13 -0
  167. data/lib/cukunity/cucumber/step_definitions/load_level_command_steps.rb +17 -0
  168. data/lib/cukunity/cucumber/step_definitions/run_steps.rb +32 -0
  169. data/lib/cukunity/cucumber/step_definitions/select_visible_steps.rb +15 -0
  170. data/lib/cukunity/cucumber/step_definitions/touch_input_steps.rb +18 -0
  171. data/lib/cukunity/cucumber/support/platform_helpers.rb +105 -0
  172. data/lib/cukunity/cucumber/support/spec_helpers.rb +21 -0
  173. data/lib/cukunity/cucumber/support/transforms.rb +5 -0
  174. data/lib/cukunity/cucumber/support/unity_helpers.rb +35 -0
  175. data/lib/cukunity/cucumber.rb +28 -0
  176. data/lib/cukunity/drivers/android/app.rb +43 -0
  177. data/lib/cukunity/drivers/android/appkiller/.gitignore +9 -0
  178. data/lib/cukunity/drivers/android/appkiller/AndroidManifest.xml +17 -0
  179. data/lib/cukunity/drivers/android/appkiller/ant.properties +17 -0
  180. data/lib/cukunity/drivers/android/appkiller/build.xml +85 -0
  181. data/lib/cukunity/drivers/android/appkiller/proguard.cfg +40 -0
  182. data/lib/cukunity/drivers/android/appkiller/project.properties +11 -0
  183. data/lib/cukunity/drivers/android/appkiller/res/layout/main.xml +13 -0
  184. data/lib/cukunity/drivers/android/appkiller/res/values/strings.xml +4 -0
  185. data/lib/cukunity/drivers/android/appkiller/src/cukunity/appkiller/AppKiller.java +29 -0
  186. data/lib/cukunity/drivers/android/keyboard_input.rb +149 -0
  187. data/lib/cukunity/drivers/android/keycodes.rb +531 -0
  188. data/lib/cukunity/drivers/android/monkey_client.rb +65 -0
  189. data/lib/cukunity/drivers/android/process.rb +103 -0
  190. data/lib/cukunity/drivers/android/touch_input.rb +24 -0
  191. data/lib/cukunity/drivers/android/tunnel_client_methods.rb +22 -0
  192. data/lib/cukunity/drivers/android/unity_client.rb +27 -0
  193. data/lib/cukunity/drivers/android/utils.rb +50 -0
  194. data/lib/cukunity/drivers/android.rb +9 -0
  195. data/lib/cukunity/drivers/iOS/app.rb +32 -0
  196. data/lib/cukunity/drivers/iOS/keyboard_input.rb +104 -0
  197. data/lib/cukunity/drivers/iOS/process.rb +42 -0
  198. data/lib/cukunity/drivers/iOS/touch_input.rb +18 -0
  199. data/lib/cukunity/drivers/iOS/tunnel_client_methods.rb +27 -0
  200. data/lib/cukunity/drivers/iOS/uiautomation.rb +97 -0
  201. data/lib/cukunity/drivers/iOS/uiautomation_master.rb +152 -0
  202. data/lib/cukunity/drivers/iOS/uiautomation_slave.js +238 -0
  203. data/lib/cukunity/drivers/iOS/uiautomation_slave.rb +41 -0
  204. data/lib/cukunity/drivers/iOS/unity_client.rb +27 -0
  205. data/lib/cukunity/drivers/iOS/utils.rb +46 -0
  206. data/lib/cukunity/drivers/iOS.rb +9 -0
  207. data/lib/cukunity/exceptions.rb +24 -0
  208. data/lib/cukunity/keyboard_input_methods.rb +35 -0
  209. data/lib/cukunity/request_line_response_client_methods.rb +80 -0
  210. data/lib/cukunity/tasks/cucumber.rake +22 -0
  211. data/lib/cukunity/touch_input_methods.rb +19 -0
  212. data/lib/cukunity/unity/client_methods.rb +46 -0
  213. data/lib/cukunity/unity/command_facade.rb +67 -0
  214. data/lib/cukunity/unity/component.rb +39 -0
  215. data/lib/cukunity/unity/gameobject.rb +53 -0
  216. data/lib/cukunity/unity/hint.rb +27 -0
  217. data/lib/cukunity/unity/json_container.rb +48 -0
  218. data/lib/cukunity/unity/level.rb +6 -0
  219. data/lib/cukunity/unity/scene.rb +18 -0
  220. data/lib/cukunity/unity/screen.rb +45 -0
  221. data/lib/cukunity/unity/screen_hint_methods.rb +61 -0
  222. data/lib/cukunity/unity/text_hint_methods.rb +17 -0
  223. data/lib/cukunity/unity.rb +11 -0
  224. data/lib/cukunity/utils.rb +56 -0
  225. data/lib/cukunity.rb +19 -0
  226. metadata +411 -0
@@ -0,0 +1,39 @@
1
+ Feature: Get Scene Command
2
+ In order to inspect the state of a Unity game
3
+ As a programmer
4
+ I want to be able to get the current scene contents
5
+
6
+ Background:
7
+ Given I install the app "fixtures/sokoban"
8
+ And I launch it
9
+ And I load the "demo_title" level
10
+
11
+ Scenario: Get game object by name (short form)
12
+ Then I should have a "Main Camera"
13
+
14
+ Scenario: Get game object by name (full form)
15
+ Then I should have a GameObject named "Main Camera"
16
+
17
+ Scenario: Get component on a game object (direct form)
18
+ Then I should have a Camera on "Main Camera"
19
+
20
+ Scenario: Get component on a game object (indirect form)
21
+ Then I should have a GameObject named "Main Camera"
22
+ And it should have a Camera component
23
+
24
+ Scenario: Check boolean properties on a game object
25
+ Then I should have a GameObject named "Main Camera"
26
+ And it should be "active"
27
+
28
+ Scenario: Check boolean properties on a component
29
+ Then I should have a Camera named "Main Camera"
30
+ And it should be "enabled"
31
+
32
+ Scenario: Check any property on a game object as string
33
+ Then I should have a GameObject named "Main Camera"
34
+ And it should have "active" property as "true"
35
+
36
+ Scenario: Check any property on a component as string
37
+ Then I should have a Camera named "Main Camera"
38
+ And it should have "enabled" property as "true"
39
+ And it should have "renderingPath" property as "UsePlayerSettings"
@@ -0,0 +1,109 @@
1
+ # language: ja
2
+ フィーチャ: ゲームクリア
3
+ 倉庫番のプレイヤーとして、
4
+ レベルを次から次へチャレンジしていくために
5
+ 人間を操作して荷物を目的地まで運んでレベルをクリアしたい。
6
+
7
+ 背景:
8
+ 前提 "fixtures/sokoban"からゲームをインストールしている
9
+ かつ ゲームを起動している
10
+ かつ レベル"demo_title"をロードしている
11
+
12
+ シナリオ: ゲームが起動する
13
+ もし タップした後に発生する遅延時間を0.5秒に変更したら
14
+ ならば アプリがインストールされていること
15
+ かつ アプリが動作していること
16
+ かつ アプリがフォアグラウンドで動作していること
17
+ かつ レベル"demo_title"がロードされていること
18
+ かつ "OptionsMenu"が存在していないこと
19
+ かつ "MainMenu"というGameObjectが存在していること
20
+ かつ "Main Camera"というCameraが存在していること
21
+ かつ その中にTransformコンポーネントが存在していること
22
+ かつ その中にTransformが存在していること
23
+ かつ その中にCameraが存在していること
24
+ かつ その中にenabledというプロパティーが存在していること
25
+ かつ その中にenabledが有効になっていること
26
+ かつ その中にrenderingPathが"UsePlayerSettings"と一致していること
27
+
28
+ シナリオ: パーフェクトでレベル1をクリアする
29
+ もし タップした後に発生する遅延時間を0.5秒に変更したら
30
+ かつ "Play"をタップしたら
31
+ かつ "Up"をタップしたら
32
+ かつ "Up"をタップしたら
33
+ かつ "Up"をタップしたら
34
+ かつ "Right"をタップしたら
35
+ かつ "Up"をタップしたら
36
+ かつ "Left"をタップしたら
37
+ かつ "Up"をタップしたら
38
+ かつ "Up"をタップしたら
39
+ かつ "Left"をタップしたら
40
+ かつ "Up"をタップしたら
41
+ かつ "Left"をタップしたら
42
+ かつ "Up"をタップしたら
43
+ かつ "Left"をタップしたら
44
+ かつ "Up"をタップしたら
45
+ かつ "Right"をタップしたら
46
+ かつ "Up"をタップしたら
47
+ かつ "Up"をタップしたら
48
+ かつ "Right"をタップしたら
49
+ かつ "Up"をタップしたら
50
+ かつ "Up"をタップしたら
51
+ かつ "Right"をタップしたら
52
+ かつ "Up"をタップしたら
53
+ かつ "Right"をタップしたら
54
+ かつ "Up"をタップしたら
55
+ かつ "Right"をタップしたら
56
+ かつ "Up"をタップしたら
57
+ かつ "Left"をタップしたら
58
+ かつ "Up"をタップしたら
59
+ かつ "Left"をタップしたら
60
+ かつ "Up"をタップしたら
61
+ かつ "Left"をタップしたら
62
+ かつ "Up"をタップしたら
63
+ かつ "Left"をタップしたら
64
+ かつ "Up"をタップしたら
65
+ かつ "Up"をタップしたら
66
+ かつ "Up"をタップしたら
67
+ かつ "Left"をタップしたら
68
+ かつ "Up"をタップしたら
69
+ かつ "Left"をタップしたら
70
+ かつ "Up"をタップしたら
71
+ かつ "Up"をタップしたら
72
+ かつ "Left"をタップしたら
73
+ かつ "Up"をタップしたら
74
+ かつ "Right"をタップしたら
75
+ かつ "Up"をタップしたら
76
+ かつ "Up"をタップしたら
77
+ かつ "Up"をタップしたら
78
+ かつ "Right"をタップしたら
79
+ かつ "Up"をタップしたら
80
+ かつ "Up"をタップしたら
81
+ かつ "Right"をタップしたら
82
+ かつ "Up"をタップしたら
83
+ かつ "Right"をタップしたら
84
+ かつ "Up"をタップしたら
85
+ かつ "Right"をタップしたら
86
+ かつ "Up"をタップしたら
87
+ かつ "Left"をタップしたら
88
+ かつ "Up"をタップしたら
89
+ かつ "Left"をタップしたら
90
+ かつ "Up"をタップしたら
91
+ かつ "Up"をタップしたら
92
+ かつ "Up"をタップしたら
93
+ かつ "Left"をタップしたら
94
+ かつ "Up"をタップしたら
95
+ かつ "Left"をタップしたら
96
+ かつ "Up"をタップしたら
97
+ ならば "GameClear"を表示していること
98
+ かつ "40"と表示していること
99
+
100
+ @wip
101
+ シナリオ: Optionsメニューにてプレイヤー名を変更する
102
+ もし "Options"をタップしたら
103
+ かつ "PlayerName"をタップしたら
104
+ かつ "Super Player"と入力したら
105
+ ならば "Super Player"と表示していること
106
+
107
+ シナリオ: ゲームをQuitボタンから終了する
108
+ もし "Quit"をタップして3秒待ったら
109
+ ならば アプリが動作していないこと
@@ -0,0 +1,23 @@
1
+ Feature: Install application
2
+ In order to test Unity apps
3
+ As a programmer
4
+ I must be able install them first
5
+
6
+ Background:
7
+ Given I uninstall the app "fixtures/sokoban"
8
+
9
+ Scenario: Direct uninstall
10
+ Then it should not be installed
11
+
12
+ Scenario: Clean install
13
+ Given I install it
14
+ Then it should be installed
15
+
16
+ Scenario: Reinstall
17
+ Given I reinstall it
18
+ Then it should be installed
19
+
20
+ Scenario: Install then uninstall
21
+ Given I install the app "fixtures/sokoban"
22
+ And I uninstall it
23
+ Then it should not be installed
@@ -0,0 +1,26 @@
1
+ Feature: Keyboard Input
2
+ In order to test a game as a human player would do
3
+ As a programmer
4
+ I want to be able to simulate keyboard input events
5
+
6
+ Background:
7
+ Given I install the app "fixtures/sokoban"
8
+ And I relaunch it
9
+ And I tap "Options"
10
+
11
+ Scenario: Application finished launching
12
+ Then I should read "PLAYER NAME:"
13
+ And I should not read "Super Player"
14
+ And I should read "Guest"
15
+
16
+ Scenario: Set player name
17
+ When I tap "PlayerName"
18
+ And I type "Super Player" using "InputMethodServiceGlue"
19
+ Then I should read "Super Player"
20
+
21
+ Scenario: Player name is displayed during play
22
+ When I tap "PlayerName"
23
+ And I append "Player" using "InputMethodServiceGlue"
24
+ And I tap "Ok" and wait 1 second
25
+ And I tap "Play" and wait 1 second
26
+ Then I should read "GuestPlayer"
@@ -0,0 +1,36 @@
1
+ Feature: Load Level Command
2
+ In order to test Unity games faster
3
+ As a programmer
4
+ I want to be able to force the loading of a game level
5
+
6
+ Background:
7
+ Given I install the app "fixtures/sokoban.apk"
8
+ And I launch it
9
+
10
+ Scenario: Reload scene (using level name)
11
+ When I load the "demo_title" level
12
+ Then it should be playing "demo_title" level
13
+ And it should not be playing "demo_game" level
14
+ Then it should be playing level 0
15
+ And it should not be playing level 1
16
+
17
+ Scenario: Reload scene (using level number)
18
+ When I load level 0
19
+ Then it should be playing level 0
20
+ And it should not be playing level 1
21
+ And it should be playing "demo_title" level
22
+ And it should not be playing "demo_game" level
23
+
24
+ Scenario: Load different scene(using level name)
25
+ When I load the "demo_game" level
26
+ Then it should be playing "demo_game" level
27
+ And it should not be playing "demo_title" level
28
+ And it should be playing level 1
29
+ And it should not be playing level 0
30
+
31
+ Scenario: Load different scene(using level number)
32
+ When I load level 1
33
+ Then it should be playing level 1
34
+ And it should not be playing level 0
35
+ And it should be playing "demo_game" level
36
+ And it should not be playing "demo_title" level
@@ -0,0 +1,33 @@
1
+ Feature: Run application
2
+ In order to test Unity apps
3
+ As a programmer
4
+ I must be able run/stop them first
5
+
6
+ Scenario: Clean launch
7
+ Given I reinstall the app "fixtures/sokoban"
8
+ And I launch it
9
+ Then it should be running
10
+ And it should be running on screen
11
+
12
+ Scenario: Launch non installed app
13
+ Given I uninstall the app "fixtures/sokoban"
14
+ And I launch it
15
+ Then it should be running
16
+
17
+ Scenario: Relaunch non running app
18
+ Given I reinstall the app "fixtures/sokoban"
19
+ And I relaunch it
20
+ Then it should be running
21
+ And it should be running on screen
22
+
23
+ Scenario: Relaunch
24
+ Given I reinstall the app "fixtures/sokoban"
25
+ And I launch it
26
+ And I relaunch it
27
+ Then it should be running
28
+ And it should be running on screen
29
+
30
+ Scenario: Relaunch non installed app
31
+ Given I uninstall the app "fixtures/sokoban"
32
+ And I relaunch it
33
+ Then it should be running
@@ -0,0 +1,29 @@
1
+ Feature: Select Visible Objects
2
+ In order to inspect the state of a Unity game
3
+ As a programmer
4
+ I want to be able select visible objects in the game scene
5
+
6
+ Background:
7
+ Given I install the app "fixtures/sokoban"
8
+ And I relaunch it
9
+
10
+ Scenario: Application displays main menu
11
+ Then I should see "Play"
12
+ And I should see "Options"
13
+ And I should see "Quit"
14
+ But I should not see "Ok"
15
+
16
+ Scenario: Options menu displays labels
17
+ When I tap "Options" and wait 1 second
18
+ Then I should read "PLAYER NAME:"
19
+
20
+ Scenario: Play scene displays buttons and labels
21
+ When I tap "Play" and wait 1 second
22
+ Then I should see "Left"
23
+ And I should see "Up"
24
+ And I should see "Right"
25
+ And I should see "Quit"
26
+ And I should see "Retry"
27
+ And I should not see "GameClear"
28
+ And I should read "Guest"
29
+ And I should read "0"
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ begin
3
+ Bundler.setup(:default, :development)
4
+ rescue Bundler::BundlerError => e
5
+ $stderr.puts e.message
6
+ $stderr.puts "Run `bundle install` to install missing gems"
7
+ exit e.status_code
8
+ end
9
+
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
+ require 'cukunity/cucumber'
@@ -0,0 +1,96 @@
1
+ Feature: Touch Input
2
+ In order to test a game as a human player would do
3
+ As a programmer
4
+ I want to be able to simulate touch input events
5
+
6
+ Background:
7
+ Given I install the app "fixtures/sokoban"
8
+ And I launch it
9
+ And I load the "demo_title" level
10
+
11
+ Scenario: Application finished launching
12
+ Then it should be running
13
+ And it should be playing "demo_title" level
14
+ And I should have a GameObject named "MainMenu"
15
+ And I should not have a GameObject named "OptionsMenu"
16
+
17
+ Scenario: Clear game
18
+ When I set the default tap delay to 0.5 seconds
19
+ And I tap "Play"
20
+ And I tap "Up"
21
+ And I tap "Up"
22
+ And I tap "Up"
23
+ And I tap "Right"
24
+ And I tap "Up"
25
+ And I tap "Left"
26
+ And I tap "Up"
27
+ And I tap "Up"
28
+ And I tap "Left"
29
+ And I tap "Up"
30
+ And I tap "Left"
31
+ And I tap "Up"
32
+ And I tap "Left"
33
+ And I tap "Up"
34
+ And I tap "Right"
35
+ And I tap "Up"
36
+ And I tap "Up"
37
+ And I tap "Right"
38
+ And I tap "Up"
39
+ And I tap "Up"
40
+ And I tap "Right"
41
+ And I tap "Up"
42
+ And I tap "Right"
43
+ And I tap "Up"
44
+ And I tap "Right"
45
+ And I tap "Up"
46
+ And I tap "Left"
47
+ And I tap "Up"
48
+ And I tap "Left"
49
+ And I tap "Up"
50
+ And I tap "Left"
51
+ And I tap "Up"
52
+ And I tap "Left"
53
+ And I tap "Up"
54
+ And I tap "Up"
55
+ And I tap "Up"
56
+ And I tap "Left"
57
+ And I tap "Up"
58
+ And I tap "Left"
59
+ And I tap "Up"
60
+ And I tap "Up"
61
+ And I tap "Left"
62
+ And I tap "Up"
63
+ And I tap "Right"
64
+ And I tap "Up"
65
+ And I tap "Up"
66
+ And I tap "Up"
67
+ And I tap "Right"
68
+ And I tap "Up"
69
+ And I tap "Up"
70
+ And I tap "Right"
71
+ And I tap "Up"
72
+ And I tap "Right"
73
+ And I tap "Up"
74
+ And I tap "Right"
75
+ And I tap "Up"
76
+ And I tap "Left"
77
+ And I tap "Up"
78
+ And I tap "Left"
79
+ And I tap "Up"
80
+ And I tap "Up"
81
+ And I tap "Up"
82
+ And I tap "Left"
83
+ And I tap "Up"
84
+ And I tap "Left"
85
+ And I tap "Up"
86
+ Then I should see "GameClear"
87
+ And I should read "40"
88
+
89
+ Scenario: Quit application by tap the "Quit" menu button
90
+ When I tap "Quit" and wait 3 seconds
91
+ Then it should not be running
92
+
93
+ Scenario: Enter options menu
94
+ When I tap "Options" and wait 1 second
95
+ Then I should have a GameObject named "OptionsMenu"
96
+ And I should not have a GameObject named "MainMenu"
@@ -0,0 +1,103 @@
1
+ require 'optparse'
2
+
3
+ module Cukunity
4
+ module CLI
5
+ class ArgumentParser
6
+ attr_reader :args
7
+ attr_reader :remaining_args
8
+ attr_reader :options
9
+ attr_reader :command
10
+
11
+ def self.parse(args)
12
+ parser = new(args)
13
+ parser.parse
14
+ end
15
+
16
+ def initialize(args)
17
+ @args = args.dup
18
+ end
19
+
20
+ def parse
21
+ parse_options
22
+ parse_command
23
+ end
24
+
25
+ private
26
+ def abort_with_msg(msg)
27
+ abort ["Error: #{msg}", @parser].join("\n\n")
28
+ end
29
+
30
+ def parse_options
31
+ # default options
32
+ defaults =
33
+ {
34
+ :verbose => true,
35
+ :ios => true,
36
+ :android => true,
37
+ :help => false
38
+ }
39
+ options = Cukunity::CLI::Options.new(defaults)
40
+
41
+ @remaining_args = @args.dup
42
+ @parser = ::OptionParser.new do |opts|
43
+ opts.banner = 'Usage: cukunity [options] <command>'
44
+
45
+ opts.separator ''
46
+ opts.separator 'Commands:'
47
+ opts.separator 'doctor Check your system for the required platform tools.'
48
+ opts.separator 'bootstrap <path> Bootstrap your Unity project.'
49
+ opts.separator 'features [<path>] Run cucumber against path containing feature files.'
50
+
51
+ opts.separator ''
52
+ opts.separator 'Options:'
53
+
54
+ # --verbose
55
+ opts.on('-v', '--[no-]verbose', 'Enable/Disable verbose mode.') do |v|
56
+ options.verbose = v
57
+ end
58
+
59
+ # --android
60
+ opts.on('--[no-]android', 'Enable/Disable for Android development.') do |use|
61
+ options.android = use
62
+ end
63
+
64
+ # --ios
65
+ opts.on('--[no-]ios', 'Enable/Disable for Android development.') do |use|
66
+ options.ios = use
67
+ end
68
+
69
+ # --help
70
+ opts.on('-h', '--help', 'This help screen.') do
71
+ options.help = true
72
+ end
73
+ end
74
+
75
+ begin
76
+ # parse and return options
77
+ @parser.parse!(@remaining_args)
78
+ rescue ::OptionParser::ParseError => err
79
+ abort_with_msg err
80
+ end
81
+ @options = options
82
+ end
83
+
84
+ def parse_command
85
+ @command = @remaining_args.shift
86
+ if options.help or @command.nil?
87
+ puts @parser
88
+ return nil
89
+ end
90
+ case @command.downcase
91
+ when 'doctor'
92
+ Cukunity::CLI::DoctorCommand.new(self)
93
+ when 'bootstrap'
94
+ Cukunity::CLI::BootstrapCommand.new(self)
95
+ when 'features'
96
+ Cukunity::CLI::FeaturesCommand.new(self)
97
+ else
98
+ abort_with_msg %Q[Error: Command "#{@command}" is unknown.]
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,39 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+
4
+ module Cukunity
5
+ module CLI
6
+ class BootstrapCommand
7
+ def initialize(parser)
8
+ @parser = parser
9
+ end
10
+
11
+ def execute
12
+ path = @parser.remaining_args.first
13
+ if path.nil?
14
+ abort 'You should specify the path to the base of your Unity project.'
15
+ end
16
+ bootstrap_unity(File.expand_path(path))
17
+ end
18
+
19
+ private
20
+ def bootstrap_unity(path)
21
+ dst_assets = File.join(path, 'Assets')
22
+ unless File.directory?(dst_assets)
23
+ abort %Q[Invalid Unity project base specified. Please make sure "#{path}" contains the "Assets" directory.]
24
+ end
25
+ src_assets = File.expand_path(File.join(File.dirname(__FILE__), '../../../Unity/Assets'))
26
+ Dir.glob("#{src_assets}/Plugins/**/*") do |file|
27
+ next if File.directory?(file) or File.extname(file) == '.meta'
28
+ relative_path = Pathname.new(file).relative_path_from(Pathname.new(src_assets)).to_s
29
+ dst_path = File.join(dst_assets, relative_path)
30
+ FileUtils.mkdir_p(File.dirname(dst_path))
31
+ if @parser.options.verbose
32
+ $stdout.puts '===>'.blue + " Copying #{file} " + 'to'.blue + " #{dst_path}"
33
+ end
34
+ FileUtils.copy(file, dst_path)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end