#include "ecs/Components.h"
#include "math/Vector.h"
#include "rendering/Window.h"
#include "tests/ArrayListTests.h"
#include "tests/ArrayTests.h"
#include "tests/BitArrayTests.h"
#include "tests/BufferTests.h"
#include "tests/ClockTests.h"
#include "tests/ColorTests.h"
#include "tests/ComponentsTests.h"
#include "tests/FrustumTests.h"
#include "tests/HashMapTests.h"
#include "tests/ImageReaderTests.h"
#include "tests/ListTests.h"
#include "tests/MatrixStackTests.h"
#include "tests/MatrixTests.h"
#include "tests/NetworkTests.h"
#include "tests/PlaneTests.h"
#include "tests/QuaternionTests.h"
#include "tests/RandomTests.h"
#include "tests/RingBufferTests.h"
#include "tests/SplitStringTests.h"
#include "tests/StackTests.h"
#include "tests/StringBufferTests.h"
#include "tests/TypedBufferTests.h"
#include "tests/UniquePointerTests.h"
#include "tests/UtilsTests.h"
#include "tests/VectorTests.h"
#include "utils/Logger.h"

int main(int argAmount, char** args) {
    if(argAmount < 2) {
        LOG_ERROR("missing path to images");
        return 0;
    }
    ArrayTests::test();
    ArrayListTests::test();
    HashMapTests::test();
    ListTests::test();
    BitArrayTests::test();
    StringBufferTests::test();
    RandomTests::test();
    RingBufferTests::test();
    SplitStringTests::test();
    VectorTests::test();
    MatrixTests::test();
    StackTests::test();
    MatrixStackTests::test();
    PlaneTests::test();
    FrustumTests::test();
    QuaternionTests::test();
    UtilsTests::test();
    ColorTests::test();
    ClockTests::test();
    ImageReaderTests::test(args[1]);
    BufferTests::test();
    TypedBufferTests::test();
    UniquePointerTests::test();
    NetworkTests::test();
    ComponentsTests::test();

    struct Game {
        bool isRunning() {
            return true;
        }

        void tick() {
        }

        void render(float) {
        }
    };

    WindowOptions options(4, 3, {800, 480}, false, "Test");
    Window w;
    Error error = w.open(options);
    if(error.has()) {
        LOG_ERROR(error.message);
        return 0;
    }
    Game game;
    w.run(game, 10'000'000);
    return 0;
}