Add tests

This commit is contained in:
Carl Philipp Klemm 2026-04-09 16:18:17 +02:00
parent a3a5277e5d
commit 3fd27905ee
7 changed files with 1429 additions and 0 deletions

View file

@ -0,0 +1,225 @@
#include <QtTest/QtTest>
#include "items/item.h"
#include "items/itemstore.h"
#include "items/itemsource.h"
#include "items/itemloadersource.h"
class TestItem : public QObject
{
Q_OBJECT
private slots:
void initTestCase()
{
// Setup for all tests
}
void testItemCreation()
{
Item item(0, "test_item", 0);
QCOMPARE(item.getName(), QString("test_item"));
}
void testOverrideFunctionality()
{
Item item(0, "test_item", 0);
// Test override on/off
item.setOverride(true);
QVERIFY(item.getOverride());
item.setOverride(false);
QVERIFY(!item.getOverride());
}
void testItemValueTypes()
{
// Test default value type is BOOL
Item item(1, "test_item", 0);
QCOMPARE(item.getValueType(), ITEM_VALUE_BOOL);
// Test setting and getting value
item.setValueData(1);
QCOMPARE(item.getValue(), static_cast<uint8_t>(1));
item.setValueData(0);
QCOMPARE(item.getValue(), static_cast<uint8_t>(0));
}
void testItemId()
{
Item item(42, "test_item", 0);
QCOMPARE(item.id(), static_cast<uint32_t>(42));
}
void testItemGroupName()
{
Item item(1, "test_item", 0);
QCOMPARE(item.getGroupName(), QString("All")); // Default group
item.setGroupName("Living Room");
QCOMPARE(item.getGroupName(), QString("Living Room"));
}
void testItemHidden()
{
Item item(1, "test_item", 0);
QVERIFY(!item.isHidden());
item.setHidden(true);
QVERIFY(item.isHidden());
item.setHidden(false);
QVERIFY(!item.isHidden());
}
void testItemLoaded()
{
Item item(1, "test_item", 0);
QVERIFY(!item.getLoaded());
item.setLoaded(true);
QVERIFY(item.getLoaded());
}
void testItemJsonSerialization()
{
Item item(42, "test_item", 1);
item.setGroupName("TestGroup");
QJsonObject json;
item.store(json);
// Verify JSON contents
QCOMPARE(json["ItemId"].toDouble(), 42.0);
// Note: Name is only stored if changes.name is true
// Value is only stored if changes.value is true
}
void testItemJsonDeserialization()
{
QJsonObject json;
json["ItemId"] = 100;
json["Name"] = "loaded_item";
json["Value"] = 1;
json["GroupName"] = "Bedroom";
Item item;
item.load(json);
// Note: load() uses loadWithChanges which requires preserve=false to apply changes
// The id should be set
// The name should be set (since preserve defaults to false)
}
void testItemUpdateRequest()
{
Item item(1, "test_item", 0);
// Test creating update request
ItemUpdateRequest request = item.createValueUpdateRequest(ITEM_UPDATE_USER, false);
QVERIFY(request.type == ITEM_UPDATE_USER);
// Note: changes is not automatically set by createValueUpdateRequest
// The caller is expected to set the changes they want
QVERIFY(request.newActors.empty());
}
void testItemUpdateRequestWithActors()
{
Item item(1, "test_item", 0);
// Test creating update request with actors
ItemUpdateRequest request = item.createValueUpdateRequest(ITEM_UPDATE_USER, true);
QVERIFY(request.type == ITEM_UPDATE_USER);
// With actors=true, newActors should be populated
// Note: changes.actors is set by the caller, not by createValueUpdateRequest
}
void testItemHasActors()
{
Item item(1, "test_item", 0);
QVERIFY(!item.hasActors());
// Note: Adding actors requires a valid Actor pointer
}
void testItemRemoveAllActors()
{
Item item(1, "test_item", 0);
item.removeAllActors();
QVERIFY(!item.hasActors());
}
void testItemSetActorsActive()
{
Item item(1, "test_item", 0);
// Should not crash when no actors
item.setActorsActive(true);
item.setActorsActive(false);
}
void testItemDataChangeDetection()
{
ItemData data1(1, "item1", 0);
ItemData data2(1, "item1", 1);
// Test value change detection
ItemFieldChanges changes(true);
QVERIFY(data1.hasChanged(data2, changes));
// Test no change
changes = ItemFieldChanges(false);
QVERIFY(!data1.hasChanged(data2, changes));
}
void testItemDataNameChange()
{
ItemData data1(1, "item1", 0);
ItemData data2(1, "item2", 0);
ItemFieldChanges changes;
changes.name = true;
QVERIFY(data1.hasChanged(data2, changes));
}
void testItemDataGroupNameChange()
{
ItemData data1(1, "item1", 0);
data1.setGroupName("Group1");
ItemData data2(1, "item1", 0);
data2.setGroupName("Group2");
ItemFieldChanges changes;
changes.groupName = true;
QVERIFY(data1.hasChanged(data2, changes));
}
void testItemFieldChanges()
{
ItemFieldChanges changes(false);
QVERIFY(changes.isNone());
changes.value = true;
QVERIFY(!changes.isNone());
ItemFieldChanges allChanges(true);
QVERIFY(!allChanges.isNone());
}
void cleanupTestCase()
{
// Cleanup after all tests
}
};
QTEST_APPLESS_MAIN(TestItem)
#include "test_item.moc"

View file

@ -0,0 +1,240 @@
#include <QtTest/QtTest>
#include "items/itemloadersource.h"
#include "items/item.h"
class TestItemLoaderSource : public QObject
{
Q_OBJECT
private slots:
void initTestCase()
{
// Setup for all tests
}
void testItemLoaderSourceCreation()
{
ItemLoaderSource source;
// Should be created with empty JSON
QVERIFY(true); // No crash
}
void testItemLoaderSourceCreationWithJson()
{
QJsonObject json;
json["Items"] = QJsonArray();
ItemLoaderSource source(json);
// Should be created with JSON
QVERIFY(true); // No crash
}
void testItemLoaderSourceRefreshEmpty()
{
ItemLoaderSource source;
// Should not crash with empty JSON
source.refresh();
// No items should be emitted
QVERIFY(true);
}
void testItemLoaderSourceRefreshWithItems()
{
QJsonObject json;
QJsonArray itemsArray;
QJsonObject item1;
item1["Type"] = "Item";
item1["ItemId"] = 1;
item1["Name"] = "test_item1";
item1["Value"] = 0;
itemsArray.append(item1);
QJsonObject item2;
item2["Type"] = "Item";
item2["ItemId"] = 2;
item2["Name"] = "test_item2";
item2["Value"] = 1;
itemsArray.append(item2);
json["Items"] = itemsArray;
ItemLoaderSource source(json);
// Capture the gotItems signal
std::vector<ItemAddRequest> capturedItems;
connect(&source, &ItemLoaderSource::gotItems,
[&capturedItems](std::vector<ItemAddRequest> items) {
capturedItems = items;
});
source.refresh();
// Should have 2 items
QVERIFY(capturedItems.size() == 2);
}
void testItemLoaderSourceRefreshWithRelay()
{
QJsonObject json;
QJsonArray itemsArray;
QJsonObject relay;
relay["Type"] = "Relay";
relay["ItemId"] = 100;
relay["Name"] = "test_relay";
relay["Value"] = 0;
relay["Id"] = 1;
relay["Address"] = 0x2000;
itemsArray.append(relay);
json["Items"] = itemsArray;
ItemLoaderSource source(json);
// Capture the gotItems signal
std::vector<ItemAddRequest> capturedItems;
connect(&source, &ItemLoaderSource::gotItems,
[&capturedItems](std::vector<ItemAddRequest> items) {
capturedItems = items;
});
source.refresh();
// Should have 1 item
QVERIFY(capturedItems.size() == 1);
}
void testItemLoaderSourceUpdateJson()
{
ItemLoaderSource source;
// Initial JSON
QJsonObject json1;
QJsonArray items1;
QJsonObject item1;
item1["Type"] = "Item";
item1["ItemId"] = 1;
item1["Name"] = "item1";
items1.append(item1);
json1["Items"] = items1;
source.updateJson(json1);
// Update JSON
QJsonObject json2;
QJsonArray items2;
QJsonObject item2;
item2["Type"] = "Item";
item2["ItemId"] = 2;
item2["Name"] = "item2";
items2.append(item2);
json2["Items"] = items2;
source.updateJson(json2);
// Should not crash
QVERIFY(true);
}
void testItemLoaderSourceRefreshWithInvalidItems()
{
QJsonObject json;
QJsonArray itemsArray;
// Add invalid item (no Type)
QJsonObject item1;
item1["ItemId"] = 1;
itemsArray.append(item1);
json["Items"] = itemsArray;
ItemLoaderSource source(json);
// Capture the gotItems signal
std::vector<ItemAddRequest> capturedItems;
connect(&source, &ItemLoaderSource::gotItems,
[&capturedItems](std::vector<ItemAddRequest> items) {
capturedItems = items;
});
source.refresh();
// Should handle invalid item gracefully (may return 0 items)
QVERIFY(capturedItems.size() == 0 || capturedItems.size() == 1);
}
void testItemLoaderSourceRefreshWithMessageItem()
{
QJsonObject json;
QJsonArray itemsArray;
QJsonObject messageItem;
messageItem["Type"] = "Message";
messageItem["ItemId"] = 200;
messageItem["Name"] = "alert_item";
messageItem["Value"] = 0;
messageItem["Message"] = "Test message";
itemsArray.append(messageItem);
json["Items"] = itemsArray;
ItemLoaderSource source(json);
// Capture the gotItems signal
std::vector<ItemAddRequest> capturedItems;
connect(&source, &ItemLoaderSource::gotItems,
[&capturedItems](std::vector<ItemAddRequest> items) {
capturedItems = items;
});
source.refresh();
// Should have 1 item
QVERIFY(capturedItems.size() == 1);
}
void testItemLoaderSourceRefreshWithSystemItem()
{
QJsonObject json;
QJsonArray itemsArray;
QJsonObject systemItem;
systemItem["Type"] = "System";
systemItem["ItemId"] = 300;
systemItem["Name"] = "system_item";
systemItem["Value"] = 0;
systemItem["OnCommand"] = "echo on";
systemItem["OffCommand"] = "echo off";
itemsArray.append(systemItem);
json["Items"] = itemsArray;
ItemLoaderSource source(json);
// Capture the gotItems signal
std::vector<ItemAddRequest> capturedItems;
connect(&source, &ItemLoaderSource::gotItems,
[&capturedItems](std::vector<ItemAddRequest> items) {
capturedItems = items;
});
source.refresh();
// Should have 1 item
QVERIFY(capturedItems.size() == 1);
}
void cleanupTestCase()
{
// Cleanup after all tests
}
};
QTEST_APPLESS_MAIN(TestItemLoaderSource)
#include "test_itemloadersource.moc"

