4
mirror of https://gitlab.com/zephray/glider.git synced 2026-08-06 03:30:32 +00:00
Files
glider/fw/User/tests/test_autoclear.c
2026-07-04 07:20:36 -04:00

131 lines
4.3 KiB
C

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "autoclear.h"
#include "config.h"
#define ASSERT_TRUE(expr) do { \
if (!(expr)) { \
printf("ASSERT_TRUE failed at %s:%d: %s\n", __FILE__, __LINE__, #expr); \
return 1; \
} \
} while (0)
#define ASSERT_FALSE(expr) ASSERT_TRUE(!(expr))
#define ASSERT_EQ(expected, actual) do { \
unsigned long long exp__ = (unsigned long long)(expected); \
unsigned long long act__ = (unsigned long long)(actual); \
if (exp__ != act__) { \
printf("ASSERT_EQ failed at %s:%d: expected %llu got %llu\n", \
__FILE__, __LINE__, exp__, act__); \
return 1; \
} \
} while (0)
static int test_thresholds_scale_for_gen1_damage_units(void) {
ASSERT_EQ(2500000u,
autoclear_scaled_threshold(AC_THRES_LOW, 3200, 2400));
ASSERT_EQ(7500000u,
autoclear_scaled_threshold(AC_THRES_MED, 3200, 2400));
ASSERT_EQ(25000000u,
autoclear_scaled_threshold(AC_THRES_HIGH, 3200, 2400));
ASSERT_EQ(625000u,
autoclear_scaled_threshold(AC_THRES_LOW, 1600, 1200));
ASSERT_EQ(1875000u,
autoclear_scaled_threshold(AC_THRES_MED, 1600, 1200));
ASSERT_EQ(6250000u,
autoclear_scaled_threshold(AC_THRES_HIGH, 1600, 1200));
ASSERT_EQ(505292u,
autoclear_scaled_threshold(AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(1515875u,
autoclear_scaled_threshold(AC_THRES_MED, 1448, 1072));
ASSERT_EQ(5052917u,
autoclear_scaled_threshold(AC_THRES_HIGH, 1448, 1072));
return 0;
}
static int test_adaptive_accumulates_damage_samples(void) {
uint32_t accumulated_damage = 0;
uint32_t last_damage = 0;
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
80000, AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(80000u, accumulated_damage);
ASSERT_EQ(80000u, last_damage);
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
80000, AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(160000u, accumulated_damage);
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
90000, AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(250000u, accumulated_damage);
ASSERT_TRUE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
260000, AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(0u, accumulated_damage);
ASSERT_EQ(260000u, last_damage);
return 0;
}
static int test_adaptive_repeated_equal_damage_can_trigger(void) {
uint32_t accumulated_damage = 0;
uint32_t last_damage = 0;
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
150000, AC_THRES_LOW, 1448, 1072));
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
150000, AC_THRES_LOW, 1448, 1072));
ASSERT_FALSE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
150000, AC_THRES_LOW, 1448, 1072));
ASSERT_TRUE(autoclear_adaptive_update(&accumulated_damage, &last_damage,
150000, AC_THRES_LOW, 1448, 1072));
ASSERT_EQ(0u, accumulated_damage);
return 0;
}
static int test_fixed_interval_values_remain_separate(void) {
ASSERT_EQ(60000u, autoclear_fixed_interval_ms(AC_1MIN));
ASSERT_EQ(5u * 60000u, autoclear_fixed_interval_ms(AC_5MIN));
ASSERT_EQ(15u * 60000u, autoclear_fixed_interval_ms(AC_15MIN));
ASSERT_EQ(5u * 60000u, autoclear_fixed_interval_ms(-1));
return 0;
}
static int test_toggle_restores_last_non_off_mode(void) {
int previous = AC_FIXED;
ASSERT_EQ(AC_OFF, autoclear_toggle_mode(AC_FIXED, &previous));
ASSERT_EQ(AC_FIXED, previous);
ASSERT_EQ(AC_FIXED, autoclear_toggle_mode(AC_OFF, &previous));
previous = AC_ADAPT;
ASSERT_EQ(AC_OFF, autoclear_toggle_mode(AC_ADAPT, &previous));
ASSERT_EQ(AC_ADAPT, previous);
ASSERT_EQ(AC_ADAPT, autoclear_toggle_mode(AC_OFF, &previous));
previous = -1;
ASSERT_EQ(AC_ADAPT, autoclear_toggle_mode(AC_OFF, &previous));
return 0;
}
int main(void) {
int rc = 0;
rc |= test_thresholds_scale_for_gen1_damage_units();
rc |= test_adaptive_accumulates_damage_samples();
rc |= test_adaptive_repeated_equal_damage_can_trigger();
rc |= test_fixed_interval_values_remain_separate();
rc |= test_toggle_restores_last_non_off_mode();
return rc;
}