Select Git revision
field_tests.c
field_tests.c 6.25 KiB
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include "field.h"
typedef struct _test_result
{
bool passed;
const char *name;
} test_result;
typedef test_result (*unit_test_t)(void);
void print_in_color(char *color, char *text)
{
printf("\033%s", color);
printf("%s", text);
printf("\033[0m");
}
void print_in_red(char *text)
{
print_in_color("[0;31m", text);
}
void print_in_green(char *text)
{
print_in_color("[0;32m", text);
}
bool dbl_eq(double a, double b)
{
return fabs(a - b) < 1e-6;
}
test_result t_compute_e_0()
{
double test_charge_q[] = {0.25, -0.25, -0.75, 0.9, 0.5};
vec2 test_position[] = {
vec2_create(0.25, 0.6),
vec2_create(0.01, 0.01),
vec2_create(0.9, 0.9),
vec2_create(0.5, 0.5),
vec2_create(0.25, 0.25)
};
vec2 awaited_result[] = {
vec2_create(0, 224700000000.000122),
vec2_create(3320060992.530107, 6778457859.748968),
vec2_create(-9855843283.957649, -6065134328.589322),
vec2_create(129427200000, 0),
vec2_create(0, -71904000000)
};
uint32_t nb_tests = sizeof(test_charge_q) / sizeof(double);
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
charge_t c = charge_create(test_charge_q[i], vec2_create(0.25, 0.5));
vec2 res = vec2_create_zero();
compute_e(c, test_position[i], 0.01, &res);
if (!vec2_is_approx_equal(res, awaited_result[i], 0.0001))
{
passed = false;
break;
}
}
return (test_result){.passed = passed, .name = "Test compute_e 0"};
}
test_result t_compute_total_normalized_e_0()
{
double test_charge_q[] = {0.25, -0.25, -0.75, 0.9, 0.5};
vec2 test_position[] = {
vec2_create(0.25, 0.6),
vec2_create(0.01, 0.01),
vec2_create(0.9, 0.9),
vec2_create(0.5, 0.5),
vec2_create(0.25, 0.25)
};
vec2 awaited_result[] = {
vec2_create(0.037974, 0.999279),
vec2_create(-0.178064, -0.984019),
vec2_create(-0.108527, -0.994093),
vec2_create(1.000000, 0.000000),
vec2_create(0.192772, -0.981244)
};
uint32_t nb_tests = sizeof(test_charge_q) / sizeof(double);
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
charge_t c[2] = {
charge_create(-0.25, vec2_create(0.75, 0.5)),
charge_create(0.25, vec2_create(0.25, 0.5))
};
vec2 res = vec2_create_zero();
compute_total_normalized_e(c, 2, test_position[i], 0.01, &res);
if (!vec2_is_approx_equal(res, awaited_result[i], 0.0001))
{
passed = false;
break;
}
}
return (test_result){.passed = passed, .name = "Test compute_total_normalized 0"};
}
test_result t_line_reach_charge_0()
{
charge_t c[2] = {
charge_create(-0.25, vec2_create(0.75, 0.5)),
charge_create(0.25, vec2_create(0.25, 0.5))
};
vec2 test_position[] = {
vec2_create(0.231, 0.481),
vec2_create(0.731, 0.519),
vec2_create(0.78, 0.5),
vec2_create(0.75, 0.5),
vec2_create(0.25, 0.5),
vec2_create(0.24, 0.49)
};
bool results[] = {false, false, false, true, true, true};
uint32_t nb_tests = sizeof(results) / sizeof(bool);
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
if (line_reach_charge(test_position[i], c, 2, 25) != results[i]){
passed = false;
break;
}
}
return (test_result){.passed = passed, .name = "Test line_reach_charge 0"};
}
test_result t_is_in_screen_0()
{
bool passed = true;
coordinates_t p[] = {
coordinates_create(99 / WID * 100, 1 / HEI * 100),
coordinates_create(50 / WID * 100, 50 / HEI * 100),
coordinates_create(1 / WID * 100, 99 / HEI * 100),
coordinates_create(WID, HEI),
coordinates_create(-1, HEI / 2),
coordinates_create(WID / 2, -1),
coordinates_create(-1, -1),
coordinates_create(WID + 10, HEI/2),
coordinates_create(WID / 2, HEI + 10),
coordinates_create(WID + 10, HEI + 10)
};
bool results[] = {true, true, true, false, false, false, false, false, false, false};
uint32_t nb_tests = sizeof(results) / sizeof(bool);
for (size_t i = 0; i < nb_tests; i++)
{
if(is_in_screen(p[i]) != results[i]){
passed = false;
break;
}
}
return (test_result){.passed = passed, .name = "Test is_in_screen 0"};
}
test_result t_force_in_screen_0()
{
bool passed = true;
coordinates_t p[] = {
coordinates_create(99 / WID * 100, 1 / HEI * 100),
coordinates_create(50 / WID * 100, 50 / HEI * 100),
coordinates_create(1 / WID * 100, 99 / HEI * 100),
coordinates_create(WID, HEI),
coordinates_create(-1, HEI / 2),
coordinates_create(WID / 2, -1),
coordinates_create(-1, -1),
coordinates_create(WID + 10, HEI/2),
coordinates_create(WID / 2, HEI + 10),
coordinates_create(WID + 10, HEI + 10)
};
coordinates_t p_results[] = {
coordinates_create(99 / WID * 100, 1 / HEI * 100),
coordinates_create(50 / WID * 100, 50 / HEI * 100),
coordinates_create(1 / WID * 100, 99 / HEI * 100),
coordinates_create(WID-1, HEI-1),
coordinates_create(0, HEI / 2),
coordinates_create(WID / 2, 0),
coordinates_create(0, 0),
coordinates_create(WID -1, HEI/2),
coordinates_create(WID / 2, HEI -1),
coordinates_create(WID -1, HEI -1)
};
uint32_t nb_tests = sizeof(p_results) / sizeof(coordinates_t);
for (size_t i = 0; i < nb_tests; i++)
{
force_in_screen(&p[i]);
if(p[i].column != p_results[i].column || p[i].row != p_results[i].row){
passed = false;
break;
}
}
return (test_result){.passed = passed, .name = "Test is_in_screen 0"};
}
// Add or remove your test function name here
const unit_test_t tests[] = {t_compute_e_0, t_compute_total_normalized_e_0, t_line_reach_charge_0, t_is_in_screen_0, t_force_in_screen_0};
int main()
{
uint32_t nb_tests = sizeof(tests) / sizeof(unit_test_t);
char message[256];
bool all_passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
printf("Running test n°%d: ...\n", i);
test_result r = tests[i]();
if (r.passed)
{
sprintf(message, "\t- %s : OK", r.name);
print_in_green(message);
}
else
{
all_passed = false;
sprintf(message, "\t- %s : FAILED", r.name);
print_in_red(message);
}
printf("\n");
}
if (all_passed)
print_in_green("\nTests suite result : OK\n");
else
print_in_red("\nTests suite result : FAILED\n");
}