#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "../LatticeWorld.h"

void test_InitToZero(void) {
    unsigned int i;
    uint8_t *buf;
    LatticeWorld *world = CreateWorld(4, 3, NULL);
    buf = GetWorldData(world);
    for(i = 0; i < 12; ++i) {
        assert(buf[i] == 0);
    }
}

void test_CanBeInitialized(void) {
    unsigned int i;
    uint8_t *buf;
    uint8_t initWorld[12];
    for(i = 0; i < 12; ++i) {
        initWorld[i] = rand() % 0x0f;
    }
    LatticeWorld *world = CreateWorld(4, 3, initWorld);
    buf = GetWorldData(world);
    for(i = 0; i < 12; ++i) {
        assert(buf[i] == initWorld[i]);
    }
}

void test_ParticlesPropogate(void) {
    unsigned int i;
    uint8_t *buf;
    uint8_t initWorld[16];
    memset(initWorld, 0, sizeof(initWorld));
    initWorld[5] = 0x04;
    initWorld[6] = 0x08;
    initWorld[9] = 0x02;
    initWorld[10] = 0x01;
    LatticeWorld *world = CreateWorld(4, 4, initWorld);
    UpdateWorld(world);
    buf = GetWorldData(world);
    assert(buf[5] == 0x02);
    assert(buf[6] == 0x04);
    assert(buf[9] == 0x01);
    assert(buf[10] == 0x08);
}

void test_CollisionsScatter(void) {
    unsigned int i;
    uint8_t *buf;
    uint8_t initWorld[25];
    memset(initWorld, 0, sizeof(initWorld));
    initWorld[12] = 0x05;
    LatticeWorld *world = CreateWorld(5, 5, initWorld);
    UpdateWorld(world);
    buf = GetWorldData(world);
    assert(buf[7] == 0x02);
    assert(buf[17] == 0x08);
}

int main(void) {
    test_InitToZero();
    test_CanBeInitialized();
    test_ParticlesPropogate();
    test_CollisionsScatter();
    printf("\nTests completed successfully\n");
    return 0;
}
