enum: Add helper to parse enum flags from strings
Individual flag names are separated by |.
This commit is contained in:
@@ -20,13 +20,13 @@
|
||||
/*******************************************************************************
|
||||
* continuous enum
|
||||
*/
|
||||
enum {
|
||||
enum test_enum_cont {
|
||||
CONT1,
|
||||
CONT2,
|
||||
CONT3,
|
||||
CONT4,
|
||||
CONT5,
|
||||
} test_enum_cont;
|
||||
};
|
||||
|
||||
ENUM_BEGIN(test_enum_cont_names, CONT1, CONT5,
|
||||
"CONT1", "CONT2", "CONT3", "CONT4", "CONT5");
|
||||
@@ -35,13 +35,13 @@ ENUM_END(test_enum_cont_names, CONT5);
|
||||
/*******************************************************************************
|
||||
* split enum
|
||||
*/
|
||||
enum {
|
||||
enum test_enum_split {
|
||||
SPLIT1 = 1,
|
||||
SPLIT2,
|
||||
SPLIT3 = 5,
|
||||
SPLIT4,
|
||||
SPLIT5 = 255,
|
||||
} test_enum_split;
|
||||
};
|
||||
|
||||
ENUM_BEGIN(test_enum_split_names, SPLIT1, SPLIT2,
|
||||
"SPLIT1", "SPLIT2");
|
||||
@@ -54,7 +54,7 @@ ENUM_END(test_enum_split_names, SPLIT5);
|
||||
/*******************************************************************************
|
||||
* enum flags
|
||||
*/
|
||||
enum {
|
||||
enum test_enum_flags {
|
||||
FLAG1 = (1 << 0),
|
||||
FLAG2 = (1 << 1),
|
||||
FLAG3 = (1 << 2),
|
||||
@@ -67,7 +67,7 @@ enum {
|
||||
FLAG10 = (1 << 9),
|
||||
FLAG11 = (1 << 10),
|
||||
FLAG12 = (1 << 11),
|
||||
} test_enum_flags;
|
||||
};
|
||||
|
||||
ENUM_FLAGS(test_enum_flags_names, FLAG1, FLAG5,
|
||||
"(unset)", "FLAG1", "FLAG2", "FLAG3", "FLAG4", "FLAG5");
|
||||
@@ -263,6 +263,30 @@ static struct {
|
||||
}, enum_flags_to_string_tests[] = {
|
||||
{-1, NULL},
|
||||
{6435, NULL},
|
||||
}, enum_flags_from_string_tests[] = {
|
||||
{0, NULL},
|
||||
{0, ""},
|
||||
{0, "(unset)"},
|
||||
{FLAG1, "FLAG1"},
|
||||
{FLAG2, "flag2"},
|
||||
{FLAG3, "fLaG3"},
|
||||
{FLAG4, "FLAG4"},
|
||||
{FLAG5, "FLAG5"},
|
||||
{FLAG1 | FLAG3, "FLAG1 | FLAG3"},
|
||||
{FLAG1 | FLAG3, "flag3|flag1"},
|
||||
{FLAG1 | FLAG3, "flag1|flag3 | (unset)"},
|
||||
{FLAG1 | FLAG2 | FLAG3 | FLAG4 | FLAG5, "flag1|flag2|flag3|flag4|flag5"},
|
||||
{FLAG1 | FLAG2 | FLAG3 | FLAG4 | FLAG5, "flag3|flag4|flag5|flag2|flag1"},
|
||||
{FLAG5, "(unset)|flag5"},
|
||||
{FLAG1, "FLAG1 | flag1 | flAg1"},
|
||||
{-1, "FLAG6"},
|
||||
{-1, "flag1 | asdf"},
|
||||
}, enum_flags_from_string_noflagenum_tests[] = {
|
||||
{0, NULL},
|
||||
{0, ""},
|
||||
{CONT2, "CONT2"},
|
||||
{CONT5, "CONT5"},
|
||||
{-1, "asdf"},
|
||||
};
|
||||
|
||||
START_TEST(test_enum_printf_hook_cont)
|
||||
@@ -371,6 +395,38 @@ START_TEST(test_enum_flags_to_string_noflagenum)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_enum_flags_from_string)
|
||||
{
|
||||
enum test_enum_flags val;
|
||||
|
||||
if (enum_flags_from_string(test_enum_flags_names,
|
||||
enum_flags_from_string_tests[_i].str, &val))
|
||||
{
|
||||
ck_assert_int_eq(enum_flags_from_string_tests[_i].val, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
ck_assert_int_eq(enum_flags_from_string_tests[_i].val, -1);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_enum_flags_from_string_noflagenum)
|
||||
{
|
||||
enum test_enum_cont val;
|
||||
|
||||
if (enum_flags_from_string(test_enum_cont_names,
|
||||
enum_flags_from_string_noflagenum_tests[_i].str, &val))
|
||||
{
|
||||
ck_assert_int_eq(enum_flags_from_string_noflagenum_tests[_i].val, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
ck_assert_int_eq(enum_flags_from_string_noflagenum_tests[_i].val, -1);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_enum_printf_hook_width)
|
||||
{
|
||||
char buf[128];
|
||||
@@ -406,6 +462,11 @@ Suite *enum_suite_create()
|
||||
tcase_add_loop_test(tc, test_enum_flags_to_string_noflagenum, 0, countof(printf_tests_flags_noflagenum));
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("enum_flags_from_string");
|
||||
tcase_add_loop_test(tc, test_enum_flags_from_string, 0, countof(enum_flags_from_string_tests));
|
||||
tcase_add_loop_test(tc, test_enum_flags_from_string_noflagenum, 0, countof(enum_flags_from_string_noflagenum_tests));
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("enum_printf_hook");
|
||||
tcase_add_loop_test(tc, test_enum_printf_hook_cont, 0, countof(printf_tests_cont));
|
||||
tcase_add_loop_test(tc, test_enum_printf_hook_split, 0, countof(printf_tests_split));
|
||||
|
||||
Reference in New Issue
Block a user