tree evaluate_merge (tree t) { int i, n= N(t); if (n == 0) return ""; tree acc= evaluate (t[0]); if (is_concat (acc)) acc= tree_as_string (acc); for (i=1; i<n; i++) { tree add= evaluate (t[i]); if (is_atomic (acc) && (is_atomic (add) || is_concat (add))) acc= acc->label * tree_as_string (add); else if (is_tuple (acc) && is_tuple (add)) acc= acc * add; else if (is_func (acc, MACRO) && is_func (add, MACRO) && (N(acc) == N(add)) && (acc (0, N(acc)-1) == add (0, N(add)-1))) { tree r = copy (acc); tree u1= copy (acc[N(acc)-1]); tree u2= copy (add[N(add)-1]); tree u (CONCAT, u1, u2); if (u1 == "") u= u2; else if (u2 == "") u= u1; else if (is_atomic (u1) && is_atomic (u2)) u= u1->label * u2->label; r[N(r)-1]= u; acc= r; } else return evaluate_error ("bad merge"); } return acc; }
END_TEST START_TEST(test_dbmail_mailbox_get_set) { guint c, d, r; GTree *set; DbmailMailbox *mb = dbmail_mailbox_new(get_mailbox_id("INBOX")); dbmail_mailbox_set_uid(mb,TRUE); r = dbmail_mailbox_open(mb); fail_unless(r == DM_SUCCESS, "dbmail_mailbox_open failed"); // basic tests; set = dbmail_mailbox_get_set(mb, "1:*", 0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); c = g_tree_nnodes(set); fail_unless(c>1,"dbmail_mailbox_get_set failed [%d]", c); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb,"*:1",0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); d = g_tree_nnodes(set); fail_unless(c==d,"dbmail_mailbox_get_set failed [%d != %d]", c, d); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb,"1,*",0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); d = g_tree_nnodes(set); fail_unless(d==2,"mailbox_get_set failed [%d != 2]", d); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb,"1,*",0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); d = g_tree_nnodes(set); fail_unless(d==2,"mailbox_get_set failed"); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb,"1",0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); d = g_tree_nnodes(set); fail_unless(d==1,"mailbox_get_set failed"); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb,"-1:1",0); fail_unless(set == NULL); // UID sets char *s, *t; set = dbmail_mailbox_get_set(mb, "1:*", 1); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); s = tree_as_string(set); c = g_tree_nnodes(set); fail_unless(c>1,"dbmail_mailbox_get_set failed"); g_tree_destroy(set); set = dbmail_mailbox_get_set(mb, "1:*", 0); fail_unless(set != NULL,"dbmail_mailbox_get_set failed"); t = tree_as_string(set); fail_unless(strncmp(s,t,1024)==0,"mismatch between <1:*> and <UID 1:*>\n%s\n%s", s,t); g_tree_destroy(set); g_free(s); g_free(t); dbmail_mailbox_free(mb); // empty box mb = dbmail_mailbox_new(get_mailbox_id("empty")); dbmail_mailbox_open(mb); set = dbmail_mailbox_get_set(mb, "1:*", 0); fail_unless(set == NULL,"dbmail_mailbox_get_set failed"); set = dbmail_mailbox_get_set(mb, "*", 0); fail_unless(set == NULL,"dbmail_mailbox_get_set failed"); set = dbmail_mailbox_get_set(mb, "1", 0); fail_unless(set == NULL,"dbmail_mailbox_get_set failed"); dbmail_mailbox_free(mb); }