Code

parser: Add support for <expr> IS [NOT] TRUE / FALSE queries.
[sysdb.git] / t / unit / parser / parser_test.c
index f363dc2b6d3e9f51ca87780026b8ec051bd918e7..4dcf684de06cc6c3b508fff98401883913bf7e6d 100644 (file)
@@ -372,7 +372,7 @@ struct {
          "ANY service.service.name = 's'",
                                 -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
 
-       /* NULL */
+       /* NULL / TRUE / FALSE */
        { "LOOKUP hosts MATCHING "
          "attribute['foo'] "
          "IS NULL",             -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
@@ -384,6 +384,24 @@ struct {
          "IS NULL",             -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
        { "LOOKUP hosts MATCHING "
          "ANY service.name IS NULL", -1, -1, 0, 0 },
+       { "LOOKUP hosts MATCHING "
+         "attribute['foo'] "
+         "IS TRUE",             -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
+       { "LOOKUP hosts MATCHING "
+         "attribute['foo'] "
+         "IS NOT TRUE",         -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
+       { "LOOKUP hosts MATCHING "
+         "NOT attribute['foo'] "
+         "IS TRUE",             -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
+       { "LOOKUP hosts MATCHING "
+         "attribute['foo'] "
+         "IS FALSE",            -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
+       { "LOOKUP hosts MATCHING "
+         "attribute['foo'] "
+         "IS NOT FALSE",        -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
+       { "LOOKUP hosts MATCHING "
+         "NOT attribute['foo'] "
+         "IS FALSE",            -1,  1, SDB_AST_TYPE_LOOKUP, SDB_HOST },
 
        /* invalid numeric constants */
        { "LOOKUP hosts MATCHING "
@@ -530,6 +548,14 @@ struct {
          "name + 1 IS NULL",    -1, -1, 0, 0 },
        { "LOOKUP hosts FILTER "
          "name + 1 IS NULL",    -1, -1, 0, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name + 1 IS TRUE",    -1, -1, 0, 0 },
+       { "LOOKUP hosts FILTER "
+         "name + 1 IS TRUE",    -1, -1, 0, 0 },
+       { "LOOKUP hosts MATCHING "
+         "name + 1 IS FALSE",   -1, -1, 0, 0 },
+       { "LOOKUP hosts FILTER "
+         "name + 1 IS FALSE",   -1, -1, 0, 0 },
 
        /* invalid iterators */
        { "LOOKUP hosts MATCHING "
@@ -635,7 +661,7 @@ START_TEST(test_parse)
        sdb_strbuf_t *errbuf = sdb_strbuf_create(64);
        sdb_llist_t *check;
        sdb_ast_node_t *node;
-       sdb_store_matcher_t *m;
+       sdb_store_query_t *q;
        _Bool ok;
 
        check = sdb_parser_parse(parse_data[_i].query,
@@ -698,13 +724,13 @@ START_TEST(test_parse)
        }
 
        /* TODO: this should move into front-end specific tests */
-       m = sdb_store_query_prepare(node);
-       fail_unless(m != NULL,
-                       "sdb_store_query_prepare(AST<%s>) = NULL; expected: <m>",
+       q = sdb_store_query_prepare(node);
+       fail_unless(q != NULL,
+                       "sdb_store_query_prepare(AST<%s>) = NULL; expected: <query>",
                        parse_data[_i].query);
 
        sdb_object_deref(SDB_OBJ(node));
-       sdb_object_deref(SDB_OBJ(m));
+       sdb_object_deref(SDB_OBJ(q));
        sdb_llist_destroy(check);
        sdb_strbuf_destroy(errbuf);
 }
@@ -832,9 +858,13 @@ struct {
          "2014-08-16 17:23",               -1,  SDB_AST_EQ },
        { "attribute['foo'] = "
          "2014-08-16 17:23:53",            -1,  SDB_AST_EQ },
-       /* NULL */
+       /* NULL / TRUE / FALSE */
        { "attribute['foo'] IS NULL",       -1,  SDB_AST_ISNULL },
        { "attribute['foo'] IS NOT NULL",   -1,  SDB_AST_NOT },
+       { "attribute['foo'] IS TRUE",       -1,  SDB_AST_ISTRUE },
+       { "attribute['foo'] IS NOT TRUE",   -1,  SDB_AST_NOT },
+       { "attribute['foo'] IS FALSE",      -1,  SDB_AST_ISFALSE },
+       { "attribute['foo'] IS NOT FALSE",  -1,  SDB_AST_NOT },
        /* array expressions */
        { "backend < ['a']",                -1,  SDB_AST_LT },
        { "backend <= ['a']",               -1,  SDB_AST_LE },