View file

@ -0,0 +1,255 @@
#include <QtTest/QtTest>
#include "items/itemstore.h"
#include "items/item.h"
class TestItemStore : public QObject
{
Q_OBJECT
private slots:
void initTestCase()
{
// Setup for all tests
}
void testItemStoreCreation()
{
ItemStore store;
// Should start empty
QVERIFY(store.getItems()->empty());
}
void testItemStoreAddItem()
{
ItemStore store;
std::shared_ptr<Item> item(new Item(1, "test_item", 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
// Item should be added
QVERIFY(store.getItems()->size() == 1);
}
void testItemStoreAddMultipleItems()
{
ItemStore store;
std::shared_ptr<Item> item1(new Item(1, "item1", 0));
std::shared_ptr<Item> item2(new Item(2, "item2", 1));
std::vector<ItemAddRequest> requests;
ItemAddRequest request1;
request1.type = ITEM_UPDATE_USER;
request1.payload = item1;
request1.changes = ItemFieldChanges(true);
requests.push_back(request1);
ItemAddRequest request2;
request2.type = ITEM_UPDATE_USER;
request2.payload = item2;
request2.changes = ItemFieldChanges(true);
requests.push_back(request2);
store.addItems(requests);
// Both items should be added
QVERIFY(store.getItems()->size() == 2);
}
void testItemStoreGetItem()
{
ItemStore store;
std::shared_ptr<Item> item(new Item(42, "test_item", 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
// Get item by id
std::shared_ptr<Item> found = store.getItem(42);
QVERIFY(found != nullptr);
QVERIFY(found->getName() == "test_item");
// Get non-existent item
std::shared_ptr<Item> notFound = store.getItem(999);
QVERIFY(notFound == nullptr);
}
void testItemStoreRemoveItem()
{
ItemStore store;
std::shared_ptr<Item> item(new Item(1, "test_item", 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
QVERIFY(store.getItems()->size() == 1);
// Remove item
ItemData itemData(1, "test_item", 0);
store.removeItem(itemData);
QVERIFY(store.getItems()->empty());
}
void testItemStoreClear()
{
ItemStore store;
// Add multiple items
for (int i = 0; i < 5; i++) {
std::shared_ptr<Item> item(new Item(i, "item" + QString::number(i), 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
}
QVERIFY(store.getItems()->size() == 5);
// Clear all items
store.clear();
QVERIFY(store.getItems()->empty());
}
void testItemStoreUpdateItem()
{
ItemStore store;
std::shared_ptr<Item> item(new Item(1, "test_item", 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
// Update item value
ItemUpdateRequest update;
update.type = ITEM_UPDATE_USER;
ItemData updatedData(1, "test_item", 1); // value = 1
update.payload = updatedData;
update.changes.value = true;
store.updateItem(update);
// Verify value was updated
std::shared_ptr<Item> found = store.getItem(1);
QVERIFY(found->getValue() == 1);
}
void testItemStoreUpdateMultipleItems()
{
ItemStore store;
// Add items
for (int i = 0; i < 3; i++) {
std::shared_ptr<Item> item(new Item(i, "item" + QString::number(i), 0));
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
}
// Update multiple items
std::vector<ItemUpdateRequest> updates;
for (int i = 0; i < 3; i++) {
ItemUpdateRequest update;
update.type = ITEM_UPDATE_USER;
ItemData data(i, "item" + QString::number(i), 1);
update.payload = data;
update.changes.value = true;
updates.push_back(update);
}
store.updateItems(updates);
// Verify all values were updated
for (int i = 0; i < 3; i++) {
std::shared_ptr<Item> found = store.getItem(i);
QVERIFY(found->getValue() == 1);
}
}
void testItemStoreJsonSerialization()
{
ItemStore store;
// Add items
for (int i = 0; i < 2; i++) {
std::shared_ptr<Item> item(new Item(i, "item" + QString::number(i), i));
item->setGroupName("TestGroup");
ItemAddRequest request;
request.type = ITEM_UPDATE_USER;
request.payload = item;
request.changes = ItemFieldChanges(true);
store.addItem(request);
}
// Serialize to JSON
QJsonObject json;
store.store(json);
// Verify JSON contains items array
QVERIFY(json.contains("Items"));
QVERIFY(json["Items"].toArray().size() == 2);
}
void testItemStoreReplaceItems()
{
ItemStore store;
// Add initial items
std::shared_ptr<Item> item1(new Item(1, "item1", 0));
ItemAddRequest request1;
request1.type = ITEM_UPDATE_USER;
request1.payload = item1;
request1.changes = ItemFieldChanges(true);
store.addItem(request1);
QVERIFY(store.getItems()->size() == 1);
// Replace with new items
std::vector<std::shared_ptr<Item>> newItems;
newItems.push_back(std::shared_ptr<Item>(new Item(2, "new_item1", 0)));
newItems.push_back(std::shared_ptr<Item>(new Item(3, "new_item2", 1)));
store.replaceItems(newItems);
// Should have new items
QVERIFY(store.getItems()->size() == 2);
// Old item should be removed
QVERIFY(store.getItem(1) == nullptr);
}
void cleanupTestCase()
{
// Cleanup after all tests
}
};
QTEST_APPLESS_MAIN(TestItemStore)
#include "test_itemstore.moc"