Skip to content
Snippets Groups Projects
Select Git revision
  • 2343770c01c45b31738c9d87d5ef1f740fef70bf
  • main default protected
  • polish
3 results

field_tests.c

Blame
  • 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");
    }