test-mail-search-args-simplify.c revision c9099b08b3cae8a849098ca776b4363c6d5f5f36
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2015 Dovecot authors, see the included COPYING file */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "lib.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "str.h"
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen#include "test-common.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "mail-search-build.h"
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen#include "mail-search-parser.h"
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "mail-search.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const char *input;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const char *output;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen} tests[] = {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "ALL", "ALL" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "NOT ALL", "NOT ALL" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "ALL NOT ALL", "NOT ALL" },
4462bd7b4c7ef3de006f060e155a90e5de7cae21Timo Sirainen { "ALL NOT ALL TEXT foo", "NOT ALL" },
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen { "OR ALL NOT ALL", "ALL" },
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen { "OR ALL OR NOT ALL TEXT foo", "ALL" },
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen { "OR ALL OR TEXT foo TEXT bar", "ALL" },
f6c1297c26b355c4aec2a08978f51ec3efecb351Timo Sirainen { "OR TEXT FOO ( ALL NOT ALL )", "TEXT FOO" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "TEXT FOO OR ALL NOT ALL", "TEXT FOO" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "TEXT foo", "TEXT foo" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( TEXT foo )", "TEXT foo" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( ( TEXT foo ) )", "TEXT foo" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( ( TEXT foo ) ( TEXT bar ) )", "TEXT foo TEXT bar" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen
ef2b2ef2e6a6eb5e4667f2e63faae8a3b646e8baTimo Sirainen { "OR ( TEXT foo ) ( TEXT bar )", "(OR TEXT foo TEXT bar)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ( TEXT foo ) OR ( TEXT bar ) ( TEXT baz )",
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen "(OR TEXT foo OR TEXT bar TEXT baz)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ( ( TEXT foo TEXT foo2 ) ) ( ( TEXT bar ( TEXT baz ) ) )",
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen "(OR (TEXT foo TEXT foo2) (TEXT bar TEXT baz))" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "NOT ( TEXT foo )", "NOT TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "NOT ( NOT ( TEXT foo ) )", "TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "NOT OR ( TEXT foo ) ( TEXT bar )", "NOT TEXT foo NOT TEXT bar" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "NOT ( OR ( TEXT foo ) ( TEXT bar ) )", "NOT TEXT foo NOT TEXT bar" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "NOT ( TEXT foo TEXT bar )", "(OR NOT TEXT foo NOT TEXT bar)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "ANSWERED FLAGGED SEEN", "(ANSWERED FLAGGED SEEN)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR ( ANSWERED FLAGGED SEEN ) DRAFT", "(OR (ANSWERED FLAGGED SEEN) (DRAFT))" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "ANSWERED TEXT foo FLAGGED SEEN", "(ANSWERED FLAGGED SEEN) TEXT foo" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "NOT ( ANSWERED FLAGGED SEEN )", "NOT (ANSWERED FLAGGED SEEN)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR NOT ANSWERED OR NOT FLAGGED NOT SEEN", "NOT (ANSWERED FLAGGED SEEN)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "ANSWERED NOT FLAGGED SEEN NOT DRAFT", "(ANSWERED SEEN) NOT (FLAGGED) NOT (DRAFT)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR NOT ANSWERED NOT SEEN", "NOT (ANSWERED SEEN)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "1:5 10:20", "1:5,10:20" },
4ea6c43a08b37f270bd54b5809142246fd118263Timo Sirainen { "1:5 NOT 10:20", "1:5 NOT 10:20" },
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen { "1:5 NOT 10:20 NOT 30:40", "1:5 NOT 10:20 NOT 30:40" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR 1:5 NOT 10:20", "(OR 1:5 NOT 10:20)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR 1:5 OR NOT 10:20 NOT 30:40", "(OR 1:5 NOT 10:20,30:40)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "UID 1:5 UID 10:20", "UID 1:5,10:20" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "UID 1:5 NOT UID 10:20", "UID 1:5 NOT UID 10:20" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "UID 1:5 NOT UID 10:20 NOT UID 30:40", "UID 1:5 NOT UID 10:20 NOT UID 30:40" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR UID 1:5 NOT UID 10:20", "(OR UID 1:5 NOT UID 10:20)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR UID 1:5 OR NOT UID 10:20 NOT UID 30:40", "(OR UID 1:5 NOT UID 10:20,30:40)" },
4ea6c43a08b37f270bd54b5809142246fd118263Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "1:5 UID 10:20", "1:5 UID 10:20" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "1:5 NOT UID 10:20", "1:5 NOT UID 10:20" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "BEFORE 03-Aug-2014 BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"01-Aug-2014\"" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"02-Aug-2014\"" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR BEFORE 01-Aug-2014 OR BEFORE 03-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"03-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "BEFORE 03-Aug-2014 NOT BEFORE 01-Aug-2014 BEFORE 02-Aug-2014", "BEFORE \"02-Aug-2014\" NOT BEFORE \"01-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SENTBEFORE 03-Aug-2014 SENTBEFORE 01-Aug-2014 SENTBEFORE 02-Aug-2014", "SENTBEFORE \"01-Aug-2014\"" },
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen { "SENTBEFORE 03-Aug-2014 BEFORE 01-Aug-2014 SENTBEFORE 02-Aug-2014", "SENTBEFORE \"02-Aug-2014\" BEFORE \"01-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "ON 03-Aug-2014 ON 03-Aug-2014", "ON \"03-Aug-2014\"" },
0df9428baed48afaff90b4d4f03792d2fd756a43Timo 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 */
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ON 03-Aug-2014 ON 04-Aug-2014", "(OR ON \"03-Aug-2014\" ON \"04-Aug-2014\")" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SINCE 03-Aug-2014 SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"01-Aug-2014\"" },
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen { "OR SINCE 01-Aug-2014 OR SINCE 03-Aug-2014 SINCE 02-Aug-2014", "SINCE \"01-Aug-2014\"" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "SINCE 03-Aug-2014 NOT SINCE 01-Aug-2014 SINCE 02-Aug-2014", "SINCE \"03-Aug-2014\" NOT SINCE \"01-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SENTSINCE 03-Aug-2014 SENTSINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SENTSINCE 03-Aug-2014 SINCE 01-Aug-2014 SENTSINCE 02-Aug-2014", "SENTSINCE \"03-Aug-2014\" SINCE \"01-Aug-2014\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SMALLER 1 SMALLER 2", "SMALLER 1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR SMALLER 1 SMALLER 2", "SMALLER 2" },
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen { "OR SMALLER 1 OR SMALLER 3 SMALLER 2", "SMALLER 3" },
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen { "SMALLER 3 NOT SMALLER 1 SMALLER 2", "SMALLER 2 NOT SMALLER 1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SMALLER 3 LARGER 5", "SMALLER 3 LARGER 5" }, /* this could be replaced with e.g. NOT ALL */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR SMALLER 3 LARGER 5", "(OR SMALLER 3 LARGER 5)" },
ef2b2ef2e6a6eb5e4667f2e63faae8a3b646e8baTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "LARGER 3 LARGER 1 LARGER 2", "LARGER 3" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR LARGER 1 LARGER 2", "LARGER 1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR LARGER 1 OR LARGER 3 LARGER 2", "LARGER 1" },
ef2b2ef2e6a6eb5e4667f2e63faae8a3b646e8baTimo Sirainen { "LARGER 3 NOT LARGER 1 LARGER 2", "LARGER 3 NOT LARGER 1" },
ef2b2ef2e6a6eb5e4667f2e63faae8a3b646e8baTimo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "SUBJECT foo SUBJECT foo", "SUBJECT foo" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "SUBJECT foo SUBJECT foob", "SUBJECT foo SUBJECT foob" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR SUBJECT foo SUBJECT foo", "SUBJECT foo" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "FROM foo FROM foo", "FROM foo" },
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen { "FROM foo FROM bar", "FROM foo FROM bar" },
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen { "FROM foo TO foo", "FROM foo TO foo" },
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "TEXT foo TEXT foo", "TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "TEXT foo TEXT foob", "TEXT foo TEXT foob" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR TEXT foo TEXT foo", "TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "TEXT foo NOT TEXT foo TEXT foo NOT TEXT foo", "TEXT foo NOT TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "BODY foo BODY foo", "BODY foo" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR BODY foo BODY foo", "BODY foo" },
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen { "TEXT foo BODY foo", "TEXT foo BODY foo" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR ( TEXT foo OR TEXT foo TEXT foo ) ( TEXT foo ( TEXT foo ) )", "TEXT foo" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen /* value="" tests */
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "HEADER foo ", "HEADER FOO \"\"" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "SUBJECT ", "SUBJECT \"\"" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "BODY ", "ALL" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "TEXT ", "ALL" },
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen { "HEADER foo .", "HEADER FOO ." },
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainen { "SUBJECT .", "SUBJECT ." },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "BODY .", "BODY ." },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "TEXT .", "TEXT ." },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen /* OR: drop redundant args */
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR ( TEXT common1 TEXT unique1 ) TEXT common1", "TEXT common1" },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR ( TEXT unique1 TEXT common1 ) TEXT common1", "TEXT common1" },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR TEXT common1 ( TEXT common1 TEXT unique1 )", "TEXT common1" },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR TEXT common1 ( TEXT unique1 TEXT common1 )", "TEXT common1" },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR ( TEXT common1 TEXT common2 ) ( TEXT common1 TEXT common2 TEXT unique1 )", "TEXT common1 TEXT common2" },
d337f4291d9ea9cd1adee0f468bc0c3baeabb4feTimo Sirainen { "OR TEXT common1 OR ( TEXT unique1 TEXT common1 ) ( TEXT unique3 TEXT common1 )", "TEXT common1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* OR: extract common AND */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR ( TEXT common1 TEXT unique1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR ( TEXT common1 TEXT unique1 ) ( TEXT unique2 TEXT common1 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ( TEXT unique1 TEXT common1 ) ( TEXT common1 TEXT unique2 TEXT unique3 )", "(OR TEXT unique1 (TEXT unique2 TEXT unique3)) TEXT common1" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "OR ( TEXT common1 TEXT common2 TEXT unique1 ) ( TEXT common1 TEXT common2 TEXT unique2 )", "(OR TEXT unique1 TEXT unique2) TEXT common2 TEXT common1" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo 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" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* non-matching cases */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR ( TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR (TEXT unique1 TEXT unique2) TEXT unique3)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "OR ( TEXT unique1 TEXT unique2 ) ( TEXT unique3 TEXT unique4 )", "(OR (TEXT unique1 TEXT unique2) (TEXT unique3 TEXT unique4))" },
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo 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)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo 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))" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen /* SUB: drop redundant args */
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( OR TEXT common1 TEXT unique1 ) TEXT common1", "TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) TEXT common1", "TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "TEXT common1 ( OR TEXT common1 TEXT unique1 )", "TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "TEXT common1 ( OR TEXT unique1 TEXT common1 )", "TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "( OR TEXT common1 TEXT common2 ) ( OR TEXT common1 OR TEXT common2 TEXT unique1 )", "(OR TEXT common1 TEXT common2)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "TEXT common1 ( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique3 TEXT common1 )", "TEXT common1" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen { "OR ( TEXT common1 ( OR TEXT unique1 TEXT common1 ) ) TEXT unique1", "(OR TEXT common1 TEXT unique1)" },
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* SUB: extract common OR */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT common1 TEXT unique1 ) ( OR TEXT unique2 TEXT common1 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 TEXT unique2 )", "(OR (TEXT unique1 TEXT unique2) TEXT common1)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen { "( OR TEXT unique1 TEXT common1 ) ( OR TEXT common1 OR TEXT unique2 TEXT unique3 )", "(OR (TEXT unique1 (OR TEXT unique2 TEXT unique3)) TEXT common1)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo 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)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo 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)" },
5a37e34b1b5acf453372cd112c70bb4e46b4bee2Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* non-matching cases */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT unique1 TEXT unique2 ) TEXT unique3", "(OR TEXT unique1 TEXT unique2) TEXT unique3" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen { "( OR TEXT unique1 TEXT unique2 ) ( OR TEXT unique3 TEXT unique4 )", "(OR TEXT unique1 TEXT unique2) (OR TEXT unique3 TEXT unique4)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo 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" },
6ef7e31619edfaa17ed044b45861d106a86191efTimo 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)" },
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainenstatic struct mail_search_args *
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainentest_build_search_args(const char *args)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen{
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct mail_search_parser *parser;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct mail_search_args *sargs;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const char *error, *charset = "UTF-8";
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen parser = mail_search_parser_init_cmdline(t_strsplit(args, " "));
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen if (mail_search_build(mail_search_register_get_imap(),
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen parser, &charset, &sargs, &error) < 0)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen i_panic("%s", error);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen mail_search_parser_deinit(&parser);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen return sargs;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen}
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstatic void test_mail_search_args_simplify(void)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen{
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct mail_search_args *args;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen string_t *str = t_str_new(256);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen const char *error;
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen unsigned int i;
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen test_begin("mail search args simplify");
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); i++) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen args = test_build_search_args(tests[i].input);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen mail_search_args_simplify(args);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen str_truncate(str, 0);
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen test_assert(mail_search_args_to_imap(str, args->args, &error));
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen test_assert_idx(strcmp(str_c(str), tests[i].output) == 0, i);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen mail_search_args_unref(&args);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen }
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen test_end();
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen}
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenint main(void)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen{
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen static void (*test_functions[])(void) = {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_mail_search_args_simplify,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen NULL
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen };
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen return test_run(test_functions);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen}
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen