1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
/* import-globals-from ../../../../test/resources/MessageGenerator.jsm */
load("../../../../resources/MessageGenerator.jsm");
var gMessages = [];
const kSetCount = 13;
const kNumExpectedMatches = 10;
function setupGlobals() {
localAccountUtils.loadLocalMailAccount();
// Create a message generator
let messageGenerator = new MessageGenerator();
let localInbox = localAccountUtils.inboxFolder.QueryInterface(
Ci.nsIMsgLocalMailFolder
);
for (let i = 0; i < kSetCount; i++) {
let message = messageGenerator.makeMessage();
gMessages.push(message);
localInbox.addMessage(message.toMboxString());
}
}
function run_test() {
setupGlobals();
do_test_pending();
let inboxDB = localAccountUtils.inboxFolder.msgDatabase;
// give messages 1,3,5 gloda-ids. These won't end up in our search hits.
let msgHdr1 = inboxDB.getMsgHdrForMessageID(gMessages[0].messageId);
msgHdr1.setUint32Property("gloda-id", 11111);
let msgHdr3 = inboxDB.getMsgHdrForMessageID(gMessages[2].messageId);
msgHdr3.setUint32Property("gloda-id", 33333);
let msgHdr5 = inboxDB.getMsgHdrForMessageID(gMessages[4].messageId);
msgHdr5.setUint32Property("gloda-id", 5555);
// set up a search term array that will give us the array of messages
// that gloda should index, as defined by this function:
let searchSession = Cc[
"@mozilla.org/messenger/searchSession;1"
].createInstance(Ci.nsIMsgSearchSession);
let searchTerms = [];
searchSession.addScopeTerm(
Ci.nsMsgSearchScope.offlineMail,
localAccountUtils.inboxFolder
);
let searchTerm = searchSession.createTerm();
// Create the following search term:
// (folderFlag & Mail && folderFlag != ImapBox) &&
// msg property.gloda-id isEmpty
searchTerm.beginsGrouping = true;
searchTerm.booleanAnd = true;
searchTerm.attrib = Ci.nsMsgSearchAttrib.FolderFlag;
searchTerm.op = Ci.nsMsgSearchOp.Is;
let value = searchTerm.value;
value.status = Ci.nsMsgFolderFlags.Mail;
value.attrib = Ci.nsMsgSearchAttrib.FolderFlag;
searchTerm.value = value;
searchTerms.push(searchTerm);
searchTerm = searchSession.createTerm();
searchTerm.booleanAnd = true;
searchTerm.attrib = Ci.nsMsgSearchAttrib.FolderFlag;
searchTerm.op = Ci.nsMsgSearchOp.Isnt;
value = searchTerm.value;
value.status = Ci.nsMsgFolderFlags.ImapBox;
value.attrib = Ci.nsMsgSearchAttrib.FolderFlag;
searchTerm.value = value;
searchTerm.endsGrouping = true;
searchTerms.push(searchTerm);
searchTerm = searchSession.createTerm();
searchTerm.booleanAnd = true;
searchTerm.attrib = Ci.nsMsgSearchAttrib.HdrProperty;
searchTerm.hdrProperty = "gloda-id";
searchTerm.op = Ci.nsMsgSearchOp.IsEmpty;
value = searchTerm.value;
value.str = "gloda-id";
value.attrib = Ci.nsMsgSearchAttrib.HdrProperty;
searchTerm.value = value;
searchTerms.push(searchTerm);
let msgEnumerator = inboxDB.getFilterEnumerator(searchTerms);
let matchingHdrs = [...msgEnumerator];
Assert.equal(kNumExpectedMatches, matchingHdrs.length);
Assert.equal(matchingHdrs[0].messageId, gMessages[1].messageId);
Assert.equal(matchingHdrs[1].messageId, gMessages[3].messageId);
// try it backwards, with roller skates:
msgEnumerator = inboxDB.getFilterEnumerator(searchTerms, true);
matchingHdrs = [...msgEnumerator];
Assert.equal(kNumExpectedMatches, matchingHdrs.length);
Assert.equal(matchingHdrs[0].messageId, gMessages[12].messageId);
Assert.equal(matchingHdrs[1].messageId, gMessages[11].messageId);
Assert.equal(matchingHdrs[9].messageId, gMessages[1].messageId);
do_test_finished();
}
|