gemba 0.1.0 → 0.2.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 (285) hide show
  1. checksums.yaml +4 -4
  2. data/THIRD_PARTY_NOTICES +37 -2
  3. data/assets/placeholder_boxart.png +0 -0
  4. data/bin/gemba +2 -2
  5. data/ext/gemba/extconf.rb +24 -1
  6. data/ext/gemba/gemba_ext.c +436 -2
  7. data/ext/gemba/gemba_ext.h +2 -0
  8. data/gemba.gemspec +5 -3
  9. data/lib/gemba/achievements/achievement.rb +23 -0
  10. data/lib/gemba/achievements/backend.rb +186 -0
  11. data/lib/gemba/achievements/cache.rb +70 -0
  12. data/lib/gemba/achievements/credentials_presenter.rb +142 -0
  13. data/lib/gemba/achievements/fake_backend.rb +205 -0
  14. data/lib/gemba/achievements/null_backend.rb +11 -0
  15. data/lib/gemba/achievements/offline_backend.rb +168 -0
  16. data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
  17. data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
  18. data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
  19. data/lib/gemba/achievements.rb +19 -0
  20. data/lib/gemba/achievements_window.rb +556 -0
  21. data/lib/gemba/app_controller.rb +1015 -0
  22. data/lib/gemba/bios.rb +54 -0
  23. data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
  24. data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
  25. data/lib/gemba/boxart_fetcher.rb +79 -0
  26. data/lib/gemba/bus_emitter.rb +13 -0
  27. data/lib/gemba/child_window.rb +24 -1
  28. data/lib/gemba/cli/commands/config_cmd.rb +83 -0
  29. data/lib/gemba/cli/commands/decode.rb +154 -0
  30. data/lib/gemba/cli/commands/patch.rb +78 -0
  31. data/lib/gemba/cli/commands/play.rb +78 -0
  32. data/lib/gemba/cli/commands/record.rb +114 -0
  33. data/lib/gemba/cli/commands/replay.rb +161 -0
  34. data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
  35. data/lib/gemba/cli/commands/version.rb +22 -0
  36. data/lib/gemba/cli.rb +52 -364
  37. data/lib/gemba/config.rb +135 -1
  38. data/lib/gemba/data/gb_games.json +1 -0
  39. data/lib/gemba/data/gb_md5.json +1 -0
  40. data/lib/gemba/data/gba_games.json +1 -0
  41. data/lib/gemba/data/gba_md5.json +1 -0
  42. data/lib/gemba/data/gbc_games.json +1 -0
  43. data/lib/gemba/data/gbc_md5.json +1 -0
  44. data/lib/gemba/emulator_frame.rb +1060 -0
  45. data/lib/gemba/event_bus.rb +48 -0
  46. data/lib/gemba/frame_stack.rb +60 -0
  47. data/lib/gemba/game_index.rb +84 -0
  48. data/lib/gemba/game_picker_frame.rb +268 -0
  49. data/lib/gemba/gamepad_map.rb +103 -0
  50. data/lib/gemba/headless.rb +6 -5
  51. data/lib/gemba/headless_player.rb +33 -3
  52. data/lib/gemba/help_window.rb +61 -0
  53. data/lib/gemba/hotkey_map.rb +3 -1
  54. data/lib/gemba/input_recorder.rb +107 -0
  55. data/lib/gemba/input_replayer.rb +119 -0
  56. data/lib/gemba/keyboard_map.rb +90 -0
  57. data/lib/gemba/locales/en.yml +97 -5
  58. data/lib/gemba/locales/ja.yml +97 -5
  59. data/lib/gemba/main_window.rb +56 -0
  60. data/lib/gemba/modal_stack.rb +81 -0
  61. data/lib/gemba/patcher_window.rb +223 -0
  62. data/lib/gemba/platform/gb.rb +21 -0
  63. data/lib/gemba/platform/gba.rb +21 -0
  64. data/lib/gemba/platform/gbc.rb +23 -0
  65. data/lib/gemba/platform.rb +20 -0
  66. data/lib/gemba/platform_open.rb +19 -0
  67. data/lib/gemba/recorder.rb +4 -3
  68. data/lib/gemba/replay_player.rb +691 -0
  69. data/lib/gemba/rom_info.rb +57 -0
  70. data/lib/gemba/rom_info_window.rb +16 -3
  71. data/lib/gemba/rom_library.rb +106 -0
  72. data/lib/gemba/rom_overrides.rb +47 -0
  73. data/lib/gemba/rom_patcher/bps.rb +161 -0
  74. data/lib/gemba/rom_patcher/ips.rb +101 -0
  75. data/lib/gemba/rom_patcher/ups.rb +118 -0
  76. data/lib/gemba/rom_patcher.rb +109 -0
  77. data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
  78. data/lib/gemba/runtime.rb +59 -26
  79. data/lib/gemba/save_state_manager.rb +4 -7
  80. data/lib/gemba/save_state_picker.rb +17 -4
  81. data/lib/gemba/session_logger.rb +64 -0
  82. data/lib/gemba/settings/audio_tab.rb +77 -0
  83. data/lib/gemba/settings/gamepad_tab.rb +351 -0
  84. data/lib/gemba/settings/hotkeys_tab.rb +259 -0
  85. data/lib/gemba/settings/paths.rb +11 -0
  86. data/lib/gemba/settings/recording_tab.rb +83 -0
  87. data/lib/gemba/settings/save_states_tab.rb +91 -0
  88. data/lib/gemba/settings/system_tab.rb +362 -0
  89. data/lib/gemba/settings/video_tab.rb +318 -0
  90. data/lib/gemba/settings_window.rb +162 -1036
  91. data/lib/gemba/version.rb +1 -1
  92. data/lib/gemba/virtual_keyboard.rb +19 -0
  93. data/lib/gemba.rb +2 -12
  94. data/test/achievements_window/test_bulk_sync.rb +218 -0
  95. data/test/achievements_window/test_bus_events.rb +125 -0
  96. data/test/achievements_window/test_close_confirmation.rb +201 -0
  97. data/test/achievements_window/test_initial_state.rb +164 -0
  98. data/test/achievements_window/test_sorting.rb +227 -0
  99. data/test/achievements_window/test_tree_rendering.rb +133 -0
  100. data/test/fixtures/fake_bios.bin +0 -0
  101. data/test/fixtures/pong.gba +0 -0
  102. data/test/fixtures/test.gb +0 -0
  103. data/test/fixtures/test.gbc +0 -0
  104. data/test/fixtures/test_quicksave.ss +0 -0
  105. data/test/screenshots/no_focus.png +0 -0
  106. data/test/shared/teek_test_worker.rb +17 -1
  107. data/test/shared/tk_test_helper.rb +91 -4
  108. data/test/support/achievements_window_helpers.rb +18 -0
  109. data/test/support/fake_core.rb +25 -0
  110. data/test/support/fake_ra_runtime.rb +74 -0
  111. data/test/support/fake_requester.rb +68 -0
  112. data/test/support/player_helpers.rb +20 -5
  113. data/test/test_achievement.rb +32 -0
  114. data/test/{test_player.rb → test_app_controller.rb} +353 -85
  115. data/test/test_bios.rb +123 -0
  116. data/test/test_boxart_fetcher.rb +150 -0
  117. data/test/test_cli.rb +17 -265
  118. data/test/test_cli_config.rb +64 -0
  119. data/test/test_cli_decode.rb +97 -0
  120. data/test/test_cli_patch.rb +58 -0
  121. data/test/test_cli_play.rb +213 -0
  122. data/test/test_cli_ra.rb +175 -0
  123. data/test/test_cli_record.rb +69 -0
  124. data/test/test_cli_replay.rb +72 -0
  125. data/test/test_cli_sync_requester.rb +152 -0
  126. data/test/test_cli_version.rb +27 -0
  127. data/test/test_config.rb +2 -3
  128. data/test/test_config_ra.rb +69 -0
  129. data/test/test_core.rb +62 -1
  130. data/test/test_credentials_presenter.rb +192 -0
  131. data/test/test_event_bus.rb +100 -0
  132. data/test/test_fake_backend_achievements.rb +130 -0
  133. data/test/test_fake_backend_auth.rb +68 -0
  134. data/test/test_game_index.rb +77 -0
  135. data/test/test_game_picker_frame.rb +310 -0
  136. data/test/test_gamepad_map.rb +1 -3
  137. data/test/test_headless_player.rb +17 -3
  138. data/test/test_help_window.rb +82 -0
  139. data/test/test_hotkey_map.rb +22 -1
  140. data/test/test_input_recorder.rb +179 -0
  141. data/test/test_input_replay_determinism.rb +113 -0
  142. data/test/test_input_replayer.rb +162 -0
  143. data/test/test_keyboard_map.rb +1 -3
  144. data/test/test_libretro_backend.rb +41 -0
  145. data/test/test_locale.rb +1 -1
  146. data/test/test_logging.rb +123 -0
  147. data/test/test_null_backend.rb +42 -0
  148. data/test/test_offline_backend.rb +116 -0
  149. data/test/test_overlay_renderer.rb +1 -1
  150. data/test/test_platform.rb +149 -0
  151. data/test/test_ra_backend.rb +313 -0
  152. data/test/test_ra_backend_unlock_gate.rb +56 -0
  153. data/test/test_recorder.rb +0 -3
  154. data/test/test_replay_player.rb +316 -0
  155. data/test/test_rom_info.rb +149 -0
  156. data/test/test_rom_overrides.rb +86 -0
  157. data/test/test_rom_patcher.rb +382 -0
  158. data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
  159. data/test/test_save_state_manager.rb +2 -4
  160. data/test/test_settings_audio.rb +107 -0
  161. data/test/test_settings_hotkeys.rb +83 -66
  162. data/test/test_settings_recording.rb +49 -0
  163. data/test/test_settings_save_states.rb +97 -0
  164. data/test/test_settings_system.rb +133 -0
  165. data/test/test_settings_video.rb +450 -0
  166. data/test/test_settings_window.rb +76 -507
  167. data/test/test_tip_service.rb +6 -6
  168. data/test/test_toast_overlay.rb +1 -1
  169. data/test/test_virtual_events.rb +156 -0
  170. data/test/test_virtual_keyboard.rb +1 -1
  171. data/vendor/rcheevos/CHANGELOG.md +495 -0
  172. data/vendor/rcheevos/LICENSE +21 -0
  173. data/vendor/rcheevos/Package.swift +33 -0
  174. data/vendor/rcheevos/README.md +67 -0
  175. data/vendor/rcheevos/include/module.modulemap +70 -0
  176. data/vendor/rcheevos/include/rc_api_editor.h +296 -0
  177. data/vendor/rcheevos/include/rc_api_info.h +280 -0
  178. data/vendor/rcheevos/include/rc_api_request.h +77 -0
  179. data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
  180. data/vendor/rcheevos/include/rc_api_user.h +262 -0
  181. data/vendor/rcheevos/include/rc_client.h +877 -0
  182. data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
  183. data/vendor/rcheevos/include/rc_consoles.h +138 -0
  184. data/vendor/rcheevos/include/rc_error.h +59 -0
  185. data/vendor/rcheevos/include/rc_export.h +100 -0
  186. data/vendor/rcheevos/include/rc_hash.h +200 -0
  187. data/vendor/rcheevos/include/rc_runtime.h +148 -0
  188. data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
  189. data/vendor/rcheevos/include/rc_util.h +51 -0
  190. data/vendor/rcheevos/include/rcheevos.h +8 -0
  191. data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
  192. data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
  193. data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
  194. data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
  195. data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
  196. data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
  197. data/vendor/rcheevos/src/rc_client.c +6941 -0
  198. data/vendor/rcheevos/src/rc_client_external.c +281 -0
  199. data/vendor/rcheevos/src/rc_client_external.h +177 -0
  200. data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
  201. data/vendor/rcheevos/src/rc_client_internal.h +409 -0
  202. data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
  203. data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
  204. data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
  205. data/vendor/rcheevos/src/rc_compat.c +251 -0
  206. data/vendor/rcheevos/src/rc_compat.h +121 -0
  207. data/vendor/rcheevos/src/rc_libretro.c +915 -0
  208. data/vendor/rcheevos/src/rc_libretro.h +98 -0
  209. data/vendor/rcheevos/src/rc_util.c +199 -0
  210. data/vendor/rcheevos/src/rc_version.c +11 -0
  211. data/vendor/rcheevos/src/rc_version.h +32 -0
  212. data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
  213. data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
  214. data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
  215. data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
  216. data/vendor/rcheevos/src/rcheevos/format.c +330 -0
  217. data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
  218. data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
  219. data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
  220. data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
  221. data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
  222. data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
  223. data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
  224. data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
  225. data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
  226. data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
  227. data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
  228. data/vendor/rcheevos/src/rcheevos/value.c +935 -0
  229. data/vendor/rcheevos/src/rhash/aes.c +480 -0
  230. data/vendor/rcheevos/src/rhash/aes.h +49 -0
  231. data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
  232. data/vendor/rcheevos/src/rhash/hash.c +1402 -0
  233. data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
  234. data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
  235. data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
  236. data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
  237. data/vendor/rcheevos/src/rhash/md5.c +382 -0
  238. data/vendor/rcheevos/src/rhash/md5.h +91 -0
  239. data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
  240. data/vendor/rcheevos/test/libretro.h +205 -0
  241. data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
  242. data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
  243. data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
  244. data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
  245. data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
  246. data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
  247. data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
  248. data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
  249. data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
  250. data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
  251. data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
  252. data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
  253. data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
  254. data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
  255. data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
  256. data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
  257. data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
  258. data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
  259. data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
  260. data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
  261. data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
  262. data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
  263. data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
  264. data/vendor/rcheevos/test/rhash/data.c +657 -0
  265. data/vendor/rcheevos/test/rhash/data.h +32 -0
  266. data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
  267. data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
  268. data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
  269. data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
  270. data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
  271. data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
  272. data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
  273. data/vendor/rcheevos/test/test.c +113 -0
  274. data/vendor/rcheevos/test/test_framework.h +205 -0
  275. data/vendor/rcheevos/test/test_rc_client.c +10509 -0
  276. data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
  277. data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
  278. data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
  279. data/vendor/rcheevos/test/test_types.natvis +9 -0
  280. data/vendor/rcheevos/validator/validator.c +658 -0
  281. data/vendor/rcheevos/validator/validator.vcxproj +152 -0
  282. data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
  283. metadata +274 -11
  284. data/lib/gemba/input_mappings.rb +0 -214
  285. data/lib/gemba/player.rb +0 -1515
