34static void utest_null_param_interfaces(
void);
35static void utest_get_last_error(
void);
36static void utest_deg_rad_conversion(
void);
37static void utest_int_param_interfaces(
void);
38static void utest_bool_param_interfaces(
void);
39static void utest_dble_param_interfaces(
void);
40static void utest_angle_param_interfaces(
void);
41static void utest_distance_param_interfaces(
void);
42static void utest_str_param_interfaces(
void);
43static void utest_enum_param_interfaces(
void);
44static void utest_struct_param_interfaces(
void);
45static void utest_oneof_param_interfaces(
void);
46static void utest_list_param_interfaces(
void);
47static void utest_usage_demo(
void);
49static double const tol = 1e-12;
53 utest_null_param_interfaces();
54 utest_get_last_error();
55 utest_deg_rad_conversion();
56 utest_int_param_interfaces();
57 utest_bool_param_interfaces();
58 utest_dble_param_interfaces();
59 utest_angle_param_interfaces();
60 utest_distance_param_interfaces();
61 utest_str_param_interfaces();
62 utest_enum_param_interfaces();
63 utest_struct_param_interfaces();
64 utest_oneof_param_interfaces();
65 utest_list_param_interfaces();
88static int utest_oneof_factory(
89 const char *
name,
void **obj,
90 struct yac_param **param,
int *is_default) {
103 NUM_SUBPARAM_TYPES =
sizeof(subparam_types) /
sizeof(subparam_types[0])};
113 if (
type == INT_MAX) {
123 int *val =
xmalloc(
sizeof(
int));
134 int *val =
xmalloc(
sizeof(
int));
149static int utest_oneof_failing_factory(
150 const char *
name,
void **obj,
151 struct yac_param **param,
int *is_default) {
160static void utest_oneof_param_interfaces(
void) {
165 void *created_obj = NULL;
167 char const * param_name =
"oneof_param";
169 int subparam_is_default = 0;
172 param_name, utest_oneof_factory, &created_obj, subparam, subparam_is_default);
178 PUT_ERR(
"oneof param get_type should return TYPE_STRUCT");
182 if ((scalar_kind_ret == 0) ||
184 PUT_ERR(
"oneof param get_scalar_kind should fail");
188 if (!
name || strcmp(
name, param_name) != 0)
189 PUT_ERR(
"oneof param get_name should return 'oneof_param'");
194 PUT_ERR(
"oneof param is_default should be 1 (default)");
199 if (ret != 0 || count != 1)
200 PUT_ERR(
"oneof param get_sub_count should return 1");
204 char const * unsupported_name =
"unsupported_sub";
206 param, unsupported_name, &sub);
208 PUT_ERR(
"oneof param get_sub_by_name should fail for non-default");
213 if (ret != 0 || !sub)
214 PUT_ERR(
"oneof param get_sub_by_index failed for index 0");
218 "oneof param get_sub_by_index should return subparam "
219 "with name 'int_sub' for index 0");
224 PUT_ERR(
"oneof factory should have allocated an object for the subparam");
227 "oneof factory should have set the created object to the initial value");
232 PUT_ERR(
"oneof param get_sub_by_index should fail for idx != 0");
242 "oneof param get_sub_by_name should fail for valid but "
243 "non-active subparam name");
249 if (ret != 0 || !sub)
250 PUT_ERR(
"oneof param get_sub_by_name failed for 'int_sub'");
254 "oneof param get_sub_by_name should return "
255 "subparam with name 'int_sub'");
260 PUT_ERR(
"oneof param is_default should be 0 (not default)");
267 if (ret != 0 || !int_sub)
268 PUT_ERR(
"oneof param get_sub_by_name failed for 'int_sub'");
275 PUT_ERR(
"oneof param is_default should be 1 (default)");
285 void *created_obj = NULL;
287 char const * param_name =
"oneof_param_non_default";
289 int subparam_is_default = 0;
292 param_name, utest_oneof_factory, &created_obj, subparam, subparam_is_default);
297 PUT_ERR(
"oneof param is_default should be 1 (default)");
304 if (ret != 0 || !bool_sub)
305 PUT_ERR(
"oneof param get_sub_by_name failed for 'bool_sub'");
307 PUT_ERR(
"oneof factory should have allocated an object for the subparam");
310 "oneof factory should have set the created object to the initial value");
311 char const * bool_sub_name =
315 "oneof param get_sub_by_name should return subparam with name 'bool_sub'");
320 PUT_ERR(
"oneof param is_default should be 0 (not default)");
330 PUT_ERR(
"oneof param is_default should be 0 (not default)");
339 void * predef_val = &predef_int_val;
344 int subparam_is_default = 1;
345 char const * param_name =
"oneof_param_predefined";
348 param_name, utest_oneof_factory, &predef_val, predef_subparam,
349 subparam_is_default);
354 if (ret != 0 || (sub != predef_subparam))
355 PUT_ERR(
"oneof predefined subparam should be returned unchanged");
361 PUT_ERR(
"oneof param is_default should be 0 (not default)");
370 PUT_ERR(
"oneof param is_default should be 1 (default)");
378 void * predef_val = &predef_bool_val;
383 int subparam_is_default = 0;
384 char const * param_name =
"oneof_param_predefined";
387 param_name, utest_oneof_factory, &predef_val, predef_subparam,
388 subparam_is_default);
393 if (ret != 0 || (sub != predef_subparam))
394 PUT_ERR(
"oneof predefined subparam should be returned unchanged");
400 PUT_ERR(
"oneof param is_default should be 0 (not default)");
409 PUT_ERR(
"oneof param is_default should be 0 (not default)");
418 void * created_obj = NULL;
419 int subparam_is_default = 0;
422 "oneof_param_fail_idx", utest_oneof_failing_factory, &created_obj, NULL,
423 subparam_is_default);
427 PUT_ERR(
"oneof get_sub_by_index should fail if factory fails");
434 void * created_obj = NULL;
435 int subparam_is_default = 0;
438 "oneof_param_fail_name", utest_oneof_failing_factory, &created_obj, NULL,
439 subparam_is_default);
444 PUT_ERR(
"oneof get_sub_by_name should fail if factory fails");
449static struct yac_param * utest_get_sub_by_name(
459static void utest_struct_param_interfaces(
void) {
461 char const * int_param_name =
"int_sub";
463 int int_default = 42;
464 int int_has_default = 1;
465 int int_is_defined = 1;
466 int int_min_value = 0;
467 int int_max_value = 100;
469 char const * bool_param_name =
"bool_sub";
471 int bool_default = 0;
472 int bool_has_default = 1;
473 int bool_is_defined = 1;
475 char const * str_param_name =
"str_sub";
476 char *str_val = strdup(
"foo");
477 const char *str_default =
"bar";
478 int str_allow_null = 0;
479 int str_allow_empty = 0;
480 int str_has_default = 1;
481 int str_is_defined = 1;
482 size_t max_str_len = 8;
487 int_param_name, &int_val, int_default, int_min_value, int_max_value,
488 int_has_default, int_is_defined),
490 bool_param_name, &bool_val, bool_default,
491 bool_has_default, bool_is_defined),
493 str_param_name, &str_val, str_default, str_allow_null, str_allow_empty,
494 max_str_len, str_has_default, str_is_defined)
496 enum {NUM_SUBPARAMS =
sizeof(subparams) /
sizeof(subparams[0])};
498 char const * param_name =
"struct_param";
501 param_name, subparams, NUM_SUBPARAMS);
507 PUT_ERR(
"struct param get_type should return TYPE_STRUCT");
512 PUT_ERR(
"struct param get_scalar_kind should fail");
516 if (!
name || strcmp(
name, param_name) != 0)
517 PUT_ERR(
"struct param get_name should return 'struct_param'");
522 if (ret != 0 || count != NUM_SUBPARAMS)
523 PUT_ERR(
"struct param get_sub_count should return 3");
529 if (ret != 0 || !sub)
530 PUT_ERR(
"struct param get_sub_by_name failed for 'int_sub'");
531 if (sub != subparams[0])
532 PUT_ERR(
"struct param get_sub_by_name did not return "
533 "the actual subparam pointer");
536 char const * nonexistent_param_name =
"nope";
539 param, nonexistent_param_name, &sub);
542 "struct param get_sub_by_name should fail for nonexistent subparam");
547 if (ret != 0 || !sub)
548 PUT_ERR(
"struct param get_sub_by_index failed for index 1");
549 if (sub != subparams[1])
550 PUT_ERR(
"struct param get_sub_by_index did not return "
551 "the actual subparam pointer");
557 PUT_ERR(
"struct param get_sub_by_index should fail for out-of-bounds");
562 PUT_ERR(
"struct param is_default should be 0 (not default)");
566 utest_get_sub_by_name(param, int_param_name), int_default);
568 utest_get_sub_by_name(param, bool_param_name), bool_default);
573 PUT_ERR(
"struct param is_default should be 0 (not default)");
577 utest_get_sub_by_name(param, str_param_name), str_default);
582 PUT_ERR(
"struct param is_default should be 1 (default)");
590static void utest_enum_param_interfaces(
void) {
592 enum {RED, GREEN, BLUE, COLOR_TABLE_SIZE};
594 {
"red", RED}, {
"green", GREEN}, {
"blue", BLUE}
598 char const * param_name =
"color_param";
600 int default_value = RED;
607 param_name, &
value, default_value, color_table, COLOR_TABLE_SIZE,
608 has_default, is_defined);
614 PUT_ERR(
"enum param get_type should return TYPE_SCALAR");
619 PUT_ERR(
"enum param get_scalar_kind should return INT");
623 if (!
name || strcmp(
name, param_name) != 0)
624 PUT_ERR(
"enum param get_name should return 'color_param'");
629 PUT_ERR(
"enum param is_default should be 0 (not default)");
633 param, default_value);
634 if ((ret != 0) || (
value != default_value))
635 PUT_ERR(
"enum param set_scalar_int failed");
640 PUT_ERR(
"enum param is_default should be 1 (default)");
645 if (ret != 0 ||
value != BLUE)
646 PUT_ERR(
"enum param set_scalar string failed");
649 strcpy(buf,
"garbage");
651 param, buf,
sizeof(buf));
652 if (ret != 0 || strcmp(buf,
"blue") != 0)
653 PUT_ERR(
"enum param get_scalar string failed");
658 if (ret != 0 ||
value != GREEN)
659 PUT_ERR(
"enum param set_scalar_int failed (again)");
665 if (ret != 0 || out_val != GREEN)
666 PUT_ERR(
"enum param get_scalar_int failed");
672 PUT_ERR(
"enum param set_scalar should fail for invalid string");
678 PUT_ERR(
"enum param set_scalar should fail for NULL value");
684 PUT_ERR(
"enum param set_scalar_int should fail for invalid value");
687 int const small_buf_len = 2;
689 param, buf, small_buf_len);
691 PUT_ERR(
"enum param get_scalar should fail for small buffer");
698 char const * param_name =
"color_param";
700 int default_value = RED;
707 param_name, &
value, default_value, color_table,
708 COLOR_TABLE_SIZE, has_default, is_defined);
713 PUT_ERR(
"enum param (no default) is_default should be 0");
720 PUT_ERR(
"enum param (no default) get_scalar_int should fail if undefined");
724 param, buf,
sizeof(buf));
726 PUT_ERR(
"enum param (no default) get_scalar should fail if undefined");
731 if (ret != 0 ||
value != GREEN)
732 PUT_ERR(
"enum param (no default) set_scalar_int failed");
738 if (ret != 0 || out_val != GREEN)
739 PUT_ERR(
"enum param (no default) get_scalar_int should succeed after set");
743 param, buf,
sizeof(buf));
744 if (ret != 0 || strcmp(buf,
"green") != 0)
745 PUT_ERR(
"enum param (no default) get_scalar should succeed after set");
749 param, default_value);
750 if (ret != 0 ||
value != default_value)
751 PUT_ERR(
"enum param (no default) set_scalar_int failed");
756 PUT_ERR(
"enum param (no default) is_default should still be 0");
763static void utest_str_param_interfaces(
void) {
766 char const * param_name =
"str_param";
767 char *
value = strdup(
"init");
768 const char *default_value =
"default";
771 size_t max_str_len = 16;
778 param_name, &
value, default_value, allow_null, allow_empty,
779 max_str_len, has_default, is_defined);
785 PUT_ERR(
"str param get_type should return TYPE_SCALAR");
790 PUT_ERR(
"str param get_scalar_kind should return STR");
794 if (!
name || strcmp(
name, param_name) != 0)
795 PUT_ERR(
"str param get_name should return 'str_param'");
800 PUT_ERR(
"str param is_default should be 0 (not default)");
804 param, default_value);
806 PUT_ERR(
"str param set_scalar to default failed");
807 if (strcmp(
value, default_value) != 0)
808 PUT_ERR(
"str param value not set to default");
813 PUT_ERR(
"str param is_default should be 1 (default)");
818 if (ret != 0 || strcmp(
value,
"foo") != 0)
819 PUT_ERR(
"str param set_scalar string failed");
822 strcpy(buf,
"garbage");
824 param, buf,
sizeof(buf));
825 if (ret != 0 || strcmp(buf,
"foo") != 0)
826 PUT_ERR(
"str param get_scalar string failed");
831 if (ret != 0 || strcmp(
value,
"") != 0)
832 PUT_ERR(
"str param set_scalar empty string failed");
835 strcpy(buf,
"garbage");
837 param, buf,
sizeof(buf));
838 if (ret != 0 || strcmp(buf,
"") != 0)
839 PUT_ERR(
"str param get_scalar empty string failed");
843 memset(longstr,
'x', max_str_len+1); longstr[max_str_len+1] =
'\0';
847 PUT_ERR(
"str param set_scalar should fail for too long string");
853 PUT_ERR(
"str param set_scalar should fail for NULL value");
858 if (ret != 0 || strcmp(
value,
"foo") != 0)
859 PUT_ERR(
"str param set_scalar non empty string failed");
865 PUT_ERR(
"str param get_scalar should fail for too small buffer");
872 char const * param_name =
"str_param";
874 const char *default_value =
"default";
879 size_t max_str_len = 16;
884 param_name, &
value, default_value, allow_null, allow_empty,
885 max_str_len, has_default, is_defined);
890 PUT_ERR(
"str param (no default) is_default should be 0");
894 param, buf,
sizeof(buf));
896 PUT_ERR(
"str param (no default) get_scalar should fail if undefined");
901 if (ret != 0 || !
value || strcmp(
value,
"abc") != 0)
902 PUT_ERR(
"str param (no default) set_scalar failed");
906 param, buf,
sizeof(buf));
907 if (ret != 0 || strcmp(buf,
"abc") != 0)
908 PUT_ERR(
"str param (no default) get_scalar should succeed after set");
912 param, default_value);
913 if (ret != 0 || !
value || strcmp(
value, default_value) != 0)
914 PUT_ERR(
"str param (no default) set_scalar failed");
919 PUT_ERR(
"str param (no default) is_default should still be 0");
924 if (ret != 0 ||
value != NULL)
925 PUT_ERR(
"str param (allow_NULL) set_scalar(NULL) should succeed");
932 strcpy(buf,
"garbage");
934 param, buf,
sizeof(buf));
935 if (ret != 0 || strcmp(buf,
"") != 0)
937 "str param (allow_NULL) get_scalar should return empty string for NULL");
944 char const * param_name =
"str_no_empty";
945 char *
value = strdup(
"non-empty");
946 char const *default_value =
"x";
949 size_t max_str_len = 16;
955 param_name, &
value, default_value, allow_null, allow_empty,
956 max_str_len, has_default, is_defined);
962 PUT_ERR(
"str param set_scalar should fail for empty value if disallowed");
971 param, buf,
sizeof(buf));
973 PUT_ERR(
"str param get_scalar should fail for empty value if disallowed");
980 char const * param_name =
"str_no_null";
981 char *
value = strdup(
"non-NULL");;
985 char const *default_value =
"x";
986 size_t max_str_len = 16;
991 param_name, &
value, default_value, allow_null, allow_empty,
992 max_str_len, has_default, is_defined);
998 PUT_ERR(
"str param set_scalar should fail for NULL value if disallowed");
1007 param, buf,
sizeof(buf));
1009 PUT_ERR(
"str param get_scalar should fail for NULL value if disallowed");
1016 char const * param_name =
"str_null_default";
1018 char const *default_value = NULL;
1020 int allow_empty = 1;
1021 size_t max_str_len = 16;
1022 int has_default = 1;
1027 param_name, &
value, default_value, allow_null, allow_empty,
1028 max_str_len, has_default, is_defined);
1033 PUT_ERR(
"str param with NULL default should be default initially");
1038 if (ret != 0 || strcmp(
value,
"hello") != 0)
1039 PUT_ERR(
"str param set_scalar failed for non-empty string");
1044 PUT_ERR(
"str param with NULL default should not be default after set");
1049 if (ret != 0 ||
value != NULL)
1050 PUT_ERR(
"str param set_scalar failed for NULL value");
1055 PUT_ERR(
"str param with NULL default should be default after setting back to NULL");
1061 char const * param_name =
"str_empty_default";
1062 char *
value = strdup(
"");
1063 char const *default_value =
"";
1065 int allow_empty = 1;
1066 size_t max_str_len = 16;
1067 int has_default = 1;
1072 param_name, &
value, default_value, allow_null, allow_empty,
1073 max_str_len, has_default, is_defined);
1078 PUT_ERR(
"str param with empty default should be default initially");
1083 if (ret != 0 || strcmp(
value,
"hello") != 0)
1084 PUT_ERR(
"str param set_scalar failed for non-empty string");
1089 PUT_ERR(
"str param with empty default should not be default after set");
1094 if (ret != 0 || strcmp(
value,
"") != 0)
1095 PUT_ERR(
"str param set_scalar failed for empty string");
1101 "str param with empty default should be default after "
1102 "setting back to empty");
1110static void utest_dble_param_interfaces(
void) {
1113 char const * param_name =
"dble_param";
1115 double default_value = 3.14;
1116 double min_value = -10.0;
1117 double max_value = 10.0;
1120 int has_default = 1;
1124 double out_val = -999.0;
1127 param_name, &
value, default_value, min_value, max_value,
1128 allow_nan, allow_inf, has_default, is_defined);
1134 PUT_ERR(
"dble param get_type should return TYPE_SCALAR");
1139 PUT_ERR(
"dble param get_scalar_kind should return DBLE");
1143 if (!
name || strcmp(
name, param_name) != 0)
1144 PUT_ERR(
"dble param get_name should return 'dble_param'");
1149 PUT_ERR(
"dble param is_default should be 0 (not default)");
1153 param, default_value);
1155 PUT_ERR(
"dble param set_scalar_dble failed");
1156 if (
value != default_value)
1157 PUT_ERR(
"dble param value not set to default");
1162 PUT_ERR(
"dble param is_default should be 1 (default)");
1167 if (ret != 0 ||
value != 2.5)
1168 PUT_ERR(
"dble param set_scalar string failed");
1174 PUT_ERR(
"dble param set_scalar should fail for NULL string");
1178 PUT_ERR(
"dble param set_scalar should fail for invalid string");
1181 strcpy(buf,
"garbage");
1183 param, buf,
sizeof(buf));
1184 if (ret != 0 || atof(buf) != 2.5)
1185 PUT_ERR(
"dble param get_scalar string failed");
1188 int const small_buf_size = 2;
1190 param, buf, small_buf_size);
1192 PUT_ERR(
"dble param get_scalar should fail for too small buffer");
1197 if (ret != 0 ||
value != -5.5)
1198 PUT_ERR(
"dble param set_scalar_dble failed (again)");
1204 if (ret != 0 || out_val != -5.5)
1205 PUT_ERR(
"dble param get_scalar_dble failed");
1210 if (ret != 0 ||
value != 5.0)
1211 PUT_ERR(
"dble param set_scalar_int should succeed for integer value");
1217 if (ret != 0 || ival != 5)
1218 PUT_ERR(
"dble param get_scalar_int should succeed for integer value");
1222 if (ret != 0)
PUT_ERR(
"dble param set_scalar_dble failed");
1225 PUT_ERR(
"dble param get_scalar_int should fail for non-integer value");
1229 param, min_value - 1.0);
1231 PUT_ERR(
"dble param set_scalar_dble should fail for out-of-range");
1233 param, max_value + 1.0);
1235 PUT_ERR(
"dble param set_scalar_dble should fail for out-of-range");
1241 PUT_ERR(
"dble param set_scalar_dble should fail for NaN");
1247 PUT_ERR(
"dble param set_scalar_dble should fail for Inf");
1255 double default_value = 3.14;
1256 double min_value = -10.0, max_value = 10.0;
1259 int has_default = 0;
1263 double out_val = -999.0;
1266 "dble_param_nodef", &
value, default_value,
1267 min_value, max_value, allow_nan, allow_inf, has_default, is_defined);
1272 PUT_ERR(
"dble param (no default) is_default should be 0");
1276 param, buf,
sizeof(buf));
1278 PUT_ERR(
"dble param (no default) get_scalar should fail if not set");
1283 PUT_ERR(
"dble param (no default) get_scalar_dble should fail if not set");
1288 if (ret != 0 ||
value != 5.5)
1289 PUT_ERR(
"dble param (no default) set_scalar_dble failed");
1291 param, buf,
sizeof(buf));
1292 if (ret != 0 || atof(buf) != 5.5)
1293 PUT_ERR(
"dble param (no default) get_scalar after set failed");
1297 if (ret != 0 || out_val != 5.5)
1298 PUT_ERR(
"dble param (no default) get_scalar_dble after set failed");
1302 param, default_value);
1303 if (ret != 0 ||
value != default_value)
1304 PUT_ERR(
"dble param (no default) set_scalar_dble failed");
1309 PUT_ERR(
"dble param (no default) is_default should be 0");
1316 double default_value = INFINITY;
1317 double min_value = -1.0;
1318 double max_value = 1.0;
1321 int has_default = 1;
1325 double out_val = 0.0;
1328 "dble_param_nan_inf", &
value, default_value,
1329 min_value, max_value, allow_nan, allow_inf, has_default, is_defined);
1334 if (ret != 0 || !isnan(
value))
1335 PUT_ERR(
"dble param set_scalar_dble should accept NaN if allowed");
1339 if (ret != 0 || !isnan(out_val))
1340 PUT_ERR(
"dble param get_scalar_dble should return NaN if set");
1345 if (ret != 0 || !isinf(
value) || (
value < 0.0))
1346 PUT_ERR(
"dble param set_scalar_dble should accept +Inf if allowed");
1350 if (ret != 0 || !isinf(out_val) || (out_val < 0.0))
1351 PUT_ERR(
"dble param get_scalar_dble should return +Inf if set");
1356 if (ret != 0 || !isnan(
value))
1357 PUT_ERR(
"dble param set_scalar should accept 'nan' if allowed");
1360 if (ret != 0 || !isinf(
value) || (
value < 0.0))
1361 PUT_ERR(
"dble param set_scalar should accept 'inf' if allowed");
1362 strcpy(buf,
"garbage");
1364 param, buf,
sizeof(buf));
1365 if (ret != 0 || !isinf(atof(buf)) || (atof(buf) < 0.0))
1366 PUT_ERR(
"dble param get_scalar should serialize +Inf");
1372 PUT_ERR(
"dble param finite out-of-range should still fail");
1376 param, min_value - 1.0);
1378 PUT_ERR(
"dble param set_scalar_dble should fail for out-of-range");
1380 param, max_value + 1.0);
1382 PUT_ERR(
"dble param set_scalar_dble should fail for out-of-range");
1386 param, default_value);
1388 PUT_ERR(
"dble param set to default +Inf failed");
1391 PUT_ERR(
"dble param is_default should be 1 for +Inf default value");
1398static void utest_get_last_error(
void) {
1404 PUT_ERR(
"set_scalar_int(NULL) should fail");
1406 if (!err)
PUT_ERR(
"get_last_error did not report expected error message");
1410static void utest_bool_param_interfaces(
void) {
1413 char const * param_name =
"bool_param";
1415 int default_value = 1;
1416 int has_default = 1;
1423 param_name, &
value, default_value, has_default, is_defined);
1429 PUT_ERR(
"bool param get_type should return TYPE_SCALAR");
1434 PUT_ERR(
"bool param get_scalar_kind should return INT");
1438 if (!
name || strcmp(
name, param_name) != 0)
1439 PUT_ERR(
"bool param get_name should return 'bool_param'");
1444 PUT_ERR(
"bool param is_default should be 0 (not default)");
1448 param, default_value);
1450 PUT_ERR(
"bool param set_scalar_int failed");
1451 if (
value != default_value)
1452 PUT_ERR(
"bool param value not set to default");
1457 PUT_ERR(
"bool param is_default should be 1 (default)");
1462 if (ret != 0 ||
value != 0)
1463 PUT_ERR(
"bool param set_scalar string failed");
1469 PUT_ERR(
"bool param set_scalar should fail for NULL value");
1473 PUT_ERR(
"bool param set_scalar should fail for invalid value");
1476 strcpy(buf,
"garbage");
1478 param, buf,
sizeof(buf));
1479 if (ret != 0 || strcmp(buf,
"false") != 0)
1480 PUT_ERR(
"bool param get_scalar string failed");
1483 int const small_buf_size = 2;
1485 param, buf, small_buf_size);
1487 PUT_ERR(
"bool param get_scalar should fail for too small buffer");
1492 if (ret != 0 ||
value != 1)
1493 PUT_ERR(
"bool param set_scalar_int failed (again)");
1499 if (ret != 0 || out_val != 1)
1500 PUT_ERR(
"bool param get_scalar_int failed");
1506 PUT_ERR(
"bool param set_scalar_dble should fail");
1513 PUT_ERR(
"bool param get_scalar_dble should fail");
1521 int default_value = 1;
1522 int has_default = 0;
1529 "bool_param_nodef", &
value, default_value, has_default, is_defined);
1534 PUT_ERR(
"bool param (no default) is_default should be 0");
1538 param, buf,
sizeof(buf));
1540 PUT_ERR(
"bool param (no default) get_scalar should fail if not set");
1545 PUT_ERR(
"bool param (no default) get_scalar_int should fail if not set");
1549 param, default_value);
1550 if (ret != 0 ||
value != default_value)
1551 PUT_ERR(
"bool param (no default) set_scalar_int to default failed");
1555 param, buf,
sizeof(buf));
1556 if (ret != 0 || strcmp(buf,
"true") != 0)
1557 PUT_ERR(
"bool param (no default) get_scalar after set failed");
1561 if (ret != 0 || out_val != 1)
1562 PUT_ERR(
"bool param (no default) get_scalar_int after set failed");
1567 PUT_ERR(
"bool param (no default) is_default should still be 0");
1574static void utest_int_param_interfaces(
void) {
1577 char const * param_name =
"int_param";
1579 int default_value = 42;
1581 int max_value = 100;
1585 int has_default = 1;
1589 param_name, &
value, default_value, min_value, max_value,
1590 has_default, is_defined);
1596 PUT_ERR(
"int param get_type should return TYPE_SCALAR");
1601 PUT_ERR(
"int param get_scalar_kind should return INT");
1605 if (!
name || strcmp(
name, param_name) != 0)
1606 PUT_ERR(
"int param get_name should return 'int_param'");
1611 PUT_ERR(
"int param is_default should be 0 (not default)");
1615 param, default_value);
1617 PUT_ERR(
"int param set_scalar_int failed");
1618 if (
value != default_value)
1619 PUT_ERR(
"int param value not set to default");
1624 PUT_ERR(
"int param is_default should be 1 (default)");
1629 if (ret != 0 ||
value != 13)
1630 PUT_ERR(
"int param set_scalar string failed");
1635 PUT_ERR(
"int param is_default should be 0 (not default)");
1641 PUT_ERR(
"int param set_scalar should fail for NULL value");
1647 PUT_ERR(
"int param set_scalar should fail for invalid string");
1650 strcpy(buf,
"garbage");
1652 param, buf,
sizeof(buf));
1653 if (ret != 0 || strcmp(buf,
"13") != 0)
1654 PUT_ERR(
"int param get_scalar string failed");
1657 size_t const small_buf_size = 2;
1659 param, buf, small_buf_size);
1661 PUT_ERR(
"int param get_scalar should fail for too small buffer");
1666 if (ret != 0 ||
value != 77)
1667 PUT_ERR(
"int param set_scalar_int failed (again)");
1671 param, min_value - 1);
1672 if (ret == 0 ||
value != 77)
1673 PUT_ERR(
"int param set_scalar_int should fail for out-of-range value");
1675 param, max_value + 1);
1676 if (ret == 0 ||
value != 77)
1677 PUT_ERR(
"int param set_scalar_int should fail for out-of-range value");
1683 if (ret != 0 || out_val != 77)
1684 PUT_ERR(
"int param get_scalar_int failed");
1689 if (ret != 0 ||
value != 50)
1690 PUT_ERR(
"int param set_scalar_dble should succeed for integer value");
1696 PUT_ERR(
"int param set_scalar_dble should fail for non-integer value");
1698 PUT_ERR(
"int param value should not change after failed set_scalar_dble");
1704 if (ret != 0 || dval != 50.0)
1705 PUT_ERR(
"int param get_scalar_dble should succeed");
1713 int default_value = 42;
1714 int min_value = 0, max_value = 100;
1715 int has_default = 0;
1721 "int_param_nodef", &
value, default_value, min_value, max_value,
1722 has_default, is_defined);
1727 PUT_ERR(
"int param (no default) is_default should be 0");
1731 param, buf,
sizeof(buf));
1733 PUT_ERR(
"int param (no default) get_scalar should fail if not set");
1738 PUT_ERR(
"int param (no default) get_scalar_int should fail if not set");
1742 param, default_value);
1747 PUT_ERR(
"int param (no default) is_default should be 0");
1751 PUT_ERR(
"int param (no default) set_scalar_int failed");
1753 param, buf,
sizeof(buf));
1754 if (ret != 0 || strcmp(buf,
"42") != 0)
1755 PUT_ERR(
"int param (no default) get_scalar after set failed");
1759 if (ret != 0 || out_val != 42)
1760 PUT_ERR(
"int param (no default) get_scalar_int after set failed");
1766static void utest_null_param_interfaces(
void) {
1769 size_t count = 1234;
1771 double d_val = 3.14;
1772 char buf[32] =
"garbage";
1780 PUT_ERR(
"get_type(NULL) should return TYPE_EMPTY");
1785 PUT_ERR(
"get_scalar_kind(NULL) should return error and INVALID");
1789 if (!ret)
PUT_ERR(
"is_default(NULL) should return 1");
1793 if (
name != NULL)
PUT_ERR(
"get_name(NULL) should return NULL");
1798 if (ret != 0 || count != 0)
1799 PUT_ERR(
"get_sub_count(NULL) should return 0, count=0");
1802 struct yac_param *sub_param = (
void*)0x1;
1804 null_param,
"foo", &sub_param);
1806 PUT_ERR(
"get_sub_by_name(NULL) should return 1");
1809 sub_param = (
void*)0x1;
1811 null_param, 0, &sub_param);
1813 PUT_ERR(
"get_sub_by_index(NULL) should return 1");
1819 PUT_ERR(
"append(NULL) should return 1");
1826 PUT_ERR(
"set_scalar(NULL) should return 1");
1829 strcpy(buf,
"garbage");
1831 null_param, buf,
sizeof(buf));
1832 if (ret != 1 || buf[0] !=
'\0')
1833 PUT_ERR(
"get_scalar(NULL) should return 1, buf=\0");
1839 PUT_ERR(
"set_scalar_int(NULL) should return 1");
1845 PUT_ERR(
"set_scalar_dble(NULL) should return 1");
1850 null_param, &i_val);
1852 PUT_ERR(
"get_scalar_int(NULL) should return 1");
1857 null_param, &d_val);
1859 PUT_ERR(
"get_scalar_dble(NULL) should return 1");
1865static void utest_distance_param_interfaces(
void) {
1868 char const * param_name =
"distance_param";
1869 double value = M_PI_4;
1870 double default_value = M_PI_2;
1871 double min_value = 0.0;
1872 double max_value = M_PI;
1873 int has_default = 1;
1877 double out_val = -999.0;
1880 param_name, &
value, default_value, min_value, max_value,
1881 has_default, is_defined);
1886 PUT_ERR(
"distance param get_type should return TYPE_SCALAR");
1891 PUT_ERR(
"distance param get_scalar_kind should return DBLE");
1895 if (!
name || strcmp(
name, param_name) != 0)
1896 PUT_ERR(
"distance param get_name should return 'distance_param'");
1901 PUT_ERR(
"distance param is_default should be 0 (not default)");
1906 PUT_ERR(
"distance param set_scalar_dble failed");
1907 if (
value != default_value)
1908 PUT_ERR(
"distance param value not set to default");
1913 PUT_ERR(
"distance param is_default should be 1 (default)");
1917 if (ret != 0 || (
value != M_PI_2))
1918 PUT_ERR(
"distance param set_scalar string default-degree failed");
1922 if (ret != 0 || (
value != 0.5))
1923 PUT_ERR(
"distance param set_scalar explicit rad suffix failed");
1927 if (ret != 0 || (
value != M_PI_4))
1928 PUT_ERR(
"distance param set_scalar short degree suffix failed");
1932 if (ret != 0 || (
value != M_PI_2))
1933 PUT_ERR(
"distance param set_scalar_dble (radians) failed");
1937 if (ret != 0 || (out_val != M_PI_2))
1938 PUT_ERR(
"distance param get_scalar_dble (radians) failed");
1941 strcpy(buf,
"garbage");
1943 if (ret != 0 || fabs(atof(buf) - 90.0) >
tol)
1944 PUT_ERR(
"distance param get_scalar should return degrees");
1949 PUT_ERR(
"distance param set_scalar should fail for NULL string");
1952 PUT_ERR(
"distance param set_scalar should fail for invalid string");
1955 PUT_ERR(
"distance param set_scalar should reject double space before unit");
1958 PUT_ERR(
"distance param set_scalar should reject trailing whitespace");
1961 int const small_buf_size = 2;
1963 param, buf, small_buf_size);
1965 PUT_ERR(
"distance param get_scalar should fail for too small buffer");
1970 if (ret != 0 || (
value != 1.0))
1971 PUT_ERR(
"distance param set_scalar_int should succeed for 1 deg");
1977 if (ret != 0 || ival != 1)
1978 PUT_ERR(
"distance param get_scalar_int should succeed for 1 deg");
1982 if (ret != 0)
PUT_ERR(
"distance param set_scalar_dble failed");
1985 PUT_ERR(
"distance param get_scalar_int should fail for non-integer deg");
1989 param, min_value - 0.01);
1991 PUT_ERR(
"distance param set_scalar_dble should fail for out-of-range");
1993 param, max_value + 0.01);
1995 PUT_ERR(
"distance param set_scalar_dble should fail for out-of-range");
2001 PUT_ERR(
"distance param set_scalar_dble should fail for NaN");
2007 PUT_ERR(
"distance param set_scalar_dble should fail for Inf");
2014 char const * param_name =
"distance_param_nodef";
2016 double default_value = 1.0;
2017 double min_value = 0.0, max_value = M_PI;
2018 int has_default = 0;
2022 double out_val = -999.0;
2025 param_name, &
value, default_value, min_value, max_value,
2026 has_default, is_defined);
2031 PUT_ERR(
"distance param (no default) is_default should be 0");
2035 param, buf,
sizeof(buf));
2037 PUT_ERR(
"distance param (no default) get_scalar should fail if not set");
2043 "distance param (no default) get_scalar_dble should fail if not set");
2048 if (ret != 0 ||
value != 0.7)
2049 PUT_ERR(
"distance param (no default) set_scalar_dble failed");
2052 PUT_ERR(
"distance param (no default) get_scalar after set failed");
2056 if (ret != 0 || out_val != 0.7)
2057 PUT_ERR(
"distance param (no default) get_scalar_dble after set failed");
2061 param, default_value);
2062 if (ret != 0 ||
value != default_value)
2063 PUT_ERR(
"distance param (no default) set_scalar_dble failed");
2068 PUT_ERR(
"distance param (no default) is_default should be 0");
2074static void utest_angle_param_interfaces(
void) {
2077 char const * param_name =
"angle_param";
2079 double default_value = 0.0;
2080 double value_min = -M_PI_2;
2081 double value_max = M_PI_2;
2082 int has_default = 1;
2085 double out_val = -999.0;
2090 param_name, &
value, default_value, value_min, value_max,
2091 has_default, is_defined);
2097 PUT_ERR(
"angle param get_type should return TYPE_SCALAR");
2102 PUT_ERR(
"angle param get_scalar_kind should return DBLE");
2106 if (!
name || strcmp(
name, param_name) != 0)
2107 PUT_ERR(
"angle param get_name should return 'angle_param'");
2112 PUT_ERR(
"angle param is_default should be 0 (not default)");
2116 if (ret != 0 || (
value != M_PI_2))
2117 PUT_ERR(
"angle param default degree string conversion failed");
2121 if (ret != 0 || (
value != 0.5))
2122 PUT_ERR(
"angle param explicit rad suffix conversion failed");
2126 if (ret != 0 || (
value != -M_PI_2))
2127 PUT_ERR(
"angle param numeric radian assignment failed");
2130 if (ret != 0 || (out_val != -M_PI_2))
2131 PUT_ERR(
"angle param numeric radian retrieval failed");
2135 if (ret != 0 || fabs(atof(buf) - (-90.0)) >
tol)
2136 PUT_ERR(
"angle param string getter should return degrees");
2141 PUT_ERR(
"angle param set_scalar should fail for NULL string");
2144 PUT_ERR(
"angle param set_scalar should fail for invalid string");
2149 PUT_ERR(
"angle param set_scalar_dble should fail for out-of-range value");
2152 PUT_ERR(
"angle param set_scalar_dble should fail for out-of-range value");
2156 int const small_buf_size = 2;
2158 param, buf, small_buf_size);
2160 PUT_ERR(
"angle param get_scalar should fail for too small buffer");
2164 param, value_min - 0.1);
2166 PUT_ERR(
"angle param should fail if wrapped value is out of range");
2168 param, value_max + 0.1);
2170 PUT_ERR(
"angle param should fail if wrapped value is out of range");
2174 if (ret != 0 || (
value != 1.0))
2175 PUT_ERR(
"angle param set_scalar_int should succeed for 1 deg");
2180 if (ret != 0 || ival != 1)
2181 PUT_ERR(
"angle param get_scalar_int should succeed for 1 deg");
2185 if (ret != 0)
PUT_ERR(
"angle param set_scalar_dble failed");
2188 PUT_ERR(
"angle param get_scalar_int should fail for non-integer deg");
2194 char const * param_name =
"angle_wrap_param";
2195 double value = 2.0 * M_PI;
2196 double default_value = 0.0;
2197 double value_min = -M_PI_2;
2198 double value_max = M_PI_2;
2199 int has_default = 1;
2206 param_name, &
value, default_value + 2.0 * M_PI,
2207 value_min, value_max, has_default, is_defined);
2211 if (ret != 0 || (
value != -M_PI_2))
2212 PUT_ERR(
"angle param wrapping from degree string input failed");
2216 if (ret != 0 || (fabs(atof(buf) - (-90.0)) >
tol))
2217 PUT_ERR(
"angle param wrapped degree retrieval failed");
2221 if (ret != 0 || (
value != M_PI_2))
2222 PUT_ERR(
"angle param wrapping from numeric radian input failed");
2225 double out_val = -999.0;
2227 if (ret != 0 || (fabs(out_val - M_PI_2) >
tol))
2228 PUT_ERR(
"angle param wrapped radian retrieval failed");
2232 if (ret != 0 || (
value != -M_PI_2))
2233 PUT_ERR(
"angle param wrapping from numeric radian input failed");
2237 param, value_min - 0.1 - 2.0 * M_PI);
2239 PUT_ERR(
"angle param should fail if wrapped value is out of range");
2241 param, value_max + 0.1 + 2.0 * M_PI);
2243 PUT_ERR(
"angle param should fail if wrapped value is out of range");
2249 char const * param_name =
"angle_init_wrap_param";
2250 double value = 3.0 * M_PI;
2251 double default_value =
value;
2252 double value_min = -M_PI;
2253 double value_max = M_PI;
2254 int has_default = 1;
2258 param_name, &
value, default_value,
2259 value_min, value_max, has_default, is_defined);
2261 PUT_ERR(
"angle param constructor with wrap should succeed");
2263 PUT_ERR(
"angle param constructor did not wrap initial value");
2265 PUT_ERR(
"angle param wrapped initial/default should match");
2270 char const * param_name =
"angle_param_nodef";
2272 double default_value = 1.0;
2273 double value_min = -M_PI_2;
2274 double value_max = M_PI_2;
2275 int has_default = 0;
2279 double out_val = -999.0;
2282 param_name, &
value, default_value, value_min, value_max,
2283 has_default, is_defined);
2288 PUT_ERR(
"angle param (no default) is_default should be 0");
2292 param, buf,
sizeof(buf));
2294 PUT_ERR(
"angle param (no default) get_scalar should fail if not set");
2298 PUT_ERR(
"angle param (no default) get_scalar_dble should fail if not set");
2303 if (ret != 0 ||
value != M_PI_4)
2304 PUT_ERR(
"angle param (no default) set_scalar_dble failed");
2308 param, buf,
sizeof(buf));
2309 if (ret != 0 || fabs(atof(buf) - 45.0) >
tol)
2310 PUT_ERR(
"angle param (no default) get_scalar after set failed");
2314 if (ret != 0 || out_val != M_PI_4)
2315 PUT_ERR(
"angle param (no default) get_scalar_dble after set failed");
2320 PUT_ERR(
"angle param (no default) is_default should be 0");
2324 param, default_value);
2325 if (ret != 0 ||
value != default_value)
2326 PUT_ERR(
"angle param (no default) set_scalar_dble failed");
2331 PUT_ERR(
"angle param (no default) is_default should be 0");
2337static void utest_deg_rad_conversion(
void) {
2339 double const deg_to_rad = M_PI / 180.0;
2341 for (
int deg = -720;
deg <= 720; ++
deg) {
2343 double wrapped_deg = (double)
deg;
2344 while (wrapped_deg < -180.0) wrapped_deg += 360.0;
2345 while (wrapped_deg >= 180.0) wrapped_deg -= 360.0;
2347 double expected_rad = wrapped_deg * deg_to_rad;
2350 if (fabs(converted_rad - expected_rad) >
tol)
2351 PUT_ERR(
"yac_deg_to_rad conversion failed in [-720,720] degree loop");
2353 double expected_deg = wrapped_deg;
2354 double converted_deg =
2357 if (fabs(converted_deg - expected_deg) >
tol)
2358 PUT_ERR(
"yac_rad_to_deg conversion failed in [-720,720] degree loop");
2362static struct yac_param * utest_get_sub_by_index(
2380static int utest_default_factory(
2381 void **element_ptr,
struct yac_param **param_ptr) {
2382 int *elem =
xmalloc(
sizeof(
int));
2384 *element_ptr = elem;
2392static int utest_failing_default_factory(
2393 void **element_ptr,
struct yac_param **param_ptr) {
2399static int utest_list_existing_element_get_param(
2400 void *element,
struct yac_param **param_ptr) {
2409static void utest_list_param_interfaces(
void) {
2416 char const * param_name =
"list_param";
2420 param_name, &list, utest_default_factory, NULL);
2426 PUT_ERR(
"list param get_type should return TYPE_LIST");
2431 PUT_ERR(
"list param get_scalar_kind should fail");
2435 if (!
name || strcmp(
name, param_name) != 0)
2436 PUT_ERR(
"list param get_name should return 'list_param'");
2439 size_t count = SIZE_MAX;
2441 if (ret != 0 || count != 0)
2442 PUT_ERR(
"list param get_sub_count should return 0");
2447 PUT_ERR(
"list param is_default should be 1 (default)");
2450 for (
int i = 0;
i < 3; ++
i) {
2453 if (ret != 0 || !added)
2454 PUT_ERR(
"list param append failed (bulk append)");
2458 PUT_ERR(
"list param set_scalar_int failed after append");
2459 if (*(
int*)list[i] != i + 1)
2460 PUT_ERR(
"list param appended element value not set correctly");
2466 PUT_ERR(
"list param is_default should be 0 (not default)");
2470 if (ret != 0 || count != 3)
2471 PUT_ERR(
"list param get_sub_count should return 3");
2474 for (
size_t i = 0;
i < count; ++
i) {
2477 if (ret != 0 || !sub)
2478 PUT_ERR(
"list param get_sub_by_index failed for valid index");
2482 if (ret != 0 || sub_val != (
int)(i + 1))
2484 "list param get_sub_by_index returned subparam with wrong value");
2491 PUT_ERR(
"list param get_sub_by_index should fail for out-of-bounds");
2494 for (
size_t i = 0;
i < count; ++
i) {
2497 if (ret != 0 || !sub)
2499 "list param get_sub_by_index failed for valid index (set default)");
2507 PUT_ERR(
"list param is_default should be 0 (not default)");
2511 for (
size_t i = 0;
i < count; ++
i) free(list[i]);
2516 char const * param_name =
"list_param_append_error";
2517 void **err_list = NULL;
2518 void **err_list_ptr = err_list;
2519 void ***err_list_handle = &err_list_ptr;
2522 param_name, err_list_handle, utest_failing_default_factory, NULL);
2526 PUT_ERR(
"list param append should fail if factory fails");
2531 char const * param_name =
"list_param_existing";
2532 int existing_values[3] = {10, 20, 30};
2533 void ** existing_list =
xmalloc(4 *
sizeof(
void*));
2534 existing_list[0] = &existing_values[0];
2535 existing_list[1] = &existing_values[1];
2536 existing_list[2] = &existing_values[2];
2537 existing_list[3] = NULL;
2540 param_name, &existing_list, utest_default_factory,
2541 utest_list_existing_element_get_param);
2546 PUT_ERR(
"list param with existing elements should not be default");
2549 size_t existing_count = 0;
2551 existing_param, &existing_count);
2552 if (ret != 0 || existing_count != 3)
2553 PUT_ERR(
"list param with existing elements should have size 3");
2556 for (
size_t i = 0;
i < existing_count; ++
i) {
2559 existing_param, i, &sub);
2560 if (ret != 0 || !sub)
2561 PUT_ERR(
"list param get_sub_by_index failed for existing element");
2565 if (ret != 0 || sub_val != existing_values[i])
2567 "list param get_sub_by_index returned subparam with wrong "
2568 "value for existing element");
2574 existing_param, existing_count, &sub);
2576 PUT_ERR(
"list param get_sub_by_index should fail for out-of-bounds on "
2582 if (ret != 0 || !added)
2583 PUT_ERR(
"list param append failed when existing elements are present");
2587 PUT_ERR(
"list param set_scalar_int failed after append with existing "
2589 if (*(
int*)existing_list[3] != 40)
2591 "list param appended element value not set correctly with existing "
2595 free(existing_list[3]);
2596 free(existing_list);
2657 if (!dummy_sub)
return NULL;
2660 DUMMY_SCALE_HAS_DEFAULT = 1,
2661 DUMMY_SCALE_IS_DEFINE = 1,
2662 DUMMY_NAME_ALLOW_NULL = 0,
2663 DUMMY_NAME_ALLOW_EMPTY = 0,
2664 DUMMY_NAME_MAX_STR_LEN = 64,
2665 DUMMY_NAME_HAS_DEFAULT = 1,
2666 DUMMY_NAME_IS_DEFINE = 1
2668 double const DUMMY_SCALE_MIN = 0.00001;
2669 double const DUMMY_SCALE_MAX = 90.0 * M_PI / 180.0;
2671 switch (dummy_sub->sub_type) {
2674 "ERROR(dummy_sub_build_param): unknown option type in dummy_sub");
2676 case (DUMMY_OPTION_A): {
2681 DUMMY_SCALE_MIN, DUMMY_SCALE_MAX, DUMMY_SCALE_HAS_DEFAULT,
2682 DUMMY_SCALE_IS_DEFINE);
2690 sub_params,
sizeof(sub_params)/
sizeof(sub_params[0]));
2693 case (DUMMY_OPTION_B): {
2698 DUMMY_NAME_ALLOW_NULL, DUMMY_NAME_ALLOW_EMPTY, DUMMY_NAME_MAX_STR_LEN,
2699 DUMMY_NAME_HAS_DEFAULT, DUMMY_NAME_IS_DEFINE);
2707 sub_params,
sizeof(sub_params)/
sizeof(sub_params[0]));
2735 const char *
name,
void **obj,
2736 struct yac_param **param,
int *is_default) {
2738 YAC_ASSERT(obj,
"missing dummy sub config object");
2740 YAC_ASSERT(is_default,
"is_default is NULL");
2742 struct dummy_sub **dummy_sub_ptr = (
struct dummy_sub **)obj;
2745 *dummy_sub_ptr == NULL,
"dummy sub config object is already defined");
2747 struct dummy_sub * dummy_sub =
xmalloc(1 *
sizeof(*dummy_sub));
2751 (
int)DUMMY_OPTION_A:
2758 case DUMMY_OPTION_A:
2759 dummy_sub->sub_type = DUMMY_OPTION_A;
2764 case DUMMY_OPTION_B:
2765 dummy_sub->sub_type = DUMMY_OPTION_B;
2774 0,
"ERROR(dummy_sub_factory): unknown option type");
2778 *dummy_sub_ptr = dummy_sub;
2796 DUMMY_COUNT_MIN = 1,
2797 DUMMY_COUNT_MAX = 100,
2798 DUMMY_COUNT_HAS_DEFAULT = 1,
2799 DUMMY_COUNT_IS_DEFAULT = 1
2805 "count", &cfg->count,
2807 DUMMY_COUNT_HAS_DEFAULT, DUMMY_COUNT_IS_DEFAULT);
2809 double const DUMMY_DISTANCE_MIN = 0.0;
2810 double const DUMMY_DISTANCE_MAX = M_PI;
2812 DUMMY_DISTANCE_HAS_DEFAULT = 1,
2813 DUMMY_DISTANCE_IS_DEFAULT = 1
2819 "distance", &cfg->distance,
2821 DUMMY_DISTANCE_HAS_DEFAULT, DUMMY_DISTANCE_IS_DEFAULT);
2827 int const DUMMY_SUB_IS_DEFAULT =
2834 dummy_sub_param, DUMMY_SUB_IS_DEFAULT);
2838 count_param, dist_param, sub_param
2842 "config", root_subs,
sizeof(root_subs)/
sizeof(root_subs[0]));
2849static void utest_usage_demo(
void) {
2870 config_param,
"distance", &dist_param);
2891 printf(
"count value = %d\n", count_value);
2902 printf(
"cfg.count = %d\n",
cfg.count);
2903 printf(
"cfg.distance (radians) = %f\n",
cfg.distance);
2905 printf(
"cfg.sub->sub_type = %d\n",
cfg.sub->sub_type);
2906 if (
cfg.sub->sub_type == DUMMY_OPTION_A) {
2907 printf(
"cfg.sub->sub_data.A.scale (radians) = %f\n",
cfg.sub->sub_data.A.scale);
2908 }
else if (
cfg.sub->sub_type == DUMMY_OPTION_B) {
2909 printf(
"cfg.sub->sub_data.B.name = %s\n",
cfg.sub->sub_data.B.name);
2912 printf(
"cfg.sub = NULL\n");
2918 if (
cfg.sub->sub_type == DUMMY_OPTION_B) {
2919 free(
cfg.sub->sub_data.B.name);
#define YAC_ASSERT(exp, msg)
int yac_name_type_pair_get_type(struct yac_name_type_pair const *pairs, size_t count, char const *name)
#define DEF_NAME_TYPE_PAIR(NAME, TYPE)
char const * yac_name_type_pair_get_name(struct yac_name_type_pair const *pairs, size_t count, int type)
int yac_param_get_scalar_dble(const struct yac_param *param, double *value)
Get the value of a scalar parameter as a double.
void yac_param_delete(struct yac_param *param)
int yac_param_get_sub_by_index(struct yac_param *param, size_t idx, struct yac_param **sub_param)
Get a handle to a subparameter by index.
int yac_param_is_default(const struct yac_param *param)
Check whether a parameter is at its default value.
double yac_deg_to_rad(double deg, char const *param_name)
int yac_param_get_scalar_kind(const struct yac_param *param, enum yac_param_scalar_kind *scalar_kind)
Get the storage kind of a scalar parameter.
double yac_rad_to_deg(double rad, char const *param_name)
int yac_param_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
Get the value of a scalar parameter as a string.
int yac_param_set_scalar(struct yac_param *param, const char *value_str)
Set the value of a scalar parameter from a string.
enum yac_param_type yac_param_get_type(const struct yac_param *param)
Get the type of a parameter.
int yac_param_append(struct yac_param *param, struct yac_param **sub_param)
Append a new default subparameter to a list parameter and return a handle to it.
int yac_param_set_scalar_int(struct yac_param *param, int value)
Set the value of a scalar parameter as an int.
int yac_param_get_sub_count(const struct yac_param *param, size_t *count)
Get the number of subparameters.
int yac_param_set_scalar_dble(struct yac_param *param, double value)
Set the value of a scalar parameter as a double.
const char * yac_param_get_last_error(void)
Retrieve the last error message for the calling thread.
int yac_param_get_scalar_int(const struct yac_param *param, int *value)
Get the value of a scalar parameter as an int.
const char * yac_param_get_name(const struct yac_param *param)
Get the name of the current parameter.
int yac_param_get_sub_by_name(struct yac_param *param, const char *name, struct yac_param **sub_param)
Get a handle to a subparameter by name.
Public interface for YAC parameters.
yac_param_scalar_kind
Scalar parameter storage kind.
@ YAC_PARAM_SCALAR_KIND_INVALID
Invalid or unsupported scalar kind.
@ YAC_PARAM_SCALAR_KIND_INT
Scalar value backed by int storage.
@ YAC_PARAM_SCALAR_KIND_DBLE
Scalar value backed by double storage.
@ YAC_PARAM_SCALAR_KIND_STR
Scalar value backed by string storage.
yac_param_type
Parameter type for generic configuration interface.
@ YAC_PARAM_TYPE_SCALAR
Single typed value (e.g., int, double, string, enum)
@ YAC_PARAM_TYPE_LIST
Ordered, growable list of subparameters.
@ YAC_PARAM_TYPE_EMPTY
No value (used for optional/absent parameters)
@ YAC_PARAM_TYPE_STRUCT
Named, fixed set of subparameters.
struct yac_param * yac_param_angle_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int has_default, int is_defined)
Create an angle parameter (stored in radians)
struct yac_param * yac_param_bool_new(const char *name, int *value_ptr, int default_value, int has_default, int is_defined)
Create a bool parameter (backed by int)
struct yac_param * yac_param_dble_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int allow_nan, int allow_inf, int has_default, int is_defined)
Create a double parameter.
struct yac_param * yac_param_distance_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int has_default, int is_defined)
Create a distance parameter (stored in radians)
struct yac_param * yac_param_enum_new(const char *name, int *value_ptr, int default_value, struct yac_name_type_pair const *enum_table, size_t enum_table_size, int has_default, int is_defined)
Create a new enum parameter for configuration.
struct yac_param * yac_param_int_new(const char *name, int *value_ptr, int default_value, int value_min, int value_max, int has_default, int is_defined)
Create an int parameter.
#define YAC_PARAM_ASSERT(COND,...)
struct yac_param * yac_param_list_new(const char *name, void ***list, yac_param_factory_ptr default_factory, yac_param_element_get_param_ptr element_get_param)
Create a new list parameter.
struct yac_param * yac_param_oneof_new(const char *name, yac_param_oneof_factory_ptr default_factory, void **value_ptr, struct yac_param *subparam, int subparam_is_default)
Create a new one-of struct parameter with a given name and a default_factory.
struct yac_param * yac_param_str_new(const char *name, char **value_ptr, const char *default_value, int allow_NULL, int allow_empty, size_t max_str_len, int has_default, int is_defined)
Create a string parameter.
struct yac_param * yac_param_struct_new(const char *name, struct yac_param **subparams, size_t subparam_count)
Create a new struct parameter with a given name and subparameters.
struct dummy_config::dummy_sub::@92::@93 A
union dummy_config::dummy_sub::@92 sub_data
struct dummy_config::dummy_sub::@92::@94 B
enum dummy_config::dummy_sub::@91 sub_type
struct dummy_config::dummy_sub * sub
int const DUMMY_COUNT_DEFAULT
[icparam_example_lookup]
static char const * oneof_default_param_name
static char const * oneof_bool_param_name
static int oneof_is_defined
static int list_param_has_default
@ dummy_option_types_size
static int oneof_has_default
static struct yac_name_type_pair const dummy_option_types[]
[icparam_example_struct]
static int list_param_is_defined
static char const * list_param_name
static struct yac_param * dummy_config_get_param(struct dummy_config *cfg)
char const *const DUMMY_NAME_DEFAULT
double const DUMMY_DISTANCE_DEFAULT
static int list_param_max
static int list_param_min
static int oneof_int_default
double const DUMMY_SCALE_DEFAULT
static int const DUMMY_SUB_DEFAULT
static struct yac_param * dummy_sub_build_param(struct dummy_sub *dummy_sub)
[icparam_example_defaults]
static int list_param_init_value
static char const * oneof_int_param_name
static int oneof_bool_has_default
static int dummy_sub_factory(const char *name, void **obj, struct yac_param **param, int *is_default)
static int oneof_bool_default
static int list_param_default_value
static int oneof_bool_val
static int oneof_bool_is_defined
#define YAC_UNREACHABLE_DEFAULT(msg)