test_ssf_fresnel.c (4468B)
1 /* Copyright (C) 2016-2018, 2021-2025 |Méso|Star> (contact@meso-star.com) 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "ssf.h" 17 #include "test_ssf_utils.h" 18 19 static int fresnel_is_init = 0; 20 21 struct ALIGN(64) fresnel { 22 uint32_t id; 23 double cos_theta; 24 double value; 25 }; 26 27 static res_T 28 fresnel_init(struct mem_allocator* allocator, void* fresnel) 29 { 30 CHK(allocator != NULL); 31 CHK(fresnel != NULL); 32 CHK(IS_ALIGNED(fresnel, 64) == 1); 33 ((struct fresnel*)fresnel)->id = 0xDECAFBAD; 34 fresnel_is_init = 1; 35 return RES_OK; 36 } 37 38 static void 39 fresnel_release(void* fresnel) 40 { 41 CHK(fresnel != NULL); 42 CHK(((struct fresnel*)fresnel)->id == 0xDECAFBAD); 43 fresnel_is_init = 0; 44 } 45 46 static double 47 fresnel_eval(void* fresnel, const double cos_theta) 48 { 49 struct fresnel* f = fresnel; 50 CHK(f != NULL); 51 CHK(f->id == 0xDECAFBAD); 52 CHK(f->cos_theta == cos_theta); 53 return f->value; 54 } 55 56 int 57 main(int argc, char** argv) 58 { 59 struct mem_allocator allocator; 60 struct fresnel* data; 61 struct ssf_fresnel* fresnel; 62 struct ssf_fresnel_type type = SSF_FRESNEL_TYPE_NULL; 63 struct ssf_fresnel_type type2 = fresnel_dummy; 64 (void)argc, (void)argv; 65 66 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 67 68 type.init = fresnel_init; 69 type.release = fresnel_release; 70 type.eval = fresnel_eval; 71 type.sizeof_fresnel = sizeof(struct fresnel); 72 type.alignof_fresnel = ALIGNOF(struct fresnel); 73 74 CHK(ssf_fresnel_create(NULL, NULL, NULL) == RES_BAD_ARG); 75 76 CHK(ssf_fresnel_create(NULL, NULL, NULL) == RES_BAD_ARG); 77 CHK(ssf_fresnel_create(&allocator, NULL, NULL) == RES_BAD_ARG); 78 CHK(ssf_fresnel_create(NULL, &type, NULL) == RES_BAD_ARG); 79 CHK(ssf_fresnel_create(&allocator, &type, NULL) == RES_BAD_ARG); 80 CHK(ssf_fresnel_create(NULL, NULL, &fresnel) == RES_BAD_ARG); 81 CHK(ssf_fresnel_create(&allocator, NULL, &fresnel) == RES_BAD_ARG); 82 83 CHK(fresnel_is_init == 0); 84 CHK(ssf_fresnel_create(NULL, &type, &fresnel) == RES_OK); 85 CHK(fresnel_is_init == 1); 86 87 CHK(ssf_fresnel_ref_get(NULL) == RES_BAD_ARG); 88 CHK(ssf_fresnel_ref_get(fresnel) == RES_OK); 89 CHK(ssf_fresnel_ref_put(NULL) == RES_BAD_ARG); 90 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 91 CHK(fresnel_is_init == 1); 92 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 93 CHK(fresnel_is_init == 0); 94 95 CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_OK); 96 CHK(fresnel_is_init == 1); 97 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 98 CHK(fresnel_is_init == 0); 99 100 type2.init = NULL; 101 CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK); 102 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 103 type2.init = fresnel_dummy.init; 104 CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK); 105 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 106 107 type.eval = NULL; 108 CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG); 109 CHK(fresnel_is_init == 0); 110 type.eval = fresnel_eval; 111 type.alignof_fresnel = 0; 112 CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG); 113 CHK(fresnel_is_init == 0); 114 type.alignof_fresnel = ALIGNOF(struct fresnel); 115 CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_OK); 116 CHK(fresnel_is_init == 1); 117 118 CHK(ssf_fresnel_get_data(NULL, NULL) == RES_BAD_ARG); 119 CHK(ssf_fresnel_get_data(fresnel, NULL) == RES_BAD_ARG); 120 CHK(ssf_fresnel_get_data(NULL, (void**)&data) == RES_BAD_ARG); 121 CHK(ssf_fresnel_get_data(fresnel, (void**)&data) == RES_OK); 122 123 CHK(data->id == 0xDECAFBAD); 124 data->cos_theta = 0.1; 125 data->value = 1.234; 126 127 CHK(ssf_fresnel_eval(fresnel, 0.1) == data->value); 128 data->cos_theta = 1.234; 129 data->value = 8.1; 130 CHK(ssf_fresnel_eval(fresnel, 1.234) == data->value); 131 132 CHK(fresnel_is_init == 1); 133 CHK(ssf_fresnel_ref_put(fresnel) == RES_OK); 134 CHK(fresnel_is_init == 0); 135 136 check_memory_allocator(&allocator); 137 mem_shutdown_proxy_allocator(&allocator); 138 CHK(mem_allocated_size() == 0); 139 return 0; 140 } 141