@@ -6,161 +6,12 @@ require_relative "shared/tk_test_helper"
6
6
  class TestMGBASettingsWindow < Minitest::Test
7
7
  include TeekTestHelper
8
8
 
9
- # -- Video scale --------------------------------------------------------
10
-
11
- def test_scale_combobox_defaults_to_3x
12
- assert_tk_app("scale combobox defaults to 3x") do
13
- require "gemba/settings_window"
14
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
15
- sw.show
16
- app.update
17
-
18
- assert_equal '3x', app.get_variable(Gemba::SettingsWindow::VAR_SCALE)
19
- end
20
- end
21
-
22
- def test_selecting_2x_scale_fires_callback
23
- assert_tk_app("selecting 2x scale fires on_scale_change") do
24
- require "gemba/settings_window"
25
- received = nil
26
- sw = Gemba::SettingsWindow.new(app, callbacks: {
27
- on_scale_change: proc { |s| received = s }
28
- })
29
- sw.show
30
- app.update
31
-
32
- # Simulate user selecting "2x" from the combobox
33
- app.set_variable(Gemba::SettingsWindow::VAR_SCALE, '2x')
34
- app.command(:event, 'generate', Gemba::SettingsWindow::SCALE_COMBO, '<<ComboboxSelected>>')
35
- app.update
36
-
37
- assert_equal 2, received
38
- end
39
- end
40
-
41
- def test_selecting_4x_scale_fires_callback
42
- assert_tk_app("selecting 4x scale fires on_scale_change") do
43
- require "gemba/settings_window"
44
- received = nil
45
- sw = Gemba::SettingsWindow.new(app, callbacks: {
46
- on_scale_change: proc { |s| received = s }
47
- })
48
- sw.show
49
- app.update
50
-
51
- app.set_variable(Gemba::SettingsWindow::VAR_SCALE, '4x')
52
- app.command(:event, 'generate', Gemba::SettingsWindow::SCALE_COMBO, '<<ComboboxSelected>>')
53
- app.update
54
-
55
- assert_equal 4, received
56
- end
57
- end
58
-
59
- # -- Volume slider ------------------------------------------------------
60
-
61
- def test_volume_defaults_to_100
62
- assert_tk_app("volume defaults to 100") do
63
- require "gemba/settings_window"
64
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
65
- sw.show
66
- app.update
67
-
68
- assert_equal '100', app.get_variable(Gemba::SettingsWindow::VAR_VOLUME)
69
- end
70
- end
71
-
72
- def test_dragging_volume_to_50_fires_callback
73
- assert_tk_app("dragging volume to 50 fires on_volume_change") do
74
- require "gemba/settings_window"
75
- received = nil
76
- sw = Gemba::SettingsWindow.new(app, callbacks: {
77
- on_volume_change: proc { |v| received = v }
78
- })
79
- sw.show
80
- app.update
81
-
82
- # Simulate user dragging volume slider to 50
83
- app.command(Gemba::SettingsWindow::VOLUME_SCALE, 'set', 50)
84
- app.update
85
-
86
- assert_in_delta 0.5, received, 0.01
87
- end
88
- end
89
-
90
- def test_volume_at_zero
91
- assert_tk_app("volume at zero") do
92
- require "gemba/settings_window"
93
- received = nil
94
- sw = Gemba::SettingsWindow.new(app, callbacks: {
95
- on_volume_change: proc { |v| received = v }
96
- })
97
- sw.show
98
- app.update
99
-
100
- app.command(Gemba::SettingsWindow::VOLUME_SCALE, 'set', 0)
101
- app.update
102
-
103
- assert_in_delta 0.0, received, 0.01
104
- end
105
- end
106
-
107
- # -- Mute checkbox ------------------------------------------------------
108
-
109
- def test_mute_defaults_to_off
110
- assert_tk_app("mute defaults to off") do
111
- require "gemba/settings_window"
112
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
113
- sw.show
114
- app.update
115
-
116
- assert_equal '0', app.get_variable(Gemba::SettingsWindow::VAR_MUTE)
117
- end
118
- end
119
-
120
- def test_clicking_mute_fires_callback
121
- assert_tk_app("clicking mute fires on_mute_change") do
122
- require "gemba/settings_window"
123
- received = nil
124
- sw = Gemba::SettingsWindow.new(app, callbacks: {
125
- on_mute_change: proc { |m| received = m }
126
- })
127
- sw.show
128
- app.update
129
-
130
- # Simulate user clicking the mute checkbox
131
- app.command(Gemba::SettingsWindow::MUTE_CHECK, 'invoke')
132
- app.update
133
-
134
- assert_equal true, received
135
- end
136
- end
137
-
138
- def test_clicking_mute_twice_unmutes
139
- assert_tk_app("clicking mute twice unmutes") do
140
- require "gemba/settings_window"
141
- received = nil
142
- sw = Gemba::SettingsWindow.new(app, callbacks: {
143
- on_mute_change: proc { |m| received = m }
144
- })
145
- sw.show
146
- app.update
147
-
148
- app.command(Gemba::SettingsWindow::MUTE_CHECK, 'invoke')
149
- app.update
150
- assert_equal true, received
151
-
152
- app.command(Gemba::SettingsWindow::MUTE_CHECK, 'invoke')
153
- app.update
154
- assert_equal false, received
155
- end
156
- end
157
-
158
9
  # -- Window lifecycle ---------------------------------------------------
