243 lines
7.4 KiB
C++
243 lines
7.4 KiB
C++
#include <unity.h>
|
|
#include <unordered_map>
|
|
#include <memory>
|
|
|
|
#define MAIN_DEVICE_ID "test"
|
|
|
|
#include "ha.h"
|
|
|
|
using namespace Ha;
|
|
|
|
void setUp(void) {
|
|
Ha::publisher = [](const char* topic, const char* message) -> uint16_t {
|
|
return 0;
|
|
};
|
|
}
|
|
|
|
void tearDown(void) {
|
|
// clean stuff up here
|
|
}
|
|
|
|
void testDevice(void) {
|
|
auto d = DeviceConfig::create("1").withName("name").withModel("model").withArea("area").withManufacturer("man");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
d.buildConfig(doc);
|
|
|
|
JsonObject dev = doc["device"];
|
|
TEST_ASSERT_TRUE(doc.containsKey("device"));
|
|
TEST_ASSERT_EQUAL_STRING("name", dev["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("model", dev["model"]);
|
|
TEST_ASSERT_EQUAL_STRING("area", dev["suggested_area"]);
|
|
TEST_ASSERT_EQUAL_STRING("man", dev["manufacturer"]);
|
|
TEST_ASSERT_TRUE(dev.containsKey("identifiers"));
|
|
TEST_ASSERT_EQUAL_STRING("1", dev["identifiers"][0]);
|
|
}
|
|
|
|
void testButton(void) {
|
|
Button b("a_name", "id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
b.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID"_id", doc["unique_id"]);
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/set", doc["command_topic"]);
|
|
TEST_ASSERT_FALSE(doc["retain"]);
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["entity_category"]);
|
|
TEST_ASSERT_NOT_NULL(Command::mapCommandTopics[doc["command_topic"]]);
|
|
}
|
|
|
|
void testSensor(void) {
|
|
Sensor s("a_name", "id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID"_id", doc["unique_id"]);
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/state", doc["state_topic"]);
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["entity_category"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["value_template"]);
|
|
TEST_ASSERT_EQUAL_INT(0, doc["suggested_display_precision"]);
|
|
TEST_ASSERT_NOT_NULL(GenericSensor::mapSensors["id"]);
|
|
}
|
|
|
|
void testNumericSensor1(void) {
|
|
Sensor s("a_name", "id");
|
|
s.deviceClass = "class";
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testNumericSensor2(void) {
|
|
Sensor s("a_name", "id");
|
|
s.unitMeasure = "%";
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testSwitch(void) {
|
|
Switch s("a_name", "id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID"_id", doc["unique_id"]);
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/set", doc["command_topic"]);
|
|
TEST_ASSERT_FALSE(doc["retain"]);
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["entity_category"]);
|
|
TEST_ASSERT_NOT_NULL(Command::mapCommandTopics[doc["command_topic"]]);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["state_topic"]);
|
|
}
|
|
|
|
void testSwitchWithState(void) {
|
|
Switch s("a_name", "id");
|
|
s.withStateTopic();
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/state", doc["state_topic"]);
|
|
}
|
|
|
|
void testNumber(void) {
|
|
Number n("a_name", "id", nullptr);
|
|
|
|
StaticJsonDocument<256> doc;
|
|
n.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID"_id", doc["unique_id"]);
|
|
TEST_ASSERT_EQUAL_INT16(1, doc["min"]);
|
|
TEST_ASSERT_EQUAL_INT16(100, doc["max"]);
|
|
TEST_ASSERT_EQUAL_INT16(1, doc["step"]);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/set", doc["command_topic"]);
|
|
TEST_ASSERT_FALSE(doc["retain"]);
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["entity_category"]);
|
|
TEST_ASSERT_NOT_NULL(Command::mapCommandTopics[doc["command_topic"]]);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["state_topic"]);
|
|
}
|
|
|
|
void testTemperatureSensor(void) {
|
|
TemperatureSensor s("id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING("Temperature", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("temperature", doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING("°C", doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testHumiditySensor(void) {
|
|
HumiditySensor s("id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING("Humidity", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("humidity", doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING("%", doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testPressureSensor(void) {
|
|
PressureSensor s("id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING("Pressure", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("pressure", doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING("hPa", doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testVoltageSensor(void) {
|
|
VoltageSensor s("id", "a_name", nullptr);
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("voltage", doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING("V", doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testBatterySensor(void) {
|
|
BatterySensor s("id", "a_name", nullptr);
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING("battery", doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING("%", doc["unit_of_measurement"]);
|
|
TEST_ASSERT_EQUAL_INT(2, doc["suggested_display_precision"]);
|
|
}
|
|
|
|
void testBinarySensor(void) {
|
|
BinarySensor s("id", "a_name");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID"_id", doc["unique_id"]);
|
|
TEST_ASSERT_EQUAL_STRING(MAIN_DEVICE_ID "/id/state", doc["state_topic"]);
|
|
TEST_ASSERT_EQUAL_STRING("a_name", doc["name"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["device_class"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["entity_category"]);
|
|
TEST_ASSERT_EQUAL_STRING(NULL, doc["value_template"]);
|
|
TEST_ASSERT_NOT_NULL(GenericSensor::mapSensors["id"]);
|
|
}
|
|
|
|
void testPublisher(void) {
|
|
Ha::publisher = [](const char* topic, const char* message) -> uint16_t {
|
|
TEST_ASSERT_EQUAL_STRING("{\"name\":\"a_name\",\"unique_id\":\"test_id\",\"command_topic\":\"test/id/set\"}", message);
|
|
return 0;
|
|
};
|
|
Switch s("a_name", "id");
|
|
|
|
StaticJsonDocument<256> doc;
|
|
s.buildConfig(doc);
|
|
s.publishConfig();
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
UNITY_BEGIN();
|
|
RUN_TEST(testDevice);
|
|
RUN_TEST(testButton);
|
|
RUN_TEST(testSensor);
|
|
RUN_TEST(testTemperatureSensor);
|
|
RUN_TEST(testHumiditySensor);
|
|
RUN_TEST(testPressureSensor);
|
|
RUN_TEST(testVoltageSensor);
|
|
RUN_TEST(testBatterySensor);
|
|
RUN_TEST(testNumericSensor1);
|
|
RUN_TEST(testNumericSensor2);
|
|
RUN_TEST(testSwitch);
|
|
RUN_TEST(testSwitchWithState);
|
|
RUN_TEST(testNumber);
|
|
RUN_TEST(testBinarySensor);
|
|
RUN_TEST(testPublisher);
|
|
return UNITY_END();
|
|
}
|