Files
opendaq-example-function-block/example_module/tests/test_example_module.cpp
2026-02-24 13:19:03 +01:00

78 lines
2.7 KiB
C++

#include <gmock/gmock.h>
#include <testutils/testutils.h>
#include <opendaq/opendaq.h>
#include <opendaq/data_descriptor_factory.h>
#include <thread>
using namespace daq;
using ExampleModuleTest = testing::Test;
TEST_F(ExampleModuleTest, TestAdd)
{
const auto instance = Instance();
ASSERT_TRUE(instance.addFunctionBlock("ExampleIIRFilter").assigned());
}
TEST_F(ExampleModuleTest, TestPropCount)
{
const auto instance = Instance();
auto fb = instance.addFunctionBlock("ExampleIIRFilter");
ASSERT_EQ(fb.getAllProperties().getCount(), 6);
}
TEST_F(ExampleModuleTest, TestDataScaling)
{
const auto instance = Instance();
auto fb = instance.addFunctionBlock("ExampleIIRFilter");
fb.setPropertyValue("Scale", 2);
auto dataDescriptor = DataDescriptorBuilder().setSampleType(SampleType::Float32).setValueRange(Range(-10, 10)).build();
auto signal = SignalWithDescriptor(instance.getContext(), dataDescriptor, nullptr, "Data");
const auto domainDescriptor = DataDescriptorBuilder()
.setSampleType(SampleType::Int64)
.setUnit(Unit("s", -1, "seconds", "time"))
.setTickResolution(Ratio(1, 1000))
.setRule(LinearDataRule(1, 0))
.setOrigin("1970-01-01T01:00:00+00:00")
.build();
auto domainSignal = SignalWithDescriptor(instance.getContext(), domainDescriptor, nullptr, "DomainData");
signal.setDomainSignal(domainSignal);
fb.getInputPorts()[0].connect(signal);
auto streamReader = StreamReader(fb.getSignals()[0], SampleType::Float32, SampleType::Int64);
auto domainPacket = DataPacket(domainDescriptor, 10, 0);
auto packet = DataPacketWithDomain(domainPacket, dataDescriptor, 10);
float* data = static_cast<float*>(packet.getRawData());
for (auto i = 0; i < 10; i++)
data[i] = static_cast<float>(i);
signal.sendPacket(packet);
domainSignal.sendPacket(domainPacket);
SizeT count = 10;
std::vector<float> readData;
readData.resize(count);
auto status = streamReader.read(readData.data(), &count);
ASSERT_EQ(status.getReadStatus(), ReadStatus::Event);
ASSERT_EQ(count, 0);
while (count < 10)
{
using namespace std::chrono_literals;
count = streamReader.getAvailableCount();
std::this_thread::sleep_for(100ms);
}
ASSERT_EQ(count, 10);
status = streamReader.read(readData.data(), &count);
ASSERT_EQ(count, 10);
ASSERT_EQ(status.getReadStatus(), ReadStatus::Ok);
for (int i = 0; i < 10; i++)
ASSERT_EQ(static_cast<int>(readData[i]), i * 2);
}