159
10
 
160
11
  def test_settings_starts_hidden
161
12
  assert_tk_app("settings starts hidden") do
162
- require "gemba/settings_window"
163
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
13
+ require "gemba/headless"
14
+ sw = Gemba::SettingsWindow.new(app)
164
15
  app.update
165
16
 
166
17
  assert_equal 'withdrawn', app.command(:wm, 'state', Gemba::SettingsWindow::TOP)
@@ -169,10 +20,10 @@ class TestMGBASettingsWindow < Minitest::Test
169
20
 
170
21
  def test_show_and_hide
171
22
  assert_tk_app("show makes window visible, hide withdraws it") do
172
- require "gemba/settings_window"
23
+ require "gemba/headless"
173
24
  app.show
174
25
  app.update
175
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
26
+ sw = Gemba::SettingsWindow.new(app)
176
27
 
177
28
  sw.show
178
29
  app.command(:focus, '-force', Gemba::SettingsWindow::TOP)
@@ -189,8 +40,8 @@ class TestMGBASettingsWindow < Minitest::Test
189
40
 
190
41
  def test_gamepad_tab_exists
191
42
  assert_tk_app("gamepad tab exists in notebook") do
192
- require "gemba/settings_window"
193
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
43
+ require "gemba/headless"
44
+ sw = Gemba::SettingsWindow.new(app)
194
45
  sw.show
