#include "ApplicationSetup.hpp"
#include <QtNodes/DataFlowGraphModel>
#include <QtNodes/Definitions>
#include <QtNodes/NodeDelegateModel>
#include <QtNodes/NodeDelegateModelRegistry>
#include <catch2/catch.hpp>
#include <QSignalSpy>
using QtNodes::DataFlowGraphModel;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDelegateModel;
using QtNodes::NodeDelegateModelRegistry;
using QtNodes::NodeId;
using QtNodes::NodeRole;
using QtNodes::PortIndex;
using QtNodes::PortType;
namespace {
class NicknameNode : public NodeDelegateModel
{
public:
QString name() const override { return QStringLiteral("NicknameNode"); }
QString caption() const override { return QStringLiteral("Test Node"); }
QString label() const override { return QStringLiteral("Default nickname"); }
bool labelVisible() const override { return false; }
bool labelEditable() const override { return true; }
unsigned int nPorts(PortType) const override { return 0; }
NodeDataType dataType(PortType, PortIndex) const override { return {}; }
void setInData(std::shared_ptr<NodeData>, PortIndex) override {}
std::shared_ptr<NodeData> outData(PortIndex) override { return nullptr; }
QWidget *embeddedWidget() override { return nullptr; }
};
std::shared_ptr<NodeDelegateModelRegistry> makeRegistry()
{
auto registry = std::make_shared<NodeDelegateModelRegistry>();
registry->registerModel<NicknameNode>();
return registry;
}
}
TEST_CASE("Nickname can be read and changed", "[nickname]")
{
auto app = applicationSetup();
DataFlowGraphModel model(makeRegistry());
NodeId const nodeId = model.addNode(QStringLiteral("NicknameNode"));
CHECK(model.nodeData(nodeId, NodeRole::Label).toString() == QStringLiteral("Default nickname"));
CHECK_FALSE(model.nodeData(nodeId, NodeRole::LabelVisible).toBool());
CHECK(model.nodeData(nodeId, NodeRole::LabelEditable).toBool());
QSignalSpy nodeUpdatedSpy(&model, &DataFlowGraphModel::nodeUpdated);
CHECK(model.setNodeData(nodeId, NodeRole::Label, QStringLiteral("New nickname")));
CHECK(model.setNodeData(nodeId, NodeRole::LabelVisible, true));
CHECK(nodeUpdatedSpy.count() == 2);
}
TEST_CASE("Nickname is saved and loaded", "[nickname]")
{
auto app = applicationSetup();
auto registry = makeRegistry();
DataFlowGraphModel model(registry);
NodeId const nodeId = model.addNode(QStringLiteral("NicknameNode"));
model.setNodeData(nodeId, NodeRole::Label, QStringLiteral("Saved nickname"));
model.setNodeData(nodeId, NodeRole::LabelVisible, true);
QJsonObject const nodeJson = model.saveNode(nodeId);
DataFlowGraphModel restoredModel(registry);
restoredModel.loadNode(nodeJson);
CHECK(restoredModel.nodeData(nodeId, NodeRole::Label).toString()
== QStringLiteral("Saved nickname"));
CHECK(restoredModel.nodeData(nodeId, NodeRole::LabelVisible).toBool());
}