diff --git a/tests/test_recorder.cpp b/tests/test_recorder.cpp new file mode 100644 --- /dev/null +++ b/tests/test_recorder.cpp @@ -0,0 +1,107 @@ +/* + Copyright © 2018 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + serialplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with serialplot. If not, see . +*/ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#include "catch.hpp" + +#include +#include "datarecorder.h" +#include "test_helpers.h" + +#define TEST_FILE_NAME "sp_test_recording.csv" + +TEST_CASE("test recording single channel", "[recorder]") +{ + DataRecorder rec; + TestSource source(1, false); + + // temporary file, remove if exists + auto fileName = QDir::tempPath() + QString("/" TEST_FILE_NAME); + if (QFile::exists(fileName)) QFile::remove(fileName); + + // connect source → sink + source.connectSink(&rec); + + // prepare data + QStringList channelNames({"Channel 1"}); + SamplePack samples(5, 1); + for (int i = 0; i < 5; i++) + { + samples.data(0)[i] = i+1; + } + + // test + rec.startRecording(fileName, ",", channelNames, false); + source._feed(samples); + rec.stopRecording(); + + // read file contents back + QFile recordFile(fileName); + REQUIRE(recordFile.open(QIODevice::ReadOnly | QIODevice::Text)); + // NOTE: mind the extra parantheses, otherwise 'catch' macros fail to compile + REQUIRE((recordFile.readLine() == "Channel 1\n")); + for (int i = 0; i < 5; i++) + REQUIRE((recordFile.readLine() == QString("%1\n").arg(i+1))); + + // cleanup + if (QFile::exists(fileName)) QFile::remove(fileName); +} + +TEST_CASE("test recording multiple channels", "[recorder]") +{ + DataRecorder rec; + TestSource source(3, false); + + // temporary file, remove if exists + auto fileName = QDir::tempPath() + QString("/" TEST_FILE_NAME); + if (QFile::exists(fileName)) QFile::remove(fileName); + + // connect source → sink + source.connectSink(&rec); + + // prepare data + QStringList channelNames({"Channel 1", "Channel 2", "Channel 3"}); + SamplePack samples(5, 3); + for (int ci = 0; ci < 3; ci++) + { + for (int i = 0; i < 5; i++) + { + samples.data(ci)[i] = (ci+1)*(i+1); + } + } + + // test + rec.startRecording(fileName, ",", channelNames, false); + source._feed(samples); + rec.stopRecording(); + + // read file contents back + QFile recordFile(fileName); + REQUIRE(recordFile.open(QIODevice::ReadOnly | QIODevice::Text)); + // NOTE: mind the extra parantheses, otherwise 'catch' macros fail to compile + REQUIRE((recordFile.readLine() == "Channel 1,Channel 2,Channel 3\n")); + REQUIRE((recordFile.readLine() == "1,2,3\n")); + REQUIRE((recordFile.readLine() == "2,4,6\n")); + REQUIRE((recordFile.readLine() == "3,6,9\n")); + REQUIRE((recordFile.readLine() == "4,8,12\n")); + REQUIRE((recordFile.readLine() == "5,10,15\n")); + + // cleanup + if (QFile::exists(fileName)) QFile::remove(fileName); +}