195
46
  app.update
196
47
 
@@ -201,8 +52,8 @@ class TestMGBASettingsWindow < Minitest::Test
201
52
 
202
53
  def test_deadzone_defaults_to_25
203
54
  assert_tk_app("dead zone defaults to 25") do
204
- require "gemba/settings_window"
205
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
55
+ require "gemba/headless"
56
+ sw = Gemba::SettingsWindow.new(app)
206
57
  sw.show
207
58
  app.update
208
59
 
@@ -212,11 +63,11 @@ class TestMGBASettingsWindow < Minitest::Test
212
63
 
213
64
  def test_deadzone_change_fires_callback
214
65
  assert_tk_app("dead zone change fires on_deadzone_change") do
215
- require "gemba/settings_window"
66
+ require "gemba/headless"
216
67
  received = nil
217
- sw = Gemba::SettingsWindow.new(app, callbacks: {
218
- on_deadzone_change: proc { |t| received = t }
219
- })
68
+ Gemba.bus = Gemba::EventBus.new
69
+ Gemba.bus.on(:deadzone_changed) { |t| received = t }
70
+ sw = Gemba::SettingsWindow.new(app)
220
71
  sw.show
221
72
  app.update
222
73
 
@@ -236,8 +87,8 @@ class TestMGBASettingsWindow < Minitest::Test
236
87
 
237
88
  def test_clicking_gba_button_enters_listen_mode
238
89
  assert_tk_app("clicking GBA button enters listen mode") do
239
- require "gemba/settings_window"
240
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
90
+ require "gemba/headless"
91
+ sw = Gemba::SettingsWindow.new(app)
241
92
  sw.show
242
93
  app.update
243
94
 
@@ -253,12 +104,12 @@ class TestMGBASettingsWindow < Minitest::Test
253
104
 
254
105
  def test_capture_mapping_updates_button_label
255
106
  assert_tk_app("capture_mapping updates button label") do
256
- require "gemba/settings_window"
107
+ require "gemba/headless"
257
108
  received_gba = nil
258
109
  received_key = nil
259
- sw = Gemba::SettingsWindow.new(app, callbacks: {
260
- on_keyboard_map_change: proc { |g, b| received_gba = g; received_key = b }
261
- })
110
+ Gemba.bus = Gemba::EventBus.new
111
+ Gemba.bus.on(:keyboard_map_changed) { |g, b| received_gba = g; received_key = b }
112
+ sw = Gemba::SettingsWindow.new(app)
262
113
  sw.show
