/
ygl
/
test_statdata
Обзор
Документация
Войти
/
ygl
/
test_statdata
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
test/test.c
148 строк
7 KB
user
togit
04 ноя 2025, 15:46
04 ноя 2025, 15:46
53c0af3
Код
Авторство
О чём код?
#include <stdio.h> #include <math.h> #include <time.h> #include "../src/stat.h" /* **Утилита должна:** - Сформировать файлы данных для утилиты обработки данных из массивов данных, определённых в ней в качестве констант; - Запустить утилиту обработки данных; - Считать результат обработки и сравнить его с эталонными данными (константами в памяти утилиты тестирования); - При расхождении ожидаемого результата с полученным печатать сообщение об ошибке (в `stderr`); - При успешном прохождении теста печатать отчёт о времени выполнения тестов и списке пройдённых тестов (в `stdout`). */ /* 1. Исходный тест */ const StatData case_1_in_a[2] = { {.id = 90889, .count = 13, .cost = 3.567, .primary = 0, .mode = 3}, {.id = 90089, .count = 1, .cost = 88.90, .primary = 1, .mode = 0} }; const StatData case_1_in_b[2] = { {.id = 90089, .count = 13, .cost = 0.011, .primary = 0, .mode = 2}, {.id = 90189, .count = 1000, .cost = 1.00003, .primary = 1, .mode = 2} }; const StatData case_1_out[3] = { {.id = 90189, .count = 1000, .cost = 1.00003, .primary = 1, .mode = 2}, {.id = 90889, .count = 13, .cost = 3.567, .primary = 0, .mode = 3}, {.id = 90089, .count = 14, .cost = 88.911, .primary = 0, .mode = 2} }; const char* case_1_name = "1. исходный тест"; /* Тест 2: Пустые массивы */ const StatData case_2_in_a[0] = {}; const StatData case_2_in_b[0] = {}; const StatData case_2_out[0] = {}; const char* case_2_name = "2. пустые массивы"; /* Тест 3: Дубликаты в одном массиве */ const StatData case_3_in_a[3] = { {.id = 100, .count = 5, .cost = 10.0, .primary = 1, .mode = 1}, {.id = 100, .count = 3, .cost = 5.0, .primary = 0, .mode = 2}, {.id = 200, .count = 10, .cost = 20.0, .primary = 1, .mode = 3} }; const StatData case_3_in_b[1] = { {.id = 150, .count = 7, .cost = 15.0, .primary = 1, .mode = 1} }; const StatData case_3_out[3] = { {.id = 100, .count = 8, .cost = 15.0, .primary = 0, .mode = 2}, {.id = 150, .count = 7, .cost = 15.0, .primary = 1, .mode = 1}, {.id = 200, .count = 10, .cost = 20.0, .primary = 1, .mode = 3} }; const char* case_3_name = "3. Дубликаты в одном массиве"; /* Тест 4: Один пустой массив */ const StatData case_4_in_a[2] = { {.id = 500, .count = 100, .cost = 50.5, .primary = 1, .mode = 5}, {.id = 600, .count = 200, .cost = 100.5, .primary = 0, .mode = 7} }; const StatData case_4_in_b[0] = {}; const StatData case_4_out[2] = { {.id = 500, .count = 100, .cost = 50.5, .primary = 1, .mode = 5}, {.id = 600, .count = 200, .cost = 100.5, .primary = 0, .mode = 7} }; const char* case_4_name = "4. Один пустой массив"; /* Тест 5: массив на 100000 */ static StatData case_stress_a[100000]; static StatData case_stress_b[100000]; static StatData case_stress_out[200000]; static void prepare_stress_data(void) { for (int i = 0; i < 100000; ++i) { case_stress_a[i] = (StatData){.id = (i+1)*2, .count = i, .cost = i*0.2f, .primary = i & 1, .mode = i % 8}; case_stress_b[i] = (StatData){.id = (i+1)*2+1, .count = i, .cost = i*0.2f+0.1f, .primary = i & 1, .mode = i % 8}; case_stress_out[i*2] = (StatData){.id = (i+1)*2, .count = i, .cost = i*0.2f, .primary = i & 1, .mode = i % 8}; case_stress_out[i*2+1] = (StatData){.id = (i+1)*2+1, .count = i, .cost = i*0.2f+0.1f, .primary = i & 1, .mode = i % 8}; } } char* case_stress1_name = "5. Тест максимальной длинны"; /* Тест 5: массив на 100000 с коллизиями, сейчас 40к коллизий на 200000 в этом тесте */ static StatData case_stress2_a[100000]; static StatData case_stress2_b[100000]; static StatData case_stress2_out[200000]; static void prepare_stress2_data(void) { for (int i = 0; i < 100000; ++i) { case_stress2_a[i] = (StatData){.id = (i+1) * 100000000000l, .count = i, .cost = i*0.2f, .primary = i & 1, .mode = i % 8}; case_stress2_b[i] = (StatData){.id = (i+1) * 10000l, .count = i, .cost = i*0.2f+0.1f, .primary = i & 1, .mode = i % 8}; case_stress2_out[i*2] = (StatData){.id = (i+1) * 100000000000l, .count = i, .cost = i*0.2f, .primary = i & 1, .mode = i % 8}; case_stress2_out[i*2+1] = (StatData){.id = (i+1) * 10000l, .count = i, .cost = i*0.2f+0.1f, .primary = i & 1, .mode = i % 8}; } } char* case_stress2_name = "6. Тест максимальной длинны с коллизиями"; #define EPSILON 1e-4f void run_case(const char* name, const StatData* in_a, long na, const StatData* in_b, long nb, const StatData* out, long nout){ printf("Test started (%s).\n", name); clock_t t0 = clock(); const char *tmp_a = "/tmp/case_a.dump"; const char *tmp_b = "/tmp/case_b.dump"; const char *tmp_out = "/tmp/case_out.dump"; StoreDump(tmp_a, in_a, na); StoreDump(tmp_b, in_b, nb); char cmd[256]; snprintf(cmd, sizeof(cmd), "./build/stat %s %s %s", tmp_a, tmp_b, tmp_out); if (system(cmd)){ fprintf(stderr, "TEST failed(%s), cmd util error\n", name); return; }; StatData *res = NULL; long rn = 0; LoadDump(tmp_out, &res, &rn); if (rn != nout) { fprintf(stderr, "TEST failed(%s), LoadDump size %li != %li\n", name, rn, nout); } for (long i = 0; i < nout; ++i) { if (res[i].id != out[i].id || res[i].count != out[i].count || fabsf(res[i].cost - out[i].cost) > EPSILON || res[i].primary != out[i].primary || res[i].mode != out[i].mode) { fprintf(stderr, "TEST failed(%s), compare at %zu\n",name, i); free(res); } } free(res); clock_t t1 = clock(); double elapsed = (double)(t1 - t0) / CLOCKS_PER_SEC; printf("Test passed (%s). Time: %.6f s\n", name, elapsed); } int main() { printf("=== Test Results ===\n"); run_case(case_1_name, case_1_in_a, 2, case_1_in_b, 2, case_1_out, 3); run_case(case_2_name, case_2_in_a, 0, case_2_in_b, 0, case_2_out, 0); run_case(case_3_name, case_3_in_a, 3, case_3_in_b, 1, case_3_out, 3); run_case(case_4_name, case_4_in_a, 2, case_4_in_b, 0, case_4_out, 2); prepare_stress_data(); run_case(case_stress1_name, case_stress_a, 100000, case_stress_b, 100000, case_stress_out, 200000); prepare_stress2_data(); run_case(case_stress2_name, case_stress2_a, 100000, case_stress2_b, 100000, case_stress2_out, 200000); return 0; }