diff --git a/test_apps/main/test_relay_chn_tilt.c b/test_apps/main/test_relay_chn_tilt.c index 177d8a1..47b7f32 100644 --- a/test_apps/main/test_relay_chn_tilt.c +++ b/test_apps/main/test_relay_chn_tilt.c @@ -282,4 +282,108 @@ TEST_CASE("tilt_auto with ID_ALL tilts channels based on last run direction", "[ // 3. Verify channel 0 tilts forward (last run was forward) and channel 1 tilts reverse (last run was reverse) TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_FORWARD, relay_chn_get_state(0)); TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_REVERSE, relay_chn_get_state(1)); +} + +// Test relay_chn_tilt_auto() chooses correct tilt direction +TEST_CASE("relay_chn_tilt_auto chooses correct direction", "[relay_chn][tilt][auto]") { + uint8_t ch = 0; + TEST_ESP_OK(relay_chn_create(gpio_map, gpio_count)); + g_is_component_initialized = true; + + // Prepare FORWARD + prepare_channel_for_tilt(ch, RELAY_CHN_CMD_FORWARD); + relay_chn_tilt_auto(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_FORWARD, relay_chn_get_state(ch)); + relay_chn_tilt_stop(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + + // Prepare REVERSE + prepare_channel_for_tilt(ch, RELAY_CHN_CMD_REVERSE); + relay_chn_tilt_auto(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_REVERSE, relay_chn_get_state(ch)); +} + +// Test sensitivity set/get +TEST_CASE("relay_chn_tilt_sensitivity_set and get", "[relay_chn][tilt][sensitivity]") { + uint8_t ch = 0; + uint8_t val = 0; + TEST_ESP_OK(relay_chn_create(gpio_map, gpio_count)); + g_is_component_initialized = true; + + relay_chn_tilt_sensitivity_set(ch, 0); + TEST_ESP_OK(relay_chn_tilt_sensitivity_get(ch, &val, 1)); + TEST_ASSERT_EQUAL_UINT8(0, val); + + relay_chn_tilt_sensitivity_set(ch, 50); + TEST_ESP_OK(relay_chn_tilt_sensitivity_get(ch, &val, 1)); + TEST_ASSERT_EQUAL_UINT8(50, val); + + relay_chn_tilt_sensitivity_set(ch, 100); + TEST_ESP_OK(relay_chn_tilt_sensitivity_get(ch, &val, 1)); + TEST_ASSERT_EQUAL_UINT8(100, val); + + // Set all channels + relay_chn_tilt_sensitivity_set(RELAY_CHN_ID_ALL, 42); + uint8_t vals[CONFIG_RELAY_CHN_COUNT] = {0}; + TEST_ESP_OK(relay_chn_tilt_sensitivity_get(RELAY_CHN_ID_ALL, vals, relay_chn_count)); + for (int i = 0; i < relay_chn_count; ++i) { + TEST_ASSERT_EQUAL_UINT8(42, vals[i]); + } +} + +// Test tilt counter logic: forward x3, reverse x3, extra reverse fails +TEST_CASE("tilt counter logic: forward and reverse consumption", "[relay_chn][tilt][counter]") { + uint8_t ch = 0; + TEST_ESP_OK(relay_chn_create(gpio_map, gpio_count)); + g_is_component_initialized = true; + + prepare_channel_for_tilt(ch, RELAY_CHN_CMD_FORWARD); + + // Tilt forward 3 times + for (int i = 0; i < 3; ++i) { + relay_chn_tilt_forward(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_FORWARD, relay_chn_get_state(ch)); + relay_chn_tilt_stop(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + } + + // Now tilt reverse 3 times (should succeed) + for (int i = 0; i < 3; ++i) { + relay_chn_tilt_reverse(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + if (i < 3) { + TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_REVERSE, relay_chn_get_state(ch)); + relay_chn_tilt_stop(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + } + } + + // Extra reverse tilt should fail (counter exhausted) + relay_chn_tilt_reverse(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + // Should not enter TILT_REVERSE, should remain FREE or STOPPED + relay_chn_state_t state = relay_chn_get_state(ch); + TEST_ASSERT(state != RELAY_CHN_STATE_TILT_REVERSE); +} + +// Test run command during TILT state +TEST_CASE("run command during TILT state transitions correctly", "[relay_chn][tilt][run-during-tilt]") { + uint8_t ch = 0; + TEST_ESP_OK(relay_chn_create(gpio_map, gpio_count)); + g_is_component_initialized = true; + + prepare_channel_for_tilt(ch, RELAY_CHN_CMD_FORWARD); + relay_chn_tilt_forward(ch); + vTaskDelay(pdMS_TO_TICKS(opposite_inertia_ms + test_delay_margin_ms)); + TEST_ASSERT_EQUAL(RELAY_CHN_STATE_TILT_FORWARD, relay_chn_get_state(ch)); + + // Issue run reverse while in TILT_FORWARD + relay_chn_run_reverse(ch); + vTaskDelay(pdMS_TO_TICKS(test_delay_margin_ms)); + // Should transition to REVERSE or REVERSE_PENDING depending on inertia logic + relay_chn_state_t state = relay_chn_get_state(ch); + TEST_ASSERT(state == RELAY_CHN_STATE_REVERSE || state == RELAY_CHN_STATE_REVERSE_PENDING); } \ No newline at end of file