263
114
  app.update
264
115
 
@@ -280,8 +131,8 @@ class TestMGBASettingsWindow < Minitest::Test
280
131
 
281
132
  def test_gamepad_selector_defaults_to_keyboard_only
282
133
  assert_tk_app("gamepad selector defaults to Keyboard Only") do
283
- require "gemba/settings_window"
284
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
134
+ require "gemba/headless"
135
+ sw = Gemba::SettingsWindow.new(app)
285
136
  sw.show
286
137
  app.update
287
138
 
@@ -293,8 +144,8 @@ class TestMGBASettingsWindow < Minitest::Test
293
144
 
294
145
  def test_undo_starts_disabled
295
146
  assert_tk_app("undo button starts disabled") do
296
- require "gemba/settings_window"
297
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
147
+ require "gemba/headless"
148
+ sw = Gemba::SettingsWindow.new(app)
298
149
  sw.show
299
150
  app.update
300
151
 
@@ -305,8 +156,8 @@ class TestMGBASettingsWindow < Minitest::Test
305
156
 
306
157
  def test_undo_enabled_after_remap
307
158
  assert_tk_app("undo enabled after capturing a mapping") do
308
- require "gemba/settings_window"
309
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
159
+ require "gemba/headless"
160
+ sw = Gemba::SettingsWindow.new(app)
310
161
  sw.show
311
162
  app.update
312
163
 
@@ -322,11 +173,11 @@ class TestMGBASettingsWindow < Minitest::Test
322
173
 
323
174
  def test_undo_fires_callback_and_disables
324
175
  assert_tk_app("undo fires on_undo_gamepad and disables itself") do
325
- require "gemba/settings_window"
176
+ require "gemba/headless"
326
177
  undo_called = false
327
- sw = Gemba::SettingsWindow.new(app, callbacks: {
328
- on_undo_gamepad: proc { undo_called = true }
329
- })
178
+ Gemba.bus = Gemba::EventBus.new
179
+ Gemba.bus.on(:undo_gamepad) { undo_called = true }
180
+ sw = Gemba::SettingsWindow.new(app)
330
181
  sw.show
331
182
  app.update
332
183
 
@@ -348,8 +199,8 @@ class TestMGBASettingsWindow < Minitest::Test
348
199
 
349
200
  def test_reset_disables_undo
350
201
  assert_tk_app("reset to defaults disables undo button") do
351
- require "gemba/settings_window"
352
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
202
+ require "gemba/headless"
203
+ sw = Gemba::SettingsWindow.new(app)
353
204
  sw.show
354
205
  app.update
355
206
 
@@ -372,93 +223,12 @@ class TestMGBASettingsWindow < Minitest::Test
372
223
  end
373
224
  end
374
225
 
375
- # -- Aspect ratio checkbox ------------------------------------------------
376
-
377
- def test_aspect_ratio_defaults_to_on
378
- assert_tk_app("aspect ratio checkbox defaults to on") do
379
- require "gemba/settings_window"
380
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
381
- sw.show
382
- app.update
383
-
384
- assert_equal '1', app.get_variable(Gemba::SettingsWindow::VAR_ASPECT_RATIO)
385
- end
386
- end
387
-
388
- def test_unchecking_aspect_ratio_fires_callback
389
- assert_tk_app("unchecking aspect ratio fires on_aspect_ratio_change") do
390
- require "gemba/settings_window"
391
- received = nil
392
- sw = Gemba::SettingsWindow.new(app, callbacks: {
393
- on_aspect_ratio_change: proc { |keep| received = keep }
394
- })
395
- sw.show
396
- app.update
397
-
398
- # Simulate user unchecking the checkbox
399
- app.command(Gemba::SettingsWindow::ASPECT_CHECK, 'invoke')
400
- app.update
401
-
402
- assert_equal false, received
403
- end
404
- end
405
-
406
- def test_checking_aspect_ratio_fires_callback
407
- assert_tk_app("re-checking aspect ratio fires callback with true") do
408
- require "gemba/settings_window"
409
- received = nil
410
- sw = Gemba::SettingsWindow.new(app, callbacks: {
411
- on_aspect_ratio_change: proc { |keep| received = keep }
412
- })
413
- sw.show
414
- app.update
415
-
416
- # Uncheck then re-check
417
- app.command(Gemba::SettingsWindow::ASPECT_CHECK, 'invoke')
418
- app.update
419
- app.command(Gemba::SettingsWindow::ASPECT_CHECK, 'invoke')
420
- app.update
421
-
422
- assert_equal true, received
423
- end
424
- end
425
-
426
- # -- Show FPS checkbox ----------------------------------------------------
427
-
428
- def test_show_fps_defaults_to_on
429
- assert_tk_app("show fps checkbox defaults to on") do
430
- require "gemba/settings_window"
431
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
432
- sw.show
433
- app.update
434
-
435
- assert_equal '1', app.get_variable(Gemba::SettingsWindow::VAR_SHOW_FPS)
436
- end
437
- end
438
-
439
- def test_unchecking_show_fps_fires_callback
440
- assert_tk_app("unchecking show fps fires on_show_fps_change") do
441
- require "gemba/settings_window"
442
- received = nil
443
- sw = Gemba::SettingsWindow.new(app, callbacks: {
444
- on_show_fps_change: proc { |show| received = show }
445
- })
446
- sw.show
447
- app.update
448
-
449
- app.command(Gemba::SettingsWindow::SHOW_FPS_CHECK, 'invoke')
450
- app.update
451
-
452
- assert_equal false, received
453
- end
454
- end
455
-
456
226
  # -- Keyboard mode --------------------------------------------------------
457
227
 
458
228
  def test_starts_in_keyboard_mode
459
229
  assert_tk_app("starts in keyboard mode") do
460
- require "gemba/settings_window"
461
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
230
+ require "gemba/headless"
231
+ sw = Gemba::SettingsWindow.new(app)
462
232
  sw.show
463
233
  app.update
