gemba 0.1.1 → 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 +23 -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 +134 -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 -1525
@@ -0,0 +1,952 @@
1
+ #include "../rc_libretro.h"
2
+
3
+ #include "../rc_compat.h"
4
+ #include "rc_consoles.h"
5
+
6
+ #include "test_framework.h"
7
+ #include "rhash/mock_filereader.h"
8
+
9
+ static void* retro_memory_data[4] = { NULL, NULL, NULL, NULL };
10
+ static size_t retro_memory_size[4] = { 0, 0, 0, 0 };
11
+
12
+ static void libretro_get_core_memory_info(uint32_t id, rc_libretro_core_memory_info_t* info)
13
+ {
14
+ info->data = retro_memory_data[id];
15
+ info->size = retro_memory_size[id];
16
+ }
17
+
18
+ static int libretro_get_image_path(uint32_t index, char* buffer, size_t buffer_size)
19
+ {
20
+ if (index < 0 || index > 9)
21
+ return 0;
22
+
23
+ snprintf(buffer, buffer_size, "save%d.dsk", index);
24
+ return 1;
25
+ }
26
+
27
+ static void test_allowed_setting(const char* library_name, const char* setting, const char* value) {
28
+ const rc_disallowed_setting_t* settings = rc_libretro_get_disallowed_settings(library_name);
29
+ if (!settings)
30
+ return;
31
+
32
+ ASSERT_TRUE(rc_libretro_is_setting_allowed(settings, setting, value));
33
+ }
34
+
35
+ static void test_disallowed_setting(const char* library_name, const char* setting, const char* value) {
36
+ const rc_disallowed_setting_t* settings = rc_libretro_get_disallowed_settings(library_name);
37
+ ASSERT_PTR_NOT_NULL(settings);
38
+ ASSERT_FALSE(rc_libretro_is_setting_allowed(settings, setting, value));
39
+ }
40
+
41
+ static void test_allowed_system(const char* library_name, uint32_t console_id) {
42
+ ASSERT_TRUE(rc_libretro_is_system_allowed(library_name, console_id));
43
+ }
44
+
45
+ static void test_disallowed_system(const char* library_name, uint32_t console_id) {
46
+ ASSERT_FALSE(rc_libretro_is_system_allowed(library_name, console_id));
47
+ }
48
+
49
+ static void test_memory_init_without_regions() {
50
+ rc_libretro_memory_regions_t regions;
51
+ uint32_t avail;
52
+ #define BUFFER1_SIZE 16
53
+ #define BUFFER2_SIZE 8
54
+ /* put explicit gap between buffer1 and buffer2 to prevent them from being merged when building regions */
55
+ uint8_t buffer[BUFFER1_SIZE + 4 + BUFFER2_SIZE];
56
+ uint8_t* buffer1 = &buffer[0];
57
+ uint8_t* buffer2 = &buffer[20];
58
+ uint8_t buffer3[4];
59
+ uint32_t i;
60
+
61
+ for (i = 0; i < BUFFER1_SIZE; ++i)
62
+ buffer1[i] = i;
63
+ for (i = 0; i < BUFFER2_SIZE; ++i)
64
+ buffer2[i] = i;
65
+ for (i = 0; i < sizeof(buffer3); ++i)
66
+ buffer3[i] = i;
67
+
68
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
69
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = BUFFER1_SIZE;
70
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = buffer2;
71
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = BUFFER2_SIZE;
72
+
73
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_HUBS));
74
+
75
+ ASSERT_NUM_EQUALS(regions.count, 2);
76
+ ASSERT_NUM_EQUALS(regions.total_size, BUFFER1_SIZE + BUFFER2_SIZE);
77
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 2), &buffer1[2]);
78
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, BUFFER1_SIZE + 2), &buffer2[2]);
79
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, BUFFER1_SIZE + BUFFER2_SIZE + 2));
80
+
81
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find_avail(&regions, 2, &avail), &buffer1[2]);
82
+ ASSERT_NUM_EQUALS(avail, BUFFER1_SIZE - 2);
83
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find_avail(&regions, BUFFER1_SIZE - 1, &avail), &buffer1[BUFFER1_SIZE - 1]);
84
+ ASSERT_NUM_EQUALS(avail, 1);
85
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find_avail(&regions, BUFFER1_SIZE + 2, &avail), &buffer2[2]);
86
+ ASSERT_NUM_EQUALS(avail, BUFFER2_SIZE - 2);
87
+ ASSERT_PTR_NULL(rc_libretro_memory_find_avail(&regions, BUFFER1_SIZE + BUFFER2_SIZE + 2, &avail));
88
+ ASSERT_NUM_EQUALS(avail, 0);
89
+
90
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 2, buffer3, 1), 1);
91
+ ASSERT_TRUE(memcmp(buffer3, &buffer1[2], 1) == 0);
92
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 7, buffer3, 4), 4);
93
+ ASSERT_TRUE(memcmp(buffer3, &buffer1[7], 4) == 0);
94
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, BUFFER1_SIZE - 2, buffer3, 3), 3); /* read across boundary */
95
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, BUFFER1_SIZE + BUFFER2_SIZE + 2, buffer3, 1), 0);
96
+
97
+ #undef BUFFER2_SIZE
98
+ #undef BUFFER1_SIZE
99
+ }
100
+
101
+ static void test_memory_init_without_regions_system_ram_only() {
102
+ rc_libretro_memory_regions_t regions;
103
+ uint8_t buffer1[16];
104
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
105
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = sizeof(buffer1);
106
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
107
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
108
+
109
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_HUBS));
110
+
111
+ ASSERT_NUM_EQUALS(regions.count, 1);
112
+ ASSERT_NUM_EQUALS(regions.total_size, sizeof(buffer1));
113
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 2), &buffer1[2]);
114
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, sizeof(buffer1) + 2));
115
+ }
116
+
117
+ static void test_memory_init_without_regions_save_ram_only() {
118
+ rc_libretro_memory_regions_t regions;
119
+ uint8_t buffer2[8];
120
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = NULL;
121
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0;
122
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = buffer2;
123
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = sizeof(buffer2);
124
+
125
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_HUBS));
126
+
127
+ ASSERT_NUM_EQUALS(regions.count, 1);
128
+ ASSERT_NUM_EQUALS(regions.total_size, sizeof(buffer2));
129
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 2), &buffer2[2]);
130
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, sizeof(buffer2) + 2));
131
+ }
132
+
133
+ static void test_memory_init_without_regions_no_ram() {
134
+ rc_libretro_memory_regions_t regions;
135
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = NULL;
136
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0;
137
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
138
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
139
+
140
+ ASSERT_FALSE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_HUBS));
141
+
142
+ ASSERT_NUM_EQUALS(regions.count, 0);
143
+ ASSERT_NUM_EQUALS(regions.total_size, 0);
144
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 2));
145
+ }
146
+
147
+ static void test_memory_init_from_unmapped_memory() {
148
+ rc_libretro_memory_regions_t regions;
149
+ uint8_t buffer1[8], buffer2[8];
150
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
151
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0x10000;
152
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = buffer2;
153
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0x10000;
154
+
155
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
156
+
157
+ ASSERT_NUM_EQUALS(regions.count, 2);
158
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
159
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
160
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
161
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
162
+ }
163
+
164
+ static void test_memory_init_from_unmapped_memory_null_filler() {
165
+ rc_libretro_memory_regions_t regions;
166
+ uint32_t avail;
167
+ uint8_t buffer1[16], buffer2[8];
168
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
169
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = sizeof(buffer1);
170
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = buffer2;
171
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = sizeof(buffer2);
172
+
173
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
174
+
175
+ ASSERT_NUM_EQUALS(regions.count, 4); /* two valid regions and two null fillers */
176
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
177
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
178
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00012));
179
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
180
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x1000A));
181
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
182
+
183
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find_avail(&regions, 0x00002, &avail), &buffer1[2]);
184
+ ASSERT_NUM_EQUALS(avail, sizeof(buffer1) - 2);
185
+ ASSERT_PTR_NULL(rc_libretro_memory_find_avail(&regions, 0x00012, &avail));
186
+ ASSERT_NUM_EQUALS(avail, 0);
187
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find_avail(&regions, 0x10002, &avail), &buffer2[2]);
188
+ ASSERT_NUM_EQUALS(avail, sizeof(buffer2) - 2);
189
+ ASSERT_PTR_NULL(rc_libretro_memory_find_avail(&regions, 0x1000A, &avail));
190
+ ASSERT_NUM_EQUALS(avail, 0);
191
+ }
192
+
193
+ static void test_memory_init_from_unmapped_memory_no_save_ram() {
194
+ rc_libretro_memory_regions_t regions;
195
+ uint8_t buffer1[16];
196
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
197
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0x10000;
198
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
199
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
200
+
201
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
202
+
203
+ ASSERT_NUM_EQUALS(regions.count, 2);
204
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
205
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
206
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10002));
207
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
208
+ }
209
+
210
+ static void test_memory_init_from_unmapped_memory_merge_neighbors() {
211
+ rc_libretro_memory_regions_t regions;
212
+ uint8_t* buffer1 = (uint8_t*)malloc(0x10000); /* have to malloc to prevent array-bounds compiler warnings */
213
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
214
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0x10000;
215
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
216
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
217
+
218
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_ATARI_LYNX));
219
+
220
+ ASSERT_NUM_EQUALS(regions.count, 1); /* all regions are adjacent, so should be merged */
221
+ ASSERT_NUM_EQUALS(regions.total_size, 0x10000);
222
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0002), &buffer1[0x0002]);
223
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0102), &buffer1[0x0102]);
224
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0xFFFF), &buffer1[0xFFFF]);
225
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10000));
226
+
227
+ free(buffer1);
228
+ }
229
+
230
+ static void test_memory_init_from_unmapped_memory_no_ram() {
231
+ rc_libretro_memory_regions_t regions;
232
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = NULL;
233
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0;
234
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
235
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
236
+
237
+ /* init returns false */
238
+ ASSERT_FALSE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
239
+
240
+ /* but one null-filled region is still generated */
241
+ ASSERT_NUM_EQUALS(regions.count, 1);
242
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
243
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00002));
244
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10002));
245
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
246
+ }
247
+
248
+ static void test_memory_init_from_unmapped_memory_ds() {
249
+ rc_libretro_memory_regions_t regions;
250
+ uint8_t* buffer1 = (uint8_t*)malloc(0x02000000); /* have to malloc to prevent array-bounds compiler warnings */
251
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = buffer1;
252
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0x02000000;
253
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
254
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
255
+
256
+ /* init returns true */
257
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_NINTENDO_DS));
258
+
259
+ /* primary region should be generated, but TCM won't be available */
260
+ ASSERT_NUM_EQUALS(regions.count, 2);
261
+ ASSERT_NUM_EQUALS(regions.total_size, 0x1004000);
262
+ ASSERT_PTR_NOT_NULL(rc_libretro_memory_find(&regions, 0x00000002));
263
+ ASSERT_PTR_NOT_NULL(rc_libretro_memory_find(&regions, 0x003FFFFF));
264
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00400000));
265
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x01000002));
266
+
267
+ free(buffer1);
268
+ }
269
+
270
+ static void test_memory_init_from_unmapped_memory_wii() {
271
+ rc_libretro_memory_regions_t regions;
272
+ retro_memory_data[RETRO_MEMORY_SYSTEM_RAM] = NULL;
273
+ retro_memory_size[RETRO_MEMORY_SYSTEM_RAM] = 0;
274
+ retro_memory_data[RETRO_MEMORY_SAVE_RAM] = NULL;
275
+ retro_memory_size[RETRO_MEMORY_SAVE_RAM] = 0;
276
+
277
+ /* init returns false */
278
+ ASSERT_FALSE(rc_libretro_memory_init(&regions, NULL, libretro_get_core_memory_info, RC_CONSOLE_WII));
279
+
280
+ /* but one null-filled region is still generated */
281
+ ASSERT_NUM_EQUALS(regions.count, 1);
282
+ ASSERT_NUM_EQUALS(regions.total_size, 0x14000000);
283
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00000002));
284
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x14000002));
285
+ }
286
+
287
+ static void test_memory_init_from_memory_map() {
288
+ rc_libretro_memory_regions_t regions;
289
+ uint8_t buffer1[8], buffer2[8];
290
+ const struct retro_memory_descriptor mmap_desc[] = {
291
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0, 0, 0x10000, "RAM" },
292
+ { RETRO_MEMDESC_SAVE_RAM, &buffer2[0], 0, 0x000000U, 0, 0, 0x10000, "SRAM" }
293
+ };
294
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
295
+
296
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
297
+
298
+ ASSERT_NUM_EQUALS(regions.count, 2);
299
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
300
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
301
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
302
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
303
+ }
304
+
305
+ static void test_memory_init_from_memory_map_null_filler() {
306
+ rc_libretro_memory_regions_t regions;
307
+ uint8_t buffer1[8], buffer2[8];
308
+ const struct retro_memory_descriptor mmap_desc[] = {
309
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0, 0, 0x10000, "RAM" },
310
+ { RETRO_MEMDESC_SAVE_RAM, &buffer2[0], 0, 0x000000U, 0, 0, 0x10000, "SRAM" }
311
+ };
312
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
313
+
314
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
315
+
316
+ ASSERT_NUM_EQUALS(regions.count, 2);
317
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
318
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
319
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
320
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
321
+ }
322
+
323
+ static void test_memory_init_from_memory_map_no_save_ram() {
324
+ rc_libretro_memory_regions_t regions;
325
+ uint8_t buffer1[8];
326
+ const struct retro_memory_descriptor mmap_desc[] = {
327
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0, 0, 0x10000, "RAM" }
328
+ };
329
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
330
+
331
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
332
+
333
+ ASSERT_NUM_EQUALS(regions.count, 2);
334
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
335
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
336
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10002));
337
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
338
+ }
339
+
340
+ static void test_memory_init_from_memory_map_merge_neighbors() {
341
+ rc_libretro_memory_regions_t regions;
342
+ uint8_t* buffer1 = (uint8_t*)malloc(0x10000); /* have to malloc to prevent array-bounds compiler warnings */
343
+ const struct retro_memory_descriptor mmap_desc[] = {
344
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0x0000], 0, 0x0000U, 0, 0, 0xFC00, "RAM" },
345
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0xFC00], 0, 0xFC00U, 0, 0, 0x0400, "Hardware controllers" }
346
+ };
347
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
348
+
349
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_ATARI_LYNX));
350
+
351
+ ASSERT_NUM_EQUALS(regions.count, 1); /* all regions are adjacent, so should be merged */
352
+ ASSERT_NUM_EQUALS(regions.total_size, 0x10000);
353
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0002), &buffer1[0x0002]);
354
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0102), &buffer1[0x0102]);
355
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0xFFFF), &buffer1[0xFFFF]);
356
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10000));
357
+
358
+ free(buffer1);
359
+ }
360
+
361
+ static void test_memory_init_from_memory_map_no_ram() {
362
+ rc_libretro_memory_regions_t regions;
363
+ const struct retro_memory_descriptor mmap_desc[] = {
364
+ { RETRO_MEMDESC_SYSTEM_RAM, NULL, 0, 0xFF0000U, 0, 0, 0x10000, "RAM" },
365
+ { RETRO_MEMDESC_SAVE_RAM, NULL, 0, 0x000000U, 0, 0, 0x10000, "SRAM" }
366
+ };
367
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
368
+
369
+ /* init returns false */
370
+ ASSERT_FALSE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
371
+
372
+ /* but one null-filled region is still generated */
373
+ ASSERT_NUM_EQUALS(regions.count, 1);
374
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
375
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00002));
376
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x10002));
377
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
378
+ }
379
+
380
+ static void test_memory_init_from_memory_map_splice() {
381
+ rc_libretro_memory_regions_t regions;
382
+ uint8_t buffer1[8], buffer2[8], buffer3[8];
383
+ const struct retro_memory_descriptor mmap_desc[] = {
384
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0, 0, 0x08000, "RAM1" },
385
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer2[0], 0, 0xFF8000U, 0, 0, 0x08000, "RAM2" },
386
+ { RETRO_MEMDESC_SAVE_RAM, &buffer3[0], 0, 0x000000U, 0, 0, 0x10000, "SRAM" }
387
+ };
388
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
389
+
390
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
391
+
392
+ ASSERT_NUM_EQUALS(regions.count, 3);
393
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
394
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
395
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x08002), &buffer2[2]);
396
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer3[2]);
397
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
398
+ }
399
+
400
+ static void test_memory_init_from_memory_map_mirrored() {
401
+ rc_libretro_memory_regions_t regions;
402
+ uint8_t buffer1[8], buffer2[8];
403
+ const struct retro_memory_descriptor mmap_desc[] = {
404
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0xFF0000U, 0x00C000U, 0x04000, "RAM" },
405
+ { RETRO_MEMDESC_SAVE_RAM, &buffer2[0], 0, 0x000000U, 0x000000U, 0x000000U, 0x10000, "SRAM" }
406
+ };
407
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
408
+
409
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
410
+
411
+ /* select of 0xFF0000 should mirror the 0x4000 bytes at 0xFF0000 into 0xFF4000, 0xFF8000, and 0xFFC000 */
412
+ ASSERT_NUM_EQUALS(regions.count, 5);
413
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
414
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
415
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x04002), &buffer1[2]);
416
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x08002), &buffer1[2]);
417
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0C002), &buffer1[2]);
418
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
419
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
420
+ }
421
+
422
+ static void test_memory_init_from_memory_map_out_of_order() {
423
+ rc_libretro_memory_regions_t regions;
424
+ uint8_t buffer1[8], buffer2[8];
425
+ const struct retro_memory_descriptor mmap_desc[] = {
426
+ { RETRO_MEMDESC_SAVE_RAM, &buffer2[0], 0, 0x000000U, 0, 0, 0x10000, "SRAM" },
427
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0xFF0000U, 0, 0, 0x10000, "RAM" }
428
+ };
429
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
430
+
431
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MEGA_DRIVE));
432
+
433
+ ASSERT_NUM_EQUALS(regions.count, 2);
434
+ ASSERT_NUM_EQUALS(regions.total_size, 0x20000);
435
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00002), &buffer1[2]);
436
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x10002), &buffer2[2]);
437
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x20002));
438
+ }
439
+
440
+ static void test_memory_init_from_memory_map_disconnect_gaps() {
441
+ rc_libretro_memory_regions_t regions;
442
+ uint8_t buffer[256];
443
+ /* the disconnect bit is smaller than the region size, so only parts of the memory map
444
+ * will be filled by the region. in this case, 00-1F will be buffer[00-1F], but
445
+ * buffer[20-3F] will be associated to addresses 40-5F! */
446
+ const struct retro_memory_descriptor mmap_desc[] = {
447
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer[0], 0, 0x0000, 0xFC20, 0x0020, sizeof(buffer), "RAM" },
448
+ };
449
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
450
+
451
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_MAGNAVOX_ODYSSEY2));
452
+
453
+ ASSERT_NUM_EQUALS(regions.count, 10);
454
+ ASSERT_NUM_EQUALS(regions.total_size, 0x140);
455
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0002), &buffer[0x02]);
456
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x0022));
457
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0042), &buffer[0x22]);
458
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x0062));
459
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0082), &buffer[0x42]);
460
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00A2));
461
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x00C2), &buffer[0x62]);
462
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x00E2));
463
+ ASSERT_PTR_EQUALS(rc_libretro_memory_find(&regions, 0x0102), &buffer[0x82]);
464
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x0122));
465
+ ASSERT_PTR_NULL(rc_libretro_memory_find(&regions, 0x0142));
466
+ }
467
+
468
+
469
+ static void test_memory_read()
470
+ {
471
+ rc_libretro_memory_regions_t regions;
472
+ /* intentionally put buffer3 between buffer1 and buffer2 for the read that spans buffers */
473
+ uint8_t buffer1[8], buffer3[4], buffer2[8];
474
+ const struct retro_memory_descriptor mmap_desc[] = {
475
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer1[0], 0, 0x000000U, 0, 0, 0x000008, "RAM A" },
476
+ { RETRO_MEMDESC_SYSTEM_RAM, &buffer2[0], 0, 0x000008U, 0, 0, 0x000008, "RAM B" }
477
+ };
478
+ const struct retro_memory_map mmap = { mmap_desc, sizeof(mmap_desc) / sizeof(mmap_desc[0]) };
479
+ int i;
480
+
481
+ for (i = 0; i < 8; ++i) {
482
+ buffer1[i] = i;
483
+ buffer2[i] = i + 8;
484
+ }
485
+
486
+ ASSERT_TRUE(rc_libretro_memory_init(&regions, &mmap, libretro_get_core_memory_info, RC_CONSOLE_NINTENDO));
487
+
488
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 0, buffer3, 4), 4);
489
+ ASSERT_NUM_EQUALS(buffer3[0], 0);
490
+ ASSERT_NUM_EQUALS(buffer3[1], 1);
491
+ ASSERT_NUM_EQUALS(buffer3[2], 2);
492
+ ASSERT_NUM_EQUALS(buffer3[3], 3);
493
+
494
+ /* only requesting two bytes, other two remain unmodified */
495
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 3, buffer3, 2), 2);
496
+ ASSERT_NUM_EQUALS(buffer3[0], 3);
497
+ ASSERT_NUM_EQUALS(buffer3[1], 4);
498
+ ASSERT_NUM_EQUALS(buffer3[2], 2);
499
+ ASSERT_NUM_EQUALS(buffer3[3], 3);
500
+
501
+ /* one two bytes are available in buffer1, the rest have to be read from buffer2 */
502
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 6, buffer3, 4), 4);
503
+ ASSERT_NUM_EQUALS(buffer3[0], 6);
504
+ ASSERT_NUM_EQUALS(buffer3[1], 7);
505
+ ASSERT_NUM_EQUALS(buffer3[2], 8); /* this comes from buffer2 */
506
+ ASSERT_NUM_EQUALS(buffer3[3], 9);
507
+
508
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 8, buffer3, 4), 4);
509
+ ASSERT_NUM_EQUALS(buffer3[0], 8);
510
+ ASSERT_NUM_EQUALS(buffer3[1], 9);
511
+ ASSERT_NUM_EQUALS(buffer3[2], 10);
512
+ ASSERT_NUM_EQUALS(buffer3[3], 11);
513
+
514
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 11, buffer3, 4), 4);
515
+ ASSERT_NUM_EQUALS(buffer3[0], 11);
516
+ ASSERT_NUM_EQUALS(buffer3[1], 12);
517
+ ASSERT_NUM_EQUALS(buffer3[2], 13);
518
+ ASSERT_NUM_EQUALS(buffer3[3], 14);
519
+
520
+ /* only requesting 1 byte. other three remain unmodified */
521
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 13, buffer3, 1), 1);
522
+ ASSERT_NUM_EQUALS(buffer3[0], 13);
523
+ ASSERT_NUM_EQUALS(buffer3[1], 12);
524
+ ASSERT_NUM_EQUALS(buffer3[2], 13);
525
+ ASSERT_NUM_EQUALS(buffer3[3], 14);
526
+
527
+ /* only two bytes are available at address 14 */
528
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 14, buffer3, 3), 2);
529
+ ASSERT_NUM_EQUALS(buffer3[0], 14);
530
+ ASSERT_NUM_EQUALS(buffer3[1], 15);
531
+ ASSERT_NUM_EQUALS(buffer3[2], 13);
532
+ ASSERT_NUM_EQUALS(buffer3[3], 14);
533
+
534
+ /* no bytes are available at invalid address */
535
+ ASSERT_NUM_EQUALS(rc_libretro_memory_read(&regions, 16, buffer3, 4), 0);
536
+ ASSERT_NUM_EQUALS(buffer3[0], 14);
537
+ ASSERT_NUM_EQUALS(buffer3[1], 15);
538
+ ASSERT_NUM_EQUALS(buffer3[2], 13);
539
+ ASSERT_NUM_EQUALS(buffer3[3], 14);
540
+ }
541
+
542
+ static void test_hash_set_add_single() {
543
+ rc_libretro_hash_set_t hash_set;
544
+ rc_hash_filereader_t file_reader;
545
+ const char hash[] = "ABCDEF01234567899876543210ABCDEF";
546
+
547
+ get_mock_filereader(&file_reader);
548
+
549
+ rc_libretro_hash_set_init(&hash_set, "file.rom", libretro_get_image_path, &file_reader);
550
+
551
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.rom"));
552
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 0);
553
+
554
+ rc_libretro_hash_set_add(&hash_set, "file.rom", 1234, hash);
555
+
556
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file.rom"), hash);
557
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 1234);
558
+
559
+ rc_libretro_hash_set_destroy(&hash_set);
560
+ }
561
+
562
+ static void test_hash_set_update_single() {
563
+ rc_libretro_hash_set_t hash_set;
564
+ rc_hash_filereader_t file_reader;
565
+ const char hash[] = "ABCDEF01234567899876543210ABCDEF";
566
+ const char hash2[] = "0123456789ABCDEF0123456789ABCDEF";
567
+
568
+ get_mock_filereader(&file_reader);
569
+
570
+ rc_libretro_hash_set_init(&hash_set, "file.rom", libretro_get_image_path, &file_reader);
571
+
572
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.rom"));
573
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 0);
574
+
575
+ rc_libretro_hash_set_add(&hash_set, "file.rom", 99, hash);
576
+
577
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file.rom"), hash);
578
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 99);
579
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash2), 0);
580
+
581
+ rc_libretro_hash_set_add(&hash_set, "file.rom", 1234, hash2);
582
+ ASSERT_NUM_EQUALS(hash_set.entries_count, 1);
583
+
584
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file.rom"), hash2);
585
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 0);
586
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash2), 1234);
587
+
588
+ rc_libretro_hash_set_destroy(&hash_set);
589
+ }
590
+
591
+ static void test_hash_set_add_many() {
592
+ rc_libretro_hash_set_t hash_set;
593
+ rc_hash_filereader_t file_reader;
594
+ const char hash1[] = "ABCDEF01234567899876543210ABCDE1";
595
+ const char hash2[] = "ABCDEF01234567899876543210ABCDE2";
596
+ const char hash3[] = "ABCDEF01234567899876543210ABCDE3";
597
+ const char hash4[] = "ABCDEF01234567899876543210ABCDE4";
598
+ const char hash5[] = "ABCDEF01234567899876543210ABCDE5";
599
+ const char hash6[] = "ABCDEF01234567899876543210ABCDE6";
600
+ const char hash7[] = "ABCDEF01234567899876543210ABCDE7";
601
+ const char hash8[] = "ABCDEF01234567899876543210ABCDE8";
602
+
603
+ get_mock_filereader(&file_reader);
604
+
605
+ rc_libretro_hash_set_init(&hash_set, "file.rom", libretro_get_image_path, &file_reader);
606
+
607
+ rc_libretro_hash_set_add(&hash_set, "file1.rom", 1, hash1);
608
+ rc_libretro_hash_set_add(&hash_set, "file2.rom", 2, hash2);
609
+ rc_libretro_hash_set_add(&hash_set, "file3.rom", 3, hash3);
610
+ rc_libretro_hash_set_add(&hash_set, "file4.rom", 4, hash4);
611
+ rc_libretro_hash_set_add(&hash_set, "file5.rom", 5, hash5);
612
+ rc_libretro_hash_set_add(&hash_set, "file6.rom", 6, hash6);
613
+ rc_libretro_hash_set_add(&hash_set, "file7.rom", 7, hash7);
614
+ rc_libretro_hash_set_add(&hash_set, "file8.rom", 8, hash8);
615
+
616
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file1.rom"), hash1);
617
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash1), 1);
618
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file2.rom"), hash2);
619
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash2), 2);
620
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file3.rom"), hash3);
621
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash3), 3);
622
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file4.rom"), hash4);
623
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash4), 4);
624
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file5.rom"), hash5);
625
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash5), 5);
626
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file6.rom"), hash6);
627
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash6), 6);
628
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file7.rom"), hash7);
629
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash7), 7);
630
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "file8.rom"), hash8);
631
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash8), 8);
632
+
633
+ rc_libretro_hash_set_destroy(&hash_set);
634
+ }
635
+
636
+ static void test_hash_set_m3u_single() {
637
+ rc_libretro_hash_set_t hash_set;
638
+ rc_hash_filereader_t file_reader;
639
+ const char hash[] = "ABCDEF01234567899876543210ABCDEF";
640
+ const char* m3u_contents = "file.dsk";
641
+
642
+ get_mock_filereader(&file_reader);
643
+ mock_file(0, "game.m3u", (uint8_t*)m3u_contents, strlen(m3u_contents));
644
+
645
+ rc_libretro_hash_set_init(&hash_set, "game.m3u", libretro_get_image_path, &file_reader);
646
+
647
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.dsk"));
648
+ ASSERT_NUM_EQUALS(rc_libretro_hash_set_get_game_id(&hash_set, hash), 0);
649
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "save1.dsk"));
650
+
651
+ rc_libretro_hash_set_destroy(&hash_set);
652
+ }
653
+
654
+ static void test_hash_set_m3u_savedisk() {
655
+ rc_libretro_hash_set_t hash_set;
656
+ rc_hash_filereader_t file_reader;
657
+ const char* m3u_contents = "file.dsk\n#SAVEDISK:";
658
+
659
+ get_mock_filereader(&file_reader);
660
+ mock_file(0, "game.m3u", (uint8_t*)m3u_contents, strlen(m3u_contents));
661
+
662
+ rc_libretro_hash_set_init(&hash_set, "game.m3u", libretro_get_image_path, &file_reader);
663
+
664
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.dsk"));
665
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "save1.dsk"), "[SAVE DISK]");
666
+
667
+ rc_libretro_hash_set_destroy(&hash_set);
668
+ }
669
+
670
+ static void test_hash_set_m3u_savedisk_volume_label() {
671
+ rc_libretro_hash_set_t hash_set;
672
+ rc_hash_filereader_t file_reader;
673
+ const char* m3u_contents = "file.dsk\n#SAVEDISK:DSAVE";
674
+
675
+ get_mock_filereader(&file_reader);
676
+ mock_file(0, "game.m3u", (uint8_t*)m3u_contents, strlen(m3u_contents));
677
+
678
+ rc_libretro_hash_set_init(&hash_set, "game.m3u", libretro_get_image_path, &file_reader);
679
+
680
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.dsk"));
681
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "save1.dsk"), "[SAVE DISK]");
682
+
683
+ rc_libretro_hash_set_destroy(&hash_set);
684
+ }
685
+
686
+ static void test_hash_set_m3u_savedisk_multiple_with_comments_and_whitespace() {
687
+ rc_libretro_hash_set_t hash_set;
688
+ rc_hash_filereader_t file_reader;
689
+ const char* m3u_contents =
690
+ "#EXTM3U\n"
691
+ "file.dsk\n" /* index 0 */
692
+ "\n"
693
+ "#Save disk in the middle, because why not?\n"
694
+ "#SAVEDISK:\n" /* index 1 */
695
+ " \r\n"
696
+ "\tfile2.dsk|File 2\n" /* index 2 */
697
+ "#SAVEDISK:DSAVE\n" /* index 3 */
698
+ "\t\r\n"
699
+ "#LABEL:My Custom Disk Label\n"
700
+ "file3.dsk" /* index 4 */
701
+ "\r\n"
702
+ "#SAVEDISK:|No Custom Label for Save Disk"; /* index 5 */
703
+
704
+ get_mock_filereader(&file_reader);
705
+ mock_file(0, "game.m3u", (uint8_t*)m3u_contents, strlen(m3u_contents));
706
+
707
+ rc_libretro_hash_set_init(&hash_set, "game.m3u", libretro_get_image_path, &file_reader);
708
+
709
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file.dsk"));
710
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "save1.dsk"), "[SAVE DISK]");
711
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file2.dsk"));
712
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "save3.dsk"), "[SAVE DISK]");
713
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file3.dsk"));
714
+ ASSERT_STR_EQUALS(rc_libretro_hash_set_get_hash(&hash_set, "save5.dsk"), "[SAVE DISK]");
715
+
716
+ rc_libretro_hash_set_destroy(&hash_set);
717
+ }
718
+
719
+ static int libretro_get_image_path_no_core_support(uint32_t index, char* buffer, size_t buffer_size)
720
+ {
721
+ if (index < 0 || index > 1)
722
+ return 0;
723
+
724
+ snprintf(buffer, buffer_size, "file%d.dsk", index);
725
+ return 1;
726
+ }
727
+
728
+ static void test_hash_set_m3u_savedisk_no_core_support() {
729
+ rc_libretro_hash_set_t hash_set;
730
+ rc_hash_filereader_t file_reader;
731
+ const char* m3u_contents = "file1.dsk\n#SAVEDISK:\nfile2.dsk";
732
+
733
+ get_mock_filereader(&file_reader);
734
+ mock_file(0, "game.m3u", (uint8_t*)m3u_contents, strlen(m3u_contents));
735
+
736
+ rc_libretro_hash_set_init(&hash_set, "game.m3u", libretro_get_image_path_no_core_support, &file_reader);
737
+
738
+ ASSERT_NUM_EQUALS(hash_set.entries_count, 0);
739
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file1.dsk"));
740
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file2.dsk"));
741
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "file3.dsk"));
742
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "save1.dsk"));
743
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "save2.dsk"));
744
+ ASSERT_PTR_NULL(rc_libretro_hash_set_get_hash(&hash_set, "save3.dsk"));
745
+
746
+ rc_libretro_hash_set_destroy(&hash_set);
747
+ }
748
+
749
+
750
+ void test_rc_libretro(void) {
751
+ TEST_SUITE_BEGIN();
752
+
753
+ /* rc_libretro_disallowed_settings */
754
+ TEST_PARAMS3(test_allowed_setting, "Beetle PSX", "beetle_psx_cpu_freq_scale", "750%");
755
+ TEST_PARAMS3(test_allowed_setting, "Beetle PSX", "beetle_psx_cpu_freq_scale", "100%(native)");
756
+ TEST_PARAMS3(test_disallowed_setting, "Beetle PSX", "beetle_psx_cpu_freq_scale", "99%");
757
+ TEST_PARAMS3(test_disallowed_setting, "Beetle PSX", "beetle_psx_cpu_freq_scale", "50%");
758
+
759
+ TEST_PARAMS3(test_allowed_setting, "Beetle PSX HW", "beetle_psx_hw_cpu_freq_scale", "750%");
760
+ TEST_PARAMS3(test_allowed_setting, "Beetle PSX HW", "beetle_psx_hw_cpu_freq_scale", "100%(native)");
761
+ TEST_PARAMS3(test_disallowed_setting, "Beetle PSX HW", "beetle_psx_hw_cpu_freq_scale", "99%");
762
+ TEST_PARAMS3(test_disallowed_setting, "Beetle PSX HW", "beetle_psx_hw_cpu_freq_scale", "50%");
763
+
764
+ TEST_PARAMS3(test_allowed_setting, "bsnes-mercury", "bsnes_region", "Auto");
765
+ TEST_PARAMS3(test_allowed_setting, "bsnes-mercury", "bsnes_region", "NTSC");
766
+ TEST_PARAMS3(test_disallowed_setting, "bsnes-mercury", "bsnes_region", "PAL");
767
+
768
+ TEST_PARAMS3(test_allowed_setting, "cap32", "cap32_autorun", "enabled");
769
+ TEST_PARAMS3(test_disallowed_setting, "cap32", "cap32_autorun", "disabled");
770
+
771
+ TEST_PARAMS3(test_allowed_setting, "dolphin-emu", "dolphin_cheats_enabled", "disabled");
772
+ TEST_PARAMS3(test_disallowed_setting, "dolphin-emu", "dolphin_cheats_enabled", "enabled");
773
+
774
+ TEST_PARAMS3(test_allowed_setting, "DOSBox-pure", "dosbox_pure_strict_mode", "true");
775
+ TEST_PARAMS3(test_disallowed_setting, "DOSBox-pure", "dosbox_pure_strict_mode", "false");
776
+
777
+ TEST_PARAMS3(test_allowed_setting, "DuckStation", "duckstation_CDROM.LoadImagePatches", "false");
778
+ TEST_PARAMS3(test_disallowed_setting, "DuckStation", "duckstation_CDROM.LoadImagePatches", "true");
779
+
780
+ TEST_PARAMS3(test_allowed_setting, "ecwolf", "ecwolf-invulnerability", "disabled");
781
+ TEST_PARAMS3(test_disallowed_setting, "ecwolf", "ecwolf-invulnerability", "enabled");
782
+
783
+ TEST_PARAMS3(test_allowed_setting, "FCEUmm", "fceumm_region", "Auto");
784
+ TEST_PARAMS3(test_allowed_setting, "FCEUmm", "fceumm_region", "NTSC");
785
+ TEST_PARAMS3(test_disallowed_setting, "FCEUmm", "fceumm_region", "PAL");
786
+ TEST_PARAMS3(test_disallowed_setting, "FCEUmm", "fceumm_region", "pal"); /* case insensitive */
787
+ TEST_PARAMS3(test_disallowed_setting, "FCEUmm", "fceumm_region", "Dendy");
788
+ TEST_PARAMS3(test_allowed_setting, "FCEUmm", "fceumm_palette", "default"); /* setting we don't care about */
789
+ TEST_PARAMS3(test_allowed_setting, "FCEUmm", "fceumm_game_genie", "disabled");
790
+ TEST_PARAMS3(test_disallowed_setting, "FCEUmm", "fceumm_game_genie", "enabled");
791
+
792
+ TEST_PARAMS3(test_allowed_setting, "Flycast", "reicast_sh4clock", "500");
793
+ TEST_PARAMS3(test_allowed_setting, "Flycast", "reicast_sh4clock", "200");
794
+ TEST_PARAMS3(test_disallowed_setting, "Flycast", "reicast_sh4clock", "190");
795
+ TEST_PARAMS3(test_disallowed_setting, "Flycast", "reicast_sh4clock", "50");
796
+
797
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-allow-patched-romsets", "disabled");
798
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-allow-patched-romsets", "enabled");
799
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cheat-mvsc-P1_Char_1_Easy_Hyper_Combo", "disabled"); /* wildcard key match */
800
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cheat-mvsc-P1_Char_1_Easy_Hyper_Combo", "enabled");
801
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cheat-mvsc-P1_Char_1_Easy_Hyper_Combo", "0 - Disabled"); /* multi-not value match */
802
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cheat-mvsc-P1_Char_1_Easy_Hyper_Combo", "1 - Enabled");
803
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "25%");
804
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "50%");
805
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "75%");
806
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "90%");
807
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "95%");
808
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "99%");
809
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "100%");
810
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "150%");
811
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "200%");
812
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-cpu-speed-adjust", "400%");
813
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-dipswitch-mslug-BIOS", "MVS Asia/Europe ver. 6 (1 slot)");
814
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-dipswitch-mslug-BIOS", "Universe BIOS ver. 2.3 (alt)");
815
+ TEST_PARAMS3(test_allowed_setting, "FinalBurn Neo", "fbneo-neogeo-mode", "DIPSWITCH");
816
+ TEST_PARAMS3(test_disallowed_setting, "FinalBurn Neo", "fbneo-neogeo-mode", "UNIBIOS");
817
+
818
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX", "genesis_plus_gx_lock_on", "disabled");
819
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX", "genesis_plus_gx_lock_on", "action replay (pro)");
820
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX", "genesis_plus_gx_lock_on", "game genie");
821
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX", "genesis_plus_gx_lock_on", "sonic & knuckles");
822
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX", "genesis_plus_gx_region_detect", "Auto");
823
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX", "genesis_plus_gx_region_detect", "NTSC-U");
824
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX", "genesis_plus_gx_region_detect", "PAL");
825
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX", "genesis_plus_gx_region_detect", "NTSC-J");
826
+
827
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_lock_on", "disabled");
828
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_lock_on", "action replay (pro)");
829
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_lock_on", "game genie");
830
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_lock_on", "sonic & knuckles");
831
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_region_detect", "Auto");
832
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_region_detect", "NTSC-U");
833
+ TEST_PARAMS3(test_disallowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_region_detect", "PAL");
834
+ TEST_PARAMS3(test_allowed_setting, "Genesis Plus GX Wide", "genesis_plus_gx_wide_region_detect", "NTSC-J");
835
+
836
+ TEST_PARAMS3(test_allowed_setting, "Mesen", "mesen_region", "Auto");
837
+ TEST_PARAMS3(test_allowed_setting, "Mesen", "mesen_region", "NTSC");
838
+ TEST_PARAMS3(test_disallowed_setting, "Mesen", "mesen_region", "PAL");
839
+ TEST_PARAMS3(test_disallowed_setting, "Mesen", "mesen_region", "Dendy");
840
+
841
+ TEST_PARAMS3(test_allowed_setting, "Mesen-S", "mesen-s_region", "Auto");
842
+ TEST_PARAMS3(test_allowed_setting, "Mesen-S", "mesen-s_region", "NTSC");
843
+ TEST_PARAMS3(test_disallowed_setting, "Mesen-S", "mesen-s_region", "PAL");
844
+
845
+ TEST_PARAMS3(test_allowed_setting, "NeoCD", "neocd_bios", "neocd.bin (CDZ)");
846
+ TEST_PARAMS3(test_disallowed_setting, "NeoCD", "neocd_bios", "uni-bioscd.rom (CDZ, Universe 3.3)");
847
+
848
+ TEST_PARAMS3(test_allowed_setting, "PPSSPP", "ppsspp_cheats", "disabled");
849
+ TEST_PARAMS3(test_disallowed_setting, "PPSSPP", "ppsspp_cheats", "enabled");
850
+
851
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_region", "Auto");
852
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_region", "NTSC");
853
+ TEST_PARAMS3(test_disallowed_setting, "PCSX-ReARMed", "pcsx_rearmed_region", "PAL");
854
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "auto");
855
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "100");
856
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "57");
857
+ TEST_PARAMS3(test_allowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "55");
858
+ TEST_PARAMS3(test_disallowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "54");
859
+ TEST_PARAMS3(test_disallowed_setting, "PCSX-ReARMed", "pcsx_rearmed_psxclock", "30");
860
+
861
+ TEST_PARAMS3(test_allowed_setting, "PicoDrive", "picodrive_region", "Auto");
862
+ TEST_PARAMS3(test_allowed_setting, "PicoDrive", "picodrive_region", "US");
863
+ TEST_PARAMS3(test_allowed_setting, "PicoDrive", "picodrive_region", "Japan NTSC");
864
+ TEST_PARAMS3(test_disallowed_setting, "PicoDrive", "picodrive_region", "Europe");
865
+ TEST_PARAMS3(test_disallowed_setting, "PicoDrive", "picodrive_region", "Japan PAL");
866
+
867
+ TEST_PARAMS3(test_allowed_setting, "QUASI88", "q88_cpu_clock", "16");
868
+ TEST_PARAMS3(test_allowed_setting, "QUASI88", "q88_cpu_clock", "8");
869
+ TEST_PARAMS3(test_allowed_setting, "QUASI88", "q88_cpu_clock", "4");
870
+ TEST_PARAMS3(test_disallowed_setting, "QUASI88", "q88_cpu_clock", "2");
871
+ TEST_PARAMS3(test_disallowed_setting, "QUASI88", "q88_cpu_clock", "1");
872
+
873
+ TEST_PARAMS3(test_allowed_setting, "SMS Plus GX", "smsplus_region", "auto");
874
+ TEST_PARAMS3(test_allowed_setting, "SMS Plus GX", "smsplus_region", "ntsc-u");
875
+ TEST_PARAMS3(test_disallowed_setting, "SMS Plus GX", "smsplus_region", "pal");
876
+ TEST_PARAMS3(test_allowed_setting, "SMS Plus GX", "smsplus_region", "ntsc-j");
877
+
878
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_region", "Auto");
879
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_region", "NTSC");
880
+ TEST_PARAMS3(test_disallowed_setting, "Snes9x", "snes9x_region", "PAL");
881
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_gfx_clip", "enabled");
882
+ TEST_PARAMS3(test_disallowed_setting, "Snes9x", "snes9x_gfx_clip", "disabled");
883
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_gfx_transp", "enabled");
884
+ TEST_PARAMS3(test_disallowed_setting, "Snes9x", "snes9x_gfx_transp", "disabled");
885
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_layer_1", "enabled");
886
+ TEST_PARAMS3(test_disallowed_setting, "Snes9x", "snes9x_layer_1", "disabled");
887
+ TEST_PARAMS3(test_allowed_setting, "Snes9x", "snes9x_layer_5", "enabled");
888
+ TEST_PARAMS3(test_disallowed_setting, "Snes9x", "snes9x_layer_5", "disabled");
889
+
890
+ TEST_PARAMS3(test_allowed_setting, "SwanStation", "swanstation_CPU_Overclock", "1000");
891
+ TEST_PARAMS3(test_allowed_setting, "SwanStation", "swanstation_CPU_Overclock", "100");
892
+ TEST_PARAMS3(test_disallowed_setting, "SwanStation", "swanstation_CPU_Overclock", "99");
893
+ TEST_PARAMS3(test_disallowed_setting, "SwanStation", "swanstation_CPU_Overclock", "50");
894
+
895
+ TEST_PARAMS3(test_allowed_setting, "VICE x64", "vice_autostart", "enabled");
896
+ TEST_PARAMS3(test_disallowed_setting, "VICE x64", "vice_autostart", "disabled");
897
+ TEST_PARAMS3(test_allowed_setting, "VICE x64", "vice_autostart", "warp");
898
+ TEST_PARAMS3(test_allowed_setting, "VICE x64", "vice_reset", "autostart");
899
+ TEST_PARAMS3(test_disallowed_setting, "VICE x64", "vice_reset", "soft");
900
+ TEST_PARAMS3(test_disallowed_setting, "VICE x64", "vice_reset", "hard");
901
+ TEST_PARAMS3(test_disallowed_setting, "VICE x64", "vice_reset", "freeze");
902
+
903
+ TEST_PARAMS3(test_allowed_setting, "Virtual Jaguar", "virtualjaguar_pal", "disabled");
904
+ TEST_PARAMS3(test_disallowed_setting, "Virtual Jaguar", "virtualjaguar_pal", "enabled");
905
+
906
+ /* rc_libretro_is_system_allowed */
907
+ TEST_PARAMS2(test_allowed_system, "FCEUmm", RC_CONSOLE_NINTENDO);
908
+
909
+ TEST_PARAMS2(test_allowed_system, "Mesen-S", RC_CONSOLE_SUPER_NINTENDO);
910
+ TEST_PARAMS2(test_disallowed_system, "Mesen-S", RC_CONSOLE_GAMEBOY);
911
+ TEST_PARAMS2(test_disallowed_system, "Mesen-S", RC_CONSOLE_GAMEBOY_COLOR);
912
+
913
+ /* rc_libretro_memory_init */
914
+ TEST(test_memory_init_without_regions);
915
+ TEST(test_memory_init_without_regions_system_ram_only);
916
+ TEST(test_memory_init_without_regions_save_ram_only);
917
+ TEST(test_memory_init_without_regions_no_ram);
918
+
919
+ TEST(test_memory_init_from_unmapped_memory);
920
+ TEST(test_memory_init_from_unmapped_memory_null_filler);
921
+ TEST(test_memory_init_from_unmapped_memory_no_save_ram);
922
+ TEST(test_memory_init_from_unmapped_memory_merge_neighbors);
923
+ TEST(test_memory_init_from_unmapped_memory_no_ram);
924
+ TEST(test_memory_init_from_unmapped_memory_ds);
925
+ TEST(test_memory_init_from_unmapped_memory_wii);
926
+
927
+ TEST(test_memory_init_from_memory_map);
928
+ TEST(test_memory_init_from_memory_map_null_filler);
929
+ TEST(test_memory_init_from_memory_map_no_save_ram);
930
+ TEST(test_memory_init_from_memory_map_merge_neighbors);
931
+ TEST(test_memory_init_from_memory_map_no_ram);
932
+ TEST(test_memory_init_from_memory_map_splice);
933
+ TEST(test_memory_init_from_memory_map_mirrored);
934
+ TEST(test_memory_init_from_memory_map_out_of_order);
935
+ TEST(test_memory_init_from_memory_map_disconnect_gaps);
936
+
937
+ /* rc_libretro_memory_read */
938
+ TEST(test_memory_read)
939
+
940
+ /* rc_libretro_hash_set_t */
941
+ TEST(test_hash_set_add_single);
942
+ TEST(test_hash_set_update_single);
943
+ TEST(test_hash_set_add_many);
944
+
945
+ TEST(test_hash_set_m3u_single);
946
+ TEST(test_hash_set_m3u_savedisk);
947
+ TEST(test_hash_set_m3u_savedisk_volume_label);
948
+ TEST(test_hash_set_m3u_savedisk_multiple_with_comments_and_whitespace);
949
+ TEST(test_hash_set_m3u_savedisk_no_core_support);
950
+
951
+ TEST_SUITE_END();
952
+ }