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,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
+ }