Files
arduino-home-assistant/test/test_utils_serializers/tests/test_serializer.cpp
T
alex 40b98a38ee Migrate unit tests to PlatformIO Unity
Replace the legacy tests/ tree (AUnit, EpoxyDuino, Make, AUniter) with
PlatformIO Unity suites under test/, shared helpers, and platformio.ini.
Remove AUnitHelpers and drop the AUnit include from ArduinoHA test builds.
Refresh docs to Markdown-only and document the test workflow in CHANGELOG.
2026-04-19 23:24:28 +10:00

386 lines
9.0 KiB
C++

#include <Arduino.h>
#include <ArduinoHA.h>
#include "../../shared/aha_unity_helpers.h"
static const char* testDeviceId = "testDevice";
static const char* testTopic = "testTopic";
const char TestComponentStr[] PROGMEM = {"dummyProgmem"};
class DummyDeviceType : public HABaseDeviceType
{
public:
DummyDeviceType() : HABaseDeviceType(AHATOFSTR(TestComponentStr), "testId") { }
protected:
virtual void onMqttConnected() override { }
};
#define prepareTest(maxEntriesNb) \
initMqttTest(testDeviceId); \
DummyDeviceType dummyDeviceType; \
HASerializer serializer(&dummyDeviceType, maxEntriesNb)
#define flushSerializer(mockPtr, ser) \
(mockPtr)->connectDummy(); \
(mockPtr)->beginPublish(testTopic, (ser).calculateSize(), false); \
(ser).flush(); \
(mockPtr)->endPublish()
#define assertSerializerMqttMessage(expectedJson) \
AHA_ASSERT_SINGLE_MQTT_MESSAGE_RAM_TOPIC(mock, testTopic, expectedJson, false)
void test_SerializerTest_empty_json(void)
{
prepareTest(0);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{}");
}
void test_SerializerTest_skip_null_fields(void)
{
prepareTest(2);
serializer.set(AHATOFSTR(HADeviceClassProperty), "Class");
serializer.set(AHATOFSTR(HAIconProperty), nullptr);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"dev_cla\":\"Class\"}");
}
void test_SerializerTest_char_field(void)
{
prepareTest(1);
serializer.set(AHATOFSTR(HANameProperty), "XYZ");
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":\"XYZ\"}");
}
void test_SerializerTest_bool_false_field(void)
{
prepareTest(1);
bool value = false;
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::BoolPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":false}");
}
void test_SerializerTest_bool_true_field(void)
{
prepareTest(1);
bool value = true;
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::BoolPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":true}");
}
void test_SerializerTest_number_zero_field(void)
{
prepareTest(1);
HANumeric value(0, 0);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":0}");
}
void test_SerializerTest_number_signed_field(void)
{
prepareTest(1);
HANumeric value(-12346756, 0);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":-12346756}");
}
void test_SerializerTest_number_unsigned_field(void)
{
prepareTest(1);
HANumeric value(312346733, 0);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":312346733}");
}
void test_SerializerTest_float_p1_field(void)
{
prepareTest(1);
HANumeric value(250.5235f, 1);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":250.5}");
}
void test_SerializerTest_float_p2_field(void)
{
prepareTest(1);
HANumeric value(250.5235f, 2);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":250.52}");
}
void test_SerializerTest_float_p3_field(void)
{
prepareTest(1);
HANumeric value(250.5235f, 3);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":250.523}");
}
void test_SerializerTest_float_p3_zero_signed_field(void)
{
prepareTest(1);
HANumeric value(-0.243f, 3);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":-0.243}");
}
void test_SerializerTest_float_p3_zero_unsigned_field(void)
{
prepareTest(1);
HANumeric value(0.243f, 3);
serializer.set(
AHATOFSTR(HANameProperty),
&value,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":0.243}");
}
void test_SerializerTest_progmem_field(void)
{
prepareTest(1);
serializer.set(
AHATOFSTR(HANameProperty),
HAOffline,
HASerializer::ProgmemPropertyValue
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"name\":\"offline\"}");
}
void test_SerializerTest_topic_field(void)
{
prepareTest(1);
serializer.topic(AHATOFSTR(HAStateTopic));
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{\"stat_t\":\"testData/testDevice/testId/stat_t\"}"
);
}
void test_SerializerTest_topics_field(void)
{
prepareTest(2);
serializer.topic(AHATOFSTR(HAStateTopic));
serializer.topic(AHATOFSTR(HAAvailabilityTopic));
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{"
"\"stat_t\":\"testData/testDevice/testId/stat_t\","
"\"avty_t\":\"testData/testDevice/testId/avty_t\""
"}"
);
}
void test_SerializerTest_device_serialization(void)
{
prepareTest(1);
serializer.set(HASerializer::WithDevice);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"dev\":{\"ids\":\"testDevice\"}}");
}
void test_SerializerTest_device_mixed_serialization(void)
{
prepareTest(2);
serializer.set(HASerializer::WithDevice);
serializer.set(AHATOFSTR(HADeviceClassProperty), "Class1");
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{\"dev\":{\"ids\":\"testDevice\"},\"dev_cla\":\"Class1\"}"
);
}
void test_SerializerTest_device_type_availability(void)
{
prepareTest(1);
dummyDeviceType.setAvailability(false);
serializer.set(HASerializer::WithAvailability);
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{\"avty_t\":\"testData/testDevice/testId/avty_t\"}"
);
}
void test_SerializerTest_device_type_availability_mixed(void)
{
prepareTest(2);
dummyDeviceType.setAvailability(false);
serializer.set(HASerializer::WithAvailability);
serializer.set(AHATOFSTR(HADeviceClassProperty), "Class1");
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{"
"\"avty_t\":\"testData/testDevice/testId/avty_t\","
"\"dev_cla\":\"Class1\""
"}"
);
}
void test_SerializerTest_shared_availability(void)
{
prepareTest(1);
device.enableSharedAvailability();
serializer.set(HASerializer::WithAvailability);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"avty_t\":\"testData/testDevice/avty_t\"}");
}
void test_SerializerTest_empty_array(void)
{
prepareTest(1);
HASerializerArray array(0);
serializer.set(
AHATOFSTR(HADeviceClassProperty),
&array,
HASerializer::ArrayPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"dev_cla\":[]}");
}
void test_SerializerTest_two_element_array(void)
{
prepareTest(1);
HASerializerArray array(2);
array.add(HADeviceProperty);
array.add(HAIconProperty);
serializer.set(
AHATOFSTR(HADeviceClassProperty),
&array,
HASerializer::ArrayPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage("{\"dev_cla\":[\"dev\",\"ic\"]}");
}
void test_SerializerTest_mixed_elements(void)
{
prepareTest(6);
HASerializerArray array(2);
array.add(HADeviceProperty);
array.add(HAIconProperty);
dummyDeviceType.setAvailability(false);
serializer.set(
AHATOFSTR(HADeviceClassProperty),
&array,
HASerializer::ArrayPropertyType
);
serializer.set(HASerializer::WithAvailability);
serializer.set(HASerializer::WithDevice);
serializer.set(AHATOFSTR(HANameProperty), "TestName");
serializer.topic(AHATOFSTR(HAStateTopic));
HANumeric intValue(312346733, 0);
serializer.set(
AHATOFSTR(HAIconProperty),
&intValue,
HASerializer::NumberPropertyType
);
flushSerializer(mock, serializer);
assertSerializerMqttMessage(
"{"
"\"dev_cla\":[\"dev\",\"ic\"],"
"\"avty_t\":\"testData/testDevice/testId/avty_t\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"name\":\"TestName\","
"\"stat_t\":\"testData/testDevice/testId/stat_t\","
"\"ic\":312346733"
"}"
);
}