Lucene.Net.Diagnostics: Added tests for Debugging class
diff --git a/src/Lucene.Net.Tests/Support/Diagnostics/TestDebugging.cs b/src/Lucene.Net.Tests/Support/Diagnostics/TestDebugging.cs
new file mode 100644
index 0000000..0232f34
--- /dev/null
+++ b/src/Lucene.Net.Tests/Support/Diagnostics/TestDebugging.cs
@@ -0,0 +1,258 @@
+using Lucene.Net.Attributes;
+using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Text;
+using Assert = Lucene.Net.TestFramework.Assert;
+using JCG = J2N.Collections.Generic;
+
+namespace Lucene.Net.Diagnostics
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    /// <summary>
+    /// LUCENENET specific tests for <see cref="Debugging"/> class
+    /// </summary>
+    public class TestDebugging
+    {
+        [Test, LuceneNetSpecific]
+        public void TestConditionTrue()
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message"));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+            });
+
+            TestWithAsserts(enabled: false, () =>
+            {
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message"));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: true, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        public void TestConditionFalse()
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message"));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+            });
+
+            TestWithAsserts(enabled: false, () =>
+            {
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message"));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+                Assert.DoesNotThrow(() => Debugging.Assert(condition: false, "test message", new object(), new object(), new object(), new object(), new object(), new object(), new object(), new object()));
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 1 })]
+        public void TestMessageFormatting_1Parameter(string expectedMessage, string messageFormat, object p0)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 2 })]
+        public void TestMessageFormatting_2Parameters(string expectedMessage, string messageFormat, object p0, object p1)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 3 })]
+        public void TestMessageFormatting_3Parameters(string expectedMessage, string messageFormat, object p0, object p1, object p2)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1, p2));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 4 })]
+        public void TestMessageFormatting_4Parameters(string expectedMessage, string messageFormat, object p0, object p1, object p2, object p3)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1, p2, p3));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 5 })]
+        public void TestMessageFormatting_5Parameters(string expectedMessage, string messageFormat, object p0, object p1, object p2, object p3, object p4)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1, p2, p3, p4));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 6 })]
+        public void TestMessageFormatting_6Parameters(string expectedMessage, string messageFormat, object p0, object p1, object p2, object p3, object p4, object p5)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1, p2, p3, p4, p5));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        [Test, LuceneNetSpecific]
+        [TestCaseSource(typeof(TestDebugging), "GetMessageFormatCases", new object[] { 7 })]
+        public void TestMessageFormatting_7Parameters(string expectedMessage, string messageFormat, object p0, object p1, object p2, object p3, object p4, object p5, object p6)
+        {
+            TestWithAsserts(enabled: true, () =>
+            {
+                var e = Assert.Throws<AssertionException>(() => Debugging.Assert(condition: false, messageFormat, p0, p1, p2, p3, p4, p5, p6));
+                Assert.AreEqual(expectedMessage, e.Message);
+            });
+        }
+
+        private void TestWithAsserts(bool enabled, Action expression)
+        {
+            var originalAssertsEnabled = Debugging.AssertsEnabled;
+
+            try
+            {
+                Debugging.AssertsEnabled = enabled;
+
+                expression();
+            }
+            finally
+            {
+                Debugging.AssertsEnabled = originalAssertsEnabled;
+            }
+        }
+
+        public static IEnumerable<TestCaseData> GetMessageFormatCases(int parameterCount)
+        {
+            foreach (var test in GetMessageFormatData())
+            {
+                var messageFormat = new StringBuilder();
+                var parameters = new List<object>();
+                var expectedMessage = new StringBuilder();
+                for (int i = 0; i < parameterCount; i++)
+                {
+                    parameters.Add(test.Parameter);
+                    if (i > 0)
+                    {
+                        messageFormat.Append(" ");
+                        expectedMessage.Append(" ");
+                    }
+                    messageFormat.Append(test.MessageFormatPrefix);
+                    messageFormat.Append(i.ToString(CultureInfo.InvariantCulture));
+                    messageFormat.Append(test.MessageFormatSuffix);
+                    expectedMessage.Append(test.ExpectedMessage);
+                }
+
+                var args = new List<object>();
+                args.Add(expectedMessage.ToString());
+                args.Add(messageFormat.ToString());
+                args.AddRange(parameters);
+                yield return new TestCaseData(args.ToArray());
+            }
+        }
+
+        private class MessageFormatData
+        {
+            public MessageFormatData(string messageFormatPrefix, string messageFormatSuffix, object parameter, string expectedMessage)
+            {
+                MessageFormatPrefix = messageFormatPrefix ?? throw new ArgumentNullException(nameof(messageFormatPrefix));
+                MessageFormatSuffix = messageFormatSuffix ?? throw new ArgumentNullException(nameof(messageFormatSuffix));
+                Parameter = parameter;
+                ExpectedMessage = expectedMessage;
+            }
+
+            public string MessageFormatPrefix { get; set; }
+            public string MessageFormatSuffix { get; set; }
+            public object Parameter { get; set; }
+            public string ExpectedMessage { get; set; }
+        }
+
+        private static IEnumerable<MessageFormatData> GetMessageFormatData()
+        {
+            yield return new MessageFormatData("{", "}", "foo", "foo"); // string
+            yield return new MessageFormatData("{", "}", (string)null, "null"); // null string
+            yield return new MessageFormatData("{", "}", 12345, "12345"); // int
+            yield return new MessageFormatData("0x{", ":x}", 12345, "0x3039"); // int hex
+
+            yield return new MessageFormatData("{", "}", new string[] { "foo", "bar", "baz" }, "[foo, bar, baz]"); // string array
+            yield return new MessageFormatData("{", "}", new int[] { 10, 11, 12 }, "[10, 11, 12]"); // int array
+            yield return new MessageFormatData("{", "}", (Array)null, "null"); // null array
+
+            yield return new MessageFormatData("{", "}", new JCG.List<string> { "foo", "bar", "baz" }, "[foo, bar, baz]"); // string list
+            yield return new MessageFormatData("{", "}", new JCG.List<int> { 10, 11, 12 }, "[10, 11, 12]"); // int list
+
+            yield return new MessageFormatData("{", "}", new List<string> { "foo", "bar", "baz" }, "[foo, bar, baz]"); // string list
+            yield return new MessageFormatData("{", "}", new List<int> { 10, 11, 12 }, "[10, 11, 12]"); // int list
+            yield return new MessageFormatData("{", "}", (IList<int>)null, "null"); // null list
+
+            yield return new MessageFormatData("{", "}", new Dictionary<string, string> { { "key1", "value1" }, { "key2", "value2" } }, "{key1=value1, key2=value2}"); // string dictionary
+            yield return new MessageFormatData("{", "}", (IDictionary<string, string>)null, "null"); // null dictionary
+        }
+    }
+}