test-mail-search-args-simplify.c revision fccd110b494a7e31f23d31d9e3bc3e986c9bb1a8
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "str.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "test-common.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-storage-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-search-build.h"
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen#include "mail-search-parser.h"
022412398e56a8f31ef111cfd7271498d64af9a9Timo Sirainen#include "mail-search.h"
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic const struct {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *input;
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen const char *output;
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen} tests[] = {
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "ALL", "ALL" },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "NOT ALL", "NOT ALL" },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "ALL NOT ALL", "NOT ALL" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "ALL NOT ALL TEXT foo", "NOT ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR ALL NOT ALL", "ALL" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ALL OR NOT ALL TEXT foo", "ALL" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ALL OR TEXT foo TEXT bar", "ALL" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR TEXT FOO ( ALL NOT ALL )", "TEXT FOO" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "TEXT FOO OR ALL NOT ALL", "TEXT FOO" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "TEXT foo", "TEXT foo" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( TEXT foo )", "TEXT foo" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( ( TEXT foo ) )", "TEXT foo" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "( ( TEXT foo ) ( TEXT bar ) )", "TEXT foo TEXT bar" },
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen { "OR ( TEXT foo ) ( TEXT bar )", "(OR TEXT foo TEXT bar)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR ( TEXT foo ) OR ( TEXT bar ) ( TEXT baz )",
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen "(OR TEXT foo OR TEXT bar TEXT baz)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR ( ( TEXT foo TEXT foo2 ) ) ( ( TEXT bar ( TEXT baz ) ) )",
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen "(OR (TEXT foo TEXT foo2) (TEXT bar TEXT baz))" },
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainen
2d3aac5be07b96f72cf0551fac35ac74a4f07770Timo Sirainen { "NOT ( TEXT foo )", "NOT TEXT foo" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "NOT ( NOT ( TEXT foo ) )", "TEXT foo" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT OR ( TEXT foo ) ( TEXT bar )", "NOT TEXT foo NOT TEXT bar" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT ( OR ( TEXT foo ) ( TEXT bar ) )", "NOT TEXT foo NOT TEXT bar" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT ( TEXT foo TEXT bar )", "(OR NOT TEXT foo NOT TEXT bar)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "ANSWERED FLAGGED SEEN", "(ANSWERED FLAGGED SEEN)" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "OR ( ANSWERED FLAGGED SEEN ) DRAFT", "(OR (ANSWERED FLAGGED SEEN) DRAFT)" },
a205d315b0978985ba77d871f44e4a98273612e6Timo Sirainen { "ANSWERED TEXT foo FLAGGED SEEN", "(ANSWERED FLAGGED SEEN) TEXT foo" },
a205d315b0978985ba77d871f44e4a98273612e6Timo Sirainen { "NOT ( ANSWERED FLAGGED SEEN )", "NOT (ANSWERED FLAGGED SEEN)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR NOT ANSWERED OR NOT FLAGGED NOT SEEN", "NOT (ANSWERED FLAGGED SEEN)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR NOT ANSWERED OR NOT FLAGGED SEEN", "(OR NOT (ANSWERED FLAGGED) SEEN)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR NOT ANSWERED OR FLAGGED NOT SEEN", "(OR NOT (ANSWERED SEEN) FLAGGED)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT ANSWERED OR FLAGGED NOT SEEN", "NOT ANSWERED (OR FLAGGED NOT SEEN)" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "NOT ANSWERED OR NOT FLAGGED NOT SEEN", "NOT ANSWERED NOT (FLAGGED SEEN)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "ANSWERED NOT FLAGGED SEEN NOT DRAFT", "(ANSWERED SEEN) NOT FLAGGED NOT DRAFT" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR NOT ANSWERED NOT SEEN", "NOT (ANSWERED SEEN)" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen { "OR NOT ANSWERED OR NOT SEEN TEXT foo", "(OR NOT (ANSWERED SEEN) TEXT foo)" },
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen { "ANSWERED ANSWERED", "ANSWERED" },
a6a2b38d806f3ab3198160e39240a8200775e525Timo Sirainen { "ANSWERED NOT ANSWERED", "NOT ALL" },
fb2e0bbb7737f3223b16aa41e4b40fb0cd5f288fTimo Sirainen { "ANSWERED ANSWERED NOT ANSWERED", "NOT ALL" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen { "ANSWERED NOT ANSWERED ANSWERED NOT ANSWERED", "NOT ALL" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen { "NOT ANSWERED NOT ANSWERED", "NOT ANSWERED" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen { "NOT SEEN NOT ANSWERED NOT ANSWERED", "NOT SEEN NOT ANSWERED" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen { "OR NOT SEEN OR NOT ANSWERED NOT ANSWERED", "NOT (ANSWERED SEEN)" },
12d34ab79772e0748a1daef30fa749dfe3036608Timo Sirainen
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "KEYWORD foo", "KEYWORD foo" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "KEYWORD foo KEYWORD bar", "KEYWORD foo KEYWORD bar" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "NOT KEYWORD foo", "NOT KEYWORD foo" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT KEYWORD foo NOT KEYWORD bar", "NOT KEYWORD foo NOT KEYWORD bar" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen { "OR KEYWORD foo KEYWORD bar", "(OR KEYWORD foo KEYWORD bar)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR NOT KEYWORD foo NOT KEYWORD bar", "(OR NOT KEYWORD foo NOT KEYWORD bar)" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "KEYWORD foo KEYWORD foo", "KEYWORD foo" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "KEYWORD foo NOT KEYWORD foo", "NOT ALL" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "OR KEYWORD foo NOT KEYWORD foo", "ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR KEYWORD foo KEYWORD foo", "KEYWORD foo" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "NOT KEYWORD foo NOT KEYWORD foo", "NOT KEYWORD foo" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:* 1:*", "ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR 1:5 6:*", "ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "UID 1:* UID 1:*", "ALL" },
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen { "OR UID 1:5 UID 6:*", "ALL" },
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { "2:* 2:*", "2:4294967295" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { "OR 2:* 2:*", "2:4294967295" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "UID 2:* UID 2:*", "UID 2:4294967295" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR UID 2:* UID 2:*", "UID 2:4294967295" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:5 6:7", "NOT ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:5 3:7", "3:5" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:5 3:7 4:9", "4:5" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:5 OR 3:4 4:6", "3:5" },
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen { "OR 1 2", "1:2" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "NOT 1,3:5", "2,6:4294967294" },
e5759add4dc24b96606dccc4a989838e260f2a12Timo Sirainen { "NOT 1:100 NOT 50:200", "201:4294967294" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR NOT 1:100 NOT 50:200", "1:49,101:4294967294" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "UID 1:5 UID 6:7", "NOT ALL" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "UID 1:5 UID 3:7", "UID 3:5" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR UID 1 UID 2", "UID 1:2" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "NOT UID 1,3:5", "UID 2,6:4294967294" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "1:5 UID 10:20", "1:5 UID 10:20" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { "1:5 NOT UID 10:20", "1:5 UID 1:9,21:4294967294" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "ALL NOT UID 3:*", "NOT UID 3:4294967295" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "NOT 1:10 NOT *", "11:4294967294 NOT 4294967295" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "BEFORE 03-Aug-2014 BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"01-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"02-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR BEFORE 01-Aug-2014 OR BEFORE 03-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"03-Aug-2014\"" },
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen { "BEFORE 03-Aug-2014 NOT BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"02-Aug-2014\" NOT BEFORE \"01-Aug-2014\"" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { "SENTBEFORE 03-Aug-2014 SENTBEFORE 01-Aug-2014 SENTBEFORE 02-Aug-2014", "SENTBEFORE \"01-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "SENTBEFORE 03-Aug-2014 BEFORE 01-Aug-2014 SENTBEFORE 02-Aug-2014", "SENTBEFORE \"02-Aug-2014\" BEFORE \"01-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "ON 03-Aug-2014 ON 03-Aug-2014", "ON \"03-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "ON 03-Aug-2014 ON 04-Aug-2014", "ON \"03-Aug-2014\" ON \"04-Aug-2014\"" }, /* this could be replaced with e.g. NOT ALL */
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR ON 03-Aug-2014 ON 04-Aug-2014", "(OR ON \"03-Aug-2014\" ON \"04-Aug-2014\")" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen { "SINCE 03-Aug-2014 SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\"" },
821984ecb6c90696f35c32a8dc4c8a60f9e98f99Timo Sirainen { "OR SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"01-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "OR SINCE 01-Aug-2014 OR SINCE 03-Aug-2014 SINCE 02-Aug-2014", "SINCE \"01-Aug-2014\"" },
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen { "SINCE 03-Aug-2014 NOT SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\" NOT SINCE \"01-Aug-2014\"" },
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen { "SENTSINCE 03-Aug-2014 SENTSINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\"" },
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen { "SENTSINCE 03-Aug-2014 SINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\" SINCE \"01-Aug-2014\"" },
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SMALLER 1 SMALLER 2", "SMALLER 1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR SMALLER 1 SMALLER 2", "SMALLER 2" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR SMALLER 1 OR SMALLER 3 SMALLER 2", "SMALLER 3" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SMALLER 3 NOT SMALLER 1 SMALLER 2", "SMALLER 2 NOT SMALLER 1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SMALLER 3 LARGER 5", "SMALLER 3 LARGER 5" }, /* this could be replaced with e.g. NOT ALL */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR SMALLER 3 LARGER 5", "(OR SMALLER 3 LARGER 5)" },
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "LARGER 3 LARGER 1 LARGER 2", "LARGER 3" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR LARGER 1 LARGER 2", "LARGER 1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR LARGER 1 OR LARGER 3 LARGER 2", "LARGER 1" },
197ad81605dc0f6d2ebc9ad99994db5ca6d76699Timo Sirainen { "LARGER 3 NOT LARGER 1 LARGER 2", "LARGER 3 NOT LARGER 1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SUBJECT foo SUBJECT foo", "SUBJECT foo" },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "SUBJECT foo NOT SUBJECT foo", "NOT ALL" },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "OR SUBJECT foo NOT SUBJECT foo", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SUBJECT foo SUBJECT foob", "SUBJECT foo SUBJECT foob" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR SUBJECT foo SUBJECT foo", "SUBJECT foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "FROM foo FROM foo", "FROM foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "FROM foo NOT FROM foo", "NOT ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR FROM foo NOT FROM foo", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "FROM foo FROM bar", "FROM foo FROM bar" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "FROM foo TO foo", "FROM foo TO foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "TEXT foo TEXT foo", "TEXT foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "TEXT foo TEXT foob", "TEXT foo TEXT foob" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR TEXT foo TEXT foo", "TEXT foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR NOT TEXT foo TEXT foo", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR TEXT foo NOT TEXT foo", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "TEXT foo NOT TEXT foo", "NOT ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "NOT TEXT foo TEXT foo", "NOT ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "BODY foo BODY foo", "BODY foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "BODY foo NOT BODY foo", "NOT ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR BODY foo NOT BODY foo", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR BODY foo BODY foo", "BODY foo" },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen { "TEXT foo BODY foo", "TEXT foo BODY foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR ( TEXT foo OR TEXT foo TEXT foo ) ( TEXT foo ( TEXT foo ) )", "TEXT foo" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* value="" tests */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "HEADER foo ", "HEADER FOO \"\"" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SUBJECT ", "SUBJECT \"\"" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "BODY ", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "TEXT ", "ALL" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "HEADER foo .", "HEADER FOO ." },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "SUBJECT .", "SUBJECT ." },
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen { "BODY .", "BODY ." },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "TEXT .", "TEXT ." },
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen
5363a534097c170ef9cccbdde5ca802f581f5eb7Timo Sirainen /* OR: drop redundant args */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR ( TEXT common1 TEXT unique1 ) TEXT common1", "TEXT common1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) TEXT common1", "TEXT common1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR TEXT common1 ( TEXT common1 TEXT unique1 )", "TEXT common1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR TEXT common1 ( TEXT unique1 TEXT common1 )", "TEXT common1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR ( TEXT common1 TEXT common2 ) ( TEXT common1 TEXT common2 TEXT unique1 )", "TEXT common1 TEXT common2" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR TEXT common1 OR ( TEXT unique1 TEXT common1 ) ( TEXT unique3 TEXT common1 )", "TEXT common1" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen /* OR: extract common AND */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen { "OR ( TEXT common1 TEXT unique1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ( TEXT common1 TEXT unique1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 TEXT unique3 )", "(OR TEXT unique1 (TEXT unique2 TEXT unique3)) TEXT common1" },
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen { "OR ( TEXT common1 TEXT common2 TEXT unique1 ) ( TEXT common1 TEXT common2 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common2 TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "OR ( TEXT common1 TEXT common2 TEXT unique1 TEXT unique2 ) ( TEXT common1 TEXT common2 TEXT unique3 TEXT unique4 )", "(OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4)) TEXT common2 TEXT common1" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen /* non-matching cases */
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { "OR ( TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR (TEXT unique1 TEXT unique2) TEXT unique3)" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { "OR ( TEXT unique1 TEXT unique2 ) ( TEXT unique3 TEXT unique4 )", "(OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4))" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT unique2 ) TEXT unique3", "(OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT unique2) TEXT unique3)" },
7f773564b94e6054a40d3785cb63c29f1e4d4deeTimo Sirainen { "OR ( TEXT common1 TEXT unique1 ) OR ( TEXT common1 TEXT common2 ) ( TEXT common2 TEXT unique2 )", "(OR (TEXT common1 TEXT unique1) OR (TEXT common1 TEXT common2) (TEXT common2 TEXT unique2))" },
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen
33ae95df45c9b5ec51332a6b39eb5322038686b9Timo Sirainen /* SUB: drop redundant args */
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "( OR TEXT common1 TEXT unique1 ) TEXT common1", "TEXT common1" },
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) TEXT common1", "TEXT common1" },
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen { "TEXT common1 ( OR TEXT common1 TEXT unique1 )", "TEXT common1" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "TEXT common1 ( OR TEXT unique1 TEXT common1 )", "TEXT common1" },
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "( OR TEXT common1 TEXT common2 ) ( OR TEXT common1 OR TEXT common2 TEXT unique1 )", "(OR TEXT common1 TEXT common2)" },
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "TEXT common1 ( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique3 TEXT common1 )", "TEXT common1" },
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "OR ( TEXT common1 ( OR TEXT unique1 TEXT common1 ) ) TEXT unique1", "(OR TEXT common1 TEXT unique1)" },
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen /* SUB: extract common OR */
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
58eb2cb24dbeadd94500670acad7ceb1c8b0d9b4Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
bf301a34ffbfd049be583094019b2644884b6d0bTimo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 OR TEXT unique2 TEXT unique3 )", "(OR (TEXT unique1 (OR TEXT unique2 TEXT unique3)) TEXT common1)" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT common1 OR TEXT common2 TEXT unique1 ) ( OR TEXT common1 OR TEXT common2 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) OR TEXT common2 TEXT common1)" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT common1 OR TEXT common2 OR TEXT unique1 TEXT unique2 ) ( OR TEXT common1 OR TEXT common2 OR TEXT unique3 TEXT unique4 )", "(OR ((OR TEXT unique1 TEXT unique2) (OR TEXT unique3 TEXT unique4)) OR TEXT common2 TEXT common1)" },
1e76a5b92f9d82d557f81f080f3dfad1c9d8f200Timo Sirainen
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen /* non-matching cases */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR TEXT unique1 TEXT unique2) TEXT unique3" },
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen { "( OR TEXT unique1 TEXT unique2 ) ( OR TEXT unique3 TEXT unique4 )", "(OR TEXT unique1 TEXT unique2) (OR TEXT unique3 TEXT unique4)" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 ) TEXT unique3", "(OR TEXT common1 TEXT unique1) (OR TEXT common1 TEXT unique2) TEXT unique3" },
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT common2 ) ( OR TEXT common2 TEXT unique2 )", "(OR TEXT common1 TEXT unique1) (OR TEXT common1 TEXT common2) (OR TEXT common2 TEXT unique2)" },
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen};
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct mail_search_args *
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainentest_build_search_args(const char *args)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen struct mail_search_parser *parser;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_search_args *sargs;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *error, *charset = "UTF-8";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen parser = mail_search_parser_init_cmdline(t_strsplit(args, " "));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (mail_search_build(mail_search_register_get_imap(),
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen parser, &charset, &sargs, &error) < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_panic("%s", error);
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen mail_search_parser_deinit(&parser);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return sargs;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void test_mail_search_args_simplify(void)
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen{
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen struct mail_search_args *args;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen struct mail_storage_settings set = { .mail_max_keyword_length = 100 };
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mail_storage storage = { .set = &set };
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen struct mailbox box = { .opened = TRUE, .storage = &storage };
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen string_t *str = t_str_new(256);
d371507847d62ba311b4bcc23d18f45c3d0f1a38Timo Sirainen const char *error;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen unsigned int i;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_begin("mail search args simplify");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen box.index = mail_index_alloc(NULL, "dovecot.index.");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); i++) {
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen args = test_build_search_args(tests[i].input);
08b30498acefc69e223baf7eda6429be98cc3a10Timo Sirainen mail_search_args_init(args, &box, FALSE, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_search_args_simplify(args);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_truncate(str, 0);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert(mail_search_args_to_imap(str, args->args, &error));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert_idx(strcmp(str_c(str), tests[i].output) == 0, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_search_args_unref(&args);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_index_free(&box.index);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_end();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void test_mail_search_args_simplify_empty_lists(void)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_search_args *args;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_begin("mail search args simplify empty args");
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen args = mail_search_build_init();
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen mail_search_args_simplify(args);
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen mail_search_args_unref(&args);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_end();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainenint main(void)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen{
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen static void (*const test_functions[])(void) = {
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen mail_storage_init,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_mail_search_args_simplify,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_mail_search_args_simplify_empty_lists,
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen mail_storage_deinit,
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen NULL
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen };
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return test_run(test_functions);
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen}
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen