diff --git a/src/field.h b/src/field.h index 34dd513faace05dfc54467a53db72bb155645ddb..01b6729fb5caf56a3dee485b875e6e4acbeaf82b 100644 --- a/src/field.h +++ b/src/field.h @@ -18,6 +18,10 @@ bool compute_e(charge_t c, vec2 p, double eps, vec2 *e); // Return false if for some qiP, norm(qiP) < eps bool compute_total_normalized_e(charge_t *charges, int num_charges, vec2 p, double eps, vec2 *e); +bool line_reach_charge(vec2 pos, charge_t * charges, double num_charges, double dx); + +bool is_in_screen(coordinates_t pos); + void draw_everything( struct gfx_context_t *ctxt, charge_t *charges, diff --git a/src/field_tests.c b/src/field_tests.c index 51577278c148336fc8ae1ca67b3aeebec4355826..80281a1a35c02ea753efd6fd50aab4a49d355640 100644 --- a/src/field_tests.c +++ b/src/field_tests.c @@ -34,7 +34,6 @@ bool dbl_eq(double a, double b) 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), @@ -70,26 +69,107 @@ test_result t_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_compute_delta_x_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; - return (test_result){.passed = passed, .name = "Test compute_delta_x 0"}; + 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, true, 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"}; } // Add or remove your test function name here -const unit_test_t tests[] = {t_compute_e_0, t_compute_total_normalized_e_0, t_compute_delta_x_0, t_is_in_screen_0}; +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}; int main() {