gemba 0.1.1 → 0.2.1

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 (289) 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 +190 -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 +511 -0
  17. data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
  18. data/lib/gemba/achievements/retro_achievements/ping_worker.rb +28 -0
  19. data/lib/gemba/achievements/retro_achievements/unlock_retry_worker.rb +35 -0
  20. data/lib/gemba/achievements.rb +19 -0
  21. data/lib/gemba/achievements_window.rb +556 -0
  22. data/lib/gemba/app_controller.rb +1036 -0
  23. data/lib/gemba/bios.rb +54 -0
  24. data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
  25. data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
  26. data/lib/gemba/boxart_fetcher.rb +79 -0
  27. data/lib/gemba/bus_emitter.rb +13 -0
  28. data/lib/gemba/child_window.rb +24 -1
  29. data/lib/gemba/cli/commands/config_cmd.rb +83 -0
  30. data/lib/gemba/cli/commands/decode.rb +154 -0
  31. data/lib/gemba/cli/commands/patch.rb +78 -0
  32. data/lib/gemba/cli/commands/play.rb +78 -0
  33. data/lib/gemba/cli/commands/record.rb +114 -0
  34. data/lib/gemba/cli/commands/replay.rb +161 -0
  35. data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
  36. data/lib/gemba/cli/commands/version.rb +22 -0
  37. data/lib/gemba/cli.rb +52 -364
  38. data/lib/gemba/config.rb +154 -1
  39. data/lib/gemba/data/gb_games.json +1 -0
  40. data/lib/gemba/data/gb_md5.json +1 -0
  41. data/lib/gemba/data/gba_games.json +1 -0
  42. data/lib/gemba/data/gba_md5.json +1 -0
  43. data/lib/gemba/data/gbc_games.json +1 -0
  44. data/lib/gemba/data/gbc_md5.json +1 -0
  45. data/lib/gemba/emulator_frame.rb +1084 -0
  46. data/lib/gemba/event_bus.rb +48 -0
  47. data/lib/gemba/frame_stack.rb +70 -0
  48. data/lib/gemba/game_index.rb +84 -0
  49. data/lib/gemba/game_picker_frame.rb +309 -0
  50. data/lib/gemba/gamepad_map.rb +103 -0
  51. data/lib/gemba/headless.rb +6 -5
  52. data/lib/gemba/headless_player.rb +33 -3
  53. data/lib/gemba/help_window.rb +61 -0
  54. data/lib/gemba/hotkey_map.rb +3 -1
  55. data/lib/gemba/input_recorder.rb +107 -0
  56. data/lib/gemba/input_replayer.rb +119 -0
  57. data/lib/gemba/keyboard_map.rb +90 -0
  58. data/lib/gemba/list_picker_frame.rb +271 -0
  59. data/lib/gemba/locales/en.yml +109 -5
  60. data/lib/gemba/locales/ja.yml +109 -5
  61. data/lib/gemba/main_window.rb +56 -0
  62. data/lib/gemba/modal_stack.rb +81 -0
  63. data/lib/gemba/patcher_window.rb +223 -0
  64. data/lib/gemba/platform/gb.rb +21 -0
  65. data/lib/gemba/platform/gba.rb +21 -0
  66. data/lib/gemba/platform/gbc.rb +23 -0
  67. data/lib/gemba/platform.rb +20 -0
  68. data/lib/gemba/platform_open.rb +19 -0
  69. data/lib/gemba/recorder.rb +4 -3
  70. data/lib/gemba/replay_player.rb +691 -0
  71. data/lib/gemba/rom_info.rb +57 -0
  72. data/lib/gemba/rom_info_window.rb +16 -3
  73. data/lib/gemba/rom_library.rb +106 -0
  74. data/lib/gemba/rom_overrides.rb +47 -0
  75. data/lib/gemba/rom_patcher/bps.rb +161 -0
  76. data/lib/gemba/rom_patcher/ips.rb +101 -0
  77. data/lib/gemba/rom_patcher/ups.rb +119 -0
  78. data/lib/gemba/rom_patcher.rb +109 -0
  79. data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
  80. data/lib/gemba/runtime.rb +59 -26
  81. data/lib/gemba/save_state_manager.rb +4 -7
  82. data/lib/gemba/save_state_picker.rb +17 -4
  83. data/lib/gemba/session_logger.rb +64 -0
  84. data/lib/gemba/settings/audio_tab.rb +77 -0
  85. data/lib/gemba/settings/gamepad_tab.rb +351 -0
  86. data/lib/gemba/settings/hotkeys_tab.rb +259 -0
  87. data/lib/gemba/settings/paths.rb +11 -0
  88. data/lib/gemba/settings/recording_tab.rb +83 -0
  89. data/lib/gemba/settings/save_states_tab.rb +91 -0
  90. data/lib/gemba/settings/system_tab.rb +377 -0
  91. data/lib/gemba/settings/video_tab.rb +318 -0
  92. data/lib/gemba/settings_window.rb +162 -1036
  93. data/lib/gemba/version.rb +1 -1
  94. data/lib/gemba/virtual_keyboard.rb +19 -0
  95. data/lib/gemba.rb +2 -12
  96. data/test/achievements_window/test_bulk_sync.rb +218 -0
  97. data/test/achievements_window/test_bus_events.rb +125 -0
  98. data/test/achievements_window/test_close_confirmation.rb +201 -0
  99. data/test/achievements_window/test_initial_state.rb +164 -0
  100. data/test/achievements_window/test_sorting.rb +227 -0
  101. data/test/achievements_window/test_tree_rendering.rb +133 -0
  102. data/test/fixtures/fake_bios.bin +0 -0
  103. data/test/fixtures/pong.gba +0 -0
  104. data/test/fixtures/test.gb +0 -0
  105. data/test/fixtures/test.gbc +0 -0
  106. data/test/fixtures/test_quicksave.ss +0 -0
  107. data/test/screenshots/no_focus.png +0 -0
  108. data/test/shared/teek_test_worker.rb +17 -1
  109. data/test/shared/tk_test_helper.rb +92 -4
  110. data/test/support/achievements_window_helpers.rb +18 -0
  111. data/test/support/fake_core.rb +25 -0
  112. data/test/support/fake_ra_runtime.rb +74 -0
  113. data/test/support/fake_requester.rb +78 -0
  114. data/test/support/player_helpers.rb +20 -5
  115. data/test/test_achievement.rb +32 -0
  116. data/test/{test_player.rb → test_app_controller.rb} +353 -85
  117. data/test/test_bios.rb +123 -0
  118. data/test/test_boxart_fetcher.rb +150 -0
  119. data/test/test_cli.rb +17 -265
  120. data/test/test_cli_config.rb +64 -0
  121. data/test/test_cli_decode.rb +97 -0
  122. data/test/test_cli_patch.rb +58 -0
  123. data/test/test_cli_play.rb +213 -0
  124. data/test/test_cli_ra.rb +175 -0
  125. data/test/test_cli_record.rb +69 -0
  126. data/test/test_cli_replay.rb +72 -0
  127. data/test/test_cli_sync_requester.rb +152 -0
  128. data/test/test_cli_version.rb +27 -0
  129. data/test/test_config.rb +3 -3
  130. data/test/test_config_ra.rb +69 -0
  131. data/test/test_core.rb +62 -1
  132. data/test/test_credentials_presenter.rb +192 -0
  133. data/test/test_event_bus.rb +100 -0
  134. data/test/test_fake_backend_achievements.rb +130 -0
  135. data/test/test_fake_backend_auth.rb +68 -0
  136. data/test/test_game_index.rb +77 -0
  137. data/test/test_game_picker_frame.rb +310 -0
  138. data/test/test_gamepad_map.rb +1 -3
  139. data/test/test_headless_player.rb +17 -3
  140. data/test/test_help_window.rb +82 -0
  141. data/test/test_hotkey_map.rb +22 -1
  142. data/test/test_input_recorder.rb +179 -0
  143. data/test/test_input_replay_determinism.rb +113 -0
  144. data/test/test_input_replayer.rb +162 -0
  145. data/test/test_keyboard_map.rb +1 -3
  146. data/test/test_libretro_backend.rb +41 -0
  147. data/test/test_list_picker_frame.rb +391 -0
  148. data/test/test_locale.rb +1 -1
  149. data/test/test_logging.rb +123 -0
  150. data/test/test_null_backend.rb +42 -0
  151. data/test/test_offline_backend.rb +116 -0
  152. data/test/test_overlay_renderer.rb +1 -1
  153. data/test/test_platform.rb +149 -0
  154. data/test/test_ra_backend.rb +313 -0
  155. data/test/test_ra_backend_unlock_gate.rb +56 -0
  156. data/test/test_ra_backend_unlock_retry.rb +123 -0
  157. data/test/test_recorder.rb +0 -3
  158. data/test/test_replay_player.rb +316 -0
  159. data/test/test_rom_info.rb +149 -0
  160. data/test/test_rom_overrides.rb +86 -0
  161. data/test/test_rom_patcher.rb +383 -0
  162. data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
  163. data/test/test_save_state_manager.rb +2 -4
  164. data/test/test_settings_audio.rb +107 -0
  165. data/test/test_settings_hotkeys.rb +83 -66
  166. data/test/test_settings_recording.rb +49 -0
  167. data/test/test_settings_save_states.rb +97 -0
  168. data/test/test_settings_system.rb +133 -0
  169. data/test/test_settings_video.rb +450 -0
  170. data/test/test_settings_window.rb +76 -507
  171. data/test/test_tip_service.rb +6 -6
  172. data/test/test_toast_overlay.rb +1 -1
  173. data/test/test_virtual_events.rb +221 -0
  174. data/test/test_virtual_keyboard.rb +1 -1
  175. data/vendor/rcheevos/CHANGELOG.md +495 -0
  176. data/vendor/rcheevos/LICENSE +21 -0
  177. data/vendor/rcheevos/Package.swift +33 -0
  178. data/vendor/rcheevos/README.md +67 -0
  179. data/vendor/rcheevos/include/module.modulemap +70 -0
  180. data/vendor/rcheevos/include/rc_api_editor.h +296 -0
  181. data/vendor/rcheevos/include/rc_api_info.h +280 -0
  182. data/vendor/rcheevos/include/rc_api_request.h +77 -0
  183. data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
  184. data/vendor/rcheevos/include/rc_api_user.h +262 -0
  185. data/vendor/rcheevos/include/rc_client.h +877 -0
  186. data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
  187. data/vendor/rcheevos/include/rc_consoles.h +138 -0
  188. data/vendor/rcheevos/include/rc_error.h +59 -0
  189. data/vendor/rcheevos/include/rc_export.h +100 -0
  190. data/vendor/rcheevos/include/rc_hash.h +200 -0
  191. data/vendor/rcheevos/include/rc_runtime.h +148 -0
  192. data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
  193. data/vendor/rcheevos/include/rc_util.h +51 -0
  194. data/vendor/rcheevos/include/rcheevos.h +8 -0
  195. data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
  196. data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
  197. data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
  198. data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
  199. data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
  200. data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
  201. data/vendor/rcheevos/src/rc_client.c +6941 -0
  202. data/vendor/rcheevos/src/rc_client_external.c +281 -0
  203. data/vendor/rcheevos/src/rc_client_external.h +177 -0
  204. data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
  205. data/vendor/rcheevos/src/rc_client_internal.h +409 -0
  206. data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
  207. data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
  208. data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
  209. data/vendor/rcheevos/src/rc_compat.c +251 -0
  210. data/vendor/rcheevos/src/rc_compat.h +121 -0
  211. data/vendor/rcheevos/src/rc_libretro.c +915 -0
  212. data/vendor/rcheevos/src/rc_libretro.h +98 -0
  213. data/vendor/rcheevos/src/rc_util.c +199 -0
  214. data/vendor/rcheevos/src/rc_version.c +11 -0
  215. data/vendor/rcheevos/src/rc_version.h +32 -0
  216. data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
  217. data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
  218. data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
  219. data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
  220. data/vendor/rcheevos/src/rcheevos/format.c +330 -0
  221. data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
  222. data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
  223. data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
  224. data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
  225. data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
  226. data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
  227. data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
  228. data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
  229. data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
  230. data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
  231. data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
  232. data/vendor/rcheevos/src/rcheevos/value.c +935 -0
  233. data/vendor/rcheevos/src/rhash/aes.c +480 -0
  234. data/vendor/rcheevos/src/rhash/aes.h +49 -0
  235. data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
  236. data/vendor/rcheevos/src/rhash/hash.c +1402 -0
  237. data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
  238. data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
  239. data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
  240. data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
  241. data/vendor/rcheevos/src/rhash/md5.c +382 -0
  242. data/vendor/rcheevos/src/rhash/md5.h +91 -0
  243. data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
  244. data/vendor/rcheevos/test/libretro.h +205 -0
  245. data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
  246. data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
  247. data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
  248. data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
  249. data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
  250. data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
  251. data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
  252. data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
  253. data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
  254. data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
  255. data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
  256. data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
  257. data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
  258. data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
  259. data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
  260. data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
  261. data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
  262. data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
  263. data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
  264. data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
  265. data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
  266. data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
  267. data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
  268. data/vendor/rcheevos/test/rhash/data.c +657 -0
  269. data/vendor/rcheevos/test/rhash/data.h +32 -0
  270. data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
  271. data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
  272. data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
  273. data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
  274. data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
  275. data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
  276. data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
  277. data/vendor/rcheevos/test/test.c +113 -0
  278. data/vendor/rcheevos/test/test_framework.h +205 -0
  279. data/vendor/rcheevos/test/test_rc_client.c +10509 -0
  280. data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
  281. data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
  282. data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
  283. data/vendor/rcheevos/test/test_types.natvis +9 -0
  284. data/vendor/rcheevos/validator/validator.c +658 -0
  285. data/vendor/rcheevos/validator/validator.vcxproj +152 -0
  286. data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
  287. metadata +277 -10
  288. data/lib/gemba/input_mappings.rb +0 -214
  289. data/lib/gemba/player.rb +0 -1525
