#include <atf-c.h>
#include <err.h>
#include <unistd.h>
#include <pkg.h>
#include <private/pkg.h>
#include <private/pkg_deps.h>
ATF_TC_WITHOUT_HEAD(check_parsing);
ATF_TC_WITHOUT_HEAD(check_sql);
ATF_TC_WITHOUT_HEAD(check_op_parsing);
ATF_TC_BODY(check_parsing, tc)
{
struct pkg_dep_formula *f;
const char *cases[] = {
"name",
"name = 1.0",
"name >= 1.0,1",
"name1, name2",
"name1 | name2, name3",
"name1 = 1.0 | name2 != 1.0, name3 > 1.0 < 2.0 != 1.5",
"name1 = 1.0 | name2 != 1.0, name3 > 1.0 < 2.0 != 1.5, name4 +opt1 -opt2"
};
char *r;
unsigned int i;
for (i = 0; i < sizeof(cases) / sizeof(cases[0]); i ++) {
f = pkg_deps_parse_formula(cases[i]);
ATF_REQUIRE(f != NULL);
r = pkg_deps_formula_tostring(f);
ATF_REQUIRE_STREQ(r, cases[i]);
free(r);
pkg_deps_formula_free(f);
}
}
ATF_TC_HEAD(check_sql, tc)
{
atf_tc_set_md_var(tc, "descr", "testing creating sql queries from formulas");
}
ATF_TC_BODY(check_sql, tc)
{
struct pkg_dep_formula *f;
const char *cases[] = {
"name", "(name='name')",
"name = 1.0", "(name='name' AND vercmp('=',version,'1.0'))",
"name >= 1.0,1", "(name='name' AND vercmp('>=',version,'1.0,1'))",
"name1 | name2", "(name='name1') OR (name='name2')",
"name1 = 1.0 | name2 != 1.0", "(name='name1' AND vercmp('=',version,'1.0')) OR (name='name2' AND vercmp('!=',version,'1.0'))"
};
char *r;
unsigned int i;
for (i = 0; i < sizeof(cases) / sizeof(cases[0]) / 2; i ++) {
f = pkg_deps_parse_formula(cases[i * 2]);
ATF_REQUIRE(f != NULL);
r = pkg_deps_formula_tosql(f->items);
ATF_REQUIRE_STREQ(r, cases[i * 2 + 1]);
free(r);
pkg_deps_formula_free(f);
}
}
ATF_TC_HEAD(check_op_parsing, tc)
{
atf_tc_set_md_var(tc, "descr", "testing parsing operands");
}
ATF_TC_BODY(check_op_parsing, tc)
{
struct cases {
const char *val;
int expect;
} cases[] = {
{ "=", VERSION_EQ },
{ "==", VERSION_EQ },
{ ">=", VERSION_GE },
{ ">", VERSION_GT },
{ "<=", VERSION_LE },
{ "<", VERSION_LT },
{ "!", VERSION_NOT },
{ "!=", VERSION_NOT },
{ "*", VERSION_ANY },
{ NULL, VERSION_ANY },
{ "=>", VERSION_ANY },
};
for (unsigned int i = 0; i < sizeof(cases) / sizeof(cases[0]); i ++) {
ATF_REQUIRE_EQ((int)pkg_deps_string_toop(cases[i].val), cases[i].expect);
}
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, check_parsing);
ATF_TP_ADD_TC(tp, check_sql);
ATF_TP_ADD_TC(tp, check_op_parsing);
return (atf_no_error());
}