#include "tests/BufferTests.h"

#include "tests/Test.h"
#include "utils/Buffer.h"
#include "utils/Utility.h"

static constexpr int SIZE_TYPES =
    sizeof(int) + sizeof(long) + sizeof(float) + sizeof(double);

static void testAdd(Test& test) {
    Buffer buffer(10);
    for(int i = 0; i < 100000; i++) {
        buffer.add(5);
        buffer.add(5L);
        buffer.add(5.0f);
        buffer.add(5.0);
    }
    test.checkEqual(SIZE_TYPES * 100000, buffer.getLength(),
                    "add increments length");
}

static void testCopy(Test& test) {
    Buffer buffer(10);
    for(int i = 0; i < 10; i++) {
        buffer.add(5);
        buffer.add(5L);
        buffer.add(5.0f);
        buffer.add(5.0);
    }
    Buffer buffer2(buffer);
    Buffer buffer3(2);
    buffer3 = buffer;

    test.checkEqual(SIZE_TYPES * 10, buffer.getLength(), "copy");
    test.checkEqual(SIZE_TYPES * 10, buffer2.getLength(), "copy");
    test.checkEqual(SIZE_TYPES * 10, buffer3.getLength(), "copy");
}

static void testMoveConstruct(Test& test) {
    Buffer buffer(10);
    for(int i = 0; i < 10; i++) {
        buffer.add(5);
        buffer.add(5L);
        buffer.add(5.0f);
        buffer.add(5.0);
    }
    Buffer buffer2(Core::move(buffer));

    test.checkEqual(0, buffer.getLength(), "move");
    test.checkEqual(SIZE_TYPES * 10, buffer2.getLength(), "move");
}

static void testMove(Test& test) {
    Buffer buffer(10);
    for(int i = 0; i < 10; i++) {
        buffer.add(5);
        buffer.add(5L);
        buffer.add(5.0f);
        buffer.add(5.0);
    }
    Buffer buffer2(3);
    buffer2 = Core::move(buffer);

    test.checkEqual(0, buffer.getLength(), "move");
    test.checkEqual(SIZE_TYPES * 10, buffer2.getLength(), "move");
}

void BufferTests::test() {
    Test test("Buffer");
    testAdd(test);
    testCopy(test);
    testMoveConstruct(test);
    testMove(test);
    test.finalize();
}