better self test for enums

This commit is contained in:
Tester23 2025-10-17 23:48:06 +02:00
parent 42976ee561
commit d264e92500
2 changed files with 102 additions and 24 deletions

View File

@ -3,8 +3,68 @@
#include "selftest_local.h"
#include "../cmnds/cmd_enums.h"
void Test_Enum_3opts() {
// reset whole device
const char *shortName = "myShortName";
SIM_ClearOBK(shortName);
const char *fullName = "Windows Enum";
const char *mqttName = "obkEnumDemo";
SIM_ClearAndPrepareForMQTTTesting(mqttName, "bekens");
//SELFTEST_ASSERT(g_enums == 0);
CMD_ExecuteCommand("SetChannelEnum 14 \"1:One Switch\" 0:Zero 3:Three", 0);
SELFTEST_ASSERT(g_enums);
SELFTEST_ASSERT(g_enums[14]);
SELFTEST_ASSERT(!g_enums[13]);
SELFTEST_ASSERT(!g_enums[15]);
SELFTEST_ASSERT(g_cfg.pins.channelTypes[14] != ChType_Enum);
CMD_ExecuteCommand("SetChannelType 14 Enum", 0);
SELFTEST_ASSERT(g_cfg.pins.channelTypes[14] == ChType_Enum);
SELFTEST_ASSERT(g_enums[14]->numOptions == 3);
SELFTEST_ASSERT(g_enums[14]->options[0].value == 1);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[0].label, "One Switch"));
SELFTEST_ASSERT(g_enums[14]->options[1].value == 0);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[1].label, "Zero"));
SELFTEST_ASSERT(g_enums[14]->options[2].value == 3);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[2].label, "Three"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14], 1), "One Switch"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14], 0), "Zero"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14], 3), "Three"));
CFG_SetShortDeviceName(shortName);
CFG_SetDeviceName(fullName);
SIM_ClearMQTTHistory();
CMD_ExecuteCommand("scheduleHADiscovery 1", 0);
Sim_RunSeconds(10, false);
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"state_topic", "~/14/get",
"unique_id", "14",
"unique_id", "14",
"uniq_id", "Windows_Enum_select_14");
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"availability_topic", "~/connected",
"payload_available", "online",
"payload_not_available", "offline",
"uniq_id", "Windows_Enum_select_14");
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"command_topic", "~/14/set",
"options", "[\"One Switch\",\"Zero\",\"Three\"]",
"value_template", "{{ {1:'One Switch', 0:'Zero', 3:'Three', 99999:'Undefined'}[(value | int(99999))] | default(\"Undefined Enum [\"~value~\"]\") }}",
"command_template", "{{ {'One Switch':'1', 'Zero':'0', 'Three':'3', 'Undefined':'99999'}[value] | default(99999) }}");
}
void Test_Enum_BadOk() {
void Test_Enums() {
char tmp[1024];
// reset whole device
@ -23,10 +83,10 @@ void Test_Enums() {
// null checks
SELFTEST_ASSERT(g_enums);
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14],1), "1"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14], 1), "1"));
CMD_GenEnumValueTemplate(g_enums[14], tmp, sizeof(tmp));
// actual discovery template content assertions are in selftst_hass_discovery_ext.c
SELFTEST_ASSERT(!strcmp(tmp,"{{ {99999:'Undefined'}[(value | int(99999))] | default(\"Undefined Enum [\"~value~\"]\") }}"));
SELFTEST_ASSERT(!strcmp(tmp, "{{ {99999:'Undefined'}[(value | int(99999))] | default(\"Undefined Enum [\"~value~\"]\") }}"));
for (int i = 0; i < CHANNEL_MAX; i++) {
if (i != 4) {
@ -37,30 +97,13 @@ void Test_Enums() {
SELFTEST_ASSERT(g_enums[4]->numOptions == 2);
SELFTEST_ASSERT(g_enums[4]->options[0].value == 1);
SELFTEST_ASSERT(!strcmp(g_enums[4]->options[0].label,"Ok"));
SELFTEST_ASSERT(!strcmp(g_enums[4]->options[0].label, "Ok"));
SELFTEST_ASSERT(g_enums[4]->options[1].value == 0);
SELFTEST_ASSERT(!strcmp(g_enums[4]->options[1].label, "Bad"));
CMD_FormatEnumTemplate(g_enums[4], tmp, sizeof(tmp),false);
CMD_FormatEnumTemplate(g_enums[4], tmp, sizeof(tmp),true);
CMD_FormatEnumTemplate(g_enums[4], tmp, sizeof(tmp), false);
CMD_FormatEnumTemplate(g_enums[4], tmp, sizeof(tmp), true);
CMD_ExecuteCommand("SetChannelEnum 14 \"1:One Switch\" 0:Zero 3:Three", 0);
SELFTEST_ASSERT(g_enums);
SELFTEST_ASSERT(g_enums[14]);
SELFTEST_ASSERT(!g_enums[13]);
SELFTEST_ASSERT(!g_enums[15]);
SELFTEST_ASSERT(g_enums[14]->numOptions == 3);
SELFTEST_ASSERT(g_enums[14]->options[0].value == 1);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[0].label, "One Switch"));
SELFTEST_ASSERT(g_enums[14]->options[1].value == 0);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[1].label, "Zero"));
SELFTEST_ASSERT(g_enums[14]->options[2].value == 3);
SELFTEST_ASSERT(!strcmp(g_enums[14]->options[2].label, "Three"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14],1), "One Switch"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14],0), "Zero"));
SELFTEST_ASSERT(!strcmp(CMD_FindChannelEnumLabel(g_enums[14],3), "Three"));
@ -71,7 +114,34 @@ void Test_Enums() {
CMD_ExecuteCommand("scheduleHADiscovery 1", 0);
Sim_RunSeconds(10, false);
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"state_topic", "~/4/get",
"unique_id", "4",
"unique_id", "4",
"uniq_id", "Windows_Enum_select_4");
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"availability_topic", "~/connected",
"payload_available", "online",
"payload_not_available", "offline",
"uniq_id", "Windows_Enum_select_4");
SELFTEST_ASSERT_HAS_MQTT_JSON_SENT_ANY_4KEY("homeassistant", true, 0, 0,
"command_topic", "~/4/set",
"options", "[\"Ok\",\"Bad\"]",
"value_template", "{{ {1:'Ok', 0:'Bad', 99999:'Undefined'}[(value | int(99999))] | default(\"Undefined Enum [\"~value~\"]\") }}",
"command_template", "{{ {'Ok':'1', 'Bad':'0', 'Undefined':'99999'}[value] | default(99999) }}");
}
void Test_Enums() {
Test_Enum_BadOk();
Test_Enum_3opts();
}
#endif

View File

@ -95,7 +95,15 @@ bool CheckForKeyVal(cJSON *tmp, const char *key, const char *value) {
}
}
else {
printf("TODO: float compare selftest");
char *json_str = cJSON_PrintUnformatted(tmp);
bool bOk = false;
if (json_str) {
if (!strcmp(json_str, value)) {
bOk = true;
}
free(json_str); // or cJSON_free(json_str) depending on your build
}
return bOk;
}
}
}