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.
- checksums.yaml +4 -4
- data/THIRD_PARTY_NOTICES +37 -2
- data/assets/placeholder_boxart.png +0 -0
- data/bin/gemba +2 -2
- data/ext/gemba/extconf.rb +23 -1
- data/ext/gemba/gemba_ext.c +436 -2
- data/ext/gemba/gemba_ext.h +2 -0
- data/gemba.gemspec +5 -3
- data/lib/gemba/achievements/achievement.rb +23 -0
- data/lib/gemba/achievements/backend.rb +186 -0
- data/lib/gemba/achievements/cache.rb +70 -0
- data/lib/gemba/achievements/credentials_presenter.rb +142 -0
- data/lib/gemba/achievements/fake_backend.rb +205 -0
- data/lib/gemba/achievements/null_backend.rb +11 -0
- data/lib/gemba/achievements/offline_backend.rb +168 -0
- data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
- data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
- data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
- data/lib/gemba/achievements.rb +19 -0
- data/lib/gemba/achievements_window.rb +556 -0
- data/lib/gemba/app_controller.rb +1015 -0
- data/lib/gemba/bios.rb +54 -0
- data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
- data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
- data/lib/gemba/boxart_fetcher.rb +79 -0
- data/lib/gemba/bus_emitter.rb +13 -0
- data/lib/gemba/child_window.rb +24 -1
- data/lib/gemba/cli/commands/config_cmd.rb +83 -0
- data/lib/gemba/cli/commands/decode.rb +154 -0
- data/lib/gemba/cli/commands/patch.rb +78 -0
- data/lib/gemba/cli/commands/play.rb +78 -0
- data/lib/gemba/cli/commands/record.rb +114 -0
- data/lib/gemba/cli/commands/replay.rb +161 -0
- data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
- data/lib/gemba/cli/commands/version.rb +22 -0
- data/lib/gemba/cli.rb +52 -364
- data/lib/gemba/config.rb +134 -1
- data/lib/gemba/data/gb_games.json +1 -0
- data/lib/gemba/data/gb_md5.json +1 -0
- data/lib/gemba/data/gba_games.json +1 -0
- data/lib/gemba/data/gba_md5.json +1 -0
- data/lib/gemba/data/gbc_games.json +1 -0
- data/lib/gemba/data/gbc_md5.json +1 -0
- data/lib/gemba/emulator_frame.rb +1060 -0
- data/lib/gemba/event_bus.rb +48 -0
- data/lib/gemba/frame_stack.rb +60 -0
- data/lib/gemba/game_index.rb +84 -0
- data/lib/gemba/game_picker_frame.rb +268 -0
- data/lib/gemba/gamepad_map.rb +103 -0
- data/lib/gemba/headless.rb +6 -5
- data/lib/gemba/headless_player.rb +33 -3
- data/lib/gemba/help_window.rb +61 -0
- data/lib/gemba/hotkey_map.rb +3 -1
- data/lib/gemba/input_recorder.rb +107 -0
- data/lib/gemba/input_replayer.rb +119 -0
- data/lib/gemba/keyboard_map.rb +90 -0
- data/lib/gemba/locales/en.yml +97 -5
- data/lib/gemba/locales/ja.yml +97 -5
- data/lib/gemba/main_window.rb +56 -0
- data/lib/gemba/modal_stack.rb +81 -0
- data/lib/gemba/patcher_window.rb +223 -0
- data/lib/gemba/platform/gb.rb +21 -0
- data/lib/gemba/platform/gba.rb +21 -0
- data/lib/gemba/platform/gbc.rb +23 -0
- data/lib/gemba/platform.rb +20 -0
- data/lib/gemba/platform_open.rb +19 -0
- data/lib/gemba/recorder.rb +4 -3
- data/lib/gemba/replay_player.rb +691 -0
- data/lib/gemba/rom_info.rb +57 -0
- data/lib/gemba/rom_info_window.rb +16 -3
- data/lib/gemba/rom_library.rb +106 -0
- data/lib/gemba/rom_overrides.rb +47 -0
- data/lib/gemba/rom_patcher/bps.rb +161 -0
- data/lib/gemba/rom_patcher/ips.rb +101 -0
- data/lib/gemba/rom_patcher/ups.rb +118 -0
- data/lib/gemba/rom_patcher.rb +109 -0
- data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
- data/lib/gemba/runtime.rb +59 -26
- data/lib/gemba/save_state_manager.rb +4 -7
- data/lib/gemba/save_state_picker.rb +17 -4
- data/lib/gemba/session_logger.rb +64 -0
- data/lib/gemba/settings/audio_tab.rb +77 -0
- data/lib/gemba/settings/gamepad_tab.rb +351 -0
- data/lib/gemba/settings/hotkeys_tab.rb +259 -0
- data/lib/gemba/settings/paths.rb +11 -0
- data/lib/gemba/settings/recording_tab.rb +83 -0
- data/lib/gemba/settings/save_states_tab.rb +91 -0
- data/lib/gemba/settings/system_tab.rb +362 -0
- data/lib/gemba/settings/video_tab.rb +318 -0
- data/lib/gemba/settings_window.rb +162 -1036
- data/lib/gemba/version.rb +1 -1
- data/lib/gemba/virtual_keyboard.rb +19 -0
- data/lib/gemba.rb +2 -12
- data/test/achievements_window/test_bulk_sync.rb +218 -0
- data/test/achievements_window/test_bus_events.rb +125 -0
- data/test/achievements_window/test_close_confirmation.rb +201 -0
- data/test/achievements_window/test_initial_state.rb +164 -0
- data/test/achievements_window/test_sorting.rb +227 -0
- data/test/achievements_window/test_tree_rendering.rb +133 -0
- data/test/fixtures/fake_bios.bin +0 -0
- data/test/fixtures/pong.gba +0 -0
- data/test/fixtures/test.gb +0 -0
- data/test/fixtures/test.gbc +0 -0
- data/test/fixtures/test_quicksave.ss +0 -0
- data/test/screenshots/no_focus.png +0 -0
- data/test/shared/teek_test_worker.rb +17 -1
- data/test/shared/tk_test_helper.rb +91 -4
- data/test/support/achievements_window_helpers.rb +18 -0
- data/test/support/fake_core.rb +25 -0
- data/test/support/fake_ra_runtime.rb +74 -0
- data/test/support/fake_requester.rb +68 -0
- data/test/support/player_helpers.rb +20 -5
- data/test/test_achievement.rb +32 -0
- data/test/{test_player.rb → test_app_controller.rb} +353 -85
- data/test/test_bios.rb +123 -0
- data/test/test_boxart_fetcher.rb +150 -0
- data/test/test_cli.rb +17 -265
- data/test/test_cli_config.rb +64 -0
- data/test/test_cli_decode.rb +97 -0
- data/test/test_cli_patch.rb +58 -0
- data/test/test_cli_play.rb +213 -0
- data/test/test_cli_ra.rb +175 -0
- data/test/test_cli_record.rb +69 -0
- data/test/test_cli_replay.rb +72 -0
- data/test/test_cli_sync_requester.rb +152 -0
- data/test/test_cli_version.rb +27 -0
- data/test/test_config.rb +2 -3
- data/test/test_config_ra.rb +69 -0
- data/test/test_core.rb +62 -1
- data/test/test_credentials_presenter.rb +192 -0
- data/test/test_event_bus.rb +100 -0
- data/test/test_fake_backend_achievements.rb +130 -0
- data/test/test_fake_backend_auth.rb +68 -0
- data/test/test_game_index.rb +77 -0
- data/test/test_game_picker_frame.rb +310 -0
- data/test/test_gamepad_map.rb +1 -3
- data/test/test_headless_player.rb +17 -3
- data/test/test_help_window.rb +82 -0
- data/test/test_hotkey_map.rb +22 -1
- data/test/test_input_recorder.rb +179 -0
- data/test/test_input_replay_determinism.rb +113 -0
- data/test/test_input_replayer.rb +162 -0
- data/test/test_keyboard_map.rb +1 -3
- data/test/test_libretro_backend.rb +41 -0
- data/test/test_locale.rb +1 -1
- data/test/test_logging.rb +123 -0
- data/test/test_null_backend.rb +42 -0
- data/test/test_offline_backend.rb +116 -0
- data/test/test_overlay_renderer.rb +1 -1
- data/test/test_platform.rb +149 -0
- data/test/test_ra_backend.rb +313 -0
- data/test/test_ra_backend_unlock_gate.rb +56 -0
- data/test/test_recorder.rb +0 -3
- data/test/test_replay_player.rb +316 -0
- data/test/test_rom_info.rb +149 -0
- data/test/test_rom_overrides.rb +86 -0
- data/test/test_rom_patcher.rb +382 -0
- data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
- data/test/test_save_state_manager.rb +2 -4
- data/test/test_settings_audio.rb +107 -0
- data/test/test_settings_hotkeys.rb +83 -66
- data/test/test_settings_recording.rb +49 -0
- data/test/test_settings_save_states.rb +97 -0
- data/test/test_settings_system.rb +133 -0
- data/test/test_settings_video.rb +450 -0
- data/test/test_settings_window.rb +76 -507
- data/test/test_tip_service.rb +6 -6
- data/test/test_toast_overlay.rb +1 -1
- data/test/test_virtual_events.rb +156 -0
- data/test/test_virtual_keyboard.rb +1 -1
- data/vendor/rcheevos/CHANGELOG.md +495 -0
- data/vendor/rcheevos/LICENSE +21 -0
- data/vendor/rcheevos/Package.swift +33 -0
- data/vendor/rcheevos/README.md +67 -0
- data/vendor/rcheevos/include/module.modulemap +70 -0
- data/vendor/rcheevos/include/rc_api_editor.h +296 -0
- data/vendor/rcheevos/include/rc_api_info.h +280 -0
- data/vendor/rcheevos/include/rc_api_request.h +77 -0
- data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
- data/vendor/rcheevos/include/rc_api_user.h +262 -0
- data/vendor/rcheevos/include/rc_client.h +877 -0
- data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
- data/vendor/rcheevos/include/rc_consoles.h +138 -0
- data/vendor/rcheevos/include/rc_error.h +59 -0
- data/vendor/rcheevos/include/rc_export.h +100 -0
- data/vendor/rcheevos/include/rc_hash.h +200 -0
- data/vendor/rcheevos/include/rc_runtime.h +148 -0
- data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
- data/vendor/rcheevos/include/rc_util.h +51 -0
- data/vendor/rcheevos/include/rcheevos.h +8 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
- data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
- data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
- data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
- data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
- data/vendor/rcheevos/src/rc_client.c +6941 -0
- data/vendor/rcheevos/src/rc_client_external.c +281 -0
- data/vendor/rcheevos/src/rc_client_external.h +177 -0
- data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
- data/vendor/rcheevos/src/rc_client_internal.h +409 -0
- data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
- data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
- data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
- data/vendor/rcheevos/src/rc_compat.c +251 -0
- data/vendor/rcheevos/src/rc_compat.h +121 -0
- data/vendor/rcheevos/src/rc_libretro.c +915 -0
- data/vendor/rcheevos/src/rc_libretro.h +98 -0
- data/vendor/rcheevos/src/rc_util.c +199 -0
- data/vendor/rcheevos/src/rc_version.c +11 -0
- data/vendor/rcheevos/src/rc_version.h +32 -0
- data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
- data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
- data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
- data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
- data/vendor/rcheevos/src/rcheevos/format.c +330 -0
- data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
- data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
- data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
- data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
- data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
- data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
- data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
- data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
- data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
- data/vendor/rcheevos/src/rcheevos/value.c +935 -0
- data/vendor/rcheevos/src/rhash/aes.c +480 -0
- data/vendor/rcheevos/src/rhash/aes.h +49 -0
- data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
- data/vendor/rcheevos/src/rhash/hash.c +1402 -0
- data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
- data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
- data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
- data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
- data/vendor/rcheevos/src/rhash/md5.c +382 -0
- data/vendor/rcheevos/src/rhash/md5.h +91 -0
- data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
- data/vendor/rcheevos/test/libretro.h +205 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
- data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
- data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
- data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
- data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
- data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
- data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
- data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
- data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
- data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
- data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
- data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
- data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
- data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
- data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
- data/vendor/rcheevos/test/rhash/data.c +657 -0
- data/vendor/rcheevos/test/rhash/data.h +32 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
- data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
- data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
- data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
- data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
- data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
- data/vendor/rcheevos/test/test.c +113 -0
- data/vendor/rcheevos/test/test_framework.h +205 -0
- data/vendor/rcheevos/test/test_rc_client.c +10509 -0
- data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
- data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
- data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
- data/vendor/rcheevos/test/test_types.natvis +9 -0
- data/vendor/rcheevos/validator/validator.c +658 -0
- data/vendor/rcheevos/validator/validator.vcxproj +152 -0
- data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
- metadata +274 -11
- data/lib/gemba/input_mappings.rb +0 -214
- data/lib/gemba/player.rb +0 -1525
|
@@ -0,0 +1,2521 @@
|
|
|
1
|
+
#include "rc_internal.h"
|
|
2
|
+
|
|
3
|
+
#include "../test_framework.h"
|
|
4
|
+
#include "mock_memory.h"
|
|
5
|
+
|
|
6
|
+
static void _assert_parse_trigger(rc_trigger_t** trigger, void* buffer, size_t buffer_size, const char* memaddr)
|
|
7
|
+
{
|
|
8
|
+
int size;
|
|
9
|
+
unsigned* overflow;
|
|
10
|
+
|
|
11
|
+
size = rc_trigger_size(memaddr);
|
|
12
|
+
ASSERT_NUM_GREATER(size, 0);
|
|
13
|
+
ASSERT_NUM_LESS_EQUALS(size + 4, buffer_size);
|
|
14
|
+
|
|
15
|
+
overflow = (unsigned*)(((char*)buffer) + size);
|
|
16
|
+
*overflow = 0xCDCDCDCD;
|
|
17
|
+
|
|
18
|
+
*trigger = rc_parse_trigger(buffer, memaddr, NULL, 0);
|
|
19
|
+
ASSERT_PTR_NOT_NULL(*trigger);
|
|
20
|
+
|
|
21
|
+
if (*overflow != 0xCDCDCDCD) {
|
|
22
|
+
ASSERT_FAIL("write past end of buffer");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
#define assert_parse_trigger(trigger, buffer, memaddr) ASSERT_HELPER(_assert_parse_trigger(trigger, buffer, sizeof(buffer), memaddr), "assert_parse_trigger")
|
|
26
|
+
|
|
27
|
+
static void _assert_evaluate_trigger(rc_trigger_t* trigger, memory_t* memory, int expected_result) {
|
|
28
|
+
int result = rc_test_trigger(trigger, peek, memory, NULL);
|
|
29
|
+
ASSERT_NUM_EQUALS(result, expected_result);
|
|
30
|
+
}
|
|
31
|
+
#define assert_evaluate_trigger(trigger, memory, expected_result) ASSERT_HELPER(_assert_evaluate_trigger(trigger, memory, expected_result), "assert_evaluate_trigger")
|
|
32
|
+
|
|
33
|
+
static rc_condition_t* trigger_get_cond(rc_trigger_t* trigger, int group_index, int cond_index) {
|
|
34
|
+
rc_condset_t* condset = trigger->requirement;
|
|
35
|
+
rc_condition_t* cond;
|
|
36
|
+
|
|
37
|
+
if (group_index != 0) {
|
|
38
|
+
--group_index;
|
|
39
|
+
condset = trigger->alternative;
|
|
40
|
+
while (group_index-- != 0) {
|
|
41
|
+
if (condset == NULL)
|
|
42
|
+
break;
|
|
43
|
+
|
|
44
|
+
condset = condset->next;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (condset == NULL)
|
|
49
|
+
return NULL;
|
|
50
|
+
|
|
51
|
+
cond = condset->conditions;
|
|
52
|
+
while (cond_index-- != 0) {
|
|
53
|
+
if (cond == NULL)
|
|
54
|
+
break;
|
|
55
|
+
|
|
56
|
+
cond = cond->next;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return cond;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static void _assert_hit_count(rc_trigger_t* trigger, int group_index, int cond_index, uint32_t expected_hit_count) {
|
|
63
|
+
rc_condition_t* cond = trigger_get_cond(trigger, group_index, cond_index);
|
|
64
|
+
ASSERT_PTR_NOT_NULL(cond);
|
|
65
|
+
|
|
66
|
+
ASSERT_NUM_EQUALS(cond->current_hits, expected_hit_count);
|
|
67
|
+
}
|
|
68
|
+
#define assert_hit_count(trigger, group_index, cond_index, expected_hit_count) ASSERT_HELPER(_assert_hit_count(trigger, group_index, cond_index, expected_hit_count), "assert_hit_count")
|
|
69
|
+
|
|
70
|
+
static int evaluate_trigger(rc_trigger_t* self, memory_t* memory) {
|
|
71
|
+
return rc_evaluate_trigger(self, peek, memory, NULL);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* ======================================================== */
|
|
75
|
+
|
|
76
|
+
static void test_alt_groups() {
|
|
77
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
78
|
+
memory_t memory;
|
|
79
|
+
rc_trigger_t* trigger;
|
|
80
|
+
char buffer[512];
|
|
81
|
+
|
|
82
|
+
memory.ram = ram;
|
|
83
|
+
memory.size = sizeof(ram);
|
|
84
|
+
|
|
85
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=16S0xH0002=52S0xL0004=6");
|
|
86
|
+
|
|
87
|
+
/* core not true, both alts are */
|
|
88
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
89
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
90
|
+
assert_hit_count(trigger, 1, 0, 1);
|
|
91
|
+
assert_hit_count(trigger, 2, 0, 1);
|
|
92
|
+
|
|
93
|
+
/* core and both alts true */
|
|
94
|
+
ram[1] = 16;
|
|
95
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
96
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
97
|
+
assert_hit_count(trigger, 1, 0, 2);
|
|
98
|
+
assert_hit_count(trigger, 2, 0, 2);
|
|
99
|
+
|
|
100
|
+
/* core and first alt true */
|
|
101
|
+
ram[4] = 0;
|
|
102
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
103
|
+
assert_hit_count(trigger, 0, 0, 2);
|
|
104
|
+
assert_hit_count(trigger, 1, 0, 3);
|
|
105
|
+
assert_hit_count(trigger, 2, 0, 2);
|
|
106
|
+
|
|
107
|
+
/* core true, but neither alt */
|
|
108
|
+
ram[2] = 0;
|
|
109
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
110
|
+
assert_hit_count(trigger, 0, 0, 3);
|
|
111
|
+
assert_hit_count(trigger, 1, 0, 3);
|
|
112
|
+
assert_hit_count(trigger, 2, 0, 2);
|
|
113
|
+
|
|
114
|
+
/* core and second alt true */
|
|
115
|
+
ram[4] = 6;
|
|
116
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
117
|
+
assert_hit_count(trigger, 0, 0, 4);
|
|
118
|
+
assert_hit_count(trigger, 1, 0, 3);
|
|
119
|
+
assert_hit_count(trigger, 2, 0, 3);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static void test_empty_core() {
|
|
123
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
124
|
+
memory_t memory;
|
|
125
|
+
rc_trigger_t* trigger;
|
|
126
|
+
char buffer[512];
|
|
127
|
+
|
|
128
|
+
memory.ram = ram;
|
|
129
|
+
memory.size = sizeof(ram);
|
|
130
|
+
|
|
131
|
+
assert_parse_trigger(&trigger, buffer, "S0xH0002=2S0xL0004=4");
|
|
132
|
+
|
|
133
|
+
/* core implicitly true, neither alt true */
|
|
134
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
135
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
136
|
+
assert_hit_count(trigger, 2, 0, 0);
|
|
137
|
+
|
|
138
|
+
/* first alt true */
|
|
139
|
+
ram[2] = 2;
|
|
140
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
141
|
+
assert_hit_count(trigger, 1, 0, 1);
|
|
142
|
+
assert_hit_count(trigger, 2, 0, 0);
|
|
143
|
+
|
|
144
|
+
/* both alts true */
|
|
145
|
+
ram[4] = 4;
|
|
146
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
147
|
+
assert_hit_count(trigger, 1, 0, 2);
|
|
148
|
+
assert_hit_count(trigger, 2, 0, 1);
|
|
149
|
+
|
|
150
|
+
/* second alt true */
|
|
151
|
+
ram[2] = 0;
|
|
152
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
153
|
+
assert_hit_count(trigger, 1, 0, 2);
|
|
154
|
+
assert_hit_count(trigger, 2, 0, 2);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static void test_empty_alt() {
|
|
158
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
159
|
+
memory_t memory;
|
|
160
|
+
rc_trigger_t* trigger;
|
|
161
|
+
char buffer[512];
|
|
162
|
+
|
|
163
|
+
memory.ram = ram;
|
|
164
|
+
memory.size = sizeof(ram);
|
|
165
|
+
|
|
166
|
+
assert_parse_trigger(&trigger, buffer, "0xH0002=2SS0xL0004=4");
|
|
167
|
+
|
|
168
|
+
/* core false, first alt implicitly true */
|
|
169
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
170
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
171
|
+
assert_hit_count(trigger, 2, 0, 0);
|
|
172
|
+
|
|
173
|
+
/* core true */
|
|
174
|
+
ram[2] = 2;
|
|
175
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
176
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
177
|
+
assert_hit_count(trigger, 2, 0, 0);
|
|
178
|
+
|
|
179
|
+
/* core and both alts true */
|
|
180
|
+
ram[4] = 4;
|
|
181
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
182
|
+
assert_hit_count(trigger, 0, 0, 2);
|
|
183
|
+
assert_hit_count(trigger, 2, 0, 1);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
static void test_empty_last_alt() {
|
|
187
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
188
|
+
memory_t memory;
|
|
189
|
+
rc_trigger_t* trigger;
|
|
190
|
+
char buffer[512];
|
|
191
|
+
|
|
192
|
+
memory.ram = ram;
|
|
193
|
+
memory.size = sizeof(ram);
|
|
194
|
+
|
|
195
|
+
assert_parse_trigger(&trigger, buffer, "0xH0002=2S0xL0004=4S");
|
|
196
|
+
|
|
197
|
+
/* core false, second alt implicitly true */
|
|
198
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
199
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
200
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
201
|
+
|
|
202
|
+
/* core true */
|
|
203
|
+
ram[2] = 2;
|
|
204
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
205
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
206
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
207
|
+
|
|
208
|
+
/* core and both alts true */
|
|
209
|
+
ram[4] = 4;
|
|
210
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
211
|
+
assert_hit_count(trigger, 0, 0, 2);
|
|
212
|
+
assert_hit_count(trigger, 1, 0, 1);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
static void test_empty_all_alts() {
|
|
216
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
217
|
+
memory_t memory;
|
|
218
|
+
rc_trigger_t* trigger;
|
|
219
|
+
char buffer[512];
|
|
220
|
+
|
|
221
|
+
memory.ram = ram;
|
|
222
|
+
memory.size = sizeof(ram);
|
|
223
|
+
|
|
224
|
+
assert_parse_trigger(&trigger, buffer, "0xH0002=2SS");
|
|
225
|
+
|
|
226
|
+
/* core false, all alts implicitly true */
|
|
227
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
228
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
229
|
+
|
|
230
|
+
/* core true */
|
|
231
|
+
ram[2] = 2;
|
|
232
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
233
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
static void test_resetif_in_alt_group() {
|
|
237
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
238
|
+
memory_t memory;
|
|
239
|
+
rc_trigger_t* trigger;
|
|
240
|
+
char buffer[1024];
|
|
241
|
+
|
|
242
|
+
memory.ram = ram;
|
|
243
|
+
memory.size = sizeof(ram);
|
|
244
|
+
|
|
245
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18(1)_R:0xH0000=1S0xH0002=52(1)S0xL0004=6(1)_R:0xH0000=2");
|
|
246
|
+
|
|
247
|
+
/* all conditions true, no resets */
|
|
248
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
249
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
250
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
251
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
252
|
+
|
|
253
|
+
/* reset in core group resets everything */
|
|
254
|
+
ram[0] = 1;
|
|
255
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
256
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
257
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
258
|
+
assert_hit_count(trigger, 2, 0, 0U);
|
|
259
|
+
|
|
260
|
+
/* all conditions true, no resets */
|
|
261
|
+
ram[0] = 0;
|
|
262
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
263
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
264
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
265
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
266
|
+
|
|
267
|
+
/* reset in alt group resets everything */
|
|
268
|
+
ram[0] = 2;
|
|
269
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
270
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
271
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
272
|
+
assert_hit_count(trigger, 2, 0, 0U);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
static void test_pauseif_in_alt_group() {
|
|
276
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
277
|
+
memory_t memory;
|
|
278
|
+
rc_trigger_t* trigger;
|
|
279
|
+
char buffer[1024];
|
|
280
|
+
|
|
281
|
+
memory.ram = ram;
|
|
282
|
+
memory.size = sizeof(ram);
|
|
283
|
+
|
|
284
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_P:0xH0000=1S0xH0002=52S0xL0004=6_P:0xH0000=2");
|
|
285
|
+
|
|
286
|
+
/* all conditions true, no resets */
|
|
287
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
288
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
289
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
290
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
291
|
+
|
|
292
|
+
/* pause in core group only pauses core group */
|
|
293
|
+
ram[0] = 1;
|
|
294
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
295
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
296
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
297
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
298
|
+
|
|
299
|
+
/* unpaused */
|
|
300
|
+
ram[0] = 0;
|
|
301
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
302
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
303
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
304
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
305
|
+
|
|
306
|
+
/* pause in alt group only pauses alt group */
|
|
307
|
+
ram[0] = 2;
|
|
308
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
309
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
310
|
+
assert_hit_count(trigger, 1, 0, 4U);
|
|
311
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
static void test_pauseif_resetif_in_alt_group() {
|
|
315
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
316
|
+
memory_t memory;
|
|
317
|
+
rc_trigger_t* trigger;
|
|
318
|
+
char buffer[1024];
|
|
319
|
+
|
|
320
|
+
memory.ram = ram;
|
|
321
|
+
memory.size = sizeof(ram);
|
|
322
|
+
|
|
323
|
+
assert_parse_trigger(&trigger, buffer, "0xH0000=0.1._0xH0003=2SP:0xH0001=18_R:0xH0002=52");
|
|
324
|
+
|
|
325
|
+
/* capture hitcount */
|
|
326
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
327
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
328
|
+
|
|
329
|
+
/* prevent future hit counts */
|
|
330
|
+
ram[0] = 1;
|
|
331
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
332
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
333
|
+
|
|
334
|
+
/* unpause alt group, hit count should be reset */
|
|
335
|
+
ram[1] = 16;
|
|
336
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
337
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
338
|
+
|
|
339
|
+
/* repause alt group, capture hitcount */
|
|
340
|
+
ram[0] = 0;
|
|
341
|
+
ram[1] = 18;
|
|
342
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
343
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
344
|
+
|
|
345
|
+
/* trigger condition. alt group is paused, so should be considered false */
|
|
346
|
+
ram[3] = 2;
|
|
347
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
348
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
349
|
+
|
|
350
|
+
/* trigger condition. alt group is unpaused, so reset will prevent trigger */
|
|
351
|
+
ram[1] = 16;
|
|
352
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
353
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
354
|
+
|
|
355
|
+
/* trigger condition. alt group is unpaused, and not resetting, so allow trigger */
|
|
356
|
+
ram[2] = 30;
|
|
357
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
358
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
static void test_pauseif_hitcount_with_reset() {
|
|
362
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
363
|
+
memory_t memory;
|
|
364
|
+
rc_trigger_t* trigger;
|
|
365
|
+
char buffer[512];
|
|
366
|
+
|
|
367
|
+
memory.ram = ram;
|
|
368
|
+
memory.size = sizeof(ram);
|
|
369
|
+
|
|
370
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_P:0xH0002=52.1._R:0xH0003=1SR:0xH0003=2");
|
|
371
|
+
|
|
372
|
+
/* pauseif triggered, non-pauseif conditions ignored */
|
|
373
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
374
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
375
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
376
|
+
assert_hit_count(trigger, 0, 2, 0);
|
|
377
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
378
|
+
|
|
379
|
+
/* pause condition is no longer true, but hitcount keeps it paused */
|
|
380
|
+
ram[2] = 0;
|
|
381
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
382
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
383
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
384
|
+
assert_hit_count(trigger, 0, 2, 0);
|
|
385
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
386
|
+
|
|
387
|
+
/* resetif in paused group is ignored */
|
|
388
|
+
ram[3] = 1;
|
|
389
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
390
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
391
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
392
|
+
assert_hit_count(trigger, 0, 2, 0);
|
|
393
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
394
|
+
|
|
395
|
+
/* resetif in alternate group is honored, active resetif prevents trigger */
|
|
396
|
+
ram[3] = 2;
|
|
397
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
398
|
+
assert_hit_count(trigger, 0, 0, 0);
|
|
399
|
+
assert_hit_count(trigger, 0, 1, 0);
|
|
400
|
+
assert_hit_count(trigger, 0, 2, 0);
|
|
401
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
402
|
+
|
|
403
|
+
/* resetif no longer active, pause not active, first condition true, trigger activates */
|
|
404
|
+
ram[3] = 3;
|
|
405
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
406
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
407
|
+
assert_hit_count(trigger, 0, 1, 0);
|
|
408
|
+
assert_hit_count(trigger, 0, 2, 0);
|
|
409
|
+
assert_hit_count(trigger, 1, 0, 0);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
static void test_measured() {
|
|
413
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
414
|
+
memory_t memory;
|
|
415
|
+
rc_trigger_t* trigger;
|
|
416
|
+
char buffer[256];
|
|
417
|
+
|
|
418
|
+
memory.ram = ram;
|
|
419
|
+
memory.size = sizeof(ram);
|
|
420
|
+
|
|
421
|
+
/* measured(repeated(3, byte(2) == 52)) */
|
|
422
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(3)");
|
|
423
|
+
ASSERT_NUM_EQUALS(trigger->measured_as_percent, 0);
|
|
424
|
+
|
|
425
|
+
/* condition is true - hit count should be incremented */
|
|
426
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
427
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
428
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
429
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
430
|
+
|
|
431
|
+
/* condition is true - hit count should be incremented */
|
|
432
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
433
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
434
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
435
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
436
|
+
|
|
437
|
+
/* condition is true - hit count should be incremented to reach target */
|
|
438
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
439
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
440
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
441
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
442
|
+
|
|
443
|
+
/* condition is true - target previously met */
|
|
444
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
445
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
446
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
447
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
static void test_measured_as_percent() {
|
|
451
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
452
|
+
memory_t memory;
|
|
453
|
+
rc_trigger_t* trigger;
|
|
454
|
+
char buffer[256];
|
|
455
|
+
|
|
456
|
+
memory.ram = ram;
|
|
457
|
+
memory.size = sizeof(ram);
|
|
458
|
+
|
|
459
|
+
/* measured(repeated(3, byte(2) == 52)) */
|
|
460
|
+
assert_parse_trigger(&trigger, buffer, "G:0xH0002=52(3)");
|
|
461
|
+
ASSERT_NUM_EQUALS(trigger->measured_as_percent, 1);
|
|
462
|
+
|
|
463
|
+
/* condition is true - hit count should be incremented */
|
|
464
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
465
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
466
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
467
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
468
|
+
|
|
469
|
+
/* condition is true - hit count should be incremented */
|
|
470
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
471
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
472
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
473
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
474
|
+
|
|
475
|
+
/* condition is true - hit count should be incremented to reach target */
|
|
476
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
477
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
478
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
479
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
480
|
+
|
|
481
|
+
/* condition is true - target previously met */
|
|
482
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
483
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
484
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
485
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
static void test_measured_comparison() {
|
|
489
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
490
|
+
memory_t memory;
|
|
491
|
+
rc_trigger_t* trigger;
|
|
492
|
+
char buffer[256];
|
|
493
|
+
|
|
494
|
+
memory.ram = ram;
|
|
495
|
+
memory.size = sizeof(ram);
|
|
496
|
+
|
|
497
|
+
/* measured(byte(2) >= 80) */
|
|
498
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002>=80");
|
|
499
|
+
|
|
500
|
+
/* condition is not true */
|
|
501
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
502
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
503
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0x34U);
|
|
504
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
505
|
+
|
|
506
|
+
/* condition is still not true */
|
|
507
|
+
ram[2] = 79;
|
|
508
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
509
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
510
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 79U);
|
|
511
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
512
|
+
|
|
513
|
+
/* condition is true - value matches */
|
|
514
|
+
ram[2] = 80;
|
|
515
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
516
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
517
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 80U);
|
|
518
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
519
|
+
|
|
520
|
+
/* condition is true - value exceeds */
|
|
521
|
+
ram[2] = 255;
|
|
522
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
523
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
524
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
525
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 255U);
|
|
526
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
static void test_measured_addhits() {
|
|
530
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
531
|
+
memory_t memory;
|
|
532
|
+
rc_trigger_t* trigger;
|
|
533
|
+
char buffer[512];
|
|
534
|
+
|
|
535
|
+
memory.ram = ram;
|
|
536
|
+
memory.size = sizeof(ram);
|
|
537
|
+
|
|
538
|
+
/* measured(repeated(5, byte(1) == 10 || byte(2) == 10)) */
|
|
539
|
+
assert_parse_trigger(&trigger, buffer, "C:0xH0001=10_M:0xH0002=10(5)");
|
|
540
|
+
|
|
541
|
+
/* neither is true - hit count should not be captured */
|
|
542
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
543
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
544
|
+
assert_hit_count(trigger, 0, 1, 0U);
|
|
545
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
546
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
547
|
+
|
|
548
|
+
/* second is true - hit count should be incremented by one */
|
|
549
|
+
ram[2] = 10;
|
|
550
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
551
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
552
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
553
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
554
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
555
|
+
|
|
556
|
+
/* both are true - hit count should be incremented by two */
|
|
557
|
+
ram[1] = 10;
|
|
558
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
559
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
560
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
561
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
562
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
563
|
+
|
|
564
|
+
/* only first is true - hit count should be incremented by one */
|
|
565
|
+
ram[2] = 0;
|
|
566
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
567
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
568
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
569
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 4U);
|
|
570
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
571
|
+
|
|
572
|
+
/* neither is true - hit count should not increment */
|
|
573
|
+
ram[1] = 0;
|
|
574
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
575
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
576
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
577
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 4U);
|
|
578
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
579
|
+
|
|
580
|
+
/* first is true - hit count should be incremented by one and trigger */
|
|
581
|
+
ram[1] = 10;
|
|
582
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
583
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
584
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
585
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 5U);
|
|
586
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
static void test_measured_indirect() {
|
|
590
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
591
|
+
memory_t memory;
|
|
592
|
+
rc_trigger_t* trigger;
|
|
593
|
+
char buffer[384];
|
|
594
|
+
|
|
595
|
+
memory.ram = ram;
|
|
596
|
+
memory.size = sizeof(ram);
|
|
597
|
+
|
|
598
|
+
/* measured(repeated(3, byte(byte(0) + 2) == 52)) */
|
|
599
|
+
assert_parse_trigger(&trigger, buffer, "I:0xH0000_M:0xH0002=52(3)");
|
|
600
|
+
|
|
601
|
+
/* condition is true - hit count should be incremented */
|
|
602
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
603
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
604
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
605
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
606
|
+
|
|
607
|
+
/* condition is no longer true - hit count should not be incremented */
|
|
608
|
+
ram[0] = 1;
|
|
609
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
610
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
611
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
612
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
613
|
+
|
|
614
|
+
/* condition is true - hit count should be incremented */
|
|
615
|
+
ram[0] = 0;
|
|
616
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
617
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
618
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
619
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
620
|
+
|
|
621
|
+
/* condition is no longer true - hit count should not be incremented */
|
|
622
|
+
ram[2] = 30;
|
|
623
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
624
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
625
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
626
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
static void test_measured_multiple() {
|
|
630
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
631
|
+
memory_t memory;
|
|
632
|
+
rc_trigger_t* trigger;
|
|
633
|
+
char buffer[512];
|
|
634
|
+
|
|
635
|
+
memory.ram = ram;
|
|
636
|
+
memory.size = sizeof(ram);
|
|
637
|
+
|
|
638
|
+
/* multiple measured conditions are only okay if they all have the same target, in which
|
|
639
|
+
* case, the maximum of all the measured values is returned */
|
|
640
|
+
|
|
641
|
+
/* measured(repeated(3, byte(2) == 52)) || measured(repeated(3, byte(3) == 17)) */
|
|
642
|
+
assert_parse_trigger(&trigger, buffer, "SM:0xH0002=52(3)SM:0xH0003=17(3)");
|
|
643
|
+
|
|
644
|
+
/* first condition is true - hit count should be incremented */
|
|
645
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
646
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
647
|
+
assert_hit_count(trigger, 2, 0, 0U);
|
|
648
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
649
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
650
|
+
|
|
651
|
+
/* second condition is true - second hit count should be incremented - both will be the same */
|
|
652
|
+
ram[2] = 9;
|
|
653
|
+
ram[3] = 17;
|
|
654
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
655
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
656
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
657
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
658
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
659
|
+
|
|
660
|
+
/* second condition still true - second hit count should be incremented and become prominent */
|
|
661
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
662
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
663
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
664
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
665
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
666
|
+
|
|
667
|
+
/* switch back to first condition */
|
|
668
|
+
ram[2] = 52;
|
|
669
|
+
ram[3] = 8;
|
|
670
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
671
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
672
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
673
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
674
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
675
|
+
|
|
676
|
+
/* first hit count will be incremented and target met */
|
|
677
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
678
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
679
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
680
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
681
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
682
|
+
|
|
683
|
+
/* both true, only second will increment as first target is met */
|
|
684
|
+
ram[3] = 17;
|
|
685
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
686
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
687
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
688
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
689
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
690
|
+
|
|
691
|
+
/* both true, both targets met */
|
|
692
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
693
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
694
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
695
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
696
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
static void test_measured_multiple_with_hitcount_in_core() {
|
|
700
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
701
|
+
memory_t memory;
|
|
702
|
+
rc_trigger_t* trigger;
|
|
703
|
+
char buffer[512];
|
|
704
|
+
|
|
705
|
+
memory.ram = ram;
|
|
706
|
+
memory.size = sizeof(ram);
|
|
707
|
+
|
|
708
|
+
/* multiple measured conditions are only okay if they all have the same target, in which
|
|
709
|
+
* case, the maximum of all the measured values is returned */
|
|
710
|
+
|
|
711
|
+
/* repeated(7, byte(1) == 18) && (measured(repeated(3, byte(2) == 52)) || measured(repeated(3, byte(3) == 17))) */
|
|
712
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18(7)SM:0xH0002=52(3)SM:0xH0003=17(3)");
|
|
713
|
+
|
|
714
|
+
/* first condition is true - hit count should be incremented */
|
|
715
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
716
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
717
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
718
|
+
assert_hit_count(trigger, 2, 0, 0U);
|
|
719
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
720
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
721
|
+
|
|
722
|
+
/* second condition is true - second hit count should be incremented - both will be the same */
|
|
723
|
+
/* core hit target is greater than any measured value, but should not be measured */
|
|
724
|
+
ram[2] = 9;
|
|
725
|
+
ram[3] = 17;
|
|
726
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
727
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
728
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
729
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
730
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
731
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
static void test_measured_while_paused() {
|
|
735
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
736
|
+
memory_t memory;
|
|
737
|
+
rc_trigger_t* trigger;
|
|
738
|
+
char buffer[512];
|
|
739
|
+
|
|
740
|
+
memory.ram = ram;
|
|
741
|
+
memory.size = sizeof(ram);
|
|
742
|
+
|
|
743
|
+
/* measured(repeated(3, byte(2) == 52)) && unless(byte(1) == 1) */
|
|
744
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(3)_P:0xH0001=1");
|
|
745
|
+
|
|
746
|
+
/* condition is true - hit count should be incremented */
|
|
747
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
748
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
749
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
750
|
+
|
|
751
|
+
/* condition is true - hit count should be incremented */
|
|
752
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
753
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
754
|
+
|
|
755
|
+
/* paused - hit count should not be incremented */
|
|
756
|
+
ram[1] = 1;
|
|
757
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
758
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
759
|
+
|
|
760
|
+
/* unpaused - hit count should be incremented */
|
|
761
|
+
ram[1] = 2;
|
|
762
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
763
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
static void test_measured_while_paused_multiple() {
|
|
767
|
+
uint8_t ram[] = {0x00, 0x00, 0x34, 0xAB, 0x56};
|
|
768
|
+
memory_t memory;
|
|
769
|
+
rc_trigger_t* trigger;
|
|
770
|
+
char buffer[512];
|
|
771
|
+
|
|
772
|
+
memory.ram = ram;
|
|
773
|
+
memory.size = sizeof(ram);
|
|
774
|
+
|
|
775
|
+
/* (measured(repeated(6, byte(2) == 52)) && unless(bit0(1) == 1)) || (measured(repeated(6, byte(0) == 0)) && unless(bit1(1) == 1)) */
|
|
776
|
+
assert_parse_trigger(&trigger, buffer, "SM:0xH0002=52(6)_P:0xM0001=1SM:0xH0000=0(6)_P:0xN0001=1");
|
|
777
|
+
|
|
778
|
+
/* both alts should be incremented */
|
|
779
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
780
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
781
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
782
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
783
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
784
|
+
|
|
785
|
+
/* first alt paused - second should update */
|
|
786
|
+
ram[1] = 1;
|
|
787
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
788
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
789
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
790
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
791
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
792
|
+
|
|
793
|
+
/* first still paused - second should update again */
|
|
794
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
795
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
796
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
797
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
798
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
799
|
+
|
|
800
|
+
/* both paused - neither should update - expect last measured value to be kept */
|
|
801
|
+
ram[1] = 3;
|
|
802
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
803
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
804
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
805
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
806
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
807
|
+
|
|
808
|
+
/* first unpaused - it will update, measured will use the active value */
|
|
809
|
+
ram[1] = 2;
|
|
810
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
811
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
812
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
813
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
814
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
815
|
+
|
|
816
|
+
/* both paused - neither should update - expect last measured value to be kept */
|
|
817
|
+
ram[1] = 3;
|
|
818
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
819
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
820
|
+
assert_hit_count(trigger, 2, 0, 3U);
|
|
821
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
822
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
823
|
+
|
|
824
|
+
/* both unpaused - both updated, will use higher */
|
|
825
|
+
ram[1] = 0;
|
|
826
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
827
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
828
|
+
assert_hit_count(trigger, 2, 0, 4U);
|
|
829
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 4U);
|
|
830
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 6U);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
static void test_measured_while_paused_reset_alt() {
|
|
834
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
835
|
+
memory_t memory;
|
|
836
|
+
rc_trigger_t* trigger;
|
|
837
|
+
char buffer[512];
|
|
838
|
+
|
|
839
|
+
memory.ram = ram;
|
|
840
|
+
memory.size = sizeof(ram);
|
|
841
|
+
|
|
842
|
+
/* measured(repeated(3, byte(2) == 52)) && unless(byte(1) == 1) && (never(byte(3) == 1)) */
|
|
843
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(3)_P:0xH0001=1SR:0xH0003=1");
|
|
844
|
+
|
|
845
|
+
/* condition is true - hit count should be incremented */
|
|
846
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
847
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
848
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
849
|
+
|
|
850
|
+
/* condition is true - hit count should be incremented */
|
|
851
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
852
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
853
|
+
|
|
854
|
+
/* paused - hit count should not be incremented */
|
|
855
|
+
ram[1] = 1;
|
|
856
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
857
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
858
|
+
|
|
859
|
+
/* reset - hit count should be cleared */
|
|
860
|
+
ram[3] = 1;
|
|
861
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
862
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
863
|
+
|
|
864
|
+
/* unpaused, reset still true, hit count should remain cleared */
|
|
865
|
+
ram[1] = 2;
|
|
866
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
867
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
868
|
+
|
|
869
|
+
/* reset not true - hit count should be incremented */
|
|
870
|
+
ram[3] = 0;
|
|
871
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
872
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
static void test_measured_while_paused_reset_core() {
|
|
876
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
877
|
+
memory_t memory;
|
|
878
|
+
rc_trigger_t* trigger;
|
|
879
|
+
char buffer[512];
|
|
880
|
+
|
|
881
|
+
memory.ram = ram;
|
|
882
|
+
memory.size = sizeof(ram);
|
|
883
|
+
|
|
884
|
+
/* measured(repeated(3, byte(2) == 52)) && unless(byte(1) == 1) && (never(byte(3) == 1)) */
|
|
885
|
+
assert_parse_trigger(&trigger, buffer, "R:0xH0003=1SM:0xH0002=52(3)_P:0xH0001=1");
|
|
886
|
+
|
|
887
|
+
/* condition is true - hit count should be incremented */
|
|
888
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
889
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
890
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
891
|
+
|
|
892
|
+
/* condition is true - hit count should be incremented */
|
|
893
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
894
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
895
|
+
|
|
896
|
+
/* paused - hit count should not be incremented */
|
|
897
|
+
ram[1] = 1;
|
|
898
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
899
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
900
|
+
|
|
901
|
+
/* reset - hit count should be cleared */
|
|
902
|
+
ram[3] = 1;
|
|
903
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
904
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
905
|
+
|
|
906
|
+
/* unpaused, reset still true, hit count should remain cleared */
|
|
907
|
+
ram[1] = 2;
|
|
908
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
909
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
910
|
+
|
|
911
|
+
/* reset not true - hit count should be incremented */
|
|
912
|
+
ram[3] = 0;
|
|
913
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
914
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
static void test_measured_while_paused_reset_non_hitcount() {
|
|
918
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
919
|
+
memory_t memory;
|
|
920
|
+
rc_trigger_t* trigger;
|
|
921
|
+
char buffer[512];
|
|
922
|
+
|
|
923
|
+
memory.ram = ram;
|
|
924
|
+
memory.size = sizeof(ram);
|
|
925
|
+
|
|
926
|
+
/* measured(repeated(3, byte(2) == 52)) && unless(byte(1) == 1) && (never(byte(3) == 1)) */
|
|
927
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=99_P:0xH0001=1SR:0xH0003=1");
|
|
928
|
+
|
|
929
|
+
/* initial value */
|
|
930
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
931
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
932
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 99U);
|
|
933
|
+
|
|
934
|
+
/* paused - capture value and return that*/
|
|
935
|
+
ram[1] = 1;
|
|
936
|
+
ram[2] = 60;
|
|
937
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
938
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
939
|
+
|
|
940
|
+
/* reset - captured value should not be cleared */
|
|
941
|
+
ram[3] = 1;
|
|
942
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
943
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
944
|
+
|
|
945
|
+
/* unpaused, reset still true, value should reflect current */
|
|
946
|
+
ram[1] = 2;
|
|
947
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
948
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 60U);
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
static void test_measured_while_paused_extra_alts() {
|
|
952
|
+
uint8_t ram[] = { 0x00, 0x00, 0x34, 0xAB, 0x56 };
|
|
953
|
+
memory_t memory;
|
|
954
|
+
rc_trigger_t* trigger;
|
|
955
|
+
char buffer[512];
|
|
956
|
+
|
|
957
|
+
memory.ram = ram;
|
|
958
|
+
memory.size = sizeof(ram);
|
|
959
|
+
|
|
960
|
+
/* (measured(byte(2) == 99) && unless(byte(1) == 1)) || (byte(3) == 1) */
|
|
961
|
+
assert_parse_trigger(&trigger, buffer, "SM:0xH0002=99_P:0xH0001=1S0xH0003=1");
|
|
962
|
+
|
|
963
|
+
/* alt1 will capture measured value */
|
|
964
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
965
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
966
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 99U);
|
|
967
|
+
|
|
968
|
+
/* first alt paused - expect last measured value to be kept */
|
|
969
|
+
ram[1] = 1;
|
|
970
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
971
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
972
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 99U);
|
|
973
|
+
|
|
974
|
+
/* measured value changed but alt still paused - expect last measured value to be kept */
|
|
975
|
+
ram[2] = 61;
|
|
976
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
977
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 52U);
|
|
978
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 99U);
|
|
979
|
+
|
|
980
|
+
/* first alt unpaused - it will update, measured will use the active value */
|
|
981
|
+
ram[1] = 0;
|
|
982
|
+
ram[2] = 63;
|
|
983
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
984
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 63U);
|
|
985
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 99U);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
static void test_measured_reset_hitcount() {
|
|
989
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
990
|
+
memory_t memory;
|
|
991
|
+
rc_trigger_t* trigger;
|
|
992
|
+
char buffer[512];
|
|
993
|
+
|
|
994
|
+
memory.ram = ram;
|
|
995
|
+
memory.size = sizeof(ram);
|
|
996
|
+
|
|
997
|
+
/* measured(repeated(3, byte(2) == 52)) && unless(byte(1) == 1) && never(byte(3) == 1) */
|
|
998
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(3)_P:0xH0001=1_R:0xH0003=1");
|
|
999
|
+
|
|
1000
|
+
/* condition is true - hit count should be incremented */
|
|
1001
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1002
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
1003
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1004
|
+
|
|
1005
|
+
/* condition is true - hit count should be incremented */
|
|
1006
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1007
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1008
|
+
|
|
1009
|
+
/* paused - hit count should not be incremented */
|
|
1010
|
+
ram[1] = 1;
|
|
1011
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1012
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1013
|
+
|
|
1014
|
+
/* reset primed, but ignored by pause */
|
|
1015
|
+
ram[3] = 1;
|
|
1016
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1017
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1018
|
+
|
|
1019
|
+
/* unpaused, reset should clear value */
|
|
1020
|
+
ram[1] = 2;
|
|
1021
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1022
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1023
|
+
|
|
1024
|
+
/* no longer reset, hit count should increment */
|
|
1025
|
+
ram[3] = 0;
|
|
1026
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1027
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
1028
|
+
|
|
1029
|
+
/* reset again, hit count should go back to 0 */
|
|
1030
|
+
ram[3] = 1;
|
|
1031
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1032
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
static void test_measured_reset_comparison() {
|
|
1036
|
+
uint8_t ram[] = {0x00, 0x12, 0x02, 0xAB, 0x56};
|
|
1037
|
+
memory_t memory;
|
|
1038
|
+
rc_trigger_t* trigger;
|
|
1039
|
+
char buffer[512];
|
|
1040
|
+
|
|
1041
|
+
memory.ram = ram;
|
|
1042
|
+
memory.size = sizeof(ram);
|
|
1043
|
+
|
|
1044
|
+
/* measured(byte(2) >= 10) && unless(byte(1) == 1) && never(byte(3) == 1) */
|
|
1045
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002>=10_P:0xH0001=1_R:0xH0003=1");
|
|
1046
|
+
|
|
1047
|
+
/* condition is true - measured will come from value */
|
|
1048
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1049
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1050
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 10U);
|
|
1051
|
+
|
|
1052
|
+
/* condition is true - value updated */
|
|
1053
|
+
ram[2] = 3;
|
|
1054
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1055
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1056
|
+
|
|
1057
|
+
/* paused - updated value should be ignored */
|
|
1058
|
+
ram[1] = 1;
|
|
1059
|
+
ram[2] = 4;
|
|
1060
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1061
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1062
|
+
|
|
1063
|
+
/* reset primed, but ignored by pause */
|
|
1064
|
+
ram[3] = 1;
|
|
1065
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1066
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1067
|
+
|
|
1068
|
+
/* unpaused, reset should not affect non-hitcount measurement */
|
|
1069
|
+
ram[1] = 2;
|
|
1070
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1071
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 4U);
|
|
1072
|
+
|
|
1073
|
+
/* no longer reset, value updated */
|
|
1074
|
+
ram[3] = 0;
|
|
1075
|
+
ram[2] = 5;
|
|
1076
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1077
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 5U);
|
|
1078
|
+
|
|
1079
|
+
/* reset again, should not affect non-hitcount measurement */
|
|
1080
|
+
ram[3] = 1;
|
|
1081
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1082
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 5U);
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
static void test_measured_if() {
|
|
1086
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1087
|
+
memory_t memory;
|
|
1088
|
+
rc_trigger_t* trigger;
|
|
1089
|
+
char buffer[512];
|
|
1090
|
+
|
|
1091
|
+
memory.ram = ram;
|
|
1092
|
+
memory.size = sizeof(ram);
|
|
1093
|
+
|
|
1094
|
+
/* measured(repeated(3, byte(2) == 52), when=byte(0) == 1) */
|
|
1095
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(3)_Q:0xH0000=1");
|
|
1096
|
+
|
|
1097
|
+
/* condition is true - hit count should be incremented, but not measured */
|
|
1098
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1099
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1100
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1101
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1102
|
+
|
|
1103
|
+
/* condition is true - hit count should be incremented and measured */
|
|
1104
|
+
ram[0] = 1;
|
|
1105
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1106
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
1107
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1108
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1109
|
+
|
|
1110
|
+
/* condition is true - hit count should be incremented to reach target, but it's not measured */
|
|
1111
|
+
ram[0] = 0;
|
|
1112
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1113
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
1114
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1115
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1116
|
+
|
|
1117
|
+
/* condition is true - target previously met, but now it's measured */
|
|
1118
|
+
ram[0] = 1;
|
|
1119
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
1120
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
1121
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1122
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
static void test_measured_if_comparison() {
|
|
1126
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1127
|
+
memory_t memory;
|
|
1128
|
+
rc_trigger_t* trigger;
|
|
1129
|
+
char buffer[512];
|
|
1130
|
+
|
|
1131
|
+
memory.ram = ram;
|
|
1132
|
+
memory.size = sizeof(ram);
|
|
1133
|
+
|
|
1134
|
+
/* measured(byte(2) >= 80, when=byte(0)==1) */
|
|
1135
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002>=80_Q:0xH0000=1");
|
|
1136
|
+
|
|
1137
|
+
/* condition is not measured */
|
|
1138
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1139
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1140
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1141
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
1142
|
+
|
|
1143
|
+
/* condition not true, but measured */
|
|
1144
|
+
ram[0] = 1;
|
|
1145
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1146
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1147
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0x34U);
|
|
1148
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
1149
|
+
|
|
1150
|
+
/* condition is still not true, but measured */
|
|
1151
|
+
ram[2] = 79;
|
|
1152
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1153
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1154
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 79U);
|
|
1155
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
1156
|
+
|
|
1157
|
+
/* condition is true, but not measured */
|
|
1158
|
+
ram[0] = 0;
|
|
1159
|
+
ram[2] = 80;
|
|
1160
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1161
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1162
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1163
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
1164
|
+
|
|
1165
|
+
/* condition is true and measured */
|
|
1166
|
+
ram[0] = 1;
|
|
1167
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
1168
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
1169
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 80U);
|
|
1170
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 80U);
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
static void test_measured_if_multiple_measured() {
|
|
1174
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1175
|
+
memory_t memory;
|
|
1176
|
+
rc_trigger_t* trigger;
|
|
1177
|
+
char buffer[512];
|
|
1178
|
+
|
|
1179
|
+
memory.ram = ram;
|
|
1180
|
+
memory.size = sizeof(ram);
|
|
1181
|
+
|
|
1182
|
+
/* multiple measured conditions are only okay if they all have the same target, in which
|
|
1183
|
+
* case, the maximum of all the measured values is returned */
|
|
1184
|
+
|
|
1185
|
+
/* measured(repeated(5, byte(2) == 52), when=byte(0)=1) || measured(repeated(5, byte(3) == 17), when=byte(0)=2) */
|
|
1186
|
+
assert_parse_trigger(&trigger, buffer, "SM:0xH0002=52(5)_Q:0xH0000=1SM:0xH0003=17(5)_Q:0xH0000=2");
|
|
1187
|
+
|
|
1188
|
+
/* first condition is true - hit count should be incremented, but not measured */
|
|
1189
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1190
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
1191
|
+
assert_hit_count(trigger, 2, 0, 0U);
|
|
1192
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1193
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1194
|
+
|
|
1195
|
+
/* second condition is true - second hit count should be incremented - both will be the same; still not measured */
|
|
1196
|
+
ram[2] = 9;
|
|
1197
|
+
ram[3] = 17;
|
|
1198
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1199
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
1200
|
+
assert_hit_count(trigger, 2, 0, 1U);
|
|
1201
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1202
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1203
|
+
|
|
1204
|
+
/* second condition still true - second hit count should be incremented and become prominent, but first is measured */
|
|
1205
|
+
ram[0] = 1;
|
|
1206
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1207
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
1208
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1209
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
1210
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1211
|
+
|
|
1212
|
+
/* switch back to first condition */
|
|
1213
|
+
ram[2] = 52;
|
|
1214
|
+
ram[3] = 8;
|
|
1215
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1216
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
1217
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1218
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1219
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1220
|
+
|
|
1221
|
+
/* first hit count will be incremented */
|
|
1222
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1223
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
1224
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1225
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1226
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1227
|
+
|
|
1228
|
+
/* first hit count will be incremented, but neither measured */
|
|
1229
|
+
ram[0] = 0;
|
|
1230
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1231
|
+
assert_hit_count(trigger, 1, 0, 4U);
|
|
1232
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1233
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1234
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1235
|
+
|
|
1236
|
+
/* first will increment to trigger state, but it's not measured - second is */
|
|
1237
|
+
ram[0] = 2;
|
|
1238
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1239
|
+
assert_hit_count(trigger, 1, 0, 5U);
|
|
1240
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1241
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1242
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1243
|
+
|
|
1244
|
+
/* first is measured and will trigger */
|
|
1245
|
+
ram[0] = 1;
|
|
1246
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
1247
|
+
assert_hit_count(trigger, 1, 0, 5U);
|
|
1248
|
+
assert_hit_count(trigger, 2, 0, 2U);
|
|
1249
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 5U);
|
|
1250
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
static void test_measured_if_multiple_measured_if() {
|
|
1254
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1255
|
+
memory_t memory;
|
|
1256
|
+
rc_trigger_t* trigger;
|
|
1257
|
+
char buffer[512];
|
|
1258
|
+
|
|
1259
|
+
memory.ram = ram;
|
|
1260
|
+
memory.size = sizeof(ram);
|
|
1261
|
+
|
|
1262
|
+
/* measured(repeated(5, byte(2) == 52), when=byte(0)=1 && byte(1)==1) */
|
|
1263
|
+
assert_parse_trigger(&trigger, buffer, "M:0xH0002=52(5)_Q:0xH0000=1_Q:0xH0001=1");
|
|
1264
|
+
|
|
1265
|
+
/* first condition is true - hit count should be incremented, but not measured */
|
|
1266
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1267
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1268
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1269
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1270
|
+
|
|
1271
|
+
/* second condition is true - hit count still incremented, but not measured because of third condition */
|
|
1272
|
+
ram[0] = 1;
|
|
1273
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1274
|
+
assert_hit_count(trigger, 0, 0, 2U);
|
|
1275
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1276
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1277
|
+
|
|
1278
|
+
/* third condition is true, measured should be measured */
|
|
1279
|
+
ram[1] = 1;
|
|
1280
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1281
|
+
assert_hit_count(trigger, 0, 0, 3U);
|
|
1282
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1283
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1284
|
+
|
|
1285
|
+
/* second condition no longer true, measured ignored */
|
|
1286
|
+
ram[0] = 2;
|
|
1287
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1288
|
+
assert_hit_count(trigger, 0, 0, 4U);
|
|
1289
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1290
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1291
|
+
|
|
1292
|
+
/* hit target met, but not measured */
|
|
1293
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1294
|
+
assert_hit_count(trigger, 0, 0, 5U);
|
|
1295
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1296
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1297
|
+
|
|
1298
|
+
/* hit target met, but not measured */
|
|
1299
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1300
|
+
assert_hit_count(trigger, 0, 0, 5U);
|
|
1301
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1302
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1303
|
+
|
|
1304
|
+
/* second condition true, measured should be measured, trigger will fire */
|
|
1305
|
+
ram[0] = 1;
|
|
1306
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
1307
|
+
assert_hit_count(trigger, 0, 0, 5U);
|
|
1308
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 5U);
|
|
1309
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 5U);
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
static void test_measured_if_while_paused() {
|
|
1313
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1314
|
+
memory_t memory;
|
|
1315
|
+
rc_trigger_t* trigger;
|
|
1316
|
+
char buffer[512];
|
|
1317
|
+
|
|
1318
|
+
memory.ram = ram;
|
|
1319
|
+
memory.size = sizeof(ram);
|
|
1320
|
+
|
|
1321
|
+
/* measured(repeated(3, byte(2) == 52), when=byte(0)==1) && unless(byte(1) == 1) */
|
|
1322
|
+
/* NOTE: this test also verifies the behavior when the MeasuredIf is first */
|
|
1323
|
+
assert_parse_trigger(&trigger, buffer, "Q:0xH0000=1_M:0xH0002=52(3)_P:0xH0001=1");
|
|
1324
|
+
|
|
1325
|
+
/* condition is true - hit count should be incremented, but not measured */
|
|
1326
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1327
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1328
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1329
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1330
|
+
|
|
1331
|
+
/* paused - hit count should not be incremented */
|
|
1332
|
+
ram[1] = 1;
|
|
1333
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1334
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1335
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1336
|
+
|
|
1337
|
+
/* paused - but measured - measured_value is not updated when paused */
|
|
1338
|
+
ram[0] = 1;
|
|
1339
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1340
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1341
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1342
|
+
|
|
1343
|
+
/* unpaused - hit count should be incremented and measured value captured */
|
|
1344
|
+
ram[1] = 2;
|
|
1345
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1346
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
1347
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1348
|
+
|
|
1349
|
+
/* paused - hit count should not be incremented, and last hit count should be measured */
|
|
1350
|
+
ram[1] = 1;
|
|
1351
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1352
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
1353
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1354
|
+
|
|
1355
|
+
/* paused but not measured - pause will prevent evaluation of MeasuredIf, so measured retained */
|
|
1356
|
+
ram[0] = 1;
|
|
1357
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1358
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
1359
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
static void test_measured_trigger() {
|
|
1363
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
1364
|
+
memory_t memory;
|
|
1365
|
+
rc_trigger_t* trigger;
|
|
1366
|
+
char buffer[512];
|
|
1367
|
+
|
|
1368
|
+
memory.ram = ram;
|
|
1369
|
+
memory.size = sizeof(ram);
|
|
1370
|
+
|
|
1371
|
+
/* never(byte(0) != 0) && trigger_when(measured(repeated(3, byte(2) == 52))) */
|
|
1372
|
+
assert_parse_trigger(&trigger, buffer, "R:0xH0000!=0SM:0xH0002=52(3)ST:0=1");
|
|
1373
|
+
ASSERT_NUM_EQUALS(trigger->measured_as_percent, 0);
|
|
1374
|
+
|
|
1375
|
+
/* condition is true - hit count should be incremented, and trigger shown */
|
|
1376
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1377
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
1378
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
1379
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1380
|
+
|
|
1381
|
+
/* core condition is false - trigger should not be shown and hit count reset */
|
|
1382
|
+
ram[0] = 1;
|
|
1383
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1384
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
1385
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 0U);
|
|
1386
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1387
|
+
|
|
1388
|
+
/* core condition is true again - hit count should be incremented, and trigger shown */
|
|
1389
|
+
ram[0] = 0;
|
|
1390
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1391
|
+
assert_hit_count(trigger, 1, 0, 1U);
|
|
1392
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 1U);
|
|
1393
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1394
|
+
|
|
1395
|
+
/* increment hit count */
|
|
1396
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1397
|
+
assert_hit_count(trigger, 1, 0, 2U);
|
|
1398
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
1399
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1400
|
+
|
|
1401
|
+
/* trigger */
|
|
1402
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1403
|
+
assert_hit_count(trigger, 1, 0, 3U);
|
|
1404
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 3U);
|
|
1405
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 3U);
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
static void test_resetnextif_trigger() {
|
|
1409
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1410
|
+
memory_t memory;
|
|
1411
|
+
rc_trigger_t* trigger;
|
|
1412
|
+
char buffer[512];
|
|
1413
|
+
|
|
1414
|
+
memory.ram = ram;
|
|
1415
|
+
memory.size = sizeof(ram);
|
|
1416
|
+
|
|
1417
|
+
/* ResetNextIf byte(0x0002)=1
|
|
1418
|
+
* byte(0x0001)=1 (1)
|
|
1419
|
+
* Trigger byte(0x0003)=0
|
|
1420
|
+
*/
|
|
1421
|
+
assert_parse_trigger(&trigger, buffer, "Z:0xH0002=1_0xH0001=1.1._T:0xH0003=0");
|
|
1422
|
+
|
|
1423
|
+
/* both conditions false */
|
|
1424
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1425
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1426
|
+
|
|
1427
|
+
/* second condition true */
|
|
1428
|
+
ram[1] = 1;
|
|
1429
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1430
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1431
|
+
|
|
1432
|
+
/* second condition not true */
|
|
1433
|
+
ram[1] = 2;
|
|
1434
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1435
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1436
|
+
|
|
1437
|
+
/* second condition true */
|
|
1438
|
+
ram[1] = 1;
|
|
1439
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1440
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1441
|
+
|
|
1442
|
+
/* first condition true */
|
|
1443
|
+
ram[2] = 1;
|
|
1444
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1445
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1446
|
+
|
|
1447
|
+
/* first condition not true */
|
|
1448
|
+
ram[2] = 2;
|
|
1449
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1450
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1451
|
+
|
|
1452
|
+
/* second condition not true */
|
|
1453
|
+
ram[1] = 2;
|
|
1454
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1455
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1456
|
+
|
|
1457
|
+
/* first condition true */
|
|
1458
|
+
ram[2] = 1;
|
|
1459
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1460
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1461
|
+
|
|
1462
|
+
/* first condition not true */
|
|
1463
|
+
ram[2] = 2;
|
|
1464
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
1465
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
static void test_evaluate_trigger_inactive() {
|
|
1469
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1470
|
+
memory_t memory;
|
|
1471
|
+
rc_trigger_t* trigger;
|
|
1472
|
+
char buffer[512];
|
|
1473
|
+
|
|
1474
|
+
memory.ram = ram;
|
|
1475
|
+
memory.size = sizeof(ram);
|
|
1476
|
+
|
|
1477
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_0xH0002<=52_R:0xL0004=4");
|
|
1478
|
+
trigger->state = RC_TRIGGER_STATE_INACTIVE;
|
|
1479
|
+
|
|
1480
|
+
/* Inactive is a permanent state - trigger is initially true */
|
|
1481
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1482
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1483
|
+
ram[2] = 24;
|
|
1484
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1485
|
+
|
|
1486
|
+
/* Trigger no longer true, still inactive */
|
|
1487
|
+
ram[1] = 1;
|
|
1488
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1489
|
+
|
|
1490
|
+
/* hits should not be tallied when inactive */
|
|
1491
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1492
|
+
assert_hit_count(trigger, 0, 1, 0U);
|
|
1493
|
+
|
|
1494
|
+
/* memrefs should be updated while inactive */
|
|
1495
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.value.memref->value.value, 24U);
|
|
1496
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.value.memref->value.changed, 0);
|
|
1497
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.value.memref->value.prior, 52U);
|
|
1498
|
+
|
|
1499
|
+
/* reset should be ignored while inactive */
|
|
1500
|
+
ram[4] = 4;
|
|
1501
|
+
trigger_get_cond(trigger, 0, 0)->current_hits = 1U;
|
|
1502
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1503
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
static void test_evaluate_trigger_waiting() {
|
|
1507
|
+
uint8_t ram[] = {0x00, 0x12, 0x18, 0xAB, 0x09};
|
|
1508
|
+
memory_t memory;
|
|
1509
|
+
rc_trigger_t* trigger;
|
|
1510
|
+
char buffer[512];
|
|
1511
|
+
|
|
1512
|
+
memory.ram = ram;
|
|
1513
|
+
memory.size = sizeof(ram);
|
|
1514
|
+
|
|
1515
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_0xH0002<=52_R:0xL0004=4");
|
|
1516
|
+
trigger->state = RC_TRIGGER_STATE_WAITING;
|
|
1517
|
+
|
|
1518
|
+
/* trigger is ready to fire, but won't as long as its waiting */
|
|
1519
|
+
/* prevents triggers from uninitialized memory */
|
|
1520
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_WAITING);
|
|
1521
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_WAITING);
|
|
1522
|
+
ram[2] = 16;
|
|
1523
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_WAITING);
|
|
1524
|
+
|
|
1525
|
+
/* waiting trigger should not tally hits */
|
|
1526
|
+
ASSERT_FALSE(trigger->has_hits);
|
|
1527
|
+
|
|
1528
|
+
/* ResetIf makes the trigger state false, so the trigger should become active */
|
|
1529
|
+
ram[4] = 4;
|
|
1530
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1531
|
+
|
|
1532
|
+
/* reset to previous state */
|
|
1533
|
+
trigger->state = RC_TRIGGER_STATE_WAITING;
|
|
1534
|
+
ram[4] = 9;
|
|
1535
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_WAITING);
|
|
1536
|
+
ASSERT_FALSE(trigger->has_hits);
|
|
1537
|
+
|
|
1538
|
+
/* trigger is no longer true, proceed to active state */
|
|
1539
|
+
ram[1] = 5;
|
|
1540
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1541
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1542
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1543
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
static void test_evaluate_trigger_reset() {
|
|
1547
|
+
uint8_t ram[] = {0x00, 0x05, 0x10, 0xAB, 0x09};
|
|
1548
|
+
memory_t memory;
|
|
1549
|
+
rc_trigger_t* trigger;
|
|
1550
|
+
char buffer[512];
|
|
1551
|
+
|
|
1552
|
+
memory.ram = ram;
|
|
1553
|
+
memory.size = sizeof(ram);
|
|
1554
|
+
|
|
1555
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_0xH0002<=52_R:0xL0004=4");
|
|
1556
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1557
|
+
|
|
1558
|
+
/* generate a hit count */
|
|
1559
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1560
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1561
|
+
|
|
1562
|
+
/* ResetIf that resets hits returns RESET, but doesn't change the state */
|
|
1563
|
+
ram[4] = 4;
|
|
1564
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1565
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1566
|
+
ASSERT_FALSE(trigger->has_hits);
|
|
1567
|
+
|
|
1568
|
+
/* ResetIf that doesn't resets hits doesn't return RESET */
|
|
1569
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1570
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1571
|
+
ASSERT_FALSE(trigger->has_hits);
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
static void test_evaluate_trigger_reset_next() {
|
|
1575
|
+
uint8_t ram[] = {0x00, 0x05, 0x10, 0xAB, 0x09};
|
|
1576
|
+
memory_t memory;
|
|
1577
|
+
rc_trigger_t* trigger;
|
|
1578
|
+
char buffer[512];
|
|
1579
|
+
|
|
1580
|
+
memory.ram = ram;
|
|
1581
|
+
memory.size = sizeof(ram);
|
|
1582
|
+
|
|
1583
|
+
assert_parse_trigger(&trigger, buffer, "Z:0xL0004=4_0xH0001=5.2._0xH0003=3");
|
|
1584
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1585
|
+
|
|
1586
|
+
/* generate a hit count */
|
|
1587
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1588
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1589
|
+
|
|
1590
|
+
/* ResetNext that resets hits returns RESET, but doesn't change the state */
|
|
1591
|
+
ram[4] = 4;
|
|
1592
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1593
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1594
|
+
ASSERT_TRUE(trigger->has_hits); /* ResetNext will have a hit */
|
|
1595
|
+
|
|
1596
|
+
/* ResetNext that doesn't resets hits doesn't return RESET */
|
|
1597
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1598
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1599
|
+
ASSERT_TRUE(trigger->has_hits); /* ResetNext will have a hit */
|
|
1600
|
+
|
|
1601
|
+
/* Secondary hit should still be tallied, ResetNext that doesn't reset hits doesn't return RESET */
|
|
1602
|
+
ram[3] = 3;
|
|
1603
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1604
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1605
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1606
|
+
|
|
1607
|
+
/* ResetNext no longer true, tally hit */
|
|
1608
|
+
ram[4] = 5;
|
|
1609
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1610
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1611
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1612
|
+
|
|
1613
|
+
/* ResetNext that resets hits returns RESET, but doesn't reset the secondary hits */
|
|
1614
|
+
ram[4] = 4;
|
|
1615
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1616
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1617
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1618
|
+
|
|
1619
|
+
/* ResetNext no longer true, tally hit */
|
|
1620
|
+
ram[4] = 5;
|
|
1621
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1622
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1623
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1624
|
+
|
|
1625
|
+
/* tally second hit to trigger */
|
|
1626
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
static void test_evaluate_trigger_triggered() {
|
|
1630
|
+
uint8_t ram[] = {0x00, 0x05, 0x10, 0xAB, 0x09};
|
|
1631
|
+
memory_t memory;
|
|
1632
|
+
rc_trigger_t* trigger;
|
|
1633
|
+
char buffer[512];
|
|
1634
|
+
|
|
1635
|
+
memory.ram = ram;
|
|
1636
|
+
memory.size = sizeof(ram);
|
|
1637
|
+
|
|
1638
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_0xH0002<=52_R:0xL0004=4");
|
|
1639
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1640
|
+
|
|
1641
|
+
/* transition to TRIGGERED */
|
|
1642
|
+
ram[1] = 18;
|
|
1643
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1644
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1645
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1646
|
+
|
|
1647
|
+
/* triggered trigger remains triggered, but returns INACTIVE and does not increment hit counts */
|
|
1648
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1649
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_TRIGGERED);
|
|
1650
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1651
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1652
|
+
|
|
1653
|
+
/* triggered trigger remains triggered when no longer true */
|
|
1654
|
+
ram[1] = 5;
|
|
1655
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1656
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_TRIGGERED);
|
|
1657
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1658
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
1659
|
+
|
|
1660
|
+
/* triggered trigger does not update deltas */
|
|
1661
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.value.memref->value.value, 18U);
|
|
1662
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.value.memref->value.changed, 1U);
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
static void test_evaluate_trigger_paused() {
|
|
1666
|
+
uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
|
|
1667
|
+
memory_t memory;
|
|
1668
|
+
rc_trigger_t* trigger;
|
|
1669
|
+
char buffer[512];
|
|
1670
|
+
|
|
1671
|
+
memory.ram = ram;
|
|
1672
|
+
memory.size = sizeof(ram);
|
|
1673
|
+
|
|
1674
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=18_0xH0003=171_P:0xH0002=1SR:0xH0004=4");
|
|
1675
|
+
|
|
1676
|
+
/* INACTIVE is a permanent state - trigger is initially true */
|
|
1677
|
+
trigger->state = RC_TRIGGER_STATE_INACTIVE;
|
|
1678
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1679
|
+
|
|
1680
|
+
/* PauseIf is ignored when INACTIVE */
|
|
1681
|
+
ram[2] = 1;
|
|
1682
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1683
|
+
|
|
1684
|
+
/* unpause, switch to WAITING, ready to trigger, so will stay WAITING */
|
|
1685
|
+
ram[2] = 2;
|
|
1686
|
+
trigger->state = RC_TRIGGER_STATE_WAITING;
|
|
1687
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_WAITING);
|
|
1688
|
+
|
|
1689
|
+
/* PauseIf makes the evaluation false, so will transition to ACTIVE, but PAUSED */
|
|
1690
|
+
ram[2] = 1;
|
|
1691
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PAUSED);
|
|
1692
|
+
ASSERT_TRUE(trigger->has_hits); /* the PauseIf has a hit */
|
|
1693
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1694
|
+
|
|
1695
|
+
/* hitcounts will update when unpaused; adjust memory so trigger is no longer true */
|
|
1696
|
+
ram[2] = 2;
|
|
1697
|
+
ram[3] = 99;
|
|
1698
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1699
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1700
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1701
|
+
|
|
1702
|
+
/* hitcounts should remain while paused */
|
|
1703
|
+
ram[2] = 1;
|
|
1704
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PAUSED);
|
|
1705
|
+
ASSERT_TRUE(trigger->has_hits);
|
|
1706
|
+
assert_hit_count(trigger, 0, 0, 1U);
|
|
1707
|
+
|
|
1708
|
+
/* ResetIf while paused should notify, but not change state */
|
|
1709
|
+
ram[4] = 4;
|
|
1710
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1711
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PAUSED);
|
|
1712
|
+
ASSERT_FALSE(trigger->has_hits);
|
|
1713
|
+
assert_hit_count(trigger, 0, 0, 0U);
|
|
1714
|
+
|
|
1715
|
+
/* ResetIf without hitcounts should return current state */
|
|
1716
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PAUSED);
|
|
1717
|
+
|
|
1718
|
+
/* trigger while paused is ignored */
|
|
1719
|
+
ram[4] = 0;
|
|
1720
|
+
ram[3] = 171;
|
|
1721
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PAUSED);
|
|
1722
|
+
|
|
1723
|
+
/* trigger should file when unpaused */
|
|
1724
|
+
ram[2] = 2;
|
|
1725
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1726
|
+
|
|
1727
|
+
/* triggered trigger ignore pause */
|
|
1728
|
+
ram[2] = 1;
|
|
1729
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1730
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_TRIGGERED);
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
static void test_evaluate_trigger_primed() {
|
|
1734
|
+
uint8_t ram[] = {0x00, 0x01, 0x00, 0x01, 0x00};
|
|
1735
|
+
memory_t memory;
|
|
1736
|
+
rc_trigger_t* trigger;
|
|
1737
|
+
char buffer[640];
|
|
1738
|
+
|
|
1739
|
+
memory.ram = ram;
|
|
1740
|
+
memory.size = sizeof(ram);
|
|
1741
|
+
|
|
1742
|
+
assert_parse_trigger(&trigger, buffer, "0xH0000=1_T:0xH0001=1_0xH0002=1_T:0xH0003=1_0xH0004=1");
|
|
1743
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1744
|
+
|
|
1745
|
+
/* T (trigger) conditions are true, but nothing else */
|
|
1746
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1747
|
+
|
|
1748
|
+
/* one non-trigger condition is still false */
|
|
1749
|
+
ram[0] = ram[2] = 1;
|
|
1750
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1751
|
+
|
|
1752
|
+
/* all non-trigger conditions are true, one trigger condition is not true */
|
|
1753
|
+
ram[1] = 0; ram[4] = 1;
|
|
1754
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1755
|
+
|
|
1756
|
+
/* non-trigger condition is false again */
|
|
1757
|
+
ram[0] = 0;
|
|
1758
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1759
|
+
|
|
1760
|
+
/* all conditions are true */
|
|
1761
|
+
ram[0] = ram[1] = 1;
|
|
1762
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1763
|
+
|
|
1764
|
+
/* one non-trigger condition is false */
|
|
1765
|
+
ram[3] = 0;
|
|
1766
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1767
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1768
|
+
|
|
1769
|
+
/* all conditions are true */
|
|
1770
|
+
ram[3] = 1;
|
|
1771
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1774
|
+
static void test_evaluate_trigger_primed_in_alts() {
|
|
1775
|
+
uint8_t ram[] = {0x01, 0x00, 0x00, 0x00, 0x00};
|
|
1776
|
+
memory_t memory;
|
|
1777
|
+
rc_trigger_t* trigger;
|
|
1778
|
+
char buffer[1024];
|
|
1779
|
+
|
|
1780
|
+
memory.ram = ram;
|
|
1781
|
+
memory.size = sizeof(ram);
|
|
1782
|
+
|
|
1783
|
+
assert_parse_trigger(&trigger, buffer, "0xH0000=1ST:0xH0001=1_0xH0002=1ST:0xH0003=1_0xH0004=1");
|
|
1784
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1785
|
+
|
|
1786
|
+
/* core is true, but neither alt is primed */
|
|
1787
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1788
|
+
|
|
1789
|
+
/* both alts primed */
|
|
1790
|
+
ram[2] = ram[4] = 1;
|
|
1791
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1792
|
+
|
|
1793
|
+
/* only second alt is primed */
|
|
1794
|
+
ram[4] = 0;
|
|
1795
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1796
|
+
|
|
1797
|
+
/* neither alt is primed */
|
|
1798
|
+
ram[2] = 0;
|
|
1799
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1800
|
+
|
|
1801
|
+
/* both alts primed */
|
|
1802
|
+
ram[2] = ram[4] = 1;
|
|
1803
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1804
|
+
|
|
1805
|
+
/* alt 2 is true */
|
|
1806
|
+
ram[3] = 1;
|
|
1807
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
static void test_evaluate_trigger_primed_one_alt() {
|
|
1811
|
+
uint8_t ram[] = {0x00, 0x00, 0x00, 0x00, 0x00};
|
|
1812
|
+
memory_t memory;
|
|
1813
|
+
rc_trigger_t* trigger;
|
|
1814
|
+
char buffer[512];
|
|
1815
|
+
|
|
1816
|
+
memory.ram = ram;
|
|
1817
|
+
memory.size = sizeof(ram);
|
|
1818
|
+
|
|
1819
|
+
assert_parse_trigger(&trigger, buffer, "0xH0000=1ST:0xH0001=1S0xH0002=1");
|
|
1820
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1821
|
+
|
|
1822
|
+
/* core must be true for trigger to be primed */
|
|
1823
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1824
|
+
|
|
1825
|
+
/* second alt is true, but core is not */
|
|
1826
|
+
ram[2] = 1;
|
|
1827
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1828
|
+
|
|
1829
|
+
/* first alt is true, but core is not */
|
|
1830
|
+
ram[2] = 0; ram[1] = 1;
|
|
1831
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1832
|
+
|
|
1833
|
+
/* only core is true, first alt is marked as Trigger, eligible to fire */
|
|
1834
|
+
ram[1] = 0; ram[0] = 1;
|
|
1835
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1836
|
+
|
|
1837
|
+
/* alt is true */
|
|
1838
|
+
ram[1] = 1;
|
|
1839
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_TRIGGERED);
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
static void test_evaluate_trigger_disabled() {
|
|
1843
|
+
uint8_t ram[] = {0x00, 0x00, 0x00, 0x00, 0x00};
|
|
1844
|
+
memory_t memory;
|
|
1845
|
+
rc_trigger_t* trigger;
|
|
1846
|
+
char buffer[512];
|
|
1847
|
+
|
|
1848
|
+
memory.ram = ram;
|
|
1849
|
+
memory.size = sizeof(ram);
|
|
1850
|
+
|
|
1851
|
+
assert_parse_trigger(&trigger, buffer, "0xH0000=1ST:0xH0001=1S0xH0002=1");
|
|
1852
|
+
trigger->state = RC_TRIGGER_STATE_DISABLED;
|
|
1853
|
+
|
|
1854
|
+
/* state stays DISABLED, but evaluate returns INACTIVE */
|
|
1855
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_INACTIVE);
|
|
1856
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_DISABLED);
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
static void test_evaluate_trigger_chained_resetnextif() {
|
|
1860
|
+
uint8_t ram[] = {0x00, 0x00, 0x00, 0x00, 0x00};
|
|
1861
|
+
memory_t memory;
|
|
1862
|
+
rc_trigger_t* trigger;
|
|
1863
|
+
char buffer[640];
|
|
1864
|
+
|
|
1865
|
+
memory.ram = ram;
|
|
1866
|
+
memory.size = sizeof(ram);
|
|
1867
|
+
|
|
1868
|
+
/* once(byte(4)==1 && never(repeated(2, byte(3)==1 && never(byte(1)==1 || byte(2)==1))) && trigger_when(byte(0)==1) */
|
|
1869
|
+
assert_parse_trigger(&trigger, buffer, "O:0xH0001=1_Z:0xH0002=1_Z:0xH0003=1.2._0xH0004=1.1._T:0xH0000=1");
|
|
1870
|
+
trigger->state = RC_TRIGGER_STATE_ACTIVE;
|
|
1871
|
+
|
|
1872
|
+
/* nothing is true */
|
|
1873
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_ACTIVE);
|
|
1874
|
+
assert_hit_count(trigger, 0, 0, 0); /* OrNext 0x0001 == 1 */
|
|
1875
|
+
assert_hit_count(trigger, 0, 1, 0); /* ResetNextIf 0x0002 == 1 */
|
|
1876
|
+
assert_hit_count(trigger, 0, 2, 0); /* ResetNextIf 0x0003 == 1 (2) */
|
|
1877
|
+
assert_hit_count(trigger, 0, 3, 0); /* 0x0004 == 1 (1) */
|
|
1878
|
+
assert_hit_count(trigger, 0, 4, 0); /* Trigger 0x0000 == 1 */
|
|
1879
|
+
|
|
1880
|
+
/* non-trigger condition is true */
|
|
1881
|
+
ram[4] = 1;
|
|
1882
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1883
|
+
assert_hit_count(trigger, 0, 3, 1);
|
|
1884
|
+
|
|
1885
|
+
/* second ResetNextIf is true */
|
|
1886
|
+
ram[3] = 1;
|
|
1887
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1888
|
+
assert_hit_count(trigger, 0, 2, 1);
|
|
1889
|
+
assert_hit_count(trigger, 0, 3, 1);
|
|
1890
|
+
|
|
1891
|
+
/* OrNext resets second ResetNextIf */
|
|
1892
|
+
ram[1] = 1;
|
|
1893
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET); /* result is RESET */
|
|
1894
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED); /* state is PRIMED */
|
|
1895
|
+
assert_hit_count(trigger, 0, 0, 1); /* OrNext tallies a hit of its own */
|
|
1896
|
+
assert_hit_count(trigger, 0, 1, 1); /* ResetNextIf gets a hit from the OrNext */
|
|
1897
|
+
assert_hit_count(trigger, 0, 2, 0); /* hit is reset by the ResetNextIf */
|
|
1898
|
+
assert_hit_count(trigger, 0, 3, 1); /* hit is not affected by the reset ResetNextIf */
|
|
1899
|
+
|
|
1900
|
+
/* OrNext no longer true */
|
|
1901
|
+
ram[1] = 0;
|
|
1902
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_PRIMED);
|
|
1903
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_PRIMED);
|
|
1904
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
1905
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
1906
|
+
assert_hit_count(trigger, 0, 2, 1);
|
|
1907
|
+
assert_hit_count(trigger, 0, 3, 1);
|
|
1908
|
+
|
|
1909
|
+
/* second ResetNextIf fires */
|
|
1910
|
+
ASSERT_NUM_EQUALS(evaluate_trigger(trigger, &memory), RC_TRIGGER_STATE_RESET);
|
|
1911
|
+
ASSERT_NUM_EQUALS(trigger->state, RC_TRIGGER_STATE_ACTIVE);
|
|
1912
|
+
assert_hit_count(trigger, 0, 0, 1);
|
|
1913
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
1914
|
+
assert_hit_count(trigger, 0, 2, 2);
|
|
1915
|
+
assert_hit_count(trigger, 0, 3, 0);
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
static void test_prev_prior_share_memref() {
|
|
1919
|
+
rc_trigger_t* trigger;
|
|
1920
|
+
rc_memrefs_t* memrefs;
|
|
1921
|
+
char buffer[512];
|
|
1922
|
+
|
|
1923
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001=d0xH0001_0xH0001!=p0xH0001");
|
|
1924
|
+
|
|
1925
|
+
memrefs = rc_trigger_get_memrefs(trigger);
|
|
1926
|
+
ASSERT_PTR_NOT_NULL(memrefs);
|
|
1927
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.count, 1);
|
|
1928
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].address, 1U);
|
|
1929
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].value.size, RC_MEMSIZE_8_BITS);
|
|
1930
|
+
|
|
1931
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.type, RC_OPERAND_ADDRESS);
|
|
1932
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand2.type, RC_OPERAND_DELTA);
|
|
1933
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.type, RC_OPERAND_ADDRESS);
|
|
1934
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand2.type, RC_OPERAND_PRIOR);
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
static void test_bit_lookups_share_memref() {
|
|
1938
|
+
rc_trigger_t* trigger;
|
|
1939
|
+
rc_memrefs_t* memrefs;
|
|
1940
|
+
char buffer[512];
|
|
1941
|
+
|
|
1942
|
+
assert_parse_trigger(&trigger, buffer, "0xM0001=1_0xN0x0001=0_0xO0x0001=1");
|
|
1943
|
+
|
|
1944
|
+
memrefs = rc_trigger_get_memrefs(trigger);
|
|
1945
|
+
ASSERT_PTR_NOT_NULL(memrefs);
|
|
1946
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.count, 1);
|
|
1947
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].address, 1U);
|
|
1948
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].value.size, RC_MEMSIZE_8_BITS);
|
|
1949
|
+
|
|
1950
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.size, RC_MEMSIZE_BIT_0);
|
|
1951
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.size, RC_MEMSIZE_BIT_1);
|
|
1952
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 2)->operand1.size, RC_MEMSIZE_BIT_2);
|
|
1953
|
+
}
|
|
1954
|
+
|
|
1955
|
+
static void test_bitcount_shares_memref() {
|
|
1956
|
+
rc_trigger_t* trigger;
|
|
1957
|
+
rc_memrefs_t* memrefs;
|
|
1958
|
+
char buffer[512];
|
|
1959
|
+
|
|
1960
|
+
assert_parse_trigger(&trigger, buffer, "0xH0001>5_0xK0001!=3");
|
|
1961
|
+
|
|
1962
|
+
memrefs = rc_trigger_get_memrefs(trigger);
|
|
1963
|
+
ASSERT_PTR_NOT_NULL(memrefs);
|
|
1964
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.count, 1);
|
|
1965
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].address, 1U);
|
|
1966
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].value.size, RC_MEMSIZE_8_BITS);
|
|
1967
|
+
|
|
1968
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.type, RC_OPERAND_ADDRESS);
|
|
1969
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 0)->operand1.size, RC_MEMSIZE_8_BITS);
|
|
1970
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.type, RC_OPERAND_ADDRESS);
|
|
1971
|
+
ASSERT_NUM_EQUALS(trigger_get_cond(trigger, 0, 1)->operand1.size, RC_MEMSIZE_BITCOUNT);
|
|
1972
|
+
}
|
|
1973
|
+
|
|
1974
|
+
static void test_large_memref_not_shared() {
|
|
1975
|
+
rc_trigger_t* trigger;
|
|
1976
|
+
rc_memrefs_t* memrefs;
|
|
1977
|
+
char buffer[512];
|
|
1978
|
+
|
|
1979
|
+
assert_parse_trigger(&trigger, buffer, "0xH1234=1_0xX1234>d0xX1234");
|
|
1980
|
+
|
|
1981
|
+
memrefs = rc_trigger_get_memrefs(trigger);
|
|
1982
|
+
ASSERT_PTR_NOT_NULL(memrefs);
|
|
1983
|
+
|
|
1984
|
+
/* this could be shared, but isn't currently */
|
|
1985
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.count, 2);
|
|
1986
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].address, 0x1234U);
|
|
1987
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[0].value.size, RC_MEMSIZE_8_BITS);
|
|
1988
|
+
|
|
1989
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[1].address, 0x1234U);
|
|
1990
|
+
ASSERT_NUM_EQUALS(memrefs->memrefs.items[1].value.size, RC_MEMSIZE_32_BITS);
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
static void test_remember_recall() {
|
|
1994
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
1995
|
+
memory_t memory;
|
|
1996
|
+
rc_trigger_t* trigger;
|
|
1997
|
+
char buffer[256];
|
|
1998
|
+
|
|
1999
|
+
memory.ram = ram;
|
|
2000
|
+
memory.size = sizeof(ram);
|
|
2001
|
+
|
|
2002
|
+
assert_parse_trigger(&trigger, buffer, "K:1_{recall}=1(3)");
|
|
2003
|
+
|
|
2004
|
+
/* condition is true - hit count should be incremented */
|
|
2005
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2006
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
2007
|
+
|
|
2008
|
+
/* condition is true - hit count should be incremented */
|
|
2009
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2010
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
2011
|
+
|
|
2012
|
+
/* condition is true - hit count should be incremented to reach target */
|
|
2013
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2014
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2015
|
+
|
|
2016
|
+
/* condition is true - target previously met */
|
|
2017
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2018
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
static void test_remember_recall_separate_accumulator_per_group() {
|
|
2022
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2023
|
+
memory_t memory;
|
|
2024
|
+
rc_trigger_t* trigger;
|
|
2025
|
+
char buffer[640];
|
|
2026
|
+
|
|
2027
|
+
memory.ram = ram;
|
|
2028
|
+
memory.size = sizeof(ram);
|
|
2029
|
+
|
|
2030
|
+
assert_parse_trigger(&trigger, buffer, "K:1_{recall}=1.3.S{recall}=1.3.SK:1_K:{recall}*2_{recall}=2.5.");
|
|
2031
|
+
|
|
2032
|
+
/* core group condition is true - hit count should be incremented */
|
|
2033
|
+
/* alt1 group condition is false since it's a different recall accumulator */
|
|
2034
|
+
/* alt2 group condition is true - hit count should be incremented */
|
|
2035
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2036
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
2037
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
2038
|
+
assert_hit_count(trigger, 2, 2, 1U);
|
|
2039
|
+
|
|
2040
|
+
/* core group condition is true - hit count should be incremented */
|
|
2041
|
+
/* alt group condition is false since it's a different recall accumulator */
|
|
2042
|
+
/* alt2 group condition is true - hit count should be incremented */
|
|
2043
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2044
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
2045
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
2046
|
+
assert_hit_count(trigger, 2, 2, 2U);
|
|
2047
|
+
|
|
2048
|
+
/* core group condition is true - hit count should be incremented to reach target */
|
|
2049
|
+
/* alt group condition is false since it's a different recall accumulator */
|
|
2050
|
+
/* alt2 group condition is true - hit count should be incremented */
|
|
2051
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2052
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2053
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
2054
|
+
assert_hit_count(trigger, 2, 2, 3U);
|
|
2055
|
+
|
|
2056
|
+
/* core group condition is true - target previously met */
|
|
2057
|
+
/* alt group condition is false since it's a different recall accumulator */
|
|
2058
|
+
/* alt2 group condition is true - hit count should be incremented */
|
|
2059
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2060
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2061
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
2062
|
+
assert_hit_count(trigger, 2, 2, 4U);
|
|
2063
|
+
|
|
2064
|
+
/* core group condition is true - target previously met */
|
|
2065
|
+
/* alt group condition is false since it's a different recall accumulator */
|
|
2066
|
+
/* alt2 group condition is true - hit count incremented to reach target */
|
|
2067
|
+
/* core + alt2 now satisfied, trigger is true*/
|
|
2068
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2069
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2070
|
+
assert_hit_count(trigger, 1, 0, 0U);
|
|
2071
|
+
assert_hit_count(trigger, 2, 2, 5U);
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
static void test_remember_recall_separate_accumulator_per_group_complex()
|
|
2075
|
+
{
|
|
2076
|
+
uint8_t ram[128];
|
|
2077
|
+
memory_t memory;
|
|
2078
|
+
rc_trigger_t* trigger;
|
|
2079
|
+
char buffer[1280];
|
|
2080
|
+
|
|
2081
|
+
memory.ram = ram;
|
|
2082
|
+
memory.size = sizeof(ram);
|
|
2083
|
+
memset(ram, 0, sizeof(ram));
|
|
2084
|
+
|
|
2085
|
+
assert_parse_trigger(&trigger, buffer, "0=0SK:0x 0002&1023_K:{recall}*2_K:{recall}+4_{recall}=100SK:0x 0004&1023_K:{recall}*2_K:{recall}+4_{recall}=100");
|
|
2086
|
+
|
|
2087
|
+
/* $2=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2088
|
+
/* $4=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2089
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2090
|
+
|
|
2091
|
+
/* $2=0030 & 03FF = 0030 * 2 = 0060 + 4 = 0064 ?= 100 = true */
|
|
2092
|
+
/* $4=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2093
|
+
ram[2] = 0x30;
|
|
2094
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2095
|
+
|
|
2096
|
+
/* $2=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2097
|
+
/* $4=0030 & 03FF = 0030 * 2 = 0060 + 4 = 0064 ?= 100 = true */
|
|
2098
|
+
ram[2] = 0x00;
|
|
2099
|
+
ram[4] = 0x30;
|
|
2100
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2101
|
+
|
|
2102
|
+
/* $2=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2103
|
+
/* $4=0000 & 03FF = 0000 * 2 = 0000 + 4 = 0004 ?= 100 = false */
|
|
2104
|
+
ram[4] = 0x00;
|
|
2105
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
static void test_remember_recall_use_same_value_multiple() {
|
|
2109
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2110
|
+
memory_t memory;
|
|
2111
|
+
rc_trigger_t* trigger;
|
|
2112
|
+
char buffer[640];
|
|
2113
|
+
|
|
2114
|
+
memory.ram = ram;
|
|
2115
|
+
memory.size = sizeof(ram);
|
|
2116
|
+
|
|
2117
|
+
ram[0] = 1;
|
|
2118
|
+
assert_parse_trigger(&trigger, buffer, "K:5_A:0xH00_C:{recall}=6_B:0xH00_C:{recall}=4_M:0=1.4.");
|
|
2119
|
+
|
|
2120
|
+
/* because the recall accumulator can be re-used, both add hits are true and increment hits */
|
|
2121
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2122
|
+
assert_hit_count(trigger, 0, 2, 1U);
|
|
2123
|
+
assert_hit_count(trigger, 0, 4, 1U);
|
|
2124
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 2U);
|
|
2125
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 4U);
|
|
2126
|
+
|
|
2127
|
+
/* because the recall accumulator can be re-used, both add hits are true and increment hits to reach target*/
|
|
2128
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2129
|
+
assert_hit_count(trigger, 0, 2, 2U);
|
|
2130
|
+
assert_hit_count(trigger, 0, 4, 2U);
|
|
2131
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 4U);
|
|
2132
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 4U);
|
|
2133
|
+
|
|
2134
|
+
/* condition is true - previously met */
|
|
2135
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2136
|
+
assert_hit_count(trigger, 0, 2, 3U);
|
|
2137
|
+
assert_hit_count(trigger, 0, 4, 3U);
|
|
2138
|
+
ASSERT_NUM_EQUALS(trigger->measured_value, 6U);
|
|
2139
|
+
ASSERT_NUM_EQUALS(trigger->measured_target, 4U);
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
static void test_remember_recall_in_pause_and_main() {
|
|
2143
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2144
|
+
memory_t memory;
|
|
2145
|
+
rc_trigger_t* trigger;
|
|
2146
|
+
char buffer[640];
|
|
2147
|
+
|
|
2148
|
+
memory.ram = ram;
|
|
2149
|
+
memory.size = sizeof(ram);
|
|
2150
|
+
|
|
2151
|
+
assert_parse_trigger(&trigger, buffer, "K:0xH00_{recall}<3.4._K:0xH00*2_{recall}>0xH01_K:0xH00*2_P:{recall}=2");
|
|
2152
|
+
|
|
2153
|
+
/* pause checks 0*2=2, not paused. Condition 2 gets hit since recalled value < 3 */
|
|
2154
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2155
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
2156
|
+
|
|
2157
|
+
ram[0] = 1;
|
|
2158
|
+
/* pause checks 1*2 = 2, pause active. condition 2 does not get new hit */
|
|
2159
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2160
|
+
assert_hit_count(trigger, 0, 1, 1U);
|
|
2161
|
+
|
|
2162
|
+
ram[0] = 2;
|
|
2163
|
+
/* pause checks 2*2 = 2, pause inactive. condition 2 dgets hit because < 3 */
|
|
2164
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2165
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
2166
|
+
|
|
2167
|
+
ram[0] = 3;
|
|
2168
|
+
/* pause checks 2*2 = 2, pause inactive. condition 2 gets no because = 3 */
|
|
2169
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2170
|
+
assert_hit_count(trigger, 0, 1, 2U);
|
|
2171
|
+
|
|
2172
|
+
ram[0] = 0;
|
|
2173
|
+
/* pause checks 0*2=2, not paused. Condition 2 gets hit since recalled value < 3 */
|
|
2174
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2175
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2176
|
+
|
|
2177
|
+
ram[0] = 1;
|
|
2178
|
+
/* pause checks 1*2 = 2, pause active. condition 2 does not get new hit */
|
|
2179
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2180
|
+
assert_hit_count(trigger, 0, 1, 3U);
|
|
2181
|
+
|
|
2182
|
+
ram[0] = 2;
|
|
2183
|
+
/* pause checks 2*2 = 2, pause inactive. condition 2 dgets hit because < 3, not true because condition 4 untrue */
|
|
2184
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2185
|
+
assert_hit_count(trigger, 0, 1, 4U);
|
|
2186
|
+
|
|
2187
|
+
ram[0] = 10;
|
|
2188
|
+
/* condition is true - hits on condition 2 previously met, no active pause. */
|
|
2189
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2190
|
+
assert_hit_count(trigger, 0, 1, 4U);
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
static void test_remember_recall_in_pause_with_chain()
|
|
2194
|
+
{
|
|
2195
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2196
|
+
memory_t memory;
|
|
2197
|
+
rc_trigger_t* trigger;
|
|
2198
|
+
rc_condition_t* condition;
|
|
2199
|
+
char buffer[640];
|
|
2200
|
+
|
|
2201
|
+
memory.ram = ram;
|
|
2202
|
+
memory.size = sizeof(ram);
|
|
2203
|
+
|
|
2204
|
+
assert_parse_trigger(&trigger, buffer, "I:{recall}_I:0xH02_0xH03=10_K:0xH00_P:0=1");
|
|
2205
|
+
|
|
2206
|
+
/* ensure recall memrefs point at the remember for the pause chain */
|
|
2207
|
+
condition = trigger->requirement->conditions;
|
|
2208
|
+
ASSERT_NUM_EQUALS(condition->operand1.type, RC_OPERAND_RECALL);
|
|
2209
|
+
ASSERT_PTR_NOT_NULL(condition->operand1.value.memref);
|
|
2210
|
+
|
|
2211
|
+
condition = condition->next;
|
|
2212
|
+
ASSERT_NUM_EQUALS(condition->operand1.value.memref->value.memref_type, RC_MEMREF_TYPE_MODIFIED_MEMREF);
|
|
2213
|
+
ASSERT_NUM_EQUALS(((rc_modified_memref_t*)condition->operand1.value.memref)->parent.type, RC_OPERAND_RECALL);
|
|
2214
|
+
ASSERT_PTR_NOT_NULL(((rc_modified_memref_t*)condition->operand1.value.memref)->parent.value.memref);
|
|
2215
|
+
|
|
2216
|
+
/* byte(0)=0, remember. byte(0+2)=0x34, byte(0x34+3)=n/a */
|
|
2217
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2218
|
+
|
|
2219
|
+
ram[2] = 1;
|
|
2220
|
+
/* byte(0)=0, remember. byte(0+2)=1, byte(1+3)=0x56 */
|
|
2221
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2222
|
+
|
|
2223
|
+
ram[4] = 10;
|
|
2224
|
+
/* byte(0)=0, remember. byte(0+2)=1, byte(1+3)=10 */
|
|
2225
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2226
|
+
}
|
|
2227
|
+
|
|
2228
|
+
static void test_remember_recall_in_addaddress()
|
|
2229
|
+
{
|
|
2230
|
+
uint8_t ram[] = { 0x02, 0x03, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
|
|
2231
|
+
memory_t memory;
|
|
2232
|
+
rc_trigger_t* trigger;
|
|
2233
|
+
char buffer[1024];
|
|
2234
|
+
|
|
2235
|
+
memory.ram = ram;
|
|
2236
|
+
memory.size = sizeof(ram);
|
|
2237
|
+
|
|
2238
|
+
/* byte(byte(0x0001) + (byte(0x0000) - 1) * 2) == 60 */
|
|
2239
|
+
assert_parse_trigger(&trigger, buffer, "K:0xH0000-1_K:{recall}*2_I:{recall}+0xH0001_0xH0000=60");
|
|
2240
|
+
|
|
2241
|
+
/* byte(3 + (2 - 1) * 2) => byte(3+2) => byte(5) == 60 */
|
|
2242
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2243
|
+
|
|
2244
|
+
/* condition is true */
|
|
2245
|
+
ram[5] = 60;
|
|
2246
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2247
|
+
|
|
2248
|
+
/* byte(3 + (3 - 1) * 2) => byte(3+4) => byte(7) == 60 */
|
|
2249
|
+
ram[0] = 3;
|
|
2250
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2251
|
+
|
|
2252
|
+
/* condition is true */
|
|
2253
|
+
ram[7] = 60;
|
|
2254
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2255
|
+
|
|
2256
|
+
/* byte(0 + (3 - 1) * 2) => byte(0+4) => byte(4) == 60 */
|
|
2257
|
+
ram[1] = 0;
|
|
2258
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2259
|
+
|
|
2260
|
+
/* condition is true */
|
|
2261
|
+
ram[4] = 60;
|
|
2262
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
static void test_remember_recall_self_in_addaddress()
|
|
2266
|
+
{
|
|
2267
|
+
uint8_t ram[] = { 0x02, 0x03, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
|
|
2268
|
+
memory_t memory;
|
|
2269
|
+
rc_trigger_t* trigger;
|
|
2270
|
+
char buffer[1024];
|
|
2271
|
+
|
|
2272
|
+
memory.ram = ram;
|
|
2273
|
+
memory.size = sizeof(ram);
|
|
2274
|
+
|
|
2275
|
+
/* byte(byte(0x0000) + 1) == 60 */
|
|
2276
|
+
assert_parse_trigger(&trigger, buffer, "K:0xH0000_K:{recall}_I:{recall}_0xH0001=60");
|
|
2277
|
+
|
|
2278
|
+
/* byte(2 + 1) => byte(3) == 60 */
|
|
2279
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2280
|
+
|
|
2281
|
+
/* condition is true */
|
|
2282
|
+
ram[3] = 60;
|
|
2283
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2284
|
+
|
|
2285
|
+
/* byte(3 + 1) => byte(4) == 60 */
|
|
2286
|
+
ram[0] = 3;
|
|
2287
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2288
|
+
|
|
2289
|
+
/* condition is true */
|
|
2290
|
+
ram[4] = 60;
|
|
2291
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2292
|
+
|
|
2293
|
+
/* byte(2 + 1) => byte(3) == 60 */
|
|
2294
|
+
ram[0] = 2;
|
|
2295
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2296
|
+
|
|
2297
|
+
/* condition is false */
|
|
2298
|
+
ram[3] = 9;
|
|
2299
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
static void test_remember_in_main_recall_in_pause()
|
|
2303
|
+
{
|
|
2304
|
+
uint8_t ram[] = { 0x02, 0x03, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
|
|
2305
|
+
memory_t memory;
|
|
2306
|
+
rc_trigger_t* trigger;
|
|
2307
|
+
char buffer[1024];
|
|
2308
|
+
|
|
2309
|
+
memory.ram = ram;
|
|
2310
|
+
memory.size = sizeof(ram);
|
|
2311
|
+
|
|
2312
|
+
/* remember(byte(0) & 15) && always_true() && pauseif({recall} != 0 && byte(1) == 1) */
|
|
2313
|
+
assert_parse_trigger(&trigger, buffer, "K:0xH0000&15_1=1.6._N:{recall}!=2_P:0xH0001=1");
|
|
2314
|
+
|
|
2315
|
+
/* because the remember gets associated to the always_true(), the {recall} in the
|
|
2316
|
+
* pauseif will always recall 0 */
|
|
2317
|
+
|
|
2318
|
+
/* always_true is true; {recall} != 2 && 3 == 1; remembered value is 2; 3 != 1 => not paused */
|
|
2319
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2320
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
2321
|
+
|
|
2322
|
+
/* always_true is true; {recall} != 2 && 1 == 1; remembered value is 2,
|
|
2323
|
+
* but it's remembered AFTER the pause is processed, so {recall} != 2 is actually
|
|
2324
|
+
* 0 != 2, which is true, so the trigger is paused. */
|
|
2325
|
+
ram[1] = 1;
|
|
2326
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2327
|
+
assert_hit_count(trigger, 0, 1, 1);
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
/* ======================================================== */
|
|
2331
|
+
|
|
2332
|
+
static void test_trailing_andnext() {
|
|
2333
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2334
|
+
memory_t memory;
|
|
2335
|
+
rc_trigger_t* trigger;
|
|
2336
|
+
char buffer[512];
|
|
2337
|
+
|
|
2338
|
+
memory.ram = ram;
|
|
2339
|
+
memory.size = sizeof(ram);
|
|
2340
|
+
|
|
2341
|
+
/* byte(0x0002)=1
|
|
2342
|
+
* AndNext byte(0x0001)=1 -- ignored as compound condition is incomplete
|
|
2343
|
+
*/
|
|
2344
|
+
assert_parse_trigger(&trigger, buffer, "0xH0002=1_N:0xH0001=1");
|
|
2345
|
+
ASSERT_PTR_NOT_NULL(trigger->requirement->conditions);
|
|
2346
|
+
ASSERT_PTR_NOT_NULL(trigger->requirement->conditions->next);
|
|
2347
|
+
ASSERT_PTR_NULL(trigger->requirement->conditions->next->next);
|
|
2348
|
+
|
|
2349
|
+
/* both conditions false */
|
|
2350
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2351
|
+
|
|
2352
|
+
/* second condition true */
|
|
2353
|
+
ram[1] = 1;
|
|
2354
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2355
|
+
|
|
2356
|
+
/* second condition not true */
|
|
2357
|
+
ram[1] = 2;
|
|
2358
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2359
|
+
|
|
2360
|
+
/* second condition true */
|
|
2361
|
+
ram[1] = 1;
|
|
2362
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2363
|
+
|
|
2364
|
+
/* first condition true */
|
|
2365
|
+
ram[2] = 1;
|
|
2366
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2367
|
+
|
|
2368
|
+
/* first condition not true */
|
|
2369
|
+
ram[2] = 2;
|
|
2370
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2371
|
+
|
|
2372
|
+
/* second condition not true */
|
|
2373
|
+
ram[1] = 2;
|
|
2374
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2375
|
+
|
|
2376
|
+
/* first condition true */
|
|
2377
|
+
ram[2] = 1;
|
|
2378
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2379
|
+
|
|
2380
|
+
/* first condition not true */
|
|
2381
|
+
ram[2] = 2;
|
|
2382
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2383
|
+
}
|
|
2384
|
+
|
|
2385
|
+
static void test_trailing_andnext_with_alt() {
|
|
2386
|
+
uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
|
|
2387
|
+
memory_t memory;
|
|
2388
|
+
rc_trigger_t* trigger;
|
|
2389
|
+
char buffer[512];
|
|
2390
|
+
|
|
2391
|
+
memory.ram = ram;
|
|
2392
|
+
memory.size = sizeof(ram);
|
|
2393
|
+
|
|
2394
|
+
/* byte(0x0002)=1
|
|
2395
|
+
* AndNext byte(0x0001)=1 -- ignored as compound condition is incomplete
|
|
2396
|
+
*/
|
|
2397
|
+
assert_parse_trigger(&trigger, buffer, "0xH0002=1_N:0xH0001=1SR:0xH0003=1");
|
|
2398
|
+
ASSERT_PTR_NOT_NULL(trigger->requirement->conditions);
|
|
2399
|
+
ASSERT_PTR_NOT_NULL(trigger->requirement->conditions->next);
|
|
2400
|
+
ASSERT_PTR_NULL(trigger->requirement->conditions->next->next);
|
|
2401
|
+
ASSERT_PTR_NOT_NULL(trigger->alternative->conditions);
|
|
2402
|
+
ASSERT_PTR_NULL(trigger->alternative->conditions->next);
|
|
2403
|
+
|
|
2404
|
+
/* both conditions false */
|
|
2405
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2406
|
+
|
|
2407
|
+
/* second condition true */
|
|
2408
|
+
ram[1] = 1;
|
|
2409
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2410
|
+
|
|
2411
|
+
/* second condition not true */
|
|
2412
|
+
ram[1] = 2;
|
|
2413
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2414
|
+
|
|
2415
|
+
/* second condition true */
|
|
2416
|
+
ram[1] = 1;
|
|
2417
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2418
|
+
|
|
2419
|
+
/* first condition true */
|
|
2420
|
+
ram[2] = 1;
|
|
2421
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2422
|
+
|
|
2423
|
+
/* first condition not true */
|
|
2424
|
+
ram[2] = 2;
|
|
2425
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2426
|
+
|
|
2427
|
+
/* second condition not true */
|
|
2428
|
+
ram[1] = 2;
|
|
2429
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2430
|
+
|
|
2431
|
+
/* first condition true */
|
|
2432
|
+
ram[2] = 1;
|
|
2433
|
+
assert_evaluate_trigger(trigger, &memory, 1);
|
|
2434
|
+
|
|
2435
|
+
/* first condition not true */
|
|
2436
|
+
ram[2] = 2;
|
|
2437
|
+
assert_evaluate_trigger(trigger, &memory, 0);
|
|
2438
|
+
}
|
|
2439
|
+
|
|
2440
|
+
/* ======================================================== */
|
|
2441
|
+
|
|
2442
|
+
void test_trigger(void) {
|
|
2443
|
+
TEST_SUITE_BEGIN();
|
|
2444
|
+
|
|
2445
|
+
/* alt groups */
|
|
2446
|
+
TEST(test_alt_groups);
|
|
2447
|
+
TEST(test_empty_core);
|
|
2448
|
+
TEST(test_empty_alt);
|
|
2449
|
+
TEST(test_empty_last_alt);
|
|
2450
|
+
TEST(test_empty_all_alts);
|
|
2451
|
+
|
|
2452
|
+
/* resetif */
|
|
2453
|
+
TEST(test_resetif_in_alt_group);
|
|
2454
|
+
|
|
2455
|
+
/* pauseif */
|
|
2456
|
+
TEST(test_pauseif_in_alt_group);
|
|
2457
|
+
TEST(test_pauseif_resetif_in_alt_group);
|
|
2458
|
+
TEST(test_pauseif_hitcount_with_reset);
|
|
2459
|
+
|
|
2460
|
+
/* measured */
|
|
2461
|
+
TEST(test_measured);
|
|
2462
|
+
TEST(test_measured_as_percent);
|
|
2463
|
+
TEST(test_measured_comparison);
|
|
2464
|
+
TEST(test_measured_addhits);
|
|
2465
|
+
TEST(test_measured_indirect);
|
|
2466
|
+
TEST(test_measured_multiple);
|
|
2467
|
+
TEST(test_measured_multiple_with_hitcount_in_core);
|
|
2468
|
+
TEST(test_measured_while_paused);
|
|
2469
|
+
TEST(test_measured_while_paused_multiple);
|
|
2470
|
+
TEST(test_measured_while_paused_reset_alt);
|
|
2471
|
+
TEST(test_measured_while_paused_reset_core);
|
|
2472
|
+
TEST(test_measured_while_paused_reset_non_hitcount);
|
|
2473
|
+
TEST(test_measured_while_paused_extra_alts);
|
|
2474
|
+
TEST(test_measured_reset_hitcount);
|
|
2475
|
+
TEST(test_measured_reset_comparison);
|
|
2476
|
+
TEST(test_measured_if);
|
|
2477
|
+
TEST(test_measured_if_comparison);
|
|
2478
|
+
TEST(test_measured_if_multiple_measured);
|
|
2479
|
+
TEST(test_measured_if_multiple_measured_if);
|
|
2480
|
+
TEST(test_measured_if_while_paused);
|
|
2481
|
+
TEST(test_measured_trigger);
|
|
2482
|
+
|
|
2483
|
+
/* trigger */
|
|
2484
|
+
TEST(test_resetnextif_trigger);
|
|
2485
|
+
|
|
2486
|
+
/* rc_evaluate_trigger */
|
|
2487
|
+
TEST(test_evaluate_trigger_inactive);
|
|
2488
|
+
TEST(test_evaluate_trigger_waiting);
|
|
2489
|
+
TEST(test_evaluate_trigger_reset);
|
|
2490
|
+
TEST(test_evaluate_trigger_reset_next);
|
|
2491
|
+
TEST(test_evaluate_trigger_triggered);
|
|
2492
|
+
TEST(test_evaluate_trigger_paused);
|
|
2493
|
+
TEST(test_evaluate_trigger_primed);
|
|
2494
|
+
TEST(test_evaluate_trigger_primed_in_alts);
|
|
2495
|
+
TEST(test_evaluate_trigger_primed_one_alt);
|
|
2496
|
+
TEST(test_evaluate_trigger_disabled);
|
|
2497
|
+
TEST(test_evaluate_trigger_chained_resetnextif);
|
|
2498
|
+
|
|
2499
|
+
/* memref sharing */
|
|
2500
|
+
TEST(test_prev_prior_share_memref);
|
|
2501
|
+
TEST(test_bit_lookups_share_memref);
|
|
2502
|
+
TEST(test_bitcount_shares_memref);
|
|
2503
|
+
TEST(test_large_memref_not_shared);
|
|
2504
|
+
|
|
2505
|
+
/* accumulator - remember and recall*/
|
|
2506
|
+
TEST(test_remember_recall);
|
|
2507
|
+
TEST(test_remember_recall_separate_accumulator_per_group);
|
|
2508
|
+
TEST(test_remember_recall_separate_accumulator_per_group_complex);
|
|
2509
|
+
TEST(test_remember_recall_use_same_value_multiple);
|
|
2510
|
+
TEST(test_remember_recall_in_pause_and_main);
|
|
2511
|
+
TEST(test_remember_recall_in_pause_with_chain);
|
|
2512
|
+
TEST(test_remember_recall_in_addaddress);
|
|
2513
|
+
TEST(test_remember_recall_self_in_addaddress);
|
|
2514
|
+
TEST(test_remember_in_main_recall_in_pause);
|
|
2515
|
+
|
|
2516
|
+
/* incomplete logic */
|
|
2517
|
+
TEST(test_trailing_andnext);
|
|
2518
|
+
TEST(test_trailing_andnext_with_alt);
|
|
2519
|
+
|
|
2520
|
+
TEST_SUITE_END();
|
|
2521
|
+
}
|