public void TestThreadableSubject()
        {
            string result;
            int    depth;

            result = MessageThreader.GetThreadableSubject("Re: simple subject", out depth);
            Assert.AreEqual("simple subject", result, "#1a");
            Assert.AreEqual(1, depth, "#1b");

            result = MessageThreader.GetThreadableSubject("Re: simple subject  ", out depth);
            Assert.AreEqual("simple subject", result, "#2a");
            Assert.AreEqual(1, depth, "#2b");

            result = MessageThreader.GetThreadableSubject("Re: Re: simple subject  ", out depth);
            Assert.AreEqual("simple subject", result, "#3a");
            Assert.AreEqual(2, depth, "#3b");

            result = MessageThreader.GetThreadableSubject("Re: Re[4]: simple subject  ", out depth);
            Assert.AreEqual("simple subject", result, "#4a");
            Assert.AreEqual(5, depth, "#4b");

            result = MessageThreader.GetThreadableSubject("Re: [Mailing-List] Re[4]: simple subject  ", out depth);
            Assert.AreEqual("simple subject", result, "#5a");
            Assert.AreEqual(5, depth, "#5b");
        }
        public void TestArgumentExceptions()
        {
            var orderBy             = new OrderBy[] { OrderBy.Arrival };
            var messagesMissingInfo = new [] { new MessageSummary(0) };
            var emptyOrderBy        = new OrderBy[0];
            int depth;

            var summary = new MessageSummary(0);

            summary.UniqueId           = UniqueId.MinValue;
            summary.Envelope           = new Envelope();
            summary.References         = new MessageIdList();
            summary.Envelope.MessageId = "*****@*****.**";
            summary.Envelope.Subject   = "This is the subject";
            summary.Envelope.Date      = DateTimeOffset.Now;
            summary.Size = 0;

            var messages = new MessageSummary[] { summary };

            Assert.Throws <ArgumentNullException> (() => MessageThreader.GetThreadableSubject(null, out depth));
            Assert.Throws <ArgumentNullException> (() => MessageThreader.Thread((IEnumerable <MessageSummary>)null, ThreadingAlgorithm.References));
            Assert.Throws <ArgumentNullException> (() => MessageThreader.Thread((IEnumerable <MessageSummary>)null, ThreadingAlgorithm.References, orderBy));
            Assert.Throws <ArgumentException> (() => MessageThreader.Thread(messagesMissingInfo, ThreadingAlgorithm.References));
            Assert.Throws <ArgumentNullException> (() => MessageThreader.Thread(messages, ThreadingAlgorithm.References, null));
            Assert.Throws <ArgumentException> (() => MessageThreader.Thread(messages, ThreadingAlgorithm.References, emptyOrderBy));
        }