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
 
@@ -22,16 +22,16 @@
 
ChunkedBuffer::ChunkedBuffer()
 
{
 
    numChunks = 0;
 
    _size = 0;
 

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

	
 
~ChunkedBuffer::ChunkedBuffer()
 
ChunkedBuffer::~ChunkedBuffer()
 
{
 
    for (auto chunk : chunks)
 
    {
 
        delete chunk;
 
    }
 
}
 
@@ -40,28 +40,28 @@ void ChunkedBuffer::addSamples(double* s
 
{
 
    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;
 
}
 

	
 
@@ -73,14 +73,14 @@ size_t ChunkedBuffer::size() const
 
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());
 
    }
 

	
src/chunkedbuffer.h
Show inline comments
 
@@ -21,12 +21,14 @@
 
#define CHUNKEDBUFFER_H
 

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

	
 
#include "datachunk.h"
 

	
 
#define CHUNK_SIZE (1024)
 

	
 
class ChunkedBuffer
 
{
 
public:
 
    ChunkedBuffer();
 
@@ -42,10 +44,11 @@ public:
 

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

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

	
 

	
 
#endif // CHUNKEDBUFFER_H
tests/CMakeLists.txt
Show inline comments
 
@@ -20,13 +20,15 @@
 
# 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
 
@@ -18,12 +18,13 @@
 
*/
 

	
 
#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);
 
@@ -74,6 +75,25 @@ TEST_CASE("filling data chunk", "[memory
 

	
 
    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)