  // Windows - 1251 (ANSI)

#include <locale.h>
#include "AE_bfield.h"

int main(int argc, char* argv[]) {

    setlocale(LC_ALL, "");

    /* Первая секция теста */

    printf("\n\n  Тест 1.1: Создаю поле нулевой размерности.\n");
    bfield* a = bfield_create(0, 0);

    printf("\n  Тест 1.2: Расширяю его до размера 5х5.\n");
    bfield_resize(&a, 5, 5);

    printf("\n  Тест 1.3: Вывожу его в файл info_1_3.txt.\n\n");
    bfield_info(a, "info_1_3.txt");

    printf("\n  Тест 1.4: Заполняю его в шахматном порядке.\n\n");

    for (uint32_t y = 0; y < 5; y++) {

        for (uint32_t x = 0; x < 5; x++) {

            ((x%2) ^ (y%2)) ? bfield_set(a, x, y) : bfield_clear(a, x, y);

        }
    }

    printf("\n  Тест 1.5: Вывожу его в файл info_1_5.txt.\n\n");
    bfield_info(a, "info_1_5.txt");

    printf("\n  Тест 1.6: Клонирую его.\n\n");
    bfield* b = bfield_clone(a);

    printf("\n  Тест 1.7: Вывожу клон в файл info_1_7.txt.\n\n");
    bfield_info(b, "info_1_7.txt");

    printf("\n  Тест 1.8: Обнуляю ячейки клона.\n\n");
    bfield_zero(b);

    printf("\n  Тест 1.9: Вывожу клон в файл info_1_9.txt.\n\n");
    bfield_info(b, "info_1_9.txt");

    printf("\n  Тест 1.10: Сужаю клон до нулевого размера.\n");
    bfield_resize(&b, 0, 0);

    printf("\n  Тест 1.11: Удаляю клон.\n\n");
    bfield_destroy(&b);

    printf("\n  Тест 1.12: Удаляю клон повторно.\n\n");
    bfield_destroy(&b);

    printf("\n  Тест 1.13: Расширяю оригинал до размера 10х10.\n");
    bfield_resize(&a, 10, 10);

    printf("\n  Тест 1.14: Вывожу оригинал в файл info_1_14.txt.\n\n");
    bfield_info(a, "info_1_14.txt");

    printf("\n  Тест 1.15: Инвертирую оригинал.\n\n");

    for (uint32_t y = 0; y < 10; y++) {

        for (uint32_t x = 0; x < 10; x++) {

            bfield_not(a, x, y);

        }
    }
    
    printf("\n  Тест 1.16: Вывожу оригинал в файл info_1_16.txt.\n\n");
    bfield_info(a, "info_1_16.txt");

    printf("\n  Тест 1.17: Сохраняю оригинал в файл bfield_1_17.bin.\n\n");
    bfield_save(a, "bfield_1_17.bin");

    printf("\n  Тест 1.18: Загружаю файл bfield_1_17.bin.\n\n");
    b = bfield_load("bfield_1_17.bin");

    printf("\n  Тест 1.19: Вывожу загруженный файл в info_1_19.txt.\n\n");
    bfield_info(b, "info_1_19.txt");

    printf("\n  Тест 1.20: Сужаю загруженный до размера 8х7.\n");
    bfield_resize(&b, 8, 7);

    printf("\n  Тест 1.21: Вывожу загруженный файл в info_1_21.txt.\n\n");
    bfield_info(b, "info_1_21.txt");

    printf("\n  Тест 1.22: Удаляю загруженный файл из памяти.\n\n");
    bfield_destroy(&b);

    printf("\n  Тест 1.23: Удаляю оригинал.\n\n");
    bfield_destroy(&a);

    /* Вторая секция теста */

    printf("\n\n  Тест 2.1: Создаю поле размерности 1543 x 2143.\n");
    printf("\n\n  Ручной расчёт: 12 + 1543 * 2143 / 8 = 413343,125 = 413344.\n");
    bfield* d = bfield_create(1543, 2143);

    printf("\n\n  Тест 2.2: Стираю поле.\n");
    bfield_destroy(&d);

    printf("\n\n  Тест 2.3: Создаю поле размерности 1024 x 1024.\n");
    printf("\n\n  Ручной расчёт: 12 + 1024 * 1024 / 8 = 131084.\n");
    d = bfield_create(1024, 1024);

    printf("\n\n  Тест 2.4: Стираю поле.\n");
    bfield_destroy(&d);

    printf("\n\n  Тест 2.5: Создаю поле размерности UINT32_MAX x UINT32_MAX.\n");
    d = bfield_create(UINT32_MAX, UINT32_MAX);

    printf("\n\n  Тест 2.6: Стираю поле.\n");
    bfield_destroy(&d);

    printf("\n\n  Тест 2.7: Создаю поле размерности 0x0000FFFF x 0x0000FFFF.\n");
    d = bfield_create(0x0000FFFF, 0x0000FFFF);

    printf("\n\n  Тест 2.8: Стираю поле.\n");
    bfield_destroy(&d);

    printf("\n\n  Тест 2.8: Создаю поле размерности 0x0000FFFF x 0x0001FFFF.\n");
    printf("\n\n  Имитация возможной проблемы с умножением.\n");
    printf("  Произведение уже не помещается в uint32_t, поэтому использовано uint64_t.\n");
    printf("  Последующее деление преобразует биты в байты и приведёт к uint32_t.\n");
    printf("  В случае x64 системы потребуется uint128_t, которого пока нет.\n");
    d = bfield_create(0x0000FFFF, 0x0001FFFF);

    printf("\n\n  Тест 2.9: Стираю поле.\n");
    bfield_destroy(&d);

    return 0;
}