Changeset - a85782edc8e8
[Not reviewed]
longmem
0 4 0
Hasan Yavuz Ă–ZDERYA - 8 years ago 2017-07-15 12:04:12
hy@ozderya.net
initial tests for ChunkedBuffer
4 files changed with 33 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/chunkedbuffer.cpp
Show inline comments
 
@@ -16,73 +16,73 @@
 
  You should have received a copy of the GNU General Public License
 
  along with serialplot.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#include "chunkedbuffer.h"
 

	
 
ChunkedBuffer::ChunkedBuffer()
 
{
 
    numChunks = 0;
 
    _size = 0;
 

	
 
    // create first chunk
 
    addChunk();
 
    addNewChunk();
 
}
 

	
 
~ChunkedBuffer::ChunkedBuffer()
 
ChunkedBuffer::~ChunkedBuffer()
 
{
 
    for (auto chunk : chunks)
 
    {
 
        delete chunk;
 
    }
 
}
 

	
 
void ChunkedBuffer::addSamples(double* samples, size_t size)
 
{
 
    size_t i = 0;
 

	
 
    while (i < size)
 
    {
 
        // select chunk to add data
 
        auto chunk = chunk->last();
 
        auto chunk = chunks.last();
 
        if (chunk->isFull())
 
        {
 
            chunk = addChunk(); // create a new chunk
 
            chunk = addNewChunk(); // create a new chunk
 
        }
 

	
 
        // add data to chunk
 
        size_t c = std::min(chunk->left(), (size - i));
 
        chunk->addSamples(&samples[i], c);
 
        i += c;
 
    }
 

	
 
    _size += size;
 
}
 

	
 
DataChunk* ChunkedBuffer::addChunk()
 
DataChunk* ChunkedBuffer::addNewChunk()
 
{
 
    auto chunk = new DataChunk(_size, CHUNK_SIZE);
 
    chunks.append(chunk);
 
    return chunk;
 
}
 

	
 
size_t ChunkedBuffer::size() const
 
{
 
    return _size;
 
}
 

	
 
QRectF ChunkedBuffer::boundingRect() const
 
{
 
    // TODO: it should be possible to cache boundingRect and only
 
    // update on 'addSamples' and when dropping chunks
 

	
 
    // find ymin and ymax
 
    ymin = chunks->first().min();
 
    ymax = chunks->first().max();
 
    double ymin = chunks.first()->min();
 
    double ymax = chunks.first()->max();
 
    for (auto c : chunks)
 
    {
 
        ymin = std::min(ymin, c->min());
 
        ymax = std::max(ymax, c->max());
 
    }
 

	
 
    return QRectF(0, ymax, _size, (ymax-ymin));
 
}
src/chunkedbuffer.h
Show inline comments
 
@@ -15,37 +15,40 @@
 

	
 
  You should have received a copy of the GNU General Public License
 
  along with serialplot.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#ifndef CHUNKEDBUFFER_H
 
#define CHUNKEDBUFFER_H
 

	
 
#include <QPointF>
 
#include <QRectF>
 
#include <QVector>
 

	
 
#include "datachunk.h"
 

	
 
#define CHUNK_SIZE (1024)
 

	
 
class ChunkedBuffer
 
{
 
public:
 
    ChunkedBuffer();
 
    ~ChunkedBuffer();
 

	
 
    void addSamples(double* samples, size_t size);
 
    void clear();
 

	
 
    // QwtSeriesData related implementations
 
    size_t size() const;
 
    QRectF boundingRect() const;
 
    double sample(size_t i) const;
 

	
 
private:
 
    size_t _size; // size of `data`
 
    size_t numChunks;
 

	
 
    QList<DataChunk*> chunks;
 
    DataChunk* addNewChunk();
 
};
 

	
 

	
 
#endif // CHUNKEDBUFFER_H
tests/CMakeLists.txt
Show inline comments
 
@@ -14,19 +14,21 @@
 
# 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 <http://www.gnu.org/licenses/>.
 
#
 

	
 
# Find the QtWidgets library
 
find_package(Qt5Widgets)
 

	
 
include_directories("../src")
 

	
 
add_executable(Test EXCLUDE_FROM_ALL
 
  test.cpp ../src/datachunk.cpp)
 
  test.cpp
 
  ../src/datachunk.cpp
 
  ../src/chunkedbuffer.cpp)
 
add_test(NAME test1 COMMAND Test)
 
qt5_use_modules(Test Widgets)
 

	
 
set(CMAKE_CTEST_COMMAND ctest -V)
 
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
 
add_dependencies(check Test)
tests/test.cpp
Show inline comments
 
@@ -12,24 +12,25 @@
 
  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 <http://www.gnu.org/licenses/>.
 
*/
 

	
 
#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
 
#include "catch.hpp"
 

	
 
#include "datachunk.h"
 
#include "chunkedbuffer.h"
 

	
 
TEST_CASE("DataChunk created empty", "[memory]")
 
{
 
    DataChunk c(0, 1000);
 
    REQUIRE(c.size() == 0);
 
    REQUIRE(c.capacity() == 1000);
 
    REQUIRE(c.start() == 0);
 
    REQUIRE(c.end() == 0);
 
    REQUIRE_FALSE(c.isFull());
 
    REQUIRE(c.left() == 1000);
 
}
 

	
 
@@ -68,12 +69,31 @@ TEST_CASE("filling data chunk", "[memory
 

	
 
    REQUIRE(c.size() == 1000);
 
    REQUIRE(c.capacity() == 1000);
 
    REQUIRE(c.start() == 0);
 
    REQUIRE(c.end() == 1000);
 
    REQUIRE(c.left() == 0);
 

	
 
    REQUIRE(c.min() == 1);
 
    REQUIRE(c.max() == 1000);
 
    REQUIRE(c.avg() == Approx(500.5));
 
    REQUIRE(c.meanSquare() == Approx(333833.5));
 
}
 

	
 
TEST_CASE("ChunkedBuffer created empty", "[memory]")
 
{
 
    ChunkedBuffer b;
 

	
 
    REQUIRE(b.size() == 0);
 
    REQUIRE(b.boundingRect() == QRectF(0,0,0,0));
 
}
 

	
 
TEST_CASE("ChunkedBuffer adding data", "[memory]")
 
{
 
    ChunkedBuffer b;
 

	
 
    // add some small data
 
    double samples[10] = {1,2,3,4,5,6,7,8,9,10};
 
    b.addSamples(samples, 10);
 

	
 
    REQUIRE(b.size() == 10);
 
}
0 comments (0 inline, 0 general)