summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/search/test/unit/test_searchBoolean.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/search/test/unit/test_searchBoolean.js')
-rw-r--r--comm/mailnews/search/test/unit/test_searchBoolean.js239
1 files changed, 239 insertions, 0 deletions
diff --git a/comm/mailnews/search/test/unit/test_searchBoolean.js b/comm/mailnews/search/test/unit/test_searchBoolean.js
new file mode 100644
index 0000000000..132acad4a3
--- /dev/null
+++ b/comm/mailnews/search/test/unit/test_searchBoolean.js
@@ -0,0 +1,239 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Demonstrates and tests the use of grouped boolean expressions in search terms
+ */
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+var gSearchSession = Cc[
+ "@mozilla.org/messenger/searchSession;1"
+].createInstance(Ci.nsIMsgSearchSession);
+
+var gHdr; // the message header for the one mailbox message
+
+var Tests = [
+ {
+ A: false,
+ B: false,
+ C: false,
+ D: false,
+ matches: false,
+ },
+ {
+ A: false,
+ B: false,
+ C: false,
+ D: true,
+ matches: false,
+ },
+ {
+ A: false,
+ B: false,
+ C: true,
+ D: false,
+ matches: false,
+ },
+ {
+ A: false,
+ B: false,
+ C: true,
+ D: true,
+ matches: false,
+ },
+ {
+ A: false,
+ B: true,
+ C: false,
+ D: false,
+ matches: false,
+ },
+ {
+ A: false,
+ B: true,
+ C: false,
+ D: true,
+ matches: true,
+ },
+ {
+ A: false,
+ B: true,
+ C: true,
+ D: false,
+ matches: true,
+ },
+ {
+ A: false,
+ B: true,
+ C: true,
+ D: true,
+ matches: true,
+ },
+ {
+ A: true,
+ B: false,
+ C: false,
+ D: false,
+ matches: false,
+ },
+ {
+ A: true,
+ B: false,
+ C: false,
+ D: true,
+ matches: true,
+ },
+ {
+ A: true,
+ B: false,
+ C: true,
+ D: false,
+ matches: true,
+ },
+ {
+ A: true,
+ B: false,
+ C: true,
+ D: true,
+ matches: true,
+ },
+ {
+ A: true,
+ B: true,
+ C: false,
+ D: false,
+ matches: false,
+ },
+ {
+ A: true,
+ B: true,
+ C: false,
+ D: true,
+ matches: true,
+ },
+ {
+ A: true,
+ B: true,
+ C: true,
+ D: false,
+ matches: true,
+ },
+ {
+ A: true,
+ B: true,
+ C: true,
+ D: true,
+ matches: true,
+ },
+];
+
+var gHitCount = 0;
+var searchListener = {
+ onSearchHit(dbHdr, folder) {
+ gHitCount++;
+ },
+ onSearchDone(status) {
+ testSearch();
+ },
+ onNewSearch() {
+ gHitCount = 0;
+ },
+};
+
+function run_test() {
+ localAccountUtils.loadLocalMailAccount();
+
+ /*
+ * I want to create and test a search term that uses this expression:
+ * (A || B ) && (C || D)
+ *
+ * The logical expressions A, B, C, and D will be represented by header
+ * string properties with values of T (true) or F (false).
+ *
+ */
+
+ // add a search term HdrProperty (some string) Is "T", with grouping
+ function addSearchTerm(aHdrProperty, aBeginGrouping, aEndGrouping, aBoolAnd) {
+ let searchTerm = gSearchSession.createTerm();
+ searchTerm.attrib = Ci.nsMsgSearchAttrib.HdrProperty;
+
+ let value = searchTerm.value;
+ // This is tricky - value.attrib must be set before actual values
+ value.attrib = Ci.nsMsgSearchAttrib.HdrProperty;
+ value.str = "T";
+ searchTerm.value = value;
+
+ searchTerm.op = Ci.nsMsgSearchOp.Is;
+ searchTerm.booleanAnd = aBoolAnd;
+ searchTerm.beginsGrouping = aBeginGrouping;
+ searchTerm.endsGrouping = aEndGrouping;
+ searchTerm.hdrProperty = aHdrProperty;
+ gSearchSession.appendTerm(searchTerm);
+ }
+
+ gSearchSession.addScopeTerm(
+ Ci.nsMsgSearchScope.offlineMail,
+ localAccountUtils.inboxFolder
+ );
+ gSearchSession.registerListener(searchListener);
+ // I tried using capital "A" but something makes it lower case internally, so it failed
+ addSearchTerm("a", true, false, true); // "(A"
+ addSearchTerm("b", false, true, false); // " || B)"
+ addSearchTerm("c", true, false, true); // " && (C"
+ addSearchTerm("d", false, true, false); // " || D)"
+
+ var copyListener = {
+ OnStartCopy() {},
+ OnProgress(aProgress, aProgressMax) {},
+ SetMessageKey(aKey) {
+ gHdr = localAccountUtils.inboxFolder.GetMessageHeader(aKey);
+ },
+ SetMessageId(aMessageId) {},
+ OnStopCopy(aStatus) {
+ testSearch();
+ },
+ };
+
+ // Get a message into the local filestore. function testSearch() continues
+ // the testing after the copy.
+ var bugmail1 = do_get_file("../../../data/bugmail1");
+ do_test_pending();
+ MailServices.copy.copyFileMessage(
+ bugmail1,
+ localAccountUtils.inboxFolder,
+ null,
+ false,
+ 0,
+ "",
+ copyListener,
+ null
+ );
+}
+
+var gTest = null;
+// process each test from queue, calls itself upon completion of each search
+function testSearch() {
+ // tests the previous search
+ if (gTest) {
+ Assert.equal(gHitCount, gTest.matches ? 1 : 0);
+ }
+ gTest = Tests.shift();
+ if (gTest) {
+ gHdr.setStringProperty("a", gTest.A ? "T" : "F");
+ gHdr.setStringProperty("b", gTest.B ? "T" : "F");
+ gHdr.setStringProperty("c", gTest.C ? "T" : "F");
+ gHdr.setStringProperty("d", gTest.D ? "T" : "F");
+ try {
+ gSearchSession.search(null);
+ } catch (e) {
+ dump(e);
+ }
+ } else {
+ gSearchSession.unregisterListener(searchListener);
+ do_test_finished();
+ }
+}