464
234
 
@@ -468,8 +238,8 @@ class TestMGBASettingsWindow < Minitest::Test
468
238
 
469
239
  def test_keyboard_mode_labels_show_keysyms
470
240
  assert_tk_app("keyboard mode shows keysym labels") do
471
- require "gemba/settings_window"
472
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
241
+ require "gemba/headless"
242
+ sw = Gemba::SettingsWindow.new(app)
473
243
  sw.show
474
244
  app.update
475
245
 
@@ -482,8 +252,8 @@ class TestMGBASettingsWindow < Minitest::Test
482
252
 
483
253
  def test_switching_to_gamepad_mode_changes_labels
484
254
  assert_tk_app("switching to gamepad shows gamepad labels") do
485
- require "gemba/settings_window"
486
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
255
+ require "gemba/headless"
256
+ sw = Gemba::SettingsWindow.new(app)
487
257
  sw.show
488
258
  app.update
489
259
 
@@ -502,8 +272,8 @@ class TestMGBASettingsWindow < Minitest::Test
502
272
 
503
273
  def test_deadzone_disabled_in_keyboard_mode
504
274
  assert_tk_app("dead zone slider disabled in keyboard mode") do
505
- require "gemba/settings_window"
506
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
275
+ require "gemba/headless"
276
+ sw = Gemba::SettingsWindow.new(app)
507
277
  sw.show
508
278
  app.update
509
279
 
@@ -514,8 +284,8 @@ class TestMGBASettingsWindow < Minitest::Test
514
284
 
515
285
  def test_deadzone_enabled_in_gamepad_mode
516
286
  assert_tk_app("dead zone slider enabled in gamepad mode") do
517
- require "gemba/settings_window"
518
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
287
+ require "gemba/headless"
288
+ sw = Gemba::SettingsWindow.new(app)
519
289
  sw.show
520
290
  app.update
521
291
 
@@ -531,12 +301,12 @@ class TestMGBASettingsWindow < Minitest::Test
531
301
 
532
302
  def test_keyboard_capture_fires_keyboard_callback
533
303
  assert_tk_app("keyboard capture fires on_keyboard_map_change") do
534
- require "gemba/settings_window"
304
+ require "gemba/headless"
535
305
  received_gba = nil
536
306
  received_key = nil
537
- sw = Gemba::SettingsWindow.new(app, callbacks: {
538
- on_keyboard_map_change: proc { |g, k| received_gba = g; received_key = k }
539
- })
307
+ Gemba.bus = Gemba::EventBus.new
308
+ Gemba.bus.on(:keyboard_map_changed) { |g, k| received_gba = g; received_key = k }
309
+ sw = Gemba::SettingsWindow.new(app)
540
310
  sw.show
541
311
  app.update
542
312
 
@@ -552,8 +322,8 @@ class TestMGBASettingsWindow < Minitest::Test
552
322
 
553
323
  def test_switching_mode_cancels_listen
554
324
  assert_tk_app("switching input mode cancels active listen") do
555
- require "gemba/settings_window"
556
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
325
+ require "gemba/headless"
326
+ sw = Gemba::SettingsWindow.new(app)
557
327
  sw.show
558
328
  app.update
559
329
 
@@ -578,7 +348,7 @@ class TestMGBASettingsWindow < Minitest::Test
578
348
 
579
349
  def test_virtual_gamepad_listen_and_capture
580
350
  assert_tk_app("virtual gamepad button press captured in listen mode") do
581
- require "gemba/settings_window"
351
+ require "gemba/headless"
582
352
  require "teek/sdl2"
583
353
  gp_cls = Teek::SDL2::Gamepad
584
354
 
@@ -588,9 +358,9 @@ class TestMGBASettingsWindow < Minitest::Test
588
358
 
589
359
  received_gba = nil
590
360
  received_gp = nil
591
- sw = Gemba::SettingsWindow.new(app, callbacks: {
592
- on_gamepad_map_change: proc { |g, b| received_gba = g; received_gp = b }
593
- })
361
+ Gemba.bus = Gemba::EventBus.new
362
+ Gemba.bus.on(:gamepad_map_changed) { |g, b| received_gba = g; received_gp = b }
363
+ sw = Gemba::SettingsWindow.new(app)
594
364
  sw.show
595
365
  app.update
596
366
 
@@ -637,12 +407,13 @@ class TestMGBASettingsWindow < Minitest::Test
637
407
 
638
408
  def test_kb_mapping_rejected_when_conflicting_with_hotkey
639
409
  assert_tk_app("keyboard mapping rejected when key conflicts with hotkey") do
640
- require "gemba/settings_window"
641
- require "gemba/hotkey_map"
410
+ require "gemba/headless"
411
+ require "gemba/headless"
642
412
  received = false
643
413
  conflict_msg = nil
414
+ Gemba.bus = Gemba::EventBus.new
415
+ Gemba.bus.on(:keyboard_map_changed) { |*| received = true }
644
416
  sw = Gemba::SettingsWindow.new(app, callbacks: {
645
- on_keyboard_map_change: proc { |*| received = true },
646
417
  on_validate_kb_mapping: ->(keysym) {
647
418
  # Simulate: 'F5' is the Quick Save hotkey
648
419
  keysym == 'F5' ? '"F5" is assigned to hotkey: Quick save' : nil
@@ -669,11 +440,12 @@ class TestMGBASettingsWindow < Minitest::Test
669
440
 
670
441
  def test_kb_mapping_accepted_when_no_conflict
671
442
  assert_tk_app("keyboard mapping accepted when no conflict") do
672
- require "gemba/settings_window"
673
- require "gemba/hotkey_map"
443
+ require "gemba/headless"
444
+ require "gemba/headless"
674
445
  received_gba = nil
446
+ Gemba.bus = Gemba::EventBus.new
447
+ Gemba.bus.on(:keyboard_map_changed) { |g, _| received_gba = g }
675
448
  sw = Gemba::SettingsWindow.new(app, callbacks: {
676
- on_keyboard_map_change: proc { |g, _| received_gba = g },
677
449
  on_validate_kb_mapping: ->(_) { nil },
678
450
  })
679
451
  sw.show
@@ -692,8 +464,8 @@ class TestMGBASettingsWindow < Minitest::Test
692
464
 
693
465
  def test_gamepad_mapping_skips_validation
694
466
  assert_tk_app("gamepad mode skips keyboard validation") do
695
- require "gemba/settings_window"
696
- require "gemba/hotkey_map"
467
+ require "gemba/headless"
468
+ require "gemba/headless"
697
469
  require "teek/sdl2"
698
470
  gp_cls = Teek::SDL2::Gamepad
699
471
  gp_cls.init_subsystem
@@ -701,8 +473,9 @@ class TestMGBASettingsWindow < Minitest::Test
701
473
  gp = gp_cls.open(idx)
702
474
 
703
475
  received_gba = nil
476
+ Gemba.bus = Gemba::EventBus.new
477
+ Gemba.bus.on(:gamepad_map_changed) { |g, _| received_gba = g }
704
478
  sw = Gemba::SettingsWindow.new(app, callbacks: {
705
- on_gamepad_map_change: proc { |g, _| received_gba = g },
706
479
  on_validate_kb_mapping: ->(_) { "should not be called" },
707
480
  })
708
481
  sw.show
@@ -728,173 +501,12 @@ class TestMGBASettingsWindow < Minitest::Test
728
501
  end
729
502
  end
730
503
 
731
- # -- Pixel filter combo ----------------------------------------------------
732
-
733
- def test_pixel_filter_defaults_to_nearest
734
- assert_tk_app("pixel filter defaults to Nearest Neighbor") do
735
- require "gemba/settings_window"
736
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
737
- sw.show
738
- app.update
739
-
740
- assert_equal 'Nearest Neighbor', app.get_variable(Gemba::SettingsWindow::VAR_FILTER)
741
- end
742
- end
743
-
744
- def test_selecting_bilinear_fires_callback
745
- assert_tk_app("selecting Bilinear fires on_filter_change") do
746
- require "gemba/settings_window"
747
- received = nil
748
- sw = Gemba::SettingsWindow.new(app, callbacks: {
749
- on_filter_change: proc { |f| received = f }
750
- })
751
- sw.show
752
- app.update
753
-
754
- app.set_variable(Gemba::SettingsWindow::VAR_FILTER, 'Bilinear')
755
- app.command(:event, 'generate', Gemba::SettingsWindow::FILTER_COMBO, '<<ComboboxSelected>>')
756
- app.update
757
-
758
- assert_equal 'linear', received
759
- end
760
- end
761
-
762
- # -- Integer scaling checkbox ----------------------------------------------
763
-
764
- def test_integer_scale_defaults_to_off
765
- assert_tk_app("integer scale checkbox defaults to off") do
766
- require "gemba/settings_window"
767
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
768
- sw.show
769
- app.update
770
-
771
- assert_equal '0', app.get_variable(Gemba::SettingsWindow::VAR_INTEGER_SCALE)
772
- end
773
- end
774
-
775
- def test_clicking_integer_scale_fires_callback
776
- assert_tk_app("clicking integer scale fires on_integer_scale_change") do
777
- require "gemba/settings_window"
778
- received = nil
779
- sw = Gemba::SettingsWindow.new(app, callbacks: {
780
- on_integer_scale_change: proc { |v| received = v }
781
- })
782
- sw.show
783
- app.update
784
-
785
- app.command(Gemba::SettingsWindow::INTEGER_SCALE_CHECK, 'invoke')
786
- app.update
787
-
788
- assert_equal true, received
789
- end
790
- end
791
-
792
- # -- Color correction checkbox --------------------------------------------
793
-
794
- def test_color_correction_defaults_to_off
795
- assert_tk_app("color correction checkbox defaults to off") do
796
- require "gemba/settings_window"
797
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
798
- sw.show
799
- app.update
800
-
801
- assert_equal '0', app.get_variable(Gemba::SettingsWindow::VAR_COLOR_CORRECTION)
802
- end
803
- end
804
-
805
- def test_clicking_color_correction_fires_callback
806
- assert_tk_app("clicking color correction fires on_color_correction_change") do
807
- require "gemba/settings_window"
808
- received = nil
809
- sw = Gemba::SettingsWindow.new(app, callbacks: {
810
- on_color_correction_change: proc { |v| received = v }
811
- })
812
- sw.show
813
- app.update
814
-
815
- app.command(Gemba::SettingsWindow::COLOR_CORRECTION_CHECK, 'invoke')
816
- app.update
817
-
818
- assert_equal true, received
819
- end
820
- end
821
-
822
- def test_unchecking_color_correction_fires_false
823
- assert_tk_app("unchecking color correction fires callback with false") do
824
- require "gemba/settings_window"
825
- received = nil
826
- sw = Gemba::SettingsWindow.new(app, callbacks: {
827
- on_color_correction_change: proc { |v| received = v }
828
- })
829
- sw.show
830
- app.update
831
-
832
- # Check then uncheck
833
- app.command(Gemba::SettingsWindow::COLOR_CORRECTION_CHECK, 'invoke')
834
- app.update
835
- app.command(Gemba::SettingsWindow::COLOR_CORRECTION_CHECK, 'invoke')
836
- app.update
837
-
838
- assert_equal false, received
839
- end
840
- end
841
-
842
- # -- Frame blending checkbox -----------------------------------------------
843
-
844
- def test_frame_blending_defaults_to_off
845
- assert_tk_app("frame blending checkbox defaults to off") do
846
- require "gemba/settings_window"
847
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
848
- sw.show
849
- app.update
850
-
851
- assert_equal '0', app.get_variable(Gemba::SettingsWindow::VAR_FRAME_BLENDING)
852
- end
853
- end
854
-
855
- def test_clicking_frame_blending_fires_callback
856
- assert_tk_app("clicking frame blending fires on_frame_blending_change") do
857
- require "gemba/settings_window"
858
- received = nil
859
- sw = Gemba::SettingsWindow.new(app, callbacks: {
860
- on_frame_blending_change: proc { |v| received = v }
861
- })
862
- sw.show
863
- app.update
864
-
865
- app.command(Gemba::SettingsWindow::FRAME_BLENDING_CHECK, 'invoke')
866
- app.update
867
-
868
- assert_equal true, received
869
- end
870
- end
871
-
872
- def test_unchecking_frame_blending_fires_false
873
- assert_tk_app("unchecking frame blending fires callback with false") do
874
- require "gemba/settings_window"
875
- received = nil
876
- sw = Gemba::SettingsWindow.new(app, callbacks: {
877
- on_frame_blending_change: proc { |v| received = v }
878
- })
879
- sw.show
880
- app.update
881
-
882
- # Check then uncheck
883
- app.command(Gemba::SettingsWindow::FRAME_BLENDING_CHECK, 'invoke')
884
- app.update
885
- app.command(Gemba::SettingsWindow::FRAME_BLENDING_CHECK, 'invoke')
886
- app.update
887
-
888
- assert_equal false, received
889
- end
890
- end
891
-
892
504
  # -- Per-game settings checkbox -------------------------------------------
893
505
 
894
506
  def test_per_game_checkbox_defaults_disabled
895
507
  assert_tk_app("per-game checkbox defaults disabled") do
896
- require "gemba/settings_window"
897
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
508
+ require "gemba/headless"
509
+ sw = Gemba::SettingsWindow.new(app)
898
510
  sw.show
899
511
  app.update
900
512
 
@@ -905,8 +517,8 @@ class TestMGBASettingsWindow < Minitest::Test
905
517
 
906
518
  def test_set_per_game_available_enables_checkbox
907
519
  assert_tk_app("set_per_game_available enables checkbox") do
908
- require "gemba/settings_window"
909
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
520
+ require "gemba/headless"
521
+ sw = Gemba::SettingsWindow.new(app)
910
522
  sw.show
911
523
  app.update
912
524
 
@@ -920,11 +532,11 @@ class TestMGBASettingsWindow < Minitest::Test
920
532
 
921
533
  def test_per_game_toggle_fires_callback
922
534
  assert_tk_app("per-game toggle fires on_per_game_toggle") do
923
- require "gemba/settings_window"
535
+ require "gemba/headless"
924
536
  received = nil
925
- sw = Gemba::SettingsWindow.new(app, callbacks: {
926
- on_per_game_toggle: proc { |v| received = v }
927
- })
537
+ Gemba.bus = Gemba::EventBus.new
538
+ Gemba.bus.on(:per_game_toggled) { |v| received = v }
539
+ sw = Gemba::SettingsWindow.new(app)
928
540
  sw.show
929
541
  app.update
930
542
 
@@ -939,8 +551,8 @@ class TestMGBASettingsWindow < Minitest::Test
939
551
 
940
552
  def test_set_per_game_active_syncs_variable
941
553
  assert_tk_app("set_per_game_active syncs variable") do
942
- require "gemba/settings_window"
943
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
554
+ require "gemba/headless"
555
+ sw = Gemba::SettingsWindow.new(app)
944
556
  sw.show
945
557
  app.update
946
558
 
@@ -954,8 +566,8 @@ class TestMGBASettingsWindow < Minitest::Test
954
566
 
955
567
  def test_per_game_disabled_on_gamepad_tab
956
568
  assert_tk_app("per-game disabled on gamepad tab") do
957
- require "gemba/settings_window"
958
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
569
+ require "gemba/headless"
570
+ sw = Gemba::SettingsWindow.new(app)
959
571
  sw.show
960
572
  app.update
961
573
 
@@ -974,8 +586,8 @@ class TestMGBASettingsWindow < Minitest::Test
974
586
 
975
587
  def test_per_game_re_enabled_on_video_tab
976
588
  assert_tk_app("per-game re-enabled on video tab") do
977
- require "gemba/settings_window"
978
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
589
+ require "gemba/headless"
590
+ sw = Gemba::SettingsWindow.new(app)
979
591
  sw.show
980
592
  app.update
981
593
 
@@ -993,47 +605,4 @@ class TestMGBASettingsWindow < Minitest::Test
993
605
  end
994
606
  end
995
607
 
996
- # -- Recording tab -------------------------------------------------------
997
-
998
- def test_recording_tab_exists
999
- assert_tk_app("recording tab exists in notebook") do
1000
- require "gemba/settings_window"
1001
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
1002
- sw.show
1003
- app.update
1004
-
1005
- tabs = app.command(Gemba::SettingsWindow::NB, 'tabs')
1006
- assert_includes tabs, Gemba::SettingsWindow::REC_TAB
1007
- end
1008
- end
1009
-
1010
- def test_compression_combobox_defaults_to_1
1011
- assert_tk_app("compression combobox defaults to 1") do
1012
- require "gemba/settings_window"
1013
- sw = Gemba::SettingsWindow.new(app, callbacks: {})
1014
- sw.show
1015
- app.update
1016
-
1017
- assert_equal '1', app.get_variable(Gemba::SettingsWindow::VAR_REC_COMPRESSION)
1018
- end
1019
- end
1020
-
1021
- def test_selecting_compression_fires_callback
1022
- assert_tk_app("selecting compression fires on_compression_change") do
1023
- require "gemba/settings_window"
1024
- received = nil
1025
- sw = Gemba::SettingsWindow.new(app, callbacks: {
1026
- on_compression_change: proc { |v| received = v }
1027
- })
1028
- sw.show
1029
- app.update
1030
-
1031
- app.set_variable(Gemba::SettingsWindow::VAR_REC_COMPRESSION, '6')
1032
- app.command(:event, 'generate', Gemba::SettingsWindow::REC_COMPRESSION_COMBO, '<<ComboboxSelected>>')
1033
- app.update
1034
-
1035
- assert_equal 6, received
1036
- end
1037
- end
1038
-
1039
608
  end