diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/base/test/unit/test_nsIMsgFolderListener.js | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/comm/mailnews/base/test/unit/test_nsIMsgFolderListener.js b/comm/mailnews/base/test/unit/test_nsIMsgFolderListener.js new file mode 100644 index 0000000000..c0a9b72e64 --- /dev/null +++ b/comm/mailnews/base/test/unit/test_nsIMsgFolderListener.js @@ -0,0 +1,214 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + * + * ***** END LICENSE BLOCK ***** */ + +/* + * Test suite for basic functionality with nsIMsgFolderListeners. + */ + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +var nsIMFNService = Ci.nsIMsgFolderNotificationService; + +var gIndividualFlags = [ + nsIMFNService.msgAdded, + nsIMFNService.msgsClassified, + nsIMFNService.msgsJunkStatusChanged, + nsIMFNService.msgsDeleted, + nsIMFNService.msgsMoveCopyCompleted, + nsIMFNService.msgKeyChanged, + nsIMFNService.msgUnincorporatedMoved, + nsIMFNService.folderAdded, + nsIMFNService.folderDeleted, + nsIMFNService.folderMoveCopyCompleted, + nsIMFNService.folderRenamed, + nsIMFNService.folderCompactStart, + nsIMFNService.folderCompactFinish, + nsIMFNService.folderReindexTriggered, +]; + +// Our listener, which captures events. +function gMFListener() {} +gMFListener.prototype = { + mReceived: 0, + mRemoveSelf: false, + msgAdded(aMsg) { + Assert.equal(this.mReceived & nsIMFNService.msgAdded, 0); + this.mReceived |= nsIMFNService.msgAdded; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgsClassified(aMsgs, aJunkProcessed, aTraitProcessed) { + Assert.equal(this.mReceived & nsIMFNService.msgsClassified, 0); + this.mReceived |= nsIMFNService.msgsClassified; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgsJunkStatusChanged(messages) { + Assert.equal(this.mReceived & nsIMFNService.msgsJunkStatusChanged, 0); + this.mReceived |= nsIMFNService.msgsJunkStatusChanged; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgsDeleted(aMsgs) { + Assert.equal(this.mReceived & nsIMFNService.msgsDeleted, 0); + this.mReceived |= nsIMFNService.msgsDeleted; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgsMoveCopyCompleted(aMove, aSrcMsgs, aDestFolder, aDestMsgs) { + Assert.equal(this.mReceived & nsIMFNService.msgsMoveCopyCompleted, 0); + this.mReceived |= nsIMFNService.msgsMoveCopyCompleted; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgKeyChanged(aOldMsgKey, aNewMsgHdr) { + Assert.equal(this.mReceived & nsIMFNService.msgKeyChanged, 0); + this.mReceived |= nsIMFNService.msgKeyChanged; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + msgUnincorporatedMoved(srcFolder, msg) { + Assert.equal(this.mReceived & nsIMFNService.msgUnincorporatedMoved, 0); + this.mReceived |= nsIMFNService.msgUnincorporatedMoved; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderAdded(aFolder) { + Assert.equal(this.mReceived & nsIMFNService.folderAdded, 0); + this.mReceived |= nsIMFNService.folderAdded; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderDeleted(aFolder) { + Assert.equal(this.mReceived & nsIMFNService.folderDeleted, 0); + this.mReceived |= nsIMFNService.folderDeleted; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderMoveCopyCompleted(aMove, aSrcFolder, aDestFolder) { + Assert.equal(this.mReceived & nsIMFNService.folderMoveCopyCompleted, 0); + this.mReceived |= nsIMFNService.folderMoveCopyCompleted; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderRenamed(aOrigFolder, aNewFolder) { + Assert.equal(this.mReceived & nsIMFNService.folderRenamed, 0); + this.mReceived |= nsIMFNService.folderRenamed; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderCompactStart(folder) { + Assert.equal(this.mReceived & nsIMFNService.folderCompactStart, 0); + this.mReceived |= nsIMFNService.folderCompactStart; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderCompactFinish(folder) { + Assert.equal(this.mReceived & nsIMFNService.folderCompactFinish, 0); + this.mReceived |= nsIMFNService.folderCompactFinish; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, + + folderReindexTriggered(folder) { + Assert.equal(this.mReceived & nsIMFNService.folderReindexTriggered, 0); + this.mReceived |= nsIMFNService.folderReindexTriggered; + if (this.mRemoveSelf) { + MailServices.mfn.removeListener(this); + } + }, +}; + +function NotifyMsgFolderListeners() { + MailServices.mfn.notifyMsgAdded(null); + MailServices.mfn.notifyMsgsClassified([], null, null); + MailServices.mfn.notifyMsgsJunkStatusChanged([]); + MailServices.mfn.notifyMsgsDeleted([]); + MailServices.mfn.notifyMsgsMoveCopyCompleted(null, [], null, []); + MailServices.mfn.notifyMsgKeyChanged(null, null); + MailServices.mfn.notifyMsgUnincorporatedMoved(null, null); + MailServices.mfn.notifyFolderAdded(null); + MailServices.mfn.notifyFolderDeleted(null); + MailServices.mfn.notifyFolderMoveCopyCompleted(null, null, null); + MailServices.mfn.notifyFolderRenamed(null, null); + MailServices.mfn.notifyFolderCompactStart(null); + MailServices.mfn.notifyFolderCompactFinish(null); + MailServices.mfn.notifyFolderReindexTriggered(null); +} + +function run_test() { + // Test: Add listeners + var singleListeners = []; + + var addAListener = function (flag) { + var listener = new gMFListener(); + MailServices.mfn.addListener(listener, flag); + singleListeners.push(listener); + }; + + gIndividualFlags.forEach(addAListener); + + // Test: Notify the listeners of all events. + NotifyMsgFolderListeners(); + + // Test: check whether the correct number of notifications have been received. + // Then remove the listeners + var checkFlag = function (flag) { + var listener = singleListeners.shift(); + Assert.equal(listener.mReceived, flag); + listener.mRemoveSelf = true; + listener.mReceived = 0; + singleListeners.push(listener); + }; + gIndividualFlags.forEach(checkFlag); + + // We'll do one more set of notifications, and remove ourselves in the middle of them + NotifyMsgFolderListeners(); + + // Test: all listeners should be removed at this point + Assert.ok(!MailServices.mfn.hasListeners); + + // Test: Send notifications again. Check that we don't receive any notifications. + singleListeners.forEach(function (listener) { + listener.mReceived = 0; + }); + + NotifyMsgFolderListeners(); + + var checkNotReceived = function () { + Assert.equal(singleListeners.shift().mReceived, 0); + }; + gIndividualFlags.forEach(checkNotReceived); +} |