@@ -0,0 +1,32 @@
1
+ #ifndef MOCK_MEMORY_H
2
+ #define MOCK_MEMORY_H
3
+
4
+ typedef struct {
5
+ uint8_t* ram;
6
+ uint32_t size;
7
+ }
8
+ memory_t;
9
+
10
+ static uint32_t peekb(uint32_t address, memory_t* memory) {
11
+ return address < memory->size ? memory->ram[address] : 0;
12
+ }
13
+
14
+ static uint32_t peek(uint32_t address, uint32_t num_bytes, void* ud) {
15
+ memory_t* memory = (memory_t*)ud;
16
+
17
+ switch (num_bytes) {
18
+ case 1: return peekb(address, memory);
19
+
20
+ case 2: return peekb(address, memory) |
21
+ peekb(address + 1, memory) << 8;
22
+
23
+ case 4: return peekb(address, memory) |
24
+ peekb(address + 1, memory) << 8 |
25
+ peekb(address + 2, memory) << 16 |
26
+ peekb(address + 3, memory) << 24;
27
+ }
28
+
29
+ return 0;
30
+ }
31
+
32
+ #endif /* MOCK_MEMORY_H */
@@ -0,0 +1,570 @@
1
+ #include "rc_internal.h"
2
+
3
+ #include "../test_framework.h"
4
+ #include "mock_memory.h"
5
+
6
+ static void _assert_operand(rc_operand_t* self, uint8_t expected_type, uint8_t expected_size, uint32_t expected_address) {
7
+ ASSERT_NUM_EQUALS(self->type, expected_type);
8
+
9
+ switch (expected_type) {
10
+ case RC_OPERAND_ADDRESS:
11
+ case RC_OPERAND_DELTA:
12
+ case RC_OPERAND_PRIOR:
13
+ ASSERT_NUM_EQUALS(self->size, expected_size);
14
+ ASSERT_NUM_EQUALS(self->value.memref->address, expected_address);
15
+ break;
16
+
17
+ case RC_OPERAND_CONST:
18
+ ASSERT_NUM_EQUALS(self->value.num, expected_address);
19
+ break;
20
+ }
21
+ }
22
+ #define assert_operand(operand, expected_type, expected_size, expected_address) ASSERT_HELPER(_assert_operand(operand, expected_type, expected_size, expected_address), "assert_operand")
23
+
24
+ static void _assert_parse_condition(
25
+ const char* memaddr, uint8_t expected_type,
26
+ uint8_t expected_left_type, uint8_t expected_left_size, uint32_t expected_left_value,
27
+ uint8_t expected_operator,
28
+ uint8_t expected_right_type, uint8_t expected_right_size, uint32_t expected_right_value,
29
+ uint32_t expected_required_hits
30
+ ) {
31
+ rc_condition_t* self;
32
+ rc_parse_state_t parse;
33
+ rc_memrefs_t memrefs;
34
+ char buffer[512];
35
+
36
+ rc_init_parse_state(&parse, buffer);
37
+ rc_init_parse_state_memrefs(&parse, &memrefs);
38
+ self = rc_parse_condition(&memaddr, &parse);
39
+ rc_destroy_parse_state(&parse);
40
+
41
+ ASSERT_NUM_EQUALS(self->type, expected_type);
42
+ assert_operand(&self->operand1, expected_left_type, expected_left_size, expected_left_value);
43
+ ASSERT_NUM_EQUALS(self->oper, expected_operator);
44
+ assert_operand(&self->operand2, expected_right_type, expected_right_size, expected_right_value);
45
+ ASSERT_NUM_EQUALS(self->required_hits, expected_required_hits);
46
+ }
47
+ #define assert_parse_condition(memaddr, expected_type, expected_left_type, expected_left_size, expected_left_value, \
48
+ expected_operator, expected_right_type, expected_right_size, expected_right_value, expected_required_hits) \
49
+ ASSERT_HELPER(_assert_parse_condition(memaddr, expected_type, expected_left_type, expected_left_size, expected_left_value, \
50
+ expected_operator, expected_right_type, expected_right_size, expected_right_value, expected_required_hits), "assert_parse_condition")
51
+
52
+ static void test_parse_condition(const char* memaddr, uint8_t expected_type, uint8_t expected_left_type,
53
+ uint8_t expected_operator, uint32_t expected_required_hits) {
54
+ if (expected_operator == RC_OPERATOR_NONE) {
55
+ assert_parse_condition(memaddr, expected_type,
56
+ expected_left_type, RC_MEMSIZE_8_BITS, 0x1234U,
57
+ expected_operator,
58
+ RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0U,
59
+ expected_required_hits
60
+ );
61
+ }
62
+ else {
63
+ assert_parse_condition(memaddr, expected_type,
64
+ expected_left_type, RC_MEMSIZE_8_BITS, 0x1234U,
65
+ expected_operator,
66
+ RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 8U,
67
+ expected_required_hits
68
+ );
69
+ }
70
+ }
71
+
72
+ static void test_parse_operands(const char* memaddr,
73
+ uint8_t expected_left_type, uint8_t expected_left_size, uint32_t expected_left_value,
74
+ uint8_t expected_right_type, uint8_t expected_right_size, uint32_t expected_right_value) {
75
+ assert_parse_condition(memaddr, RC_CONDITION_STANDARD,
76
+ expected_left_type, expected_left_size, expected_left_value,
77
+ RC_OPERATOR_EQ,
78
+ expected_right_type, expected_right_size, expected_right_value,
79
+ 0
80
+ );
81
+ }
82
+
83
+ static void test_parse_modifier(const char* memaddr, uint8_t expected_operator, uint8_t expected_operand, double expected_multiplier) {
84
+ assert_parse_condition(memaddr, RC_CONDITION_ADD_SOURCE,
85
+ RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U,
86
+ expected_operator,
87
+ expected_operand, RC_MEMSIZE_8_BITS, (int)expected_multiplier,
88
+ 0
89
+ );
90
+ }
91
+
92
+ static void test_parse_modifier_shorthand(const char* memaddr, uint8_t expected_type) {
93
+ assert_parse_condition(memaddr, expected_type,
94
+ RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U,
95
+ RC_OPERATOR_NONE,
96
+ RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 1U,
97
+ 0
98
+ );
99
+ }
100
+
101
+ static void test_parse_condition_error(const char* memaddr, int expected_error) {
102
+ if (expected_error == RC_OK) {
103
+ ASSERT_NUM_GREATER(rc_trigger_size(memaddr), 0);
104
+ } else {
105
+ ASSERT_NUM_EQUALS(rc_trigger_size(memaddr), expected_error);
106
+ }
107
+ }
108
+
109
+ static int evaluate_condition(rc_condition_t* cond, memory_t* memory, rc_memrefs_t* memrefs) {
110
+ rc_eval_state_t eval_state;
111
+
112
+ memset(&eval_state, 0, sizeof(eval_state));
113
+ eval_state.peek = peek;
114
+ eval_state.peek_userdata = memory;
115
+
116
+ rc_update_memref_values(memrefs, peek, memory);
117
+ return rc_test_condition(cond, &eval_state);
118
+ }
119
+
120
+ static void test_evaluate_condition(const char* memaddr, uint8_t expected_comparator, int expected_result) {
121
+ rc_condition_t* self;
122
+ rc_parse_state_t parse;
123
+ char buffer[512];
124
+ rc_memrefs_t memrefs;
125
+ int ret;
126
+ uint8_t ram[] = {0x00, 0x11, 0x34, 0xAB, 0x56};
127
+ memory_t memory;
128
+
129
+ memory.ram = ram;
130
+ memory.size = sizeof(ram);
131
+
132
+ rc_init_parse_state(&parse, buffer);
133
+ rc_init_parse_state_memrefs(&parse, &memrefs);
134
+ self = rc_parse_condition(&memaddr, &parse);
135
+ rc_destroy_parse_state(&parse);
136
+
137
+ ASSERT_NUM_GREATER(parse.offset, 0);
138
+ ASSERT_NUM_EQUALS(*memaddr, 0);
139
+
140
+ rc_update_memref_values(&memrefs, peek, &memory); /* capture delta for ram[1] */
141
+ ram[1] = 0x12;
142
+
143
+ ASSERT_NUM_EQUALS(self->optimized_comparator, expected_comparator);
144
+ ret = evaluate_condition(self, &memory, &memrefs);
145
+
146
+ if (expected_result) {
147
+ ASSERT_NUM_EQUALS(ret, 1);
148
+ } else {
149
+ ASSERT_NUM_EQUALS(ret, 0);
150
+ }
151
+ }
152
+
153
+ static void test_default_comparator(const char* memaddr) {
154
+ rc_condset_t* condset;
155
+ rc_condition_t* condition;
156
+ rc_parse_state_t parse;
157
+ char buffer[512];
158
+ rc_memrefs_t memrefs;
159
+
160
+ rc_init_parse_state(&parse, buffer);
161
+ rc_init_parse_state_memrefs(&parse, &memrefs);
162
+ condset = rc_parse_condset(&memaddr, &parse);
163
+ rc_destroy_parse_state(&parse);
164
+
165
+ ASSERT_NUM_GREATER(parse.offset, 0);
166
+ ASSERT_NUM_EQUALS(*memaddr, 0);
167
+
168
+ condition = condset->conditions;
169
+ while (condition->next)
170
+ condition = condition->next;
171
+
172
+ /* expect last condition to have default comparator - that's the point of this test */
173
+ ASSERT_NUM_EQUALS(condition->optimized_comparator, RC_PROCESSING_COMPARE_DEFAULT);
174
+ }
175
+
176
+ static void test_evaluate_condition_float(const char* memaddr, int expected_result) {
177
+ rc_condition_t* self;
178
+ rc_parse_state_t parse;
179
+ char buffer[512];
180
+ rc_memrefs_t memrefs;
181
+ int ret;
182
+ uint8_t ram[] = {0x00, 0x00, 0x00, 0x40, 0x83, 0x49, 0x0F, 0xDB}; /* FF0=2, FF4=2*pi */
183
+ memory_t memory;
184
+
185
+ memory.ram = ram;
186
+ memory.size = sizeof(ram);
187
+
188
+ rc_init_parse_state(&parse, buffer);
189
+ rc_init_parse_state_memrefs(&parse, &memrefs);
190
+ self = rc_parse_condition(&memaddr, &parse);
191
+ rc_destroy_parse_state(&parse);
192
+
193
+ ASSERT_NUM_GREATER(parse.offset, 0);
194
+ ASSERT_NUM_EQUALS(*memaddr, 0);
195
+
196
+ ret = evaluate_condition(self, &memory, &memrefs);
197
+
198
+ if (expected_result) {
199
+ ASSERT_NUM_EQUALS(ret, 1);
200
+ } else {
201
+ ASSERT_NUM_EQUALS(ret, 0);
202
+ }
203
+ }
204
+
205
+ static void test_condition_compare_delta() {
206
+ uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
207
+ memory_t memory;
208
+ rc_condition_t* cond;
209
+ rc_parse_state_t parse;
210
+ char buffer[512];
211
+ rc_memrefs_t memrefs;
212
+
213
+ const char* cond_str = "0xH0001>d0xH0001";
214
+ rc_init_parse_state(&parse, buffer);
215
+ rc_init_parse_state_memrefs(&parse, &memrefs);
216
+ cond = rc_parse_condition(&cond_str, &parse);
217
+ rc_destroy_parse_state(&parse);
218
+
219
+ ASSERT_NUM_GREATER(parse.offset, 0);
220
+ ASSERT_NUM_EQUALS(*cond_str, 0);
221
+ memory.ram = ram;
222
+ memory.size = sizeof(ram);
223
+
224
+ /* initial delta value is 0, 0x12 > 0 */
225
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
226
+
227
+ /* delta value is now 0x12, 0x12 = 0x12 */
228
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
229
+
230
+ /* delta value is now 0x12, 0x11 < 0x12 */
231
+ ram[1] = 0x11;
232
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
233
+
234
+ /* delta value is now 0x13, 0x12 > 0x11 */
235
+ ram[1] = 0x12;
236
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
237
+ }
238
+
239
+ static void test_condition_delta_24bit() {
240
+ uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
241
+ memory_t memory;
242
+ rc_condition_t* cond;
243
+ rc_parse_state_t parse;
244
+ char buffer[512];
245
+ rc_memrefs_t memrefs;
246
+
247
+ const char* cond_str = "0xW0001>d0xW0001";
248
+ rc_init_parse_state(&parse, buffer);
249
+ rc_init_parse_state_memrefs(&parse, &memrefs);
250
+ cond = rc_parse_condition(&cond_str, &parse);
251
+ rc_destroy_parse_state(&parse);
252
+
253
+ ASSERT_NUM_GREATER(parse.offset, 0);
254
+ ASSERT_NUM_EQUALS(*cond_str, 0);
255
+ memory.ram = ram;
256
+ memory.size = sizeof(ram);
257
+
258
+ /* initial delta value is 0x000000, 0xAB3412 > 0x000000 */
259
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
260
+
261
+ /* delta value is now 0xAB3412, 0xAB3412 == 0xAB3412 */
262
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
263
+
264
+ /* value changes to 0xAB3411, delta value is now 0xAB3412, 0xAB3411 < 0xAB3412 */
265
+ ram[1] = 0x11;
266
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
267
+
268
+ /* value changes to 0xAB3412, delta value is now 0xAB3411, 0xAB3412 > 0xAB3411 */
269
+ ram[1] = 0x12;
270
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
271
+
272
+ /* ram[4] should not affect the 24-bit value, 0xAB3412 == 0xAB3412 */
273
+ ram[4] = 0xAC;
274
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
275
+
276
+ /* value changes to 0xAB3411, delta is still 0xAB3412, 0xAB3411 < 0xAB3412 */
277
+ ram[1] = 0x11;
278
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
279
+
280
+ /* ram[4] should not affect the 24-bit value, 0xAB3411 == 0xAB3411 */
281
+ ram[4] = 0xAD;
282
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
283
+ }
284
+
285
+ static void test_condition_prior_24bit() {
286
+ uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
287
+ memory_t memory;
288
+ rc_condition_t* cond;
289
+ rc_parse_state_t parse;
290
+ char buffer[512];
291
+ rc_memrefs_t memrefs;
292
+
293
+ const char* cond_str = "0xW0001>p0xW0001";
294
+ rc_init_parse_state(&parse, buffer);
295
+ rc_init_parse_state_memrefs(&parse, &memrefs);
296
+ cond = rc_parse_condition(&cond_str, &parse);
297
+ rc_destroy_parse_state(&parse);
298
+
299
+ ASSERT_NUM_GREATER(parse.offset, 0);
300
+ ASSERT_NUM_EQUALS(*cond_str, 0);
301
+ memory.ram = ram;
302
+ memory.size = sizeof(ram);
303
+
304
+ /* initial prior value is 0x000000, 0xAB3412 > 0x000000 */
305
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
306
+
307
+ /* delta value is now 0xAB3412, but prior is still 0x000000, 0xAB3412 > 0x000000 */
308
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
309
+
310
+ /* value changes to 0xAB3411, delta and prior values are now 0xAB3412, 0xAB3411 < 0xAB3412 */
311
+ ram[1] = 0x11;
312
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
313
+
314
+ /* value changes to 0xAB3412, delta and prior values are now 0xAB3411, 0xAB3412 > 0xAB3411 */
315
+ ram[1] = 0x12;
316
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
317
+
318
+ /* ram[4] should not affect the 24-bit value, 0xAB3412 > 0xAB3411 */
319
+ ram[4] = 0xAC;
320
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
321
+
322
+ /* ram[4] should not affect the 24-bit value, 0xAB3412 > 0xAB3411 */
323
+ ram[4] = 0xAD;
324
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 1);
325
+
326
+ /* value changes to 0xAB3411, delta and prior values are now 0xAB3412, 0xAB3411 < 0xAB3412 */
327
+ ram[1] = 0x11;
328
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
329
+
330
+ /* ram[4] should not affect the 24-bit value, 0xAB3411 < 0xAB3412 */
331
+ ram[4] = 0xAE;
332
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
333
+
334
+ /* ram[4] should not affect the 24-bit value, 0xAB3411 < 0xAB3412 */
335
+ ram[4] = 0xAF;
336
+ ASSERT_NUM_EQUALS(evaluate_condition(cond, &memory, &memrefs), 0);
337
+ }
338
+
339
+ void test_condition(void) {
340
+ TEST_SUITE_BEGIN();
341
+
342
+ /* different comparison operators */
343
+ TEST_PARAMS5(test_parse_condition, "0xH1234=8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
344
+ TEST_PARAMS5(test_parse_condition, "0xH1234==8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
345
+ TEST_PARAMS5(test_parse_condition, "0xH1234!=8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_NE, 0);
346
+ TEST_PARAMS5(test_parse_condition, "0xH1234<8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_LT, 0);
347
+ TEST_PARAMS5(test_parse_condition, "0xH1234<=8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_LE, 0);
348
+ TEST_PARAMS5(test_parse_condition, "0xH1234>8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_GT, 0);
349
+ TEST_PARAMS5(test_parse_condition, "0xH1234>=8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_GE, 0);
350
+ TEST_PARAMS5(test_parse_condition, "0xH1234<8", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_LT, 0);
351
+
352
+ /* special accessors */
353
+ TEST_PARAMS5(test_parse_condition, "d0xH1234=8", RC_CONDITION_STANDARD, RC_OPERAND_DELTA, RC_OPERATOR_EQ, 0);
354
+ TEST_PARAMS5(test_parse_condition, "p0xH1234=8", RC_CONDITION_STANDARD, RC_OPERAND_PRIOR, RC_OPERATOR_EQ, 0);
355
+
356
+ /* flags */
357
+ TEST_PARAMS5(test_parse_condition, "R:0xH1234=8", RC_CONDITION_RESET_IF, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
358
+ TEST_PARAMS5(test_parse_condition, "P:0xH1234=8", RC_CONDITION_PAUSE_IF, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
359
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234=8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_NONE, 0);
360
+ TEST_PARAMS5(test_parse_condition, "B:0xH1234=8", RC_CONDITION_SUB_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_NONE, 0);
361
+ TEST_PARAMS5(test_parse_condition, "C:0xH1234=8", RC_CONDITION_ADD_HITS, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
362
+ TEST_PARAMS5(test_parse_condition, "D:0xH1234=8", RC_CONDITION_SUB_HITS, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
363
+ TEST_PARAMS5(test_parse_condition, "M:0xH1234=8", RC_CONDITION_MEASURED, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
364
+ TEST_PARAMS5(test_parse_condition, "G:0xH1234=8", RC_CONDITION_MEASURED, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
365
+ TEST_PARAMS5(test_parse_condition, "Q:0xH1234=8", RC_CONDITION_MEASURED_IF, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
366
+ TEST_PARAMS5(test_parse_condition, "I:0xH1234=8", RC_CONDITION_ADD_ADDRESS, RC_OPERAND_ADDRESS, RC_OPERATOR_NONE, 0);
367
+ TEST_PARAMS5(test_parse_condition, "T:0xH1234=8", RC_CONDITION_TRIGGER, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
368
+ TEST_PARAMS5(test_parse_condition, "Z:0xH1234=8", RC_CONDITION_RESET_NEXT_IF, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 0);
369
+
370
+ /* modifiers (only valid with some flags, use A:) */
371
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234*8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_MULT, 0);
372
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234/8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_DIV, 0);
373
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234&8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_AND, 0);
374
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234^8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_XOR, 0);
375
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234%8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_MOD, 0);
376
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234+8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_ADD, 0);
377
+ TEST_PARAMS5(test_parse_condition, "A:0xH1234-8", RC_CONDITION_ADD_SOURCE, RC_OPERAND_ADDRESS, RC_OPERATOR_SUB, 0);
378
+
379
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234", RC_OPERATOR_NONE, RC_OPERAND_CONST, 1);
380
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*1", RC_OPERATOR_MULT, RC_OPERAND_CONST, 1);
381
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*3", RC_OPERATOR_MULT, RC_OPERAND_CONST, 3);
382
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*f0.5", RC_OPERATOR_MULT, RC_OPERAND_FP, 0.5);
383
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*f.5", RC_OPERATOR_MULT, RC_OPERAND_FP, 0.5);
384
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*-1", RC_OPERATOR_MULT, RC_OPERAND_CONST, -1);
385
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234*0xH3456", RC_OPERATOR_MULT, RC_OPERAND_ADDRESS, 0x3456);
386
+
387
+ /* legacy serializers would include whatever happened to be in the right side before it was converted to a modifier.
388
+ * they should be ignored */
389
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234=0", RC_OPERATOR_NONE, RC_OPERAND_CONST, 0);
390
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234!=0xH1234", RC_OPERATOR_NONE, RC_OPERAND_CONST, 0);
391
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234=0.60.", RC_OPERATOR_NONE, RC_OPERAND_CONST, 0);
392
+ TEST_PARAMS4(test_parse_modifier, "A:0xH1234=0(60)", RC_OPERATOR_NONE, RC_OPERAND_CONST, 0);
393
+
394
+ /* hit counts */
395
+ TEST_PARAMS5(test_parse_condition, "0xH1234=8(1)", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 1);
396
+ TEST_PARAMS5(test_parse_condition, "0xH1234=8.1.", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 1); /* legacy format */
397
+ TEST_PARAMS5(test_parse_condition, "0xH1234=8(1000)", RC_CONDITION_STANDARD, RC_OPERAND_ADDRESS, RC_OPERATOR_EQ, 1000);
398
+
399
+ /* hex value is interpreted as a 16-bit memory reference */
400
+ TEST_PARAMS7(test_parse_operands, "0xH1234=0x80", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U, RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS, 0x80U);
401
+
402
+ TEST_PARAMS7(test_parse_operands, "0xL1234=0xU3456", RC_OPERAND_ADDRESS, RC_MEMSIZE_LOW, 0x1234U, RC_OPERAND_ADDRESS, RC_MEMSIZE_HIGH, 0x3456U);
403
+
404
+ /* shorthard for modifier conditions */
405
+ TEST_PARAMS2(test_parse_modifier_shorthand, "A:0xH1234", RC_CONDITION_ADD_SOURCE);
406
+ TEST_PARAMS2(test_parse_modifier_shorthand, "B:0xH1234", RC_CONDITION_SUB_SOURCE);
407
+ TEST_PARAMS2(test_parse_modifier_shorthand, "I:0xH1234", RC_CONDITION_ADD_ADDRESS);
408
+
409
+ /* parse errors */
410
+ TEST_PARAMS2(test_parse_condition_error, "0xH1234==0", RC_OK);
411
+ TEST_PARAMS2(test_parse_condition_error, "H0x1234==0", RC_INVALID_CONST_OPERAND);
412
+ TEST_PARAMS2(test_parse_condition_error, "0x1234", RC_INVALID_OPERATOR);
413
+ TEST_PARAMS2(test_parse_condition_error, "C:0x1234", RC_INVALID_OPERATOR); /* shorthand only valid on modifier conditions */
414
+ TEST_PARAMS2(test_parse_condition_error, "N:0x1234", RC_INVALID_OPERATOR);
415
+ TEST_PARAMS2(test_parse_condition_error, "O:0x1234", RC_INVALID_OPERATOR);
416
+ TEST_PARAMS2(test_parse_condition_error, "P:0x1234", RC_INVALID_OPERATOR);
417
+ TEST_PARAMS2(test_parse_condition_error, "R:0x1234", RC_INVALID_OPERATOR);
418
+ TEST_PARAMS2(test_parse_condition_error, "M:0x1234", RC_INVALID_OPERATOR);
419
+ TEST_PARAMS2(test_parse_condition_error, "G:0x1234", RC_INVALID_OPERATOR);
420
+ TEST_PARAMS2(test_parse_condition_error, "Y:0x1234", RC_INVALID_CONDITION_TYPE);
421
+ TEST_PARAMS2(test_parse_condition_error, "0x1234=1.2", RC_INVALID_REQUIRED_HITS);
422
+ TEST_PARAMS2(test_parse_condition_error, "0.1234==0", RC_INVALID_OPERATOR); /* period is assumed to be operator */
423
+ TEST_PARAMS2(test_parse_condition_error, "0==0.1234", RC_INVALID_REQUIRED_HITS); /* period is assumed to be start of hit target, no end marker */
424
+
425
+ /* simple evaluations (ram[1] = 18, delta(ram[1]) = 17, ram[2] = 52, delta(ram[2]) = 52) */
426
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001!=0", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 1);
427
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>0", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 1);
428
+
429
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001=18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 1);
430
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001!=18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 0);
431
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001<=18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 1);
432
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>=18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 1);
433
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001<18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 0);
434
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>18", RC_PROCESSING_COMPARE_MEMREF_TO_CONST, 0);
435
+
436
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001=18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
437
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001!=18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
438
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001<=18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
439
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001>=18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
440
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001<18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
441
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001>18", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
442
+
443
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002=52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
444
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002!=52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
445
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002<=52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
446
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002>=52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 1);
447
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002<52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
448
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002>52", RC_PROCESSING_COMPARE_DELTA_TO_CONST, 0);
449
+
450
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001<0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF, 1);
451
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF, 0);
452
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001=0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF, 0);
453
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001!=0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF, 1);
454
+
455
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001=d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
456
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001!=d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
457
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001<=d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
458
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>=d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
459
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001<d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
460
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001>d0xH0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
461
+
462
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002=d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
463
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002!=d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
464
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002<=d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
465
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002>=d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 1);
466
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002<d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
467
+ TEST_PARAMS3(test_evaluate_condition, "0xH0002>d0xH0002", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA, 0);
468
+
469
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001=0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
470
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001!=0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
471
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001<=0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
472
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001>=0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
473
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001<0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
474
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0001>0xH0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
475
+
476
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002=0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
477
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002!=0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
478
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002<=0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
479
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002>=0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 1);
480
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002<0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
481
+ TEST_PARAMS3(test_evaluate_condition, "d0xH0002>0xH0002", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF, 0);
482
+
483
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001=1", RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED, 0);
484
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001!=1", RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED, 1);
485
+ TEST_PARAMS3(test_evaluate_condition, "0xK0001=2", RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED, 1);
486
+ TEST_PARAMS3(test_evaluate_condition, "0xK0001!=2", RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED, 0);
487
+
488
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0001=1", RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED, 1);
489
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0001!=1", RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED, 0);
490
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0002=1", RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED, 0);
491
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0002!=1", RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED, 1);
492
+
493
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001=0xN0001", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 0);
494
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001!=0xN0001", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 1);
495
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001=0xH0000", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 1);
496
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001!=0xH0000", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 0);
497
+ TEST_PARAMS3(test_evaluate_condition, "0xH0000=0xM0001", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 1);
498
+ TEST_PARAMS3(test_evaluate_condition, "0xH0000!=0xM0001", RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED, 0);
499
+
500
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001=d0xN0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED, 1);
501
+ TEST_PARAMS3(test_evaluate_condition, "0xM0001!=d0xN0001", RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED, 0);
502
+
503
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0001=0xN0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED, 1);
504
+ TEST_PARAMS3(test_evaluate_condition, "d0xM0001!=0xN0001", RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED, 0);
505
+
506
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001=0xH0001", RC_PROCESSING_COMPARE_ALWAYS_TRUE, 1);
507
+ TEST_PARAMS3(test_evaluate_condition, "0xH0001!=0xH0001", RC_PROCESSING_COMPARE_ALWAYS_FALSE, 0);
508
+ TEST_PARAMS3(test_evaluate_condition, "1=1", RC_PROCESSING_COMPARE_ALWAYS_TRUE, 1);
509
+ TEST_PARAMS3(test_evaluate_condition, "0=1", RC_PROCESSING_COMPARE_ALWAYS_FALSE, 0);
510
+
511
+ TEST_PARAMS1(test_default_comparator, "I:0xH0000_0xH0001=0"); /* indirect cannot be optimized */
512
+ TEST_PARAMS1(test_default_comparator, "fF0001=f2.0"); /* float is not common enough to be optimized */
513
+ TEST_PARAMS1(test_default_comparator, "p0xH0001=0"); /* prior is not common enough to be optimized */
514
+ TEST_PARAMS1(test_default_comparator, "b0xH0001=0"); /* bcd is not common enough to be optimized */
515
+ TEST_PARAMS1(test_default_comparator, "~0xH0001=0"); /* inverted is not common enough to be optimized */
516
+ TEST_PARAMS1(test_default_comparator, "d0xH0001=0x 0001"); /* delta comparison only optimized for same address, same size */
517
+ TEST_PARAMS1(test_default_comparator, "0xH0001=d0x 0001"); /* delta comparison only optimized for same address, same size */
518
+ TEST_PARAMS1(test_default_comparator, "d0xH0001=0xH0002"); /* delta comparison only optimized for same address, same size */
519
+ TEST_PARAMS1(test_default_comparator, "0xH0001=d0xH0002"); /* delta comparison only optimized for same address, same size */
520
+
521
+ /* float evaluations (ram[0] = 2.0, ram[4] = 3.14159 */
522
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000=f2.0", 1);
523
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000!=f2.0", 0);
524
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<=f2.0", 1);
525
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>=f2.0", 1);
526
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<f2.0", 0);
527
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>f2.0", 0);
528
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<f1.999999", 0);
529
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>f1.999999", 1);
530
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<f2.000001", 1);
531
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>f2.000001", 0);
532
+
533
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000=2", 1);
534
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000!=2", 0);
535
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<=2", 1);
536
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>=2", 1);
537
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<2", 0);
538
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>2", 0);
539
+
540
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004=f6.283185", 1);
541
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004!=f6.283185", 0);
542
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<=f6.283185", 1);
543
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>=f6.283185", 1);
544
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<f6.283185", 0);
545
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>f6.283185", 0);
546
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<f6.283183", 0); /* due to rounding during the conversion from */
547
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>f6.283183", 1); /* binary to float, the last decimal digit may */
548
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<f6.283187", 1); /* not change. go two digits to either side to */
549
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>f6.283187", 0); /* ensure we cover an epsilon gap */
550
+
551
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004=6", 0);
552
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004!=6", 1);
553
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<=6", 0);
554
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>=6", 1);
555
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004<6", 0);
556
+ TEST_PARAMS2(test_evaluate_condition_float, "fM0004>6", 1);
557
+
558
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000==fF0000", 1);
559
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000!=fF0000", 0);
560
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000==fM0004", 0);
561
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000!=fM0004", 1);
562
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000<fM0004", 1);
563
+ TEST_PARAMS2(test_evaluate_condition_float, "fF0000>fM0004", 0);
564
+
565
+ TEST(test_condition_compare_delta);
566
+ TEST(test_condition_delta_24bit);
567
+ TEST(test_condition_prior_24bit);
568
+
569
+ TEST_SUITE_END();
570
+ }