Restructure the project tree for unit testing

Restructure the whole project tree so that the component can be unit tested. Also update some cmake files to update the modified paths, update test cases etc.
This commit is contained in:
2025-07-04 00:38:57 +03:00
parent ed5b86e863
commit 41c292cc89
11 changed files with 2100 additions and 9 deletions

View File

@@ -0,0 +1,3 @@
idf_component_register(SRCS "test_relay_chn.c"
INCLUDE_DIRS "."
REQUIRES unity relay_chn)

View File

@@ -0,0 +1,104 @@
#include "driver/gpio.h"
#include "unity.h"
#include "unity_test_utils.h"
#include "relay_chn.h"
#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
const gpio_num_t gpio_map[] = {GPIO_NUM_4, GPIO_NUM_5, GPIO_NUM_18, GPIO_NUM_19};
const uint8_t gpio_count = sizeof(gpio_map) / sizeof(gpio_map[0]);
const uint8_t relay_chn_count = gpio_count / 2;
void setUp(void) {
// Her testten önce çalışacak kod
// relay_chn_create'i burada çağırarak her testin temiz bir başlangıç yapmasını sağlayalım.
TEST_ESP_OK(relay_chn_create(gpio_map, gpio_count));
// Tüm röleleri başlangıçta durdur (temiz bir durum için)
for (uint8_t i = 0; i < relay_chn_count; i++) {
relay_chn_stop(i);
}
vTaskDelay(pdMS_TO_TICKS(100)); // Rölelerin stabilize olması için kısa bir gecikme
}
void tearDown(void) {
// Her testten sonra çalışacak kod (isteğe bağlı, genellikle cleanup için)
// Örneğin, GPIO'ları de-initialize edebilirsin, ama relay_chn'in buna ihtiyacı yoksa boş bırakabilirsin.
// Ancak her test sonunda tüm rölelerin kapalı olduğundan emin olmak iyi bir pratik.
for (uint8_t i = 0; i < relay_chn_count; i++) {
relay_chn_stop(i);
}
vTaskDelay(pdMS_TO_TICKS(100));
}
TEST_CASE("Relay channels run forward and update state", "[relay_chn][forward]")
{
// Test forward run on all channels
for (uint8_t i = 0; i < relay_chn_count; i++) {
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
relay_chn_run_forward(i); // Run the channel forward
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_FORWARD, relay_chn_get_state(i));
relay_chn_stop(i); // Stop the channel
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
relay_chn_flip_direction(i); // Flip the direction
TEST_ASSERT_EQUAL(RELAY_CHN_DIRECTION_FLIPPED, relay_chn_get_direction(i));
relay_chn_run_forward(i); // Run the channel forward
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_FORWARD, relay_chn_get_state(i));
relay_chn_stop(i); // Stop the channel
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
}
}
TEST_CASE("Relay channels run reverse and update state", "[relay_chn][reverse]")
{
// Test reverse run on all channels
for (uint8_t i = 0; i < relay_chn_count; i++) {
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
relay_chn_run_reverse(i); // Run the channel reverse
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_REVERSE, relay_chn_get_state(i));
relay_chn_stop(i); // Stop the channel
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
relay_chn_flip_direction(i); // Flip the direction
TEST_ASSERT_EQUAL(RELAY_CHN_DIRECTION_FLIPPED, relay_chn_get_direction(i));
relay_chn_run_reverse(i); // Run the channel forward
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_REVERSE, relay_chn_get_state(i));
relay_chn_stop(i); // Stop the channel
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
}
}
static void check_channels_state_unchanged(void)
{
for (uint8_t i = 0; i < relay_chn_count; i++) {
TEST_ASSERT_EQUAL(RELAY_CHN_STATE_STOPPED, relay_chn_get_state(i));
TEST_ASSERT_EQUAL(RELAY_CHN_DIRECTION_DEFAULT, relay_chn_get_direction(i));
}
}
TEST_CASE("Relay channels do not change state for invalid channel", "[relay_chn][invalid]")
{
// Test invalid channel run
relay_chn_run_forward(relay_chn_count); // İlk geçersiz kanal (index out of bounds)
check_channels_state_unchanged(); // Tüm geçerli kanalların durumu değişmemeli
relay_chn_run_reverse(relay_chn_count);
check_channels_state_unchanged();
relay_chn_stop(relay_chn_count);
check_channels_state_unchanged();
relay_chn_flip_direction(relay_chn_count);
check_channels_state_unchanged();
}
void app_main(void) {
ESP_LOGI("APP_MAIN", "Starting relay_chn unit tests...");
unity_run_all_tests();
ESP_LOGI("APP_MAIN", "All relay_chn tests completed. Restarting in 10 seconds...");
vTaskDelay(pdMS_TO_TICKS(10000));
esp_restart();
}