diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/db/msgdb/test/unit/test_references_parsing.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/comm/mailnews/db/msgdb/test/unit/test_references_parsing.js b/comm/mailnews/db/msgdb/test/unit/test_references_parsing.js new file mode 100644 index 0000000000..fdfa76dd6d --- /dev/null +++ b/comm/mailnews/db/msgdb/test/unit/test_references_parsing.js @@ -0,0 +1,124 @@ +/* + * Test nsMsgHdr's In-Reply-To/References parsing logic. + */ + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +var anyOldMessage = do_get_file("../../../../data/bugmail1"); + +var refsAndResults = [ + // an empty string is not a reference. + ["", []], + // super valid things + ["<abc@def>", ["abc@def"]], + [ + "<up@down> <left@right> <ying@yang>", + ["up@down", "left@right", "ying@yang"], + ], + // whitespace type things + [" ", []], + [" <left@space>", ["left@space"]], + ["<space@right> ", ["space@right"]], + [" <space@space> ", ["space@space"]], + ["\t<tab@tab>\t", ["tab@tab"]], + ["<a@b>\n\t<tab@newline.n>", ["a@b", "tab@newline.n"]], + ["<a@b>\r\t<tab@newline.r>", ["a@b", "tab@newline.r"]], + ["<a@b>\n\t<tab@newline.nr>", ["a@b", "tab@newline.nr"]], + [ + "<a@1>\n<a@2> <a@3>\t <a@4>\n <a@5>\r\t<a@6>\r\n <a@7>\r\n\t ", + ["a@1", "a@2", "a@3", "a@4", "a@5", "a@6", "a@7"], + ], + // be backwards compatible with old-school things that make some sense + ["i am a stupid message-id", ["i am a stupid message-id"]], + [" those were spaces!", ["those were spaces!"]], + // be backwards compatible with things that make no sense + [" seriously\n who does this?", ["seriously\n who does this?"]], + // handle things we used to be stupid about + ["<z@1a> was an awesome message!", ["z@1a"]], + [" <z@1b> was an awesomer message!", ["z@1b"]], + ["I can't get enough of <z@2a>", ["z@2a"]], + [" nor of I can enough get <z@2b> ", ["z@2b"]], + ["let's talk about <z@3a> shall we", ["z@3a"]], + ["and then let us speak of <z@3b> and its\n many points", ["z@3b"]], + // be backwards compatible with things that just seem malicious + [" 4 < 5", ["4 < 5"]], + [" 6 > 3", ["6 > 3"]], + [" look ma!\n newlines!", ["look ma!\n newlines!"]], +]; + +/** + * Parse the references in refsAndResults and ensure their references match + * the corresponding results. + * + * @param {nsIMsgDBHdr} aMsgHdr - A message header that you don't mind if we + * mess with. + */ +function test_references_header_parsing(aMsgHdr) { + var iCase, iResult, refString, results; + for (iCase = 0; iCase < refsAndResults.length; iCase++) { + refString = refsAndResults[iCase][0]; + results = refsAndResults[iCase][1]; + + dump("Setting references to: '" + refString + "'\n"); + aMsgHdr.setReferences(refString); + if (aMsgHdr.numReferences != results.length) { + dump("Length mismatch! Was expecting:\n"); + for (iResult = 0; iResult < results.length; iResult++) { + dump("'" + results[iResult] + "'\n"); + } + + dump("Got:\n"); + + for (iResult = 0; iResult < aMsgHdr.numReferences; iResult++) { + dump("'" + aMsgHdr.getStringReference(iResult) + "'\n"); + } + + Assert.equal(aMsgHdr.numReferences, results.length); + } + + for (iResult = 0; iResult < results.length; iResult++) { + Assert.equal(aMsgHdr.getStringReference(iResult), results[iResult]); + } + } + + do_test_finished(); +} + +/* + * This infrastructure down here exists just to get + * test_references_header_parsing its message header. + */ + +function run_test() { + localAccountUtils.loadLocalMailAccount(); + do_test_pending(); + MailServices.copy.copyFileMessage( + anyOldMessage, + localAccountUtils.inboxFolder, + null, + false, + 0, + "", + messageHeaderGetterListener, + null + ); + return true; +} + +var messageHeaderGetterListener = { + msgKey: null, + + OnStartCopy() {}, + OnProgress(aProgress, aProgressMax) {}, + GetMessageId(aMessageId) {}, + SetMessageKey(aKey) { + this.msgKey = aKey; + }, + OnStopCopy(aStatus) { + test_references_header_parsing( + localAccountUtils.inboxFolder.GetMessageHeader(this.msgKey) + ); + }, +}; |