You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2020/08/24 18:29:51 UTC

[lucenenet] 04/13: Converted test framework to use Lucene.Net.Diagnostics.Debugging.Assert() instead of Lucene.Net.Diagnostics.Debug.Assert()

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit 8aa71088bd329e2c04e3e05eed8e069bc6812c98
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Thu Aug 13 23:09:25 2020 +0700

    Converted test framework to use Lucene.Net.Diagnostics.Debugging.Assert() instead of Lucene.Net.Diagnostics.Debug.Assert()
---
 .../Analysis/LookaheadTokenFilter.cs               |  24 +--
 .../Analysis/MockCharFilter.cs                     |   4 +-
 .../Analysis/MockReaderWrapper.cs                  |   8 +-
 .../Analysis/MockTokenizer.cs                      |  22 +-
 .../Codecs/Asserting/AssertingDocValuesFormat.cs   |  84 ++++----
 .../Codecs/Asserting/AssertingNormsFormat.cs       |   8 +-
 .../Codecs/Asserting/AssertingPostingsFormat.cs    |  70 +++----
 .../Asserting/AssertingStoredFieldsFormat.cs       |  22 +-
 .../Codecs/Asserting/AssertingTermVectorsFormat.cs |  48 ++---
 .../Compressing/Dummy/DummyCompressingCodec.cs     |   4 +-
 .../Codecs/Lucene3x/PreFlexRWFieldInfosWriter.cs   |   6 +-
 .../Codecs/Lucene3x/PreFlexRWFieldsWriter.cs       |  12 +-
 .../Codecs/Lucene3x/PreFlexRWNormsConsumer.cs      |   4 +-
 .../Codecs/Lucene3x/PreFlexRWStoredFieldsWriter.cs |   6 +-
 .../Codecs/Lucene3x/PreFlexRWTermVectorsWriter.cs  |   8 +-
 .../Codecs/Lucene3x/TermInfosWriter.cs             |  14 +-
 .../Codecs/Lucene40/Lucene40DocValuesWriter.cs     |  18 +-
 .../Codecs/Lucene40/Lucene40FieldInfosWriter.cs    |  10 +-
 .../Codecs/Lucene40/Lucene40PostingsWriter.cs      |  18 +-
 .../Codecs/Lucene40/Lucene40SkipListWriter.cs      |  10 +-
 .../Codecs/Lucene42/Lucene42DocValuesConsumer.cs   |   4 +-
 .../Codecs/Lucene42/Lucene42FieldInfosWriter.cs    |   6 +-
 .../MockVariableIntBlockPostingsFormat.cs          |   4 +-
 .../Codecs/MockRandom/MockRandomPostingsFormat.cs  |   4 +-
 .../Codecs/RAMOnly/RAMOnlyPostingsFormat.cs        |  12 +-
 .../Index/AllDeletedFilterReader.cs                |   4 +-
 .../Index/AssertingAtomicReader.cs                 | 224 ++++++++++-----------
 .../Index/BaseDocValuesFormatTestCase.cs           |  66 +++---
 .../Index/BasePostingsFormatTestCase.cs            |   4 +-
 .../Index/MockRandomMergePolicy.cs                 |   4 +-
 src/Lucene.Net.TestFramework/Index/RandomCodec.cs  |   6 +-
 .../Index/RandomDocumentsWriterPerThreadPool.cs    |  12 +-
 .../Index/RandomIndexWriter.cs                     |   4 +-
 .../Index/ThreadedIndexingAndSearchingTestCase.cs  |   6 +-
 .../Search/AssertingBulkScorer.cs                  |   4 +-
 .../Search/AssertingCollector.cs                   |   4 +-
 .../Search/AssertingScorer.cs                      |  10 +-
 src/Lucene.Net.TestFramework/Search/QueryUtils.cs  |   6 +-
 .../Search/RandomSimilarityProvider.cs             |   4 +-
 .../Search/ShardSearchingTestBase.cs               |  22 +-
 .../Store/MockDirectoryWrapper.cs                  |  12 +-
 .../Support/Diagnostics/Debug.cs                   |  46 -----
 .../Support/JavaCompatibility/LuceneTestCase.cs    |   4 +-
 .../Util/Automaton/AutomatonTestUtil.cs            |   6 +-
 .../Util/BaseDocIdSetTestCase.cs                   |   4 +-
 .../Util/FailOnNonBulkMergesInfoStream.cs          |   4 +-
 src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs |  10 +-
 .../Util/LuceneTestCase.cs                         |  16 +-
 .../Util/NullInfoStream.cs                         |   8 +-
 .../Util/TestRuleAssertionsRequired.cs             |   2 +-
 .../Util/TestRuleSetupAndRestoreClassEnv.cs        |  16 +-
 .../Util/ThrottledIndexOutput.cs                   |   4 +-
 52 files changed, 448 insertions(+), 494 deletions(-)

diff --git a/src/Lucene.Net.TestFramework/Analysis/LookaheadTokenFilter.cs b/src/Lucene.Net.TestFramework/Analysis/LookaheadTokenFilter.cs
index 262356c..67d081e 100644
--- a/src/Lucene.Net.TestFramework/Analysis/LookaheadTokenFilter.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/LookaheadTokenFilter.cs
@@ -1,8 +1,8 @@
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
 using System.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Analysis
 {
@@ -78,7 +78,7 @@ namespace Lucene.Net.Analysis
 
             public virtual AttributeSource.State NextState()
             {
-                Debug.Assert(NextRead < InputTokens.Count);
+                Debugging.Assert(() => NextRead < InputTokens.Count);
                 return InputTokens[NextRead++];
             }
         }
@@ -141,7 +141,7 @@ namespace Lucene.Net.Analysis
                 m_positions.Get(m_inputPos).Add(CaptureState());
                 tokenPending = false;
             }
-            Debug.Assert(!insertPending);
+            Debugging.Assert(() => !insertPending);
             insertPending = true;
         }
 
@@ -184,8 +184,8 @@ namespace Lucene.Net.Analysis
             {
                 Console.WriteLine("LTF.peekToken inputPos=" + m_inputPos + " outputPos=" + m_outputPos + " tokenPending=" + tokenPending);
             }
-            Debug.Assert(!m_end);
-            Debug.Assert(m_inputPos == -1 || m_outputPos <= m_inputPos);
+            Debugging.Assert(() => !m_end);
+            Debugging.Assert(() => m_inputPos == -1 || m_outputPos <= m_inputPos);
             if (tokenPending)
             {
                 m_positions.Get(m_inputPos).Add(CaptureState());
@@ -199,7 +199,7 @@ namespace Lucene.Net.Analysis
             if (gotToken)
             {
                 m_inputPos += m_posIncAtt.PositionIncrement;
-                Debug.Assert(m_inputPos >= 0);
+                Debugging.Assert(() => m_inputPos >= 0);
                 if (DEBUG)
                 {
                     Console.WriteLine("  now inputPos=" + m_inputPos);
@@ -216,7 +216,7 @@ namespace Lucene.Net.Analysis
                 else
                 {
                     // Make sure our input isn't messing up offsets:
-                    Debug.Assert(startPosData.StartOffset == startOffset, "prev startOffset=" + startPosData.StartOffset + " vs new startOffset=" + startOffset + " inputPos=" + m_inputPos);
+                    Debugging.Assert(() => startPosData.StartOffset == startOffset, () => "prev startOffset=" + startPosData.StartOffset + " vs new startOffset=" + startOffset + " inputPos=" + m_inputPos);
                 }
 
                 int endOffset = m_offsetAtt.EndOffset;
@@ -227,7 +227,7 @@ namespace Lucene.Net.Analysis
                 else
                 {
                     // Make sure our input isn't messing up offsets:
-                    Debug.Assert(endPosData.EndOffset == endOffset, "prev endOffset=" + endPosData.EndOffset + " vs new endOffset=" + endOffset + " inputPos=" + m_inputPos);
+                    Debugging.Assert(() => endPosData.EndOffset == endOffset, () => "prev endOffset=" + endPosData.EndOffset + " vs new endOffset=" + endOffset + " inputPos=" + m_inputPos);
                 }
 
                 tokenPending = true;
@@ -314,7 +314,7 @@ namespace Lucene.Net.Analysis
                             {
                                 Console.WriteLine("  return inserted token");
                             }
-                            Debug.Assert(InsertedTokenConsistent());
+                            Debugging.Assert(InsertedTokenConsistent);
                             insertPending = false;
                             return true;
                         }
@@ -340,7 +340,7 @@ namespace Lucene.Net.Analysis
                             {
                                 Console.WriteLine("  return inserted token");
                             }
-                            Debug.Assert(InsertedTokenConsistent());
+                            Debugging.Assert(InsertedTokenConsistent);
                             insertPending = false;
                             return true;
                         }
@@ -364,8 +364,8 @@ namespace Lucene.Net.Analysis
         {
             int posLen = m_posLenAtt.PositionLength;
             Position endPosData = m_positions.Get(m_outputPos + posLen);
-            Debug.Assert(endPosData.EndOffset != -1);
-            Debug.Assert(m_offsetAtt.EndOffset == endPosData.EndOffset, "offsetAtt.endOffset=" + m_offsetAtt.EndOffset + " vs expected=" + endPosData.EndOffset);
+            Debugging.Assert(() => endPosData.EndOffset != -1);
+            Debugging.Assert(() => m_offsetAtt.EndOffset == endPosData.EndOffset, () => "offsetAtt.endOffset=" + m_offsetAtt.EndOffset + " vs expected=" + endPosData.EndOffset);
             return true;
         }
 
diff --git a/src/Lucene.Net.TestFramework/Analysis/MockCharFilter.cs b/src/Lucene.Net.TestFramework/Analysis/MockCharFilter.cs
index c4ad5f5..5f15220 100644
--- a/src/Lucene.Net.TestFramework/Analysis/MockCharFilter.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/MockCharFilter.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using JCG = J2N.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Analysis
 {
@@ -112,7 +112,7 @@ namespace Lucene.Net.Analysis
                 ret = currentOff;
             }
 
-            Debug.Assert(ret >= 0, "currentOff=" + currentOff + ",diff=" + (ret - currentOff));
+            Debugging.Assert(() => ret >= 0, () => "currentOff=" + currentOff + ",diff=" + (ret - currentOff));
             return ret;
         }
 
diff --git a/src/Lucene.Net.TestFramework/Analysis/MockReaderWrapper.cs b/src/Lucene.Net.TestFramework/Analysis/MockReaderWrapper.cs
index c16af6c..51e9e52 100644
--- a/src/Lucene.Net.TestFramework/Analysis/MockReaderWrapper.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/MockReaderWrapper.cs
@@ -1,7 +1,7 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
 using System;
 using System.IO;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Analysis
 {
@@ -47,7 +47,7 @@ namespace Lucene.Net.Analysis
         {
             excAtChar = charUpto;
             // You should only call this on init!:
-            Debug.Assert(0 == readSoFar);
+            Debugging.Assert(() => 0 == readSoFar);
         }
 
         public virtual void ThrowExcNext()
@@ -91,10 +91,10 @@ namespace Lucene.Net.Analysis
             if (excAtChar != -1)
             {
                 int left = excAtChar - readSoFar;
-                Debug.Assert(left != 0);
+                Debugging.Assert(() => left != 0);
                 read = input.Read(cbuf, off, Math.Min(realLen, left));
                 //Characters are left
-                Debug.Assert(read != 0);
+                Debugging.Assert(() => read != 0);
                 readSoFar += read;
             }
             else
diff --git a/src/Lucene.Net.TestFramework/Analysis/MockTokenizer.cs b/src/Lucene.Net.TestFramework/Analysis/MockTokenizer.cs
index 4be7f18..f2c076a 100644
--- a/src/Lucene.Net.TestFramework/Analysis/MockTokenizer.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/MockTokenizer.cs
@@ -1,13 +1,13 @@
 using J2N;
 using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
 using System;
+using System.Globalization;
 using System.IO;
+using Assert = Lucene.Net.TestFramework.Assert;
 using CharacterRunAutomaton = Lucene.Net.Util.Automaton.CharacterRunAutomaton;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using RegExp = Lucene.Net.Util.Automaton.RegExp;
-using Assert = Lucene.Net.TestFramework.Assert;
-using System.Globalization;
 
 namespace Lucene.Net.Analysis
 {
@@ -140,7 +140,7 @@ namespace Lucene.Net.Analysis
 
         public sealed override bool IncrementToken()
         {
-            Debug.Assert(!enableChecks || (streamState == State.RESET || streamState == State.INCREMENT), "IncrementToken() called while in wrong state: " + streamState);
+            Debugging.Assert(() => !enableChecks || (streamState == State.RESET || streamState == State.INCREMENT), () => "IncrementToken() called while in wrong state: " + streamState);
             ClearAttributes();
             for (; ; )
             {
@@ -219,7 +219,7 @@ namespace Lucene.Net.Analysis
             }
             else
             {
-                Debug.Assert(!char.IsLowSurrogate((char)ch), "unpaired low surrogate: " + ch.ToString("x"));
+                Debugging.Assert(() => !char.IsLowSurrogate((char)ch), () => "unpaired low surrogate: " + ch.ToString("x"));
                 off++;
                 if (char.IsHighSurrogate((char)ch))
                 {
@@ -227,12 +227,12 @@ namespace Lucene.Net.Analysis
                     if (ch2 >= 0)
                     {
                         off++;
-                        Debug.Assert(char.IsLowSurrogate((char)ch2), "unpaired high surrogate: " + ch.ToString("x") + ", followed by: " + ch2.ToString("x"));
+                        Debugging.Assert(() => char.IsLowSurrogate((char)ch2), () => "unpaired high surrogate: " + ch.ToString("x") + ", followed by: " + ch2.ToString("x"));
                         return Character.ToCodePoint((char)ch, (char)ch2);
                     }
                     else
                     {
-                        Debug.Assert(false, "stream ends with unpaired high surrogate: " + ch.ToString("x"));
+                        Debugging.Assert(() => false, () => "stream ends with unpaired high surrogate: " + ch.ToString("x"));
                     }
                 }
                 return ch;
@@ -300,7 +300,7 @@ namespace Lucene.Net.Analysis
             state = runAutomaton.InitialState;
             lastOffset = off = 0;
             bufferedCodePoint = -1;
-            Debug.Assert(!enableChecks || streamState != State.RESET, "Double Reset()");
+            Debugging.Assert(() => !enableChecks || streamState != State.RESET, () => "Double Reset()");
             streamState = State.RESET;
         }
 
@@ -312,14 +312,14 @@ namespace Lucene.Net.Analysis
                 // in some exceptional cases (e.g. TestIndexWriterExceptions) a test can prematurely close()
                 // these tests should disable this check, by default we check the normal workflow.
                 // TODO: investigate the CachingTokenFilter "double-close"... for now we ignore this
-                Debug.Assert(!enableChecks || streamState == State.END || streamState == State.CLOSE, "Dispose() called in wrong state: " + streamState);
+                Debugging.Assert(() => !enableChecks || streamState == State.END || streamState == State.CLOSE, () => "Dispose() called in wrong state: " + streamState);
                 streamState = State.CLOSE;
             }
         }
 
         internal override bool SetReaderTestPoint()
         {
-            Debug.Assert(!enableChecks || streamState == State.CLOSE, "SetReader() called in wrong state: " + streamState);
+            Debugging.Assert(() => !enableChecks || streamState == State.CLOSE, () => "SetReader() called in wrong state: " + streamState);
             streamState = State.SETREADER;
             return true;
         }
@@ -333,7 +333,7 @@ namespace Lucene.Net.Analysis
             // these tests should disable this check (in general you should consume the entire stream)
             try
             {
-                Debug.Assert(!enableChecks || streamState == State.INCREMENT_FALSE, "End() called before IncrementToken() returned false!");
+                Debugging.Assert(() => !enableChecks || streamState == State.INCREMENT_FALSE, () => "End() called before IncrementToken() returned false!");
             }
             finally
             {
diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs
index f63298d..6cad1fc 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingDocValuesFormat.cs
@@ -1,9 +1,9 @@
 using Lucene.Net.Codecs.Lucene45;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Asserting
 {
@@ -40,15 +40,15 @@ namespace Lucene.Net.Codecs.Asserting
         public override DocValuesConsumer FieldsConsumer(SegmentWriteState state)
         {
             DocValuesConsumer consumer = @in.FieldsConsumer(state);
-            Debug.Assert(consumer != null);
+            Debugging.Assert(() => consumer != null);
             return new AssertingDocValuesConsumer(consumer, state.SegmentInfo.DocCount);
         }
 
         public override DocValuesProducer FieldsProducer(SegmentReadState state)
         {
-            Debug.Assert(state.FieldInfos.HasDocValues);
+            Debugging.Assert(() => state.FieldInfos.HasDocValues);
             DocValuesProducer producer = @in.FieldsProducer(state);
-            Debug.Assert(producer != null);
+            Debugging.Assert(() => producer != null);
             return new AssertingDocValuesProducer(producer, state.SegmentInfo.DocCount);
         }
 
@@ -70,7 +70,7 @@ namespace Lucene.Net.Codecs.Asserting
                 {
                     count++;
                 }
-                Debug.Assert(count == maxDoc);
+                Debugging.Assert(() => count == maxDoc);
                 CheckIterator(values.GetEnumerator(), maxDoc, true);
                 @in.AddNumericField(field, values);
             }
@@ -80,10 +80,10 @@ namespace Lucene.Net.Codecs.Asserting
                 int count = 0;
                 foreach (BytesRef b in values)
                 {
-                    Debug.Assert(b == null || b.IsValid());
+                    Debugging.Assert(() => b == null || b.IsValid());
                     count++;
                 }
-                Debug.Assert(count == maxDoc);
+                Debugging.Assert(() => count == maxDoc);
                 CheckIterator(values.GetEnumerator(), maxDoc, true);
                 @in.AddBinaryField(field, values);
             }
@@ -94,25 +94,25 @@ namespace Lucene.Net.Codecs.Asserting
                 BytesRef lastValue = null;
                 foreach (BytesRef b in values)
                 {
-                    Debug.Assert(b != null);
-                    Debug.Assert(b.IsValid());
+                    Debugging.Assert(() => b != null);
+                    Debugging.Assert(() => b.IsValid());
                     if (valueCount > 0)
                     {
-                        Debug.Assert(b.CompareTo(lastValue) > 0);
+                        Debugging.Assert(() => b.CompareTo(lastValue) > 0);
                     }
                     lastValue = BytesRef.DeepCopyOf(b);
                     valueCount++;
                 }
-                Debug.Assert(valueCount <= maxDoc);
+                Debugging.Assert(() => valueCount <= maxDoc);
 
                 FixedBitSet seenOrds = new FixedBitSet(valueCount);
 
                 int count = 0;
                 foreach (long? v in docToOrd)
                 {
-                    Debug.Assert(v != null);
+                    Debugging.Assert(() => v != null);
                     int ord = (int)v.Value;
-                    Debug.Assert(ord >= -1 && ord < valueCount);
+                    Debugging.Assert(() => ord >= -1 && ord < valueCount);
                     if (ord >= 0)
                     {
                         seenOrds.Set(ord);
@@ -120,8 +120,8 @@ namespace Lucene.Net.Codecs.Asserting
                     count++;
                 }
 
-                Debug.Assert(count == maxDoc);
-                Debug.Assert(seenOrds.Cardinality() == valueCount);
+                Debugging.Assert(() => count == maxDoc);
+                Debugging.Assert(() => seenOrds.Cardinality() == valueCount);
                 CheckIterator(values.GetEnumerator(), valueCount, false);
                 CheckIterator(docToOrd.GetEnumerator(), maxDoc, false);
                 @in.AddSortedField(field, values, docToOrd);
@@ -133,11 +133,11 @@ namespace Lucene.Net.Codecs.Asserting
                 BytesRef lastValue = null;
                 foreach (BytesRef b in values)
                 {
-                    Debug.Assert(b != null);
-                    Debug.Assert(b.IsValid());
+                    Debugging.Assert(() => b != null);
+                    Debugging.Assert(() => b.IsValid());
                     if (valueCount > 0)
                     {
-                        Debug.Assert(b.CompareTo(lastValue) > 0);
+                        Debugging.Assert(() => b.CompareTo(lastValue) > 0);
                     }
                     lastValue = BytesRef.DeepCopyOf(b);
                     valueCount++;
@@ -150,9 +150,9 @@ namespace Lucene.Net.Codecs.Asserting
                 {
                     foreach (long? v in docToOrdCount)
                     {
-                        Debug.Assert(v != null);
+                        Debugging.Assert(() => v != null);
                         int count = (int)v.Value;
-                        Debug.Assert(count >= 0);
+                        Debugging.Assert(() => count >= 0);
                         docCount++;
                         ordCount += count;
 
@@ -161,18 +161,18 @@ namespace Lucene.Net.Codecs.Asserting
                         {
                             ordIterator.MoveNext();
                             long? o = ordIterator.Current;
-                            Debug.Assert(o != null);
+                            Debugging.Assert(() => o != null);
                             long ord = o.Value;
-                            Debug.Assert(ord >= 0 && ord < valueCount);
-                            Debug.Assert(ord > lastOrd, "ord=" + ord + ",lastOrd=" + lastOrd);
+                            Debugging.Assert(() => ord >= 0 && ord < valueCount);
+                            Debugging.Assert(() => ord > lastOrd, () => "ord=" + ord + ",lastOrd=" + lastOrd);
                             seenOrds.Set(ord);
                             lastOrd = ord;
                         }
                     }
-                    Debug.Assert(ordIterator.MoveNext() == false);
+                    Debugging.Assert(() => ordIterator.MoveNext() == false);
 
-                    Debug.Assert(docCount == maxDoc);
-                    Debug.Assert(seenOrds.Cardinality() == valueCount);
+                    Debugging.Assert(() => docCount == maxDoc);
+                    Debugging.Assert(() => seenOrds.Cardinality() == valueCount);
                     CheckIterator(values.GetEnumerator(), valueCount, false);
                     CheckIterator(docToOrdCount.GetEnumerator(), maxDoc, false);
                     CheckIterator(ords.GetEnumerator(), ordCount, false);
@@ -203,10 +203,10 @@ namespace Lucene.Net.Codecs.Asserting
                 int count = 0;
                 foreach (long? v in values)
                 {
-                    Debug.Assert(v != null);
+                    Debugging.Assert(() => v != null);
                     count++;
                 }
-                Debug.Assert(count == maxDoc);
+                Debugging.Assert(() => count == maxDoc);
                 CheckIterator(values.GetEnumerator(), maxDoc, false);
                 @in.AddNumericField(field, values);
             }
@@ -240,9 +240,9 @@ namespace Lucene.Net.Codecs.Asserting
                 for (long i = 0; i < expectedSize; i++)
                 {
                     bool hasNext = iterator.MoveNext();
-                    Debug.Assert(hasNext);
+                    Debugging.Assert(() => hasNext);
                     T v = iterator.Current;
-                    Debug.Assert(allowNull || v != null);
+                    Debugging.Assert(() => allowNull || v != null);
 
                     // LUCENE.NET specific. removed call to Reset().
                     //try
@@ -255,7 +255,7 @@ namespace Lucene.Net.Codecs.Asserting
                     //    // ok
                     //}
                 }
-                Debug.Assert(!iterator.MoveNext());
+                Debugging.Assert(() => !iterator.MoveNext());
                 /*try
                 {
                   //iterator.next();
@@ -285,42 +285,42 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override NumericDocValues GetNumeric(FieldInfo field)
             {
-                Debug.Assert(field.DocValuesType == DocValuesType.NUMERIC || field.NormType == DocValuesType.NUMERIC);
+                Debugging.Assert(() => field.DocValuesType == DocValuesType.NUMERIC || field.NormType == DocValuesType.NUMERIC);
                 NumericDocValues values = @in.GetNumeric(field);
-                Debug.Assert(values != null);
+                Debugging.Assert(() => values != null);
                 return new AssertingNumericDocValues(values, maxDoc);
             }
 
             public override BinaryDocValues GetBinary(FieldInfo field)
             {
-                Debug.Assert(field.DocValuesType == DocValuesType.BINARY);
+                Debugging.Assert(() => field.DocValuesType == DocValuesType.BINARY);
                 BinaryDocValues values = @in.GetBinary(field);
-                Debug.Assert(values != null);
+                Debugging.Assert(() => values != null);
                 return new AssertingBinaryDocValues(values, maxDoc);
             }
 
             public override SortedDocValues GetSorted(FieldInfo field)
             {
-                Debug.Assert(field.DocValuesType == DocValuesType.SORTED);
+                Debugging.Assert(() => field.DocValuesType == DocValuesType.SORTED);
                 SortedDocValues values = @in.GetSorted(field);
-                Debug.Assert(values != null);
+                Debugging.Assert(() => values != null);
                 return new AssertingSortedDocValues(values, maxDoc);
             }
 
             public override SortedSetDocValues GetSortedSet(FieldInfo field)
             {
-                Debug.Assert(field.DocValuesType == DocValuesType.SORTED_SET);
+                Debugging.Assert(() => field.DocValuesType == DocValuesType.SORTED_SET);
                 SortedSetDocValues values = @in.GetSortedSet(field);
-                Debug.Assert(values != null);
+                Debugging.Assert(() => values != null);
                 return new AssertingSortedSetDocValues(values, maxDoc);
             }
 
             public override IBits GetDocsWithField(FieldInfo field)
             {
-                Debug.Assert(field.DocValuesType != DocValuesType.NONE);
+                Debugging.Assert(() => field.DocValuesType != DocValuesType.NONE);
                 IBits bits = @in.GetDocsWithField(field);
-                Debug.Assert(bits != null);
-                Debug.Assert(bits.Length == maxDoc);
+                Debugging.Assert(() => bits != null);
+                Debugging.Assert(() => bits.Length == maxDoc);
                 return new AssertingBits(bits);
             }
 
diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingNormsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingNormsFormat.cs
index 28f822a..87efcba 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingNormsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingNormsFormat.cs
@@ -1,7 +1,7 @@
 using Lucene.Net.Codecs.Lucene42;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using static Lucene.Net.Codecs.Asserting.AssertingDocValuesFormat;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Asserting
 {
@@ -32,15 +32,15 @@ namespace Lucene.Net.Codecs.Asserting
         public override DocValuesConsumer NormsConsumer(SegmentWriteState state)
         {
             DocValuesConsumer consumer = @in.NormsConsumer(state);
-            Debug.Assert(consumer != null);
+            Debugging.Assert(() => consumer != null);
             return new AssertingNormsConsumer(consumer, state.SegmentInfo.DocCount);
         }
 
         public override DocValuesProducer NormsProducer(SegmentReadState state)
         {
-            Debug.Assert(state.FieldInfos.HasNorms);
+            Debugging.Assert(() => state.FieldInfos.HasNorms);
             DocValuesProducer producer = @in.NormsProducer(state);
-            Debug.Assert(producer != null);
+            Debugging.Assert(() => producer != null);
             return new AssertingDocValuesProducer(producer, state.SegmentInfo.DocCount);
         }
     }
diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingPostingsFormat.cs
index d12c609..cc99fd3 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingPostingsFormat.cs
@@ -1,9 +1,9 @@
 using Lucene.Net.Codecs.Lucene41;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Asserting
 {
@@ -67,7 +67,7 @@ namespace Lucene.Net.Codecs.Asserting
             public override IEnumerator<string> GetEnumerator()
             {
                 IEnumerator<string> iterator = @in.GetEnumerator();
-                Debug.Assert(iterator != null);
+                Debugging.Assert(() => iterator != null);
                 return iterator;
             }
 
@@ -105,7 +105,7 @@ namespace Lucene.Net.Codecs.Asserting
             public override TermsConsumer AddField(FieldInfo field)
             {
                 TermsConsumer consumer = @in.AddField(field);
-                Debug.Assert(consumer != null);
+                Debugging.Assert(() => consumer != null);
                 return new AssertingTermsConsumer(consumer, field);
             }
 
@@ -144,28 +144,28 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override PostingsConsumer StartTerm(BytesRef text)
             {
-                Debug.Assert(state == TermsConsumerState.INITIAL || state == TermsConsumerState.START && lastPostingsConsumer.docFreq == 0);
+                Debugging.Assert(() => state == TermsConsumerState.INITIAL || state == TermsConsumerState.START && lastPostingsConsumer.docFreq == 0);
                 state = TermsConsumerState.START;
-                Debug.Assert(lastTerm == null || @in.Comparer.Compare(text, lastTerm) > 0);
+                Debugging.Assert(() => lastTerm == null || @in.Comparer.Compare(text, lastTerm) > 0);
                 lastTerm = BytesRef.DeepCopyOf(text);
                 return lastPostingsConsumer = new AssertingPostingsConsumer(@in.StartTerm(text), fieldInfo, visitedDocs);
             }
 
             public override void FinishTerm(BytesRef text, TermStats stats)
             {
-                Debug.Assert(state == TermsConsumerState.START);
+                Debugging.Assert(() => state == TermsConsumerState.START);
                 state = TermsConsumerState.INITIAL;
-                Debug.Assert(text.Equals(lastTerm));
-                Debug.Assert(stats.DocFreq > 0); // otherwise, this method should not be called.
-                Debug.Assert(stats.DocFreq == lastPostingsConsumer.docFreq);
+                Debugging.Assert(() => text.Equals(lastTerm));
+                Debugging.Assert(() => stats.DocFreq > 0); // otherwise, this method should not be called.
+                Debugging.Assert(() => stats.DocFreq == lastPostingsConsumer.docFreq);
                 sumDocFreq += stats.DocFreq;
                 if (fieldInfo.IndexOptions == IndexOptions.DOCS_ONLY)
                 {
-                    Debug.Assert(stats.TotalTermFreq == -1);
+                    Debugging.Assert(() => stats.TotalTermFreq == -1);
                 }
                 else
                 {
-                    Debug.Assert(stats.TotalTermFreq == lastPostingsConsumer.totalTermFreq);
+                    Debugging.Assert(() => stats.TotalTermFreq == lastPostingsConsumer.totalTermFreq);
                     sumTotalTermFreq += stats.TotalTermFreq;
                 }
                 @in.FinishTerm(text, stats);
@@ -173,20 +173,20 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void Finish(long sumTotalTermFreq, long sumDocFreq, int docCount)
             {
-                Debug.Assert(state == TermsConsumerState.INITIAL || state == TermsConsumerState.START && lastPostingsConsumer.docFreq == 0);
+                Debugging.Assert(() => state == TermsConsumerState.INITIAL || state == TermsConsumerState.START && lastPostingsConsumer.docFreq == 0);
                 state = TermsConsumerState.FINISHED;
-                Debug.Assert(docCount >= 0);
-                Debug.Assert(docCount == visitedDocs.Cardinality());
-                Debug.Assert(sumDocFreq >= docCount);
-                Debug.Assert(sumDocFreq == this.sumDocFreq);
+                Debugging.Assert(() => docCount >= 0);
+                Debugging.Assert(() => docCount == visitedDocs.Cardinality());
+                Debugging.Assert(() => sumDocFreq >= docCount);
+                Debugging.Assert(() => sumDocFreq == this.sumDocFreq);
                 if (fieldInfo.IndexOptions == IndexOptions.DOCS_ONLY)
                 {
-                    Debug.Assert(sumTotalTermFreq == -1);
+                    Debugging.Assert(() => sumTotalTermFreq == -1);
                 }
                 else
                 {
-                    Debug.Assert(sumTotalTermFreq >= sumDocFreq);
-                    Debug.Assert(sumTotalTermFreq == this.sumTotalTermFreq);
+                    Debugging.Assert(() => sumTotalTermFreq >= sumDocFreq);
+                    Debugging.Assert(() => sumTotalTermFreq == this.sumTotalTermFreq);
                 }
                 @in.Finish(sumTotalTermFreq, sumDocFreq, docCount);
             }
@@ -222,17 +222,17 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void StartDoc(int docID, int freq)
             {
-                Debug.Assert(state == PostingsConsumerState.INITIAL);
+                Debugging.Assert(() => state == PostingsConsumerState.INITIAL);
                 state = PostingsConsumerState.START;
-                Debug.Assert(docID >= 0);
+                Debugging.Assert(() => docID >= 0);
                 if (fieldInfo.IndexOptions == IndexOptions.DOCS_ONLY)
                 {
-                    Debug.Assert(freq == -1);
+                    Debugging.Assert(() => freq == -1);
                     this.freq = 0; // we don't expect any positions here
                 }
                 else
                 {
-                    Debug.Assert(freq > 0);
+                    Debugging.Assert(() => freq > 0);
                     this.freq = freq;
                     totalTermFreq += freq;
                 }
@@ -246,41 +246,41 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void AddPosition(int position, BytesRef payload, int startOffset, int endOffset)
             {
-                Debug.Assert(state == PostingsConsumerState.START);
-                Debug.Assert(positionCount < freq);
+                Debugging.Assert(() => state == PostingsConsumerState.START);
+                Debugging.Assert(() => positionCount < freq);
                 positionCount++;
-                Debug.Assert(position >= lastPosition || position == -1); // we still allow -1 from old 3.x indexes
+                Debugging.Assert(() => position >= lastPosition || position == -1); // we still allow -1 from old 3.x indexes
                 lastPosition = position;
                 if (fieldInfo.IndexOptions == IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS)
                 {
-                    Debug.Assert(startOffset >= 0);
-                    Debug.Assert(startOffset >= lastStartOffset);
+                    Debugging.Assert(() => startOffset >= 0);
+                    Debugging.Assert(() => startOffset >= lastStartOffset);
                     lastStartOffset = startOffset;
-                    Debug.Assert(endOffset >= startOffset);
+                    Debugging.Assert(() => endOffset >= startOffset);
                 }
                 else
                 {
-                    Debug.Assert(startOffset == -1);
-                    Debug.Assert(endOffset == -1);
+                    Debugging.Assert(() => startOffset == -1);
+                    Debugging.Assert(() => endOffset == -1);
                 }
                 if (payload != null)
                 {
-                    Debug.Assert(fieldInfo.HasPayloads);
+                    Debugging.Assert(() => fieldInfo.HasPayloads);
                 }
                 @in.AddPosition(position, payload, startOffset, endOffset);
             }
 
             public override void FinishDoc()
             {
-                Debug.Assert(state == PostingsConsumerState.START);
+                Debugging.Assert(() => state == PostingsConsumerState.START);
                 state = PostingsConsumerState.INITIAL;
                 if (fieldInfo.IndexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) < 0)
                 {
-                    Debug.Assert(positionCount == 0); // we should not have fed any positions!
+                    Debugging.Assert(() => positionCount == 0); // we should not have fed any positions!
                 }
                 else
                 {
-                    Debug.Assert(positionCount == freq);
+                    Debugging.Assert(() => positionCount == freq);
                 }
                 @in.FinishDoc();
             }
diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingStoredFieldsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingStoredFieldsFormat.cs
index 3e87039..ca57617 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingStoredFieldsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingStoredFieldsFormat.cs
@@ -1,7 +1,7 @@
 using Lucene.Net.Codecs.Lucene41;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Asserting
 {
@@ -58,7 +58,7 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void VisitDocument(int n, StoredFieldVisitor visitor)
             {
-                Debug.Assert(n >= 0 && n < maxDoc);
+                Debugging.Assert(() => n >= 0 && n < maxDoc);
                 @in.VisitDocument(n, visitor);
             }
 
@@ -100,9 +100,9 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void StartDocument(int numStoredFields)
             {
-                Debug.Assert(docStatus != Status.STARTED);
+                Debugging.Assert(() => docStatus != Status.STARTED);
                 @in.StartDocument(numStoredFields);
-                Debug.Assert(fieldCount == 0);
+                Debugging.Assert(() => fieldCount == 0);
                 fieldCount = numStoredFields;
                 numWritten++;
                 docStatus = Status.STARTED;
@@ -110,17 +110,17 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void FinishDocument()
             {
-                Debug.Assert(docStatus == Status.STARTED);
-                Debug.Assert(fieldCount == 0);
+                Debugging.Assert(() => docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldCount == 0);
                 @in.FinishDocument();
                 docStatus = Status.FINISHED;
             }
 
             public override void WriteField(FieldInfo info, IIndexableField field)
             {
-                Debug.Assert(docStatus == Status.STARTED);
+                Debugging.Assert(() => docStatus == Status.STARTED);
                 @in.WriteField(info, field);
-                Debug.Assert(fieldCount > 0);
+                Debugging.Assert(() => fieldCount > 0);
                 fieldCount--;
             }
 
@@ -131,10 +131,10 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void Finish(FieldInfos fis, int numDocs)
             {
-                Debug.Assert(docStatus == (numDocs > 0 ? Status.FINISHED : Status.UNDEFINED));
+                Debugging.Assert(() => docStatus == (numDocs > 0 ? Status.FINISHED : Status.UNDEFINED));
                 @in.Finish(fis, numDocs);
-                Debug.Assert(fieldCount == 0);
-                Debug.Assert(numDocs == numWritten);
+                Debugging.Assert(() => fieldCount == 0);
+                Debugging.Assert(() => numDocs == numWritten);
             }
 
             protected override void Dispose(bool disposing)
diff --git a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingTermVectorsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingTermVectorsFormat.cs
index 0e735e6..10a94d5 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingTermVectorsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Asserting/AssertingTermVectorsFormat.cs
@@ -1,9 +1,9 @@
 using Lucene.Net.Codecs.Lucene40;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Asserting
 {
@@ -103,8 +103,8 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void StartDocument(int numVectorFields)
             {
-                Debug.Assert(fieldCount == 0);
-                Debug.Assert(docStatus != Status.STARTED);
+                Debugging.Assert(() => fieldCount == 0);
+                Debugging.Assert(() => docStatus != Status.STARTED);
                 @in.StartDocument(numVectorFields);
                 docStatus = Status.STARTED;
                 fieldCount = numVectorFields;
@@ -113,17 +113,17 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void FinishDocument()
             {
-                Debug.Assert(fieldCount == 0);
-                Debug.Assert(docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldCount == 0);
+                Debugging.Assert(() => docStatus == Status.STARTED);
                 @in.FinishDocument();
                 docStatus = Status.FINISHED;
             }
 
             public override void StartField(FieldInfo info, int numTerms, bool positions, bool offsets, bool payloads)
             {
-                Debug.Assert(termCount == 0);
-                Debug.Assert(docStatus == Status.STARTED);
-                Debug.Assert(fieldStatus != Status.STARTED);
+                Debugging.Assert(() => termCount == 0);
+                Debugging.Assert(() => docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldStatus != Status.STARTED);
                 @in.StartField(info, numTerms, positions, offsets, payloads);
                 fieldStatus = Status.STARTED;
                 termCount = numTerms;
@@ -132,8 +132,8 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void FinishField()
             {
-                Debug.Assert(termCount == 0);
-                Debug.Assert(fieldStatus == Status.STARTED);
+                Debugging.Assert(() => termCount == 0);
+                Debugging.Assert(() => fieldStatus == Status.STARTED);
                 @in.FinishField();
                 fieldStatus = Status.FINISHED;
                 --fieldCount;
@@ -141,9 +141,9 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void StartTerm(BytesRef term, int freq)
             {
-                Debug.Assert(docStatus == Status.STARTED);
-                Debug.Assert(fieldStatus == Status.STARTED);
-                Debug.Assert(termStatus != Status.STARTED);
+                Debugging.Assert(() => docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldStatus == Status.STARTED);
+                Debugging.Assert(() => termStatus != Status.STARTED);
                 @in.StartTerm(term, freq);
                 termStatus = Status.STARTED;
                 positionCount = hasPositions ? freq : 0;
@@ -151,10 +151,10 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void FinishTerm()
             {
-                Debug.Assert(positionCount == 0);
-                Debug.Assert(docStatus == Status.STARTED);
-                Debug.Assert(fieldStatus == Status.STARTED);
-                Debug.Assert(termStatus == Status.STARTED);
+                Debugging.Assert(() => positionCount == 0);
+                Debugging.Assert(() => docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldStatus == Status.STARTED);
+                Debugging.Assert(() => termStatus == Status.STARTED);
                 @in.FinishTerm();
                 termStatus = Status.FINISHED;
                 --termCount;
@@ -162,9 +162,9 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void AddPosition(int position, int startOffset, int endOffset, BytesRef payload)
             {
-                Debug.Assert(docStatus == Status.STARTED);
-                Debug.Assert(fieldStatus == Status.STARTED);
-                Debug.Assert(termStatus == Status.STARTED);
+                Debugging.Assert(() => docStatus == Status.STARTED);
+                Debugging.Assert(() => fieldStatus == Status.STARTED);
+                Debugging.Assert(() => termStatus == Status.STARTED);
                 @in.AddPosition(position, startOffset, endOffset, payload);
                 --positionCount;
             }
@@ -176,10 +176,10 @@ namespace Lucene.Net.Codecs.Asserting
 
             public override void Finish(FieldInfos fis, int numDocs)
             {
-                Debug.Assert(docCount == numDocs);
-                Debug.Assert(docStatus == (numDocs > 0 ? Status.FINISHED : Status.UNDEFINED));
-                Debug.Assert(fieldStatus != Status.STARTED);
-                Debug.Assert(termStatus != Status.STARTED);
+                Debugging.Assert(() => docCount == numDocs);
+                Debugging.Assert(() => docStatus == (numDocs > 0 ? Status.FINISHED : Status.UNDEFINED));
+                Debugging.Assert(() => fieldStatus != Status.STARTED);
+                Debugging.Assert(() => termStatus != Status.STARTED);
                 @in.Finish(fis, numDocs);
             }
 
diff --git a/src/Lucene.Net.TestFramework/Codecs/Compressing/Dummy/DummyCompressingCodec.cs b/src/Lucene.Net.TestFramework/Codecs/Compressing/Dummy/DummyCompressingCodec.cs
index ba2ebfb..dacda7f 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Compressing/Dummy/DummyCompressingCodec.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Compressing/Dummy/DummyCompressingCodec.cs
@@ -1,6 +1,6 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Compressing.Dummy
 {
@@ -57,7 +57,7 @@ namespace Lucene.Net.Codecs.Compressing.Dummy
         {
             public override void Decompress(DataInput @in, int originalLength, int offset, int length, BytesRef bytes)
             {
-                Debug.Assert(offset + length <= originalLength);
+                Debugging.Assert(() => offset + length <= originalLength);
                 if (bytes.Bytes.Length < originalLength)
                 {
                     bytes.Bytes = new byte[ArrayUtil.Oversize(originalLength, 1)];
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldInfosWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldInfosWriter.cs
index 9cddcce..d46a3ad 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldInfosWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldInfosWriter.cs
@@ -1,7 +1,7 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene3x
 {
@@ -79,7 +79,7 @@ namespace Lucene.Net.Codecs.Lucene3x
                     if (fi.IsIndexed)
                     {
                         bits |= IS_INDEXED;
-                        Debug.Assert(fi.IndexOptions == IndexOptions.DOCS_AND_FREQS_AND_POSITIONS || !fi.HasPayloads);
+                        Debugging.Assert(() => fi.IndexOptions == IndexOptions.DOCS_AND_FREQS_AND_POSITIONS || !fi.HasPayloads);
                         if (fi.IndexOptions == IndexOptions.DOCS_ONLY)
                         {
                             bits |= OMIT_TERM_FREQ_AND_POSITIONS;
@@ -103,7 +103,7 @@ namespace Lucene.Net.Codecs.Lucene3x
                         // only in RW case
                         output.WriteByte((byte)(sbyte)(fi.NormType == Index.DocValuesType.NONE ? 0 : 1));
                     }
-                    Debug.Assert(fi.Attributes == null); // not used or supported
+                    Debugging.Assert(() => fi.Attributes == null); // not used or supported
                 }
                 success = true;
             }
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldsWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldsWriter.cs
index 5f43e53..5964172 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldsWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWFieldsWriter.cs
@@ -1,9 +1,9 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene3x
 {
@@ -81,7 +81,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
         public override TermsConsumer AddField(FieldInfo field)
         {
-            Debug.Assert(field.Number != -1);
+            Debugging.Assert(() => field.Number != -1);
             if (field.IndexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0)
             {
                 throw new NotSupportedException("this codec cannot index offsets");
@@ -164,7 +164,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
                     lastDocID = docID;
 
-                    Debug.Assert(docID < outerInstance.outerInstance.totalNumDocs, "docID=" + docID + " totalNumDocs=" + outerInstance.outerInstance.totalNumDocs);
+                    Debugging.Assert(() => docID < outerInstance.outerInstance.totalNumDocs, () => "docID=" + docID + " totalNumDocs=" + outerInstance.outerInstance.totalNumDocs);
 
                     if (outerInstance.omitTF)
                     {
@@ -188,9 +188,9 @@ namespace Lucene.Net.Codecs.Lucene3x
 
                 public override void AddPosition(int position, BytesRef payload, int startOffset, int endOffset)
                 {
-                    Debug.Assert(outerInstance.outerInstance.proxOut != null);
-                    Debug.Assert(startOffset == -1);
-                    Debug.Assert(endOffset == -1);
+                    Debugging.Assert(() => outerInstance.outerInstance.proxOut != null);
+                    Debugging.Assert(() => startOffset == -1);
+                    Debugging.Assert(() => endOffset == -1);
                     //System.out.println("      w pos=" + position + " payl=" + payload);
                     int delta = position - lastPosition;
                     lastPosition = position;
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWNormsConsumer.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWNormsConsumer.cs
index 4bf5dcf..6831153 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWNormsConsumer.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWNormsConsumer.cs
@@ -1,9 +1,9 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using AssertionError = Lucene.Net.Diagnostics.AssertionException;
 
 namespace Lucene.Net.Codecs.Lucene3x
@@ -75,7 +75,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
         public override void AddNumericField(FieldInfo field, IEnumerable<long?> values)
         {
-            Debug.Assert(field.Number > lastFieldNumber, "writing norms fields out of order" + lastFieldNumber + " -> " + field.Number);
+            Debugging.Assert(() => field.Number > lastFieldNumber, () => "writing norms fields out of order" + lastFieldNumber + " -> " + field.Number);
             foreach (var n in values)
             {
                 if (((sbyte)(byte)(long)n) < sbyte.MinValue || ((sbyte)(byte)(long)n) > sbyte.MaxValue)
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWStoredFieldsWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWStoredFieldsWriter.cs
index 8eb4908..e7bd7d9 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWStoredFieldsWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWStoredFieldsWriter.cs
@@ -1,9 +1,9 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene3x
 {
@@ -36,7 +36,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
         public PreFlexRWStoredFieldsWriter(Directory directory, string segment, IOContext context)
         {
-            Debug.Assert(directory != null);
+            Debugging.Assert(() => directory != null);
             this.directory = directory;
             this.segment = segment;
 
@@ -188,7 +188,7 @@ namespace Lucene.Net.Codecs.Lucene3x
                         fieldsStream.WriteInt64(J2N.BitConversion.DoubleToInt64Bits(field.GetDoubleValue().Value));
                         break;
                     default:
-                        Debug.Assert(false);
+                        Debugging.Assert(() => false);
                         break;
                 }
             }
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWTermVectorsWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWTermVectorsWriter.cs
index a173c04..1f8fb40 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWTermVectorsWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/PreFlexRWTermVectorsWriter.cs
@@ -1,10 +1,10 @@
 using J2N.Text;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene3x
 {
@@ -75,7 +75,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
         public override void StartField(FieldInfo info, int numTerms, bool positions, bool offsets, bool payloads)
         {
-            Debug.Assert(lastFieldName == null || info.Name.CompareToOrdinal(lastFieldName) > 0, "fieldName=" + info.Name + " lastFieldName=" + lastFieldName);
+            Debugging.Assert(() => lastFieldName == null || info.Name.CompareToOrdinal(lastFieldName) > 0, () => "fieldName=" + info.Name + " lastFieldName=" + lastFieldName);
             lastFieldName = info.Name;
             if (payloads)
             {
@@ -98,7 +98,7 @@ namespace Lucene.Net.Codecs.Lucene3x
             }
             tvf.WriteByte((byte)bits);
 
-            Debug.Assert(fieldCount <= numVectorFields);
+            Debugging.Assert(() => fieldCount <= numVectorFields);
             if (fieldCount == numVectorFields)
             {
                 // last field of the document
@@ -148,7 +148,7 @@ namespace Lucene.Net.Codecs.Lucene3x
 
         public override void AddPosition(int position, int startOffset, int endOffset, BytesRef payload)
         {
-            Debug.Assert(payload == null);
+            Debugging.Assert(() => payload == null);
             if (positions && offsets)
             {
                 // write position delta
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/TermInfosWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/TermInfosWriter.cs
index 9d72885..3030f4c 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene3x/TermInfosWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene3x/TermInfosWriter.cs
@@ -1,10 +1,10 @@
 using J2N.Text;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
 using System.IO;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Codecs.Lucene3x
@@ -135,7 +135,7 @@ namespace Lucene.Net.Codecs.Lucene3x
                 output.WriteInt32(indexInterval); // write indexInterval
                 output.WriteInt32(skipInterval); // write skipInterval
                 output.WriteInt32(maxSkipLevels); // write maxSkipLevels
-                Debug.Assert(InitUTF16Results());
+                Debugging.Assert(InitUTF16Results);
                 success = true;
             }
             finally
@@ -202,10 +202,10 @@ namespace Lucene.Net.Codecs.Lucene3x
             }
 
             scratchBytes.CopyBytes(term);
-            Debug.Assert(lastTerm.Offset == 0);
+            Debugging.Assert(() => lastTerm.Offset == 0);
             UnicodeUtil.UTF8toUTF16(lastTerm.Bytes, 0, lastTerm.Length, utf16Result1);
 
-            Debug.Assert(scratchBytes.Offset == 0);
+            Debugging.Assert(() => scratchBytes.Offset == 0);
             UnicodeUtil.UTF8toUTF16(scratchBytes.Bytes, 0, scratchBytes.Length, utf16Result2);
 
             int len;
@@ -243,10 +243,10 @@ namespace Lucene.Net.Codecs.Lucene3x
         /// </summary>
         public void Add(int fieldNumber, BytesRef term, TermInfo ti)
         {
-            Debug.Assert(CompareToLastTerm(fieldNumber, term) < 0 || (isIndex && term.Length == 0 && lastTerm.Length == 0), "Terms are out of order: field=" + FieldName(fieldInfos, fieldNumber) + " (number " + fieldNumber + ")" + " lastField=" + FieldName(fieldInfos, lastFieldNumber) + " (number " + lastFieldNumber + ")" + " text=" + term.Utf8ToString() + " lastText=" + lastTerm.Utf8ToString());
+            Debugging.Assert(() => CompareToLastTerm(fieldNumber, term) < 0 || (isIndex && term.Length == 0 && lastTerm.Length == 0), () => "Terms are out of order: field=" + FieldName(fieldInfos, fieldNumber) + " (number " + fieldNumber + ")" + " lastField=" + FieldName(fieldInfos, lastFieldNumber) + " (number " + lastFieldNumber + ")" + " text=" + term.Utf8ToString() + " lastText=" + lastTerm.Utf8ToString());
 
-            Debug.Assert(ti.FreqPointer >= lastTi.FreqPointer, "freqPointer out of order (" + ti.FreqPointer + " < " + lastTi.FreqPointer + ")");
-            Debug.Assert(ti.ProxPointer >= lastTi.ProxPointer, "proxPointer out of order (" + ti.ProxPointer + " < " + lastTi.ProxPointer + ")");
+            Debugging.Assert(() => ti.FreqPointer >= lastTi.FreqPointer, () => "freqPointer out of order (" + ti.FreqPointer + " < " + lastTi.FreqPointer + ")");
+            Debugging.Assert(() => ti.ProxPointer >= lastTi.ProxPointer, () => "proxPointer out of order (" + ti.ProxPointer + " < " + lastTi.ProxPointer + ")");
 
             if (!isIndex && size % indexInterval == 0)
             {
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40DocValuesWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40DocValuesWriter.cs
index 0085aa2..cd00949 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40DocValuesWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40DocValuesWriter.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Support;
@@ -8,7 +9,6 @@ using System.Collections.Generic;
 using System.Globalization;
 using System.Linq;
 using JCG = J2N.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene40
 {
@@ -333,7 +333,7 @@ namespace Lucene.Net.Codecs.Lucene40
             index.WriteVInt64(maxAddress);
 
             int maxDoc = state.SegmentInfo.DocCount;
-            Debug.Assert(maxDoc != int.MaxValue); // unsupported by the 4.0 impl
+            Debugging.Assert(() => maxDoc != int.MaxValue); // unsupported by the 4.0 impl
 
             PackedInt32s.Writer w = PackedInt32s.GetWriter(index, maxDoc + 1, PackedInt32s.BitsRequired(maxAddress), PackedInt32s.DEFAULT);
             long currentPosition = 0;
@@ -346,7 +346,7 @@ namespace Lucene.Net.Codecs.Lucene40
                 }
             }
             // write sentinel
-            Debug.Assert(currentPosition == maxAddress);
+            Debugging.Assert(() => currentPosition == maxAddress);
             w.Add(currentPosition);
             w.Finish();
         }
@@ -375,7 +375,7 @@ namespace Lucene.Net.Codecs.Lucene40
 
             /* ordinals */
             int valueCount = dictionary.Count;
-            Debug.Assert(valueCount > 0);
+            Debugging.Assert(() => valueCount > 0);
             index.WriteInt32(valueCount);
             int maxDoc = state.SegmentInfo.DocCount;
             PackedInt32s.Writer w = PackedInt32s.GetWriter(index, maxDoc, PackedInt32s.BitsRequired(valueCount - 1), PackedInt32s.DEFAULT);
@@ -439,7 +439,7 @@ namespace Lucene.Net.Codecs.Lucene40
         // the little vint encoding used for var-deref
         private static void WriteVInt16(IndexOutput o, int i)
         {
-            Debug.Assert(i >= 0 && i <= short.MaxValue);
+            Debugging.Assert(() => i >= 0 && i <= short.MaxValue);
             if (i < 128)
             {
                 o.WriteByte((byte)(sbyte)i);
@@ -545,7 +545,7 @@ namespace Lucene.Net.Codecs.Lucene40
 
             index.WriteInt32(valueCount);
             int maxDoc = state.SegmentInfo.DocCount;
-            Debug.Assert(valueCount > 0);
+            Debugging.Assert(() => valueCount > 0);
             PackedInt32s.Writer w = PackedInt32s.GetWriter(index, maxDoc, PackedInt32s.BitsRequired(valueCount - 1), PackedInt32s.DEFAULT);
             foreach (long n in docToOrd)
             {
@@ -578,7 +578,7 @@ namespace Lucene.Net.Codecs.Lucene40
             long maxAddress = data.GetFilePointer() - startPos;
             index.WriteInt64(maxAddress);
 
-            Debug.Assert(valueCount != int.MaxValue); // unsupported by the 4.0 impl
+            Debugging.Assert(() => valueCount != int.MaxValue); // unsupported by the 4.0 impl
 
             PackedInt32s.Writer w = PackedInt32s.GetWriter(index, valueCount + 1, PackedInt32s.BitsRequired(maxAddress), PackedInt32s.DEFAULT);
             long currentPosition = 0;
@@ -588,14 +588,14 @@ namespace Lucene.Net.Codecs.Lucene40
                 currentPosition += v.Length;
             }
             // write sentinel
-            Debug.Assert(currentPosition == maxAddress);
+            Debugging.Assert(() => currentPosition == maxAddress);
             w.Add(currentPosition);
             w.Finish();
 
             /* ordinals */
 
             int maxDoc = state.SegmentInfo.DocCount;
-            Debug.Assert(valueCount > 0);
+            Debugging.Assert(() => valueCount > 0);
             PackedInt32s.Writer ords = PackedInt32s.GetWriter(index, maxDoc, PackedInt32s.BitsRequired(valueCount - 1), PackedInt32s.DEFAULT);
             foreach (long n in docToOrd)
             {
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40FieldInfosWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40FieldInfosWriter.cs
index ec1bdaf..a11809e 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40FieldInfosWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40FieldInfosWriter.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene40
 {
@@ -66,7 +66,7 @@ namespace Lucene.Net.Codecs.Lucene40
                     if (fi.IsIndexed)
                     {
                         bits |= Lucene40FieldInfosFormat.IS_INDEXED;
-                        Debug.Assert(indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0 || !fi.HasPayloads);
+                        Debugging.Assert(() => indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0 || !fi.HasPayloads);
                         if (indexOptions == IndexOptions.DOCS_ONLY)
                         {
                             bits |= Lucene40FieldInfosFormat.OMIT_TERM_FREQ_AND_POSITIONS;
@@ -87,7 +87,7 @@ namespace Lucene.Net.Codecs.Lucene40
                     // pack the DV types in one byte
                     byte dv = DocValuesByte(fi.DocValuesType, fi.GetAttribute(Lucene40FieldInfosReader.LEGACY_DV_TYPE_KEY));
                     byte nrm = DocValuesByte(fi.NormType, fi.GetAttribute(Lucene40FieldInfosReader.LEGACY_NORM_TYPE_KEY));
-                    Debug.Assert((dv & (~0xF)) == 0 && (nrm & (~0x0F)) == 0);
+                    Debugging.Assert(() => (dv & (~0xF)) == 0 && (nrm & (~0x0F)) == 0);
                     var val = (byte)(0xff & ((nrm << 4) | (byte)dv));
                     output.WriteByte(val);
                     output.WriteStringStringMap(fi.Attributes);
@@ -113,12 +113,12 @@ namespace Lucene.Net.Codecs.Lucene40
         {
             if (type == DocValuesType.NONE)
             {
-                Debug.Assert(legacyTypeAtt == null);
+                Debugging.Assert(() => legacyTypeAtt == null);
                 return 0;
             }
             else
             {
-                Debug.Assert(legacyTypeAtt != null);
+                Debugging.Assert(() => legacyTypeAtt != null);
                 //return (sbyte)LegacyDocValuesType.ordinalLookup[legacyTypeAtt];
                 return (byte)legacyTypeAtt.ToLegacyDocValuesType();
             }
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40PostingsWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40PostingsWriter.cs
index e597def..0cdfac0 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40PostingsWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40PostingsWriter.cs
@@ -1,7 +1,7 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene40
 {
@@ -208,7 +208,7 @@ namespace Lucene.Net.Codecs.Lucene40
                 skipListWriter.BufferSkip(df);
             }
 
-            Debug.Assert(docID < totalNumDocs, "docID=" + docID + " totalNumDocs=" + totalNumDocs);
+            Debugging.Assert(() => docID < totalNumDocs, () => "docID=" + docID + " totalNumDocs=" + totalNumDocs);
 
             lastDocID = docID;
             if (indexOptions == IndexOptions.DOCS_ONLY)
@@ -234,12 +234,12 @@ namespace Lucene.Net.Codecs.Lucene40
         public override void AddPosition(int position, BytesRef payload, int startOffset, int endOffset)
         {
             //if (DEBUG) System.out.println("SPW:     addPos pos=" + position + " payload=" + (payload == null ? "null" : (payload.Length + " bytes")) + " proxFP=" + proxOut.getFilePointer());
-            Debug.Assert(indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0, "invalid indexOptions: " + indexOptions);
-            Debug.Assert(proxOut != null);
+            Debugging.Assert(() => indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0, () => "invalid indexOptions: " + indexOptions);
+            Debugging.Assert(() => proxOut != null);
 
             int delta = position - lastPosition;
 
-            Debug.Assert(delta >= 0, "position=" + position + " lastPosition=" + lastPosition); // not quite right (if pos=0 is repeated twice we don't catch it)
+            Debugging.Assert(() => delta >= 0, () => "position=" + position + " lastPosition=" + lastPosition); // not quite right (if pos=0 is repeated twice we don't catch it)
 
             lastPosition = position;
 
@@ -271,7 +271,7 @@ namespace Lucene.Net.Codecs.Lucene40
                 // and the numbers aren't that much smaller anyways.
                 int offsetDelta = startOffset - lastOffset;
                 int offsetLength = endOffset - startOffset;
-                Debug.Assert(offsetDelta >= 0 && offsetLength >= 0, "startOffset=" + startOffset + ",lastOffset=" + lastOffset + ",endOffset=" + endOffset);
+                Debugging.Assert(() => offsetDelta >= 0 && offsetLength >= 0, () => "startOffset=" + startOffset + ",lastOffset=" + lastOffset + ",endOffset=" + endOffset);
                 if (offsetLength != lastOffsetLength)
                 {
                     proxOut.WriteVInt32(offsetDelta << 1 | 1);
@@ -308,11 +308,11 @@ namespace Lucene.Net.Codecs.Lucene40
         {
             StandardTermState state_ = (StandardTermState)state;
             // if (DEBUG) System.out.println("SPW: finishTerm seg=" + segment + " freqStart=" + freqStart);
-            Debug.Assert(state_.DocFreq > 0);
+            Debugging.Assert(() => state_.DocFreq > 0);
 
             // TODO: wasteful we are counting this (counting # docs
             // for this term) in two places?
-            Debug.Assert(state_.DocFreq == df);
+            Debugging.Assert(() => state_.DocFreq == df);
             state_.FreqStart = freqStart;
             state_.ProxStart = proxStart;
             if (df >= skipMinimum)
@@ -337,7 +337,7 @@ namespace Lucene.Net.Codecs.Lucene40
             @out.WriteVInt64(state_.FreqStart - lastState.FreqStart);
             if (state_.SkipOffset != -1)
             {
-                Debug.Assert(state_.SkipOffset > 0);
+                Debugging.Assert(() => state_.SkipOffset > 0);
                 @out.WriteVInt64(state_.SkipOffset);
             }
             if (indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0)
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40SkipListWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40SkipListWriter.cs
index 282f62f..f8b50ee 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40SkipListWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene40/Lucene40SkipListWriter.cs
@@ -1,7 +1,7 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
 using Lucene.Net.Support;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene40
 {
@@ -67,8 +67,8 @@ namespace Lucene.Net.Codecs.Lucene40
         /// </summary>
         public virtual void SetSkipData(int doc, bool storePayloads, int payloadLength, bool storeOffsets, int offsetLength)
         {
-            Debug.Assert(storePayloads || payloadLength == -1);
-            Debug.Assert(storeOffsets || offsetLength == -1);
+            Debugging.Assert(() => storePayloads || payloadLength == -1);
+            Debugging.Assert(() => storeOffsets || offsetLength == -1);
             this.curDoc = doc;
             this.curStorePayloads = storePayloads;
             this.curPayloadLength = payloadLength;
@@ -120,8 +120,8 @@ namespace Lucene.Net.Codecs.Lucene40
 
             if (curStorePayloads || curStoreOffsets)
             {
-                Debug.Assert(curStorePayloads || curPayloadLength == lastSkipPayloadLength[level]);
-                Debug.Assert(curStoreOffsets || curOffsetLength == lastSkipOffsetLength[level]);
+                Debugging.Assert(() => curStorePayloads || curPayloadLength == lastSkipPayloadLength[level]);
+                Debugging.Assert(() => curStoreOffsets || curOffsetLength == lastSkipOffsetLength[level]);
 
                 if (curPayloadLength == lastSkipPayloadLength[level] && curOffsetLength == lastSkipOffsetLength[level])
                 {
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42DocValuesConsumer.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42DocValuesConsumer.cs
index 58dcb64..9c87bf3 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42DocValuesConsumer.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42DocValuesConsumer.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
@@ -9,7 +10,6 @@ using System.IO;
 using JCG = J2N.Collections.Generic;
 using static Lucene.Net.Util.Fst.FST;
 using static Lucene.Net.Util.Packed.PackedInt32s;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene42
 {
@@ -125,7 +125,7 @@ namespace Lucene.Net.Codecs.Lucene42
 
                     ++count;
                 }
-                Debug.Assert(count == maxDoc);
+                Debugging.Assert(() => count == maxDoc);
             }
 
             if (uniqueValues != null)
diff --git a/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42FieldInfosWriter.cs b/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42FieldInfosWriter.cs
index 5a1d1b0..9889f63 100644
--- a/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42FieldInfosWriter.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/Lucene42/Lucene42FieldInfosWriter.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.Lucene42
 {
@@ -66,7 +66,7 @@ namespace Lucene.Net.Codecs.Lucene42
                     if (fi.IsIndexed)
                     {
                         bits |= Lucene42FieldInfosFormat.IS_INDEXED;
-                        Debug.Assert(indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0 || !fi.HasPayloads);
+                        Debugging.Assert(() => indexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0 || !fi.HasPayloads);
                         if (indexOptions == IndexOptions.DOCS_ONLY)
                         {
                             bits |= Lucene42FieldInfosFormat.OMIT_TERM_FREQ_AND_POSITIONS;
@@ -87,7 +87,7 @@ namespace Lucene.Net.Codecs.Lucene42
                     // pack the DV types in one byte
                     var dv = DocValuesByte(fi.DocValuesType);
                     var nrm = DocValuesByte(fi.NormType);
-                    Debug.Assert((dv & (~0xF)) == 0 && (nrm & (~0x0F)) == 0);
+                    Debugging.Assert(() => (dv & (~0xF)) == 0 && (nrm & (~0x0F)) == 0);
                     var val = (byte)(0xff & ((nrm << 4) | (byte)dv));
                     output.WriteByte(val);
                     output.WriteStringStringMap(fi.Attributes);
diff --git a/src/Lucene.Net.TestFramework/Codecs/MockIntBlock/MockVariableIntBlockPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/MockIntBlock/MockVariableIntBlockPostingsFormat.cs
index e8b6cce..d8e4ed8 100644
--- a/src/Lucene.Net.TestFramework/Codecs/MockIntBlock/MockVariableIntBlockPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/MockIntBlock/MockVariableIntBlockPostingsFormat.cs
@@ -1,10 +1,10 @@
 using Lucene.Net.Codecs.BlockTerms;
 using Lucene.Net.Codecs.IntBlock;
 using Lucene.Net.Codecs.Sep;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.MockIntBlock
 {
@@ -107,7 +107,7 @@ namespace Lucene.Net.Codecs.MockIntBlock
                     {
                         buffer[0] = input.ReadVInt32();
                         int count = buffer[0] <= 3 ? baseBlockSize - 1 : 2 * baseBlockSize - 1;
-                        Debug.Assert(buffer.Length >= count, "buffer.length=" + buffer.Length + " count=" + count);
+                        Debugging.Assert(() => buffer.Length >= count, () => "buffer.length=" + buffer.Length + " count=" + count);
                         for (int i = 0; i < count; i++)
                         {
                             buffer[i + 1] = input.ReadVInt32();
diff --git a/src/Lucene.Net.TestFramework/Codecs/MockRandom/MockRandomPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/MockRandom/MockRandomPostingsFormat.cs
index ab3e43c..75925c1 100644
--- a/src/Lucene.Net.TestFramework/Codecs/MockRandom/MockRandomPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/MockRandom/MockRandomPostingsFormat.cs
@@ -5,13 +5,13 @@ using Lucene.Net.Codecs.MockIntBlock;
 using Lucene.Net.Codecs.MockSep;
 using Lucene.Net.Codecs.Pulsing;
 using Lucene.Net.Codecs.Sep;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.MockRandom
 {
@@ -88,7 +88,7 @@ namespace Lucene.Net.Codecs.MockRandom
             private static string GetExtension(string fileName)
             {
                 int idx = fileName.IndexOf('.');
-                Debug.Assert(idx != -1);
+                Debugging.Assert(() => idx != -1);
                 return fileName.Substring(idx);
             }
 
diff --git a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
index 75eeebc..d4565c2 100644
--- a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
@@ -1,5 +1,6 @@
 using J2N.Text;
 using J2N.Threading.Atomic;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
@@ -7,7 +8,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using JCG = J2N.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Codecs.RAMOnly
 {
@@ -290,8 +290,8 @@ namespace Lucene.Net.Codecs.RAMOnly
 
             public override void FinishTerm(BytesRef text, TermStats stats)
             {
-                Debug.Assert(stats.DocFreq > 0);
-                Debug.Assert(stats.DocFreq == current.docs.Count);
+                Debugging.Assert(() => stats.DocFreq > 0);
+                Debugging.Assert(() => stats.DocFreq == current.docs.Count);
                 current.totalTermFreq = stats.TotalTermFreq;
                 field.termToDocs[current.term] = current;
             }
@@ -324,8 +324,8 @@ namespace Lucene.Net.Codecs.RAMOnly
 
             public override void AddPosition(int position, BytesRef payload, int startOffset, int endOffset)
             {
-                Debug.Assert(startOffset == -1);
-                Debug.Assert(endOffset == -1);
+                Debugging.Assert(() => startOffset == -1);
+                Debugging.Assert(() => endOffset == -1);
                 current.positions[posUpto] = position;
                 if (payload != null && payload.Length > 0)
                 {
@@ -341,7 +341,7 @@ namespace Lucene.Net.Codecs.RAMOnly
 
             public override void FinishDoc()
             {
-                Debug.Assert(posUpto == current.positions.Length);
+                Debugging.Assert(() => posUpto == current.positions.Length);
             }
         }
 
diff --git a/src/Lucene.Net.TestFramework/Index/AllDeletedFilterReader.cs b/src/Lucene.Net.TestFramework/Index/AllDeletedFilterReader.cs
index d14e6c0..2c56376 100644
--- a/src/Lucene.Net.TestFramework/Index/AllDeletedFilterReader.cs
+++ b/src/Lucene.Net.TestFramework/Index/AllDeletedFilterReader.cs
@@ -1,5 +1,5 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Util;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Index
 {
@@ -31,7 +31,7 @@ namespace Lucene.Net.Index
             : base(@in)
         {
             liveDocs = new Bits.MatchNoBits(@in.MaxDoc);
-            Debug.Assert(MaxDoc == 0 || HasDeletions);
+            Debugging.Assert(() => MaxDoc == 0 || HasDeletions);
         }
 
         public override IBits LiveDocs => liveDocs;
diff --git a/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs b/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs
index 0183aac..4657a16 100644
--- a/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs
+++ b/src/Lucene.Net.TestFramework/Index/AssertingAtomicReader.cs
@@ -1,9 +1,9 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Search;
 using Lucene.Net.Util;
 using Lucene.Net.Util.Automaton;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Index
 {
@@ -36,7 +36,7 @@ namespace Lucene.Net.Index
         public override IEnumerator<string> GetEnumerator()
         {
             IEnumerator<string> iterator = base.GetEnumerator();
-            Debug.Assert(iterator != null);
+            Debugging.Assert(() => iterator != null);
             return iterator;
         }
 
@@ -59,8 +59,8 @@ namespace Lucene.Net.Index
         public override TermsEnum Intersect(CompiledAutomaton automaton, BytesRef bytes)
         {
             TermsEnum termsEnum = m_input.Intersect(automaton, bytes);
-            Debug.Assert(termsEnum != null);
-            Debug.Assert(bytes == null || bytes.IsValid());
+            Debugging.Assert(() => termsEnum != null);
+            Debugging.Assert(() => bytes == null || bytes.IsValid());
             return new AssertingAtomicReader.AssertingTermsEnum(termsEnum);
         }
 
@@ -73,7 +73,7 @@ namespace Lucene.Net.Index
                 reuse = ((AssertingAtomicReader.AssertingTermsEnum)reuse).m_input;
             }
             TermsEnum termsEnum = base.GetIterator(reuse);
-            Debug.Assert(termsEnum != null);
+            Debugging.Assert(() => termsEnum != null);
             return new AssertingAtomicReader.AssertingTermsEnum(termsEnum);
         }
     }
@@ -102,7 +102,7 @@ namespace Lucene.Net.Index
             try
             {
                 int docid = @in.DocID;
-                Debug.Assert(docid == -1, @in.GetType() + ": invalid initial doc id: " + docid);
+                Debugging.Assert(() => docid == -1, () => @in.GetType() + ": invalid initial doc id: " + docid);
             }
             catch (NotSupportedException /*e*/)
             {
@@ -116,9 +116,9 @@ namespace Lucene.Net.Index
 
         public override int NextDoc()
         {
-            Debug.Assert(state != DocsEnumState.FINISHED, "NextDoc() called after NO_MORE_DOCS");
+            Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "NextDoc() called after NO_MORE_DOCS");
             int nextDoc = base.NextDoc();
-            Debug.Assert(nextDoc > doc, "backwards NextDoc from " + doc + " to " + nextDoc + " " + m_input);
+            Debugging.Assert(() => nextDoc > doc, () => "backwards NextDoc from " + doc + " to " + nextDoc + " " + m_input);
             if (nextDoc == DocIdSetIterator.NO_MORE_DOCS)
             {
                 state = DocsEnumState.FINISHED;
@@ -127,16 +127,16 @@ namespace Lucene.Net.Index
             {
                 state = DocsEnumState.ITERATING;
             }
-            Debug.Assert(base.DocID == nextDoc);
+            Debugging.Assert(() => base.DocID == nextDoc);
             return doc = nextDoc;
         }
 
         public override int Advance(int target)
         {
-            Debug.Assert(state != DocsEnumState.FINISHED, "Advance() called after NO_MORE_DOCS");
-            Debug.Assert(target > doc, "target must be > DocID, got " + target + " <= " + doc);
+            Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "Advance() called after NO_MORE_DOCS");
+            Debugging.Assert(() => target > doc, () => "target must be > DocID, got " + target + " <= " + doc);
             int advanced = base.Advance(target);
-            Debug.Assert(advanced >= target, "backwards advance from: " + target + " to: " + advanced);
+            Debugging.Assert(() => advanced >= target, () => "backwards advance from: " + target + " to: " + advanced);
             if (advanced == DocIdSetIterator.NO_MORE_DOCS)
             {
                 state = DocsEnumState.FINISHED;
@@ -145,7 +145,7 @@ namespace Lucene.Net.Index
             {
                 state = DocsEnumState.ITERATING;
             }
-            Debug.Assert(base.DocID == advanced);
+            Debugging.Assert(() => base.DocID == advanced);
             return doc = advanced;
         }
 
@@ -153,7 +153,7 @@ namespace Lucene.Net.Index
         {
             get
             {
-                Debug.Assert(doc == base.DocID, " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
+                Debugging.Assert(() => doc == base.DocID, () => " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
                 return doc;
             }
         }
@@ -162,10 +162,10 @@ namespace Lucene.Net.Index
         {
             get
             {
-                Debug.Assert(state != DocsEnumState.START, "Freq called before NextDoc()/Advance()");
-                Debug.Assert(state != DocsEnumState.FINISHED, "Freq called after NO_MORE_DOCS");
+                Debugging.Assert(() => state != DocsEnumState.START, () => "Freq called before NextDoc()/Advance()");
+                Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "Freq called after NO_MORE_DOCS");
                 int freq = base.Freq;
-                Debug.Assert(freq > 0);
+                Debugging.Assert(() => freq > 0);
                 return freq;
             }
         }
@@ -186,7 +186,7 @@ namespace Lucene.Net.Index
 
         public override long Get(int docID)
         {
-            Debug.Assert(docID >= 0 && docID < maxDoc);
+            Debugging.Assert(() => docID >= 0 && docID < maxDoc);
             return @in.Get(docID);
         }
     }
@@ -206,10 +206,10 @@ namespace Lucene.Net.Index
 
         public override void Get(int docID, BytesRef result)
         {
-            Debug.Assert(docID >= 0 && docID < maxDoc);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(() => docID >= 0 && docID < maxDoc);
+            Debugging.Assert(result.IsValid);
             @in.Get(docID, result);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(result.IsValid);
         }
     }
 
@@ -226,23 +226,23 @@ namespace Lucene.Net.Index
             this.@in = @in;
             this.maxDoc = maxDoc;
             this.valueCount = @in.ValueCount;
-            Debug.Assert(valueCount >= 0 && valueCount <= maxDoc);
+            Debugging.Assert(() => valueCount >= 0 && valueCount <= maxDoc);
         }
 
         public override int GetOrd(int docID)
         {
-            Debug.Assert(docID >= 0 && docID < maxDoc);
+            Debugging.Assert(() => docID >= 0 && docID < maxDoc);
             int ord = @in.GetOrd(docID);
-            Debug.Assert(ord >= -1 && ord < valueCount);
+            Debugging.Assert(() => ord >= -1 && ord < valueCount);
             return ord;
         }
 
         public override void LookupOrd(int ord, BytesRef result)
         {
-            Debug.Assert(ord >= 0 && ord < valueCount);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(() => ord >= 0 && ord < valueCount);
+            Debugging.Assert(result.IsValid);
             @in.LookupOrd(ord, result);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(result.IsValid);
         }
 
         public override int ValueCount
@@ -250,25 +250,25 @@ namespace Lucene.Net.Index
             get
             {
                 int valueCount = @in.ValueCount;
-                Debug.Assert(valueCount == this.valueCount); // should not change
+                Debugging.Assert(() => valueCount == this.valueCount); // should not change
                 return valueCount;
             }
         }
 
         public override void Get(int docID, BytesRef result)
         {
-            Debug.Assert(docID >= 0 && docID < maxDoc);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(() => docID >= 0 && docID < maxDoc);
+            Debugging.Assert(result.IsValid);
             @in.Get(docID, result);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(result.IsValid);
         }
 
         public override int LookupTerm(BytesRef key)
         {
-            Debug.Assert(key.IsValid());
+            Debugging.Assert(key.IsValid);
             int result = @in.LookupTerm(key);
-            Debug.Assert(result < valueCount);
-            Debug.Assert(key.IsValid());
+            Debugging.Assert(() => result < valueCount);
+            Debugging.Assert(key.IsValid);
             return result;
         }
     }
@@ -287,32 +287,32 @@ namespace Lucene.Net.Index
             this.@in = @in;
             this.maxDoc = maxDoc;
             this.valueCount = @in.ValueCount;
-            Debug.Assert(valueCount >= 0);
+            Debugging.Assert(() => valueCount >= 0);
         }
 
         public override long NextOrd()
         {
-            Debug.Assert(lastOrd != NO_MORE_ORDS);
+            Debugging.Assert(() => lastOrd != NO_MORE_ORDS);
             long ord = @in.NextOrd();
-            Debug.Assert(ord < valueCount);
-            Debug.Assert(ord == NO_MORE_ORDS || ord > lastOrd);
+            Debugging.Assert(() => ord < valueCount);
+            Debugging.Assert(() => ord == NO_MORE_ORDS || ord > lastOrd);
             lastOrd = ord;
             return ord;
         }
 
         public override void SetDocument(int docID)
         {
-            Debug.Assert(docID >= 0 && docID < maxDoc, "docid=" + docID + ",maxDoc=" + maxDoc);
+            Debugging.Assert(() => docID >= 0 && docID < maxDoc, () => "docid=" + docID + ",maxDoc=" + maxDoc);
             @in.SetDocument(docID);
             lastOrd = -2;
         }
 
         public override void LookupOrd(long ord, BytesRef result)
         {
-            Debug.Assert(ord >= 0 && ord < valueCount);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(() => ord >= 0 && ord < valueCount);
+            Debugging.Assert(result.IsValid);
             @in.LookupOrd(ord, result);
-            Debug.Assert(result.IsValid());
+            Debugging.Assert(result.IsValid);
         }
 
         public override long ValueCount
@@ -320,17 +320,17 @@ namespace Lucene.Net.Index
             get
             {
                 long valueCount = @in.ValueCount;
-                Debug.Assert(valueCount == this.valueCount); // should not change
+                Debugging.Assert(() => valueCount == this.valueCount); // should not change
                 return valueCount;
             }
         }
 
         public override long LookupTerm(BytesRef key)
         {
-            Debug.Assert(key.IsValid());
+            Debugging.Assert(key.IsValid);
             long result = @in.LookupTerm(key);
-            Debug.Assert(result < valueCount);
-            Debug.Assert(key.IsValid());
+            Debugging.Assert(() => result < valueCount);
+            Debugging.Assert(key.IsValid);
             return result;
         }
     }
@@ -348,7 +348,7 @@ namespace Lucene.Net.Index
 
         public virtual bool Get(int index)
         {
-            Debug.Assert(index >= 0 && index < Length);
+            Debugging.Assert(() => index >= 0 && index < Length);
             return @in.Get(index);
         }
 
@@ -365,10 +365,10 @@ namespace Lucene.Net.Index
             : base(@in)
         {
             // check some basic reader sanity
-            Debug.Assert(@in.MaxDoc >= 0);
-            Debug.Assert(@in.NumDocs <= @in.MaxDoc);
-            Debug.Assert(@in.NumDeletedDocs + @in.NumDocs == @in.MaxDoc);
-            Debug.Assert(!@in.HasDeletions || @in.NumDeletedDocs > 0 && @in.NumDocs < @in.MaxDoc);
+            Debugging.Assert(() => @in.MaxDoc >= 0);
+            Debugging.Assert(() => @in.NumDocs <= @in.MaxDoc);
+            Debugging.Assert(() => @in.NumDeletedDocs + @in.NumDocs == @in.MaxDoc);
+            Debugging.Assert(() => !@in.HasDeletions || @in.NumDeletedDocs > 0 && @in.NumDocs < @in.MaxDoc);
         }
 
         public override Fields Fields
@@ -409,7 +409,7 @@ namespace Lucene.Net.Index
 
             public override DocsEnum Docs(IBits liveDocs, DocsEnum reuse, DocsFlags flags)
             {
-                Debug.Assert(state == State.POSITIONED, "Docs(...) called on unpositioned TermsEnum");
+                Debugging.Assert(() => state == State.POSITIONED, () => "Docs(...) called on unpositioned TermsEnum");
 
                 // TODO: should we give this thing a random to be super-evil,
                 // and randomly *not* unwrap?
@@ -423,7 +423,7 @@ namespace Lucene.Net.Index
 
             public override DocsAndPositionsEnum DocsAndPositions(IBits liveDocs, DocsAndPositionsEnum reuse, DocsAndPositionsFlags flags)
             {
-                Debug.Assert(state == State.POSITIONED, "DocsAndPositions(...) called on unpositioned TermsEnum");
+                Debugging.Assert(() => state == State.POSITIONED, () => "DocsAndPositions(...) called on unpositioned TermsEnum");
 
                 // TODO: should we give this thing a random to be super-evil,
                 // and randomly *not* unwrap?
@@ -439,7 +439,7 @@ namespace Lucene.Net.Index
             // someone should not call next() after it returns null!!!!
             public override BytesRef Next()
             {
-                Debug.Assert(state == State.INITIAL || state == State.POSITIONED, "Next() called on unpositioned TermsEnum");
+                Debugging.Assert(() => state == State.INITIAL || state == State.POSITIONED, () => "Next() called on unpositioned TermsEnum");
                 BytesRef result = base.Next();
                 if (result == null)
                 {
@@ -447,7 +447,7 @@ namespace Lucene.Net.Index
                 }
                 else
                 {
-                    Debug.Assert(result.IsValid());
+                    Debugging.Assert(result.IsValid);
                     state = State.POSITIONED;
                 }
                 return result;
@@ -457,7 +457,7 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state == State.POSITIONED, "Ord called on unpositioned TermsEnum");
+                    Debugging.Assert(() => state == State.POSITIONED, () => "Ord called on unpositioned TermsEnum");
                     return base.Ord;
                 }
             }
@@ -466,7 +466,7 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state == State.POSITIONED, "DocFreq called on unpositioned TermsEnum");
+                    Debugging.Assert(() => state == State.POSITIONED, () => "DocFreq called on unpositioned TermsEnum");
                     return base.DocFreq;
                 }
             }
@@ -475,7 +475,7 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state == State.POSITIONED, "TotalTermFreq called on unpositioned TermsEnum");
+                    Debugging.Assert(() => state == State.POSITIONED, () => "TotalTermFreq called on unpositioned TermsEnum");
                     return base.TotalTermFreq;
                 }
             }
@@ -484,9 +484,9 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state == State.POSITIONED, "Term called on unpositioned TermsEnum");
+                    Debugging.Assert(() => state == State.POSITIONED, () => "Term called on unpositioned TermsEnum");
                     BytesRef ret = base.Term;
-                    Debug.Assert(ret == null || ret.IsValid());
+                    Debugging.Assert(() => ret == null || ret.IsValid());
                     return ret;
                 }
             }
@@ -499,7 +499,7 @@ namespace Lucene.Net.Index
 
             public override SeekStatus SeekCeil(BytesRef term)
             {
-                Debug.Assert(term.IsValid());
+                Debugging.Assert(term.IsValid);
                 SeekStatus result = base.SeekCeil(term);
                 if (result == SeekStatus.END)
                 {
@@ -514,7 +514,7 @@ namespace Lucene.Net.Index
 
             public override bool SeekExact(BytesRef text)
             {
-                Debug.Assert(text.IsValid());
+                Debugging.Assert(text.IsValid);
                 if (base.SeekExact(text))
                 {
                     state = State.POSITIONED;
@@ -529,13 +529,13 @@ namespace Lucene.Net.Index
 
             public override TermState GetTermState()
             {
-                Debug.Assert(state == State.POSITIONED, "GetTermState() called on unpositioned TermsEnum");
+                Debugging.Assert(() => state == State.POSITIONED, () => "GetTermState() called on unpositioned TermsEnum");
                 return base.GetTermState();
             }
 
             public override void SeekExact(BytesRef term, TermState state)
             {
-                Debug.Assert(term.IsValid());
+                Debugging.Assert(term.IsValid);
                 base.SeekExact(term, state);
                 this.state = State.POSITIONED;
             }
@@ -556,15 +556,15 @@ namespace Lucene.Net.Index
                 : base(@in)
             {
                 int docid = @in.DocID;
-                Debug.Assert(docid == -1, "invalid initial doc id: " + docid);
+                Debugging.Assert(() => docid == -1, () => "invalid initial doc id: " + docid);
                 doc = -1;
             }
 
             public override int NextDoc()
             {
-                Debug.Assert(state != DocsEnumState.FINISHED, "NextDoc() called after NO_MORE_DOCS");
+                Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "NextDoc() called after NO_MORE_DOCS");
                 int nextDoc = base.NextDoc();
-                Debug.Assert(nextDoc > doc, "backwards nextDoc from " + doc + " to " + nextDoc);
+                Debugging.Assert(() => nextDoc > doc, () => "backwards nextDoc from " + doc + " to " + nextDoc);
                 positionCount = 0;
                 if (nextDoc == DocIdSetIterator.NO_MORE_DOCS)
                 {
@@ -576,16 +576,16 @@ namespace Lucene.Net.Index
                     state = DocsEnumState.ITERATING;
                     positionMax = base.Freq;
                 }
-                Debug.Assert(base.DocID == nextDoc);
+                Debugging.Assert(() => base.DocID == nextDoc);
                 return doc = nextDoc;
             }
 
             public override int Advance(int target)
             {
-                Debug.Assert(state != DocsEnumState.FINISHED, "Advance() called after NO_MORE_DOCS");
-                Debug.Assert(target > doc, "target must be > DocID, got " + target + " <= " + doc);
+                Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "Advance() called after NO_MORE_DOCS");
+                Debugging.Assert(() => target > doc, () => "target must be > DocID, got " + target + " <= " + doc);
                 int advanced = base.Advance(target);
-                Debug.Assert(advanced >= target, "backwards advance from: " + target + " to: " + advanced);
+                Debugging.Assert(() => advanced >= target, () => "backwards advance from: " + target + " to: " + advanced);
                 positionCount = 0;
                 if (advanced == DocIdSetIterator.NO_MORE_DOCS)
                 {
@@ -597,7 +597,7 @@ namespace Lucene.Net.Index
                     state = DocsEnumState.ITERATING;
                     positionMax = base.Freq;
                 }
-                Debug.Assert(base.DocID == advanced);
+                Debugging.Assert(() => base.DocID == advanced);
                 return doc = advanced;
             }
 
@@ -605,7 +605,7 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(doc == base.DocID, " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
+                    Debugging.Assert(() => doc == base.DocID, () => " invalid DocID in " + m_input.GetType() + " " + base.DocID + " instead of " + doc);
                     return doc;
                 }
             }
@@ -614,21 +614,21 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state != DocsEnumState.START, "Freq called before NextDoc()/Advance()");
-                    Debug.Assert(state != DocsEnumState.FINISHED, "Freq called after NO_MORE_DOCS");
+                    Debugging.Assert(() => state != DocsEnumState.START, () => "Freq called before NextDoc()/Advance()");
+                    Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "Freq called after NO_MORE_DOCS");
                     int freq = base.Freq;
-                    Debug.Assert(freq > 0);
+                    Debugging.Assert(() => freq > 0);
                     return freq;
                 }
             }
 
             public override int NextPosition()
             {
-                Debug.Assert(state != DocsEnumState.START, "NextPosition() called before NextDoc()/Advance()");
-                Debug.Assert(state != DocsEnumState.FINISHED, "NextPosition() called after NO_MORE_DOCS");
-                Debug.Assert(positionCount < positionMax, "NextPosition() called more than Freq times!");
+                Debugging.Assert(() => state != DocsEnumState.START, () => "NextPosition() called before NextDoc()/Advance()");
+                Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "NextPosition() called after NO_MORE_DOCS");
+                Debugging.Assert(() => positionCount < positionMax, () => "NextPosition() called more than Freq times!");
                 int position = base.NextPosition();
-                Debug.Assert(position >= 0 || position == -1, "invalid position: " + position);
+                Debugging.Assert(() => position >= 0 || position == -1, () => "invalid position: " + position);
                 positionCount++;
                 return position;
             }
@@ -637,9 +637,9 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state != DocsEnumState.START, "StartOffset called before NextDoc()/Advance()");
-                    Debug.Assert(state != DocsEnumState.FINISHED, "StartOffset called after NO_MORE_DOCS");
-                    Debug.Assert(positionCount > 0, "StartOffset called before NextPosition()!");
+                    Debugging.Assert(() => state != DocsEnumState.START, () => "StartOffset called before NextDoc()/Advance()");
+                    Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "StartOffset called after NO_MORE_DOCS");
+                    Debugging.Assert(() => positionCount > 0, () => "StartOffset called before NextPosition()!");
                     return base.StartOffset;
                 }
             }
@@ -648,20 +648,20 @@ namespace Lucene.Net.Index
             {
                 get
                 {
-                    Debug.Assert(state != DocsEnumState.START, "EndOffset called before NextDoc()/Advance()");
-                    Debug.Assert(state != DocsEnumState.FINISHED, "EndOffset called after NO_MORE_DOCS");
-                    Debug.Assert(positionCount > 0, "EndOffset called before NextPosition()!");
+                    Debugging.Assert(() => state != DocsEnumState.START, () => "EndOffset called before NextDoc()/Advance()");
+                    Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "EndOffset called after NO_MORE_DOCS");
+                    Debugging.Assert(() => positionCount > 0, () => "EndOffset called before NextPosition()!");
                     return base.EndOffset;
                 }
             }
 
             public override BytesRef GetPayload()
             {
-                Debug.Assert(state != DocsEnumState.START, "GetPayload() called before NextDoc()/Advance()");
-                Debug.Assert(state != DocsEnumState.FINISHED, "GetPayload() called after NO_MORE_DOCS");
-                Debug.Assert(positionCount > 0, "GetPayload() called before NextPosition()!");
+                Debugging.Assert(() => state != DocsEnumState.START, () => "GetPayload() called before NextDoc()/Advance()");
+                Debugging.Assert(() => state != DocsEnumState.FINISHED, () => "GetPayload() called after NO_MORE_DOCS");
+                Debugging.Assert(() => positionCount > 0, () => "GetPayload() called before NextPosition()!");
                 BytesRef payload = base.GetPayload();
-                Debug.Assert(payload == null || payload.IsValid() && payload.Length > 0, "GetPayload() returned payload with invalid length!");
+                Debugging.Assert(() => payload == null || payload.IsValid() && payload.Length > 0, () => "GetPayload() returned payload with invalid length!");
                 return payload;
             }
         }
@@ -681,13 +681,13 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (dv != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.DocValuesType == DocValuesType.NUMERIC);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.DocValuesType == DocValuesType.NUMERIC);
                 return new AssertingNumericDocValues(dv, MaxDoc);
             }
             else
             {
-                Debug.Assert(fi == null || fi.DocValuesType != DocValuesType.NUMERIC);
+                Debugging.Assert(() => fi == null || fi.DocValuesType != DocValuesType.NUMERIC);
                 return null;
             }
         }
@@ -698,13 +698,13 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (dv != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.DocValuesType == DocValuesType.BINARY);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.DocValuesType == DocValuesType.BINARY);
                 return new AssertingBinaryDocValues(dv, MaxDoc);
             }
             else
             {
-                Debug.Assert(fi == null || fi.DocValuesType != DocValuesType.BINARY);
+                Debugging.Assert(() => fi == null || fi.DocValuesType != DocValuesType.BINARY);
                 return null;
             }
         }
@@ -715,13 +715,13 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (dv != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.DocValuesType == DocValuesType.SORTED);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.DocValuesType == DocValuesType.SORTED);
                 return new AssertingSortedDocValues(dv, MaxDoc);
             }
             else
             {
-                Debug.Assert(fi == null || fi.DocValuesType != DocValuesType.SORTED);
+                Debugging.Assert(() => fi == null || fi.DocValuesType != DocValuesType.SORTED);
                 return null;
             }
         }
@@ -732,13 +732,13 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (dv != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.DocValuesType == DocValuesType.SORTED_SET);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.DocValuesType == DocValuesType.SORTED_SET);
                 return new AssertingSortedSetDocValues(dv, MaxDoc);
             }
             else
             {
-                Debug.Assert(fi == null || fi.DocValuesType != DocValuesType.SORTED_SET);
+                Debugging.Assert(() => fi == null || fi.DocValuesType != DocValuesType.SORTED_SET);
                 return null;
             }
         }
@@ -749,13 +749,13 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (dv != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.HasNorms);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.HasNorms);
                 return new AssertingNumericDocValues(dv, MaxDoc);
             }
             else
             {
-                Debug.Assert(fi == null || fi.HasNorms == false);
+                Debugging.Assert(() => fi == null || fi.HasNorms == false);
                 return null;
             }
         }
@@ -769,13 +769,13 @@ namespace Lucene.Net.Index
                 IBits liveDocs = base.LiveDocs;
                 if (liveDocs != null)
                 {
-                    Debug.Assert(MaxDoc == liveDocs.Length);
+                    Debugging.Assert(() => MaxDoc == liveDocs.Length);
                     liveDocs = new AssertingBits(liveDocs);
                 }
                 else
                 {
-                    Debug.Assert(MaxDoc == NumDocs);
-                    Debug.Assert(!HasDeletions);
+                    Debugging.Assert(() => MaxDoc == NumDocs);
+                    Debugging.Assert(() => !HasDeletions);
                 }
                 return liveDocs;
             }
@@ -787,14 +787,14 @@ namespace Lucene.Net.Index
             FieldInfo fi = FieldInfos.FieldInfo(field);
             if (docsWithField != null)
             {
-                Debug.Assert(fi != null);
-                Debug.Assert(fi.HasDocValues);
-                Debug.Assert(MaxDoc == docsWithField.Length);
+                Debugging.Assert(() => fi != null);
+                Debugging.Assert(() => fi.HasDocValues);
+                Debugging.Assert(() => MaxDoc == docsWithField.Length);
                 docsWithField = new AssertingBits(docsWithField);
             }
             else
             {
-                Debug.Assert(fi == null || fi.HasDocValues == false);
+                Debugging.Assert(() => fi == null || fi.HasDocValues == false);
             }
             return docsWithField;
         }
diff --git a/src/Lucene.Net.TestFramework/Index/BaseDocValuesFormatTestCase.cs b/src/Lucene.Net.TestFramework/Index/BaseDocValuesFormatTestCase.cs
index 1f58b28..0ba88c9 100644
--- a/src/Lucene.Net.TestFramework/Index/BaseDocValuesFormatTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/BaseDocValuesFormatTestCase.cs
@@ -1,6 +1,7 @@
 using J2N.Threading;
 using Lucene.Net.Analysis;
 using Lucene.Net.Codecs.Lucene42;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index.Extensions;
 using Lucene.Net.Search;
@@ -12,7 +13,6 @@ using System.Collections.Generic;
 using System.Globalization;
 using System.Threading;
 using JCG = J2N.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Assert = Lucene.Net.TestFramework.Assert;
 using static Lucene.Net.Index.TermsEnum;
 using J2N.Collections.Generic.Extensions;
@@ -116,7 +116,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         NumericDocValues dv = ((AtomicReader)((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader))).GetNumericDocValues("dv");
                         Assert.AreEqual(5L, dv.Get(hits.ScoreDocs[i].Doc)); // LUCENENET specific - 5L required because types don't match (xUnit checks this)
                     }
@@ -159,7 +159,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         NumericDocValues dv = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetNumericDocValues("dv");
                         Assert.AreEqual((long)J2N.BitConversion.SingleToInt32Bits(5.7f), dv.Get(hits.ScoreDocs[i].Doc)); // LUCENENET specific - cast required because types don't match (xUnit checks this)
                     }
@@ -201,7 +201,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         NumericDocValues dv = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetNumericDocValues("dv1");
                         Assert.AreEqual(5L, dv.Get(hits.ScoreDocs[i].Doc)); // LUCENENET specific - 5L required because types don't match (xUnit checks this)
                         dv = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetNumericDocValues("dv2");
@@ -248,7 +248,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         BinaryDocValues dv = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetBinaryDocValues("dv1");
                         dv.Get(hits.ScoreDocs[i].Doc, scratch);
                         Assert.AreEqual(new BytesRef(longTerm), scratch);
@@ -297,7 +297,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         NumericDocValues dv = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetNumericDocValues("dv1");
                         Assert.AreEqual(5L, dv.Get(hits.ScoreDocs[i].Doc)); // LUCENENET specific - 5L required because types don't match (xUnit checks this)
                         BinaryDocValues dv2 = ((AtomicReader)((AtomicReader)ireader.Leaves[0].Reader)).GetBinaryDocValues("dv2");
@@ -346,7 +346,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv1");
                         int ord = dv.GetOrd(0);
                         dv.LookupOrd(ord, scratch);
@@ -399,7 +399,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv2");
                         int ord = dv.GetOrd(0);
                         dv.LookupOrd(ord, scratch);
@@ -438,7 +438,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     NumericDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetNumericDocValues("dv");
                     Assert.AreEqual(1L, dv.Get(0)); // LUCENENET specific - 1L required because types don't match (xUnit checks this)
                     Assert.AreEqual(2L, dv.Get(1)); // LUCENENET specific - 2L required because types don't match (xUnit checks this)
@@ -473,7 +473,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     NumericDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetNumericDocValues("dv");
                     for (int i = 0; i < 2; i++)
                     {
@@ -517,7 +517,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     NumericDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetNumericDocValues("dv");
                     Assert.AreEqual(long.MinValue, dv.Get(0));
                     Assert.AreEqual(long.MaxValue, dv.Get(1));
@@ -549,7 +549,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     NumericDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetNumericDocValues("dv");
                     Assert.AreEqual(-8841491950446638677L, dv.Get(0));
                     Assert.AreEqual(9062230939892376225L, dv.Get(1));
@@ -591,7 +591,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                         dv.Get(hits.ScoreDocs[i].Doc, scratch);
                         Assert.AreEqual(new BytesRef("hello world"), scratch);
@@ -627,7 +627,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     for (int i = 0; i < 2; i++)
@@ -684,7 +684,7 @@ namespace Lucene.Net.Index
                     {
                         Document hitDoc = isearcher.Doc(hits.ScoreDocs[i].Doc);
                         Assert.AreEqual(text, hitDoc.Get("fieldname"));
-                        Debug.Assert(ireader.Leaves.Count == 1);
+                        Debugging.Assert(() => ireader.Leaves.Count == 1);
                         SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                         dv.LookupOrd(dv.GetOrd(hits.ScoreDocs[i].Doc), scratch);
                         Assert.AreEqual(new BytesRef("hello world"), scratch);
@@ -717,7 +717,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.LookupOrd(dv.GetOrd(0), scratch);
@@ -755,7 +755,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     Assert.AreEqual(2, dv.ValueCount);
                     BytesRef scratch = new BytesRef();
@@ -797,7 +797,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     Assert.AreEqual(2, dv.ValueCount); // 2 ords
                     BytesRef scratch = new BytesRef();
@@ -894,7 +894,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -925,7 +925,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.LookupOrd(dv.GetOrd(0), scratch);
@@ -1045,7 +1045,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     SortedDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     Assert.AreEqual(0, dv.GetOrd(0));
@@ -1080,7 +1080,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -1114,7 +1114,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -1146,7 +1146,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -1174,7 +1174,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     var mybytes = new byte[20];
                     BytesRef scratch = new BytesRef(mybytes);
@@ -1205,7 +1205,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     var mybytes = new byte[20];
                     BytesRef scratch = new BytesRef(mybytes);
@@ -1239,7 +1239,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetBinaryDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -1277,7 +1277,7 @@ namespace Lucene.Net.Index
                 // Now search the index:
                 using (IndexReader ireader = DirectoryReader.Open(directory)) // read-only=true
                 {
-                    Debug.Assert(ireader.Leaves.Count == 1);
+                    Debugging.Assert(() => ireader.Leaves.Count == 1);
                     BinaryDocValues dv = ((AtomicReader)ireader.Leaves[0].Reader).GetSortedDocValues("dv");
                     BytesRef scratch = new BytesRef();
                     dv.Get(0, scratch);
@@ -1494,7 +1494,7 @@ namespace Lucene.Net.Index
                     int numDocs = AtLeast(300);
                     // numDocs should be always > 256 so that in case of a codec that optimizes
                     // for numbers of values <= 256, all storage layouts are tested
-                    Debug.Assert(numDocs > 256);
+                    Debugging.Assert(() => numDocs > 256);
                     for (int i = 0; i < numDocs; i++)
                     {
                         idField.SetStringValue(Convert.ToString(i, CultureInfo.InvariantCulture));
@@ -1580,7 +1580,7 @@ namespace Lucene.Net.Index
                     int numDocs = AtLeast(300);
                     // numDocs should be always > 256 so that in case of a codec that optimizes
                     // for numbers of values <= 256, all storage layouts are tested
-                    Debug.Assert(numDocs > 256);
+                    Debugging.Assert(() => numDocs > 256);
                     for (int i = 0; i < numDocs; i++)
                     {
                         idField.SetStringValue(Convert.ToString(i, CultureInfo.InvariantCulture));
@@ -2649,13 +2649,13 @@ namespace Lucene.Net.Index
                             }
                             for (int j = 0; j < stringValues.Length; j++)
                             {
-                                Debug.Assert(docValues != null);
+                                Debugging.Assert(() => docValues != null);
                                 long ord = docValues.NextOrd();
-                                Debug.Assert(ord != SortedSetDocValues.NO_MORE_ORDS);
+                                Debugging.Assert(() => ord != SortedSetDocValues.NO_MORE_ORDS);
                                 docValues.LookupOrd(ord, scratch);
                                 Assert.AreEqual(stringValues[j], scratch.Utf8ToString());
                             }
-                            Debug.Assert(docValues == null || docValues.NextOrd() == SortedSetDocValues.NO_MORE_ORDS);
+                            Debugging.Assert(() => docValues == null || docValues.NextOrd() == SortedSetDocValues.NO_MORE_ORDS);
                         }
                     }
                 } // ir.Dispose();
diff --git a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
index f3f2791..de00107 100644
--- a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
@@ -1,5 +1,6 @@
 using J2N.Threading;
 using Lucene.Net.Codecs;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
@@ -8,7 +9,6 @@ using System.Collections.Generic;
 using System.IO;
 using JCG = J2N.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Assert = Lucene.Net.TestFramework.Assert;
 using Directory = Lucene.Net.Store.Directory;
 using J2N.Collections.Generic.Extensions;
@@ -239,7 +239,7 @@ namespace Lucene.Net.Index
                     posUpto = freq;
                     return 0;
                 }
-                Debug.Assert(posUpto < freq);
+                Debugging.Assert(() => posUpto < freq);
 
                 if (posUpto == 0 && random.NextBoolean())
                 {
diff --git a/src/Lucene.Net.TestFramework/Index/MockRandomMergePolicy.cs b/src/Lucene.Net.TestFramework/Index/MockRandomMergePolicy.cs
index 23620f3..dca1e12 100644
--- a/src/Lucene.Net.TestFramework/Index/MockRandomMergePolicy.cs
+++ b/src/Lucene.Net.TestFramework/Index/MockRandomMergePolicy.cs
@@ -1,9 +1,9 @@
 using J2N.Collections.Generic.Extensions;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Index
 {
@@ -106,7 +106,7 @@ namespace Lucene.Net.Index
                 {
                     foreach (SegmentCommitInfo info in merge.Segments)
                     {
-                        Debug.Assert(segmentsToMerge.ContainsKey(info));
+                        Debugging.Assert(() => segmentsToMerge.ContainsKey(info));
                     }
                 }
             }
diff --git a/src/Lucene.Net.TestFramework/Index/RandomCodec.cs b/src/Lucene.Net.TestFramework/Index/RandomCodec.cs
index 8264666..2017704 100644
--- a/src/Lucene.Net.TestFramework/Index/RandomCodec.cs
+++ b/src/Lucene.Net.TestFramework/Index/RandomCodec.cs
@@ -13,6 +13,7 @@ using Lucene.Net.Codecs.MockSep;
 using Lucene.Net.Codecs.NestedPulsing;
 using Lucene.Net.Codecs.Pulsing;
 using Lucene.Net.Codecs.SimpleText;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
@@ -20,7 +21,6 @@ using System.Collections.Concurrent;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using J2N.Collections.Generic.Extensions;
 
 namespace Lucene.Net.Index
@@ -92,7 +92,7 @@ namespace Lucene.Net.Index
                 }
                 previousMappings[name] = codec;
                 // Safety:
-                Debug.Assert(previousMappings.Count < 10000, "test went insane");
+                Debugging.Assert(() => previousMappings.Count < 10000, () => "test went insane");
             }
 
             //if (LuceneTestCase.VERBOSE)
@@ -115,7 +115,7 @@ namespace Lucene.Net.Index
                 }
                 previousDVMappings[name] = codec;
                 // Safety:
-                Debug.Assert(previousDVMappings.Count < 10000, "test went insane");
+                Debugging.Assert(() => previousDVMappings.Count < 10000, () => "test went insane");
             }
 
             //if (LuceneTestCase.VERBOSE)
diff --git a/src/Lucene.Net.TestFramework/Index/RandomDocumentsWriterPerThreadPool.cs b/src/Lucene.Net.TestFramework/Index/RandomDocumentsWriterPerThreadPool.cs
index b02694c..97c8f63 100644
--- a/src/Lucene.Net.TestFramework/Index/RandomDocumentsWriterPerThreadPool.cs
+++ b/src/Lucene.Net.TestFramework/Index/RandomDocumentsWriterPerThreadPool.cs
@@ -1,6 +1,6 @@
+using Lucene.Net.Diagnostics;
 using System;
 using System.Threading;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Index
 {
@@ -36,7 +36,7 @@ namespace Lucene.Net.Index
         public RandomDocumentsWriterPerThreadPool(int maxNumPerThreads, Random random)
             : base(maxNumPerThreads)
         {
-            Debug.Assert(MaxThreadStates >= 1);
+            Debugging.Assert(() => MaxThreadStates >= 1);
             states = new ThreadState[maxNumPerThreads];
             this.random = new Random(random.Next());
             this.maxRetry = 1 + random.Next(10);
@@ -56,14 +56,14 @@ namespace Lucene.Net.Index
                     }
                 }
             }
-            Debug.Assert(NumThreadStatesActive > 0);
+            Debugging.Assert(() => NumThreadStatesActive > 0);
             for (int i = 0; i < maxRetry; i++)
             {
                 int ord = random.Next(NumThreadStatesActive);
                 lock (this)
                 {
                     threadState = states[ord];
-                    Debug.Assert(threadState != null);
+                    Debugging.Assert(() => threadState != null);
                 }
 
                 if (threadState.TryLock())
@@ -89,12 +89,12 @@ namespace Lucene.Net.Index
                 if (newThreadState != null) // did we get a new state?
                 {
                     threadState = states[NumThreadStatesActive - 1] = newThreadState;
-                    //Debug.Assert(threadState.HeldByCurrentThread);
+                    //Debugging.Assert(threadState.HeldByCurrentThread);
                     return threadState;
                 }
                 // if no new state is available lock the random one
             }
-            Debug.Assert(threadState != null);
+            Debugging.Assert(() => threadState != null);
             threadState.@Lock();
             return threadState;
         }
diff --git a/src/Lucene.Net.TestFramework/Index/RandomIndexWriter.cs b/src/Lucene.Net.TestFramework/Index/RandomIndexWriter.cs
index 196f1b9..146e070 100644
--- a/src/Lucene.Net.TestFramework/Index/RandomIndexWriter.cs
+++ b/src/Lucene.Net.TestFramework/Index/RandomIndexWriter.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Analysis;
 using Lucene.Net.Codecs;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Search;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
@@ -7,7 +8,6 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Index
 {
@@ -440,7 +440,7 @@ namespace Lucene.Net.Index
                         Console.WriteLine("RIW: doRandomForceMerge(" + limit + ")");
                     }
                     IndexWriter.ForceMerge(limit);
-                    Debug.Assert(!doRandomForceMergeAssert || IndexWriter.SegmentCount <= limit, "limit=" + limit + " actual=" + IndexWriter.SegmentCount);
+                    Debugging.Assert(() => !doRandomForceMergeAssert || IndexWriter.SegmentCount <= limit, () => "limit=" + limit + " actual=" + IndexWriter.SegmentCount);
                 }
             }
         }
diff --git a/src/Lucene.Net.TestFramework/Index/ThreadedIndexingAndSearchingTestCase.cs b/src/Lucene.Net.TestFramework/Index/ThreadedIndexingAndSearchingTestCase.cs
index 20a69f9..e2dbc3b 100644
--- a/src/Lucene.Net.TestFramework/Index/ThreadedIndexingAndSearchingTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/ThreadedIndexingAndSearchingTestCase.cs
@@ -1,6 +1,7 @@
 using J2N.Threading;
 using J2N.Threading.Atomic;
 using Lucene.Net.Analysis;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index.Extensions;
 using Lucene.Net.Search;
@@ -16,7 +17,6 @@ using System.Runtime.CompilerServices;
 using System.Threading;
 using System.Threading.Tasks;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Index
@@ -227,7 +227,7 @@ namespace Lucene.Net.Index
                                 if (toDeleteSubDocs.Count > 0 && Random.NextBoolean())
                                 {
                                     delSubDocs = toDeleteSubDocs[Random.Next(toDeleteSubDocs.Count)];
-                                    Debug.Assert(!delSubDocs.Deleted);
+                                    Debugging.Assert(() => !delSubDocs.Deleted);
                                     toDeleteSubDocs.Remove(delSubDocs);
                                     // Update doc block, replacing prior packID
                                     packID = delSubDocs.PackID;
@@ -364,7 +364,7 @@ namespace Lucene.Net.Index
 
                             foreach (SubDocs subDocs in toDeleteSubDocs)
                             {
-                                Debug.Assert(!subDocs.Deleted);
+                                Debugging.Assert(() => !subDocs.Deleted);
                                 delPackIDs.Add(subDocs.PackID);
                                 outerInstance.DeleteDocuments(new Term("packID", subDocs.PackID));
                                 subDocs.Deleted = true;
diff --git a/src/Lucene.Net.TestFramework/Search/AssertingBulkScorer.cs b/src/Lucene.Net.TestFramework/Search/AssertingBulkScorer.cs
index 1082d68..4d88aa5 100644
--- a/src/Lucene.Net.TestFramework/Search/AssertingBulkScorer.cs
+++ b/src/Lucene.Net.TestFramework/Search/AssertingBulkScorer.cs
@@ -1,7 +1,7 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Util;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Search
 {
@@ -61,7 +61,7 @@ namespace Lucene.Net.Search
                 try
                 {
                     bool remaining = @in.Score(collector, DocsEnum.NO_MORE_DOCS);
-                    Debug.Assert(!remaining);
+                    Debugging.Assert(() => !remaining);
                 }
 #pragma warning disable 168
                 catch (NotSupportedException e)
diff --git a/src/Lucene.Net.TestFramework/Search/AssertingCollector.cs b/src/Lucene.Net.TestFramework/Search/AssertingCollector.cs
index 087b31e..b2e7795 100644
--- a/src/Lucene.Net.TestFramework/Search/AssertingCollector.cs
+++ b/src/Lucene.Net.TestFramework/Search/AssertingCollector.cs
@@ -1,6 +1,6 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Search
 {
@@ -52,7 +52,7 @@ namespace Lucene.Net.Search
         {
             if (inOrder || !AcceptsDocsOutOfOrder)
             {
-                Debug.Assert(doc > lastCollected, "Out of order : " + lastCollected + " " + doc);
+                Debugging.Assert(() => doc > lastCollected, () => "Out of order : " + lastCollected + " " + doc);
             }
             @in.Collect(doc);
             lastCollected = doc;
diff --git a/src/Lucene.Net.TestFramework/Search/AssertingScorer.cs b/src/Lucene.Net.TestFramework/Search/AssertingScorer.cs
index df19e58..72351d5 100644
--- a/src/Lucene.Net.TestFramework/Search/AssertingScorer.cs
+++ b/src/Lucene.Net.TestFramework/Search/AssertingScorer.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using System.Runtime.CompilerServices;
 
 namespace Lucene.Net.Search
@@ -105,10 +105,10 @@ namespace Lucene.Net.Search
 
         public override float GetScore()
         {
-            Debug.Assert(Iterating());
+            Debugging.Assert(Iterating);
             float score = @in.GetScore();
-            Debug.Assert(!float.IsNaN(score));
-            Debug.Assert(!float.IsNaN(score));
+            Debugging.Assert(() => !float.IsNaN(score));
+            Debugging.Assert(() => !float.IsNaN(score));
             return score;
         }
 
@@ -125,7 +125,7 @@ namespace Lucene.Net.Search
         {
             get
             {
-                Debug.Assert(Iterating());
+                Debugging.Assert(Iterating);
                 return @in.Freq;
             }
         }
diff --git a/src/Lucene.Net.TestFramework/Search/QueryUtils.cs b/src/Lucene.Net.TestFramework/Search/QueryUtils.cs
index 0ed15a7..14db582 100644
--- a/src/Lucene.Net.TestFramework/Search/QueryUtils.cs
+++ b/src/Lucene.Net.TestFramework/Search/QueryUtils.cs
@@ -1,4 +1,5 @@
 using Lucene.Net.Analysis;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Store;
@@ -7,7 +8,6 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Text;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Assert = Lucene.Net.TestFramework.Assert;
 using Directory = Lucene.Net.Store.Directory;
 
@@ -294,7 +294,7 @@ namespace Lucene.Net.Search
 
         private static IndexReader MakeEmptyIndex(Random random, int numDocs)
         {
-            Debug.Assert(numDocs > 0);
+            Debugging.Assert(() => numDocs > 0);
             Directory d = new MockDirectoryWrapper(random, new RAMDirectory());
             IndexWriter w = new IndexWriter(d, new IndexWriterConfig(LuceneTestCase.TEST_VERSION_CURRENT, new MockAnalyzer(random)));
             for (int i = 0; i < numDocs; i++)
@@ -487,7 +487,7 @@ namespace Lucene.Net.Search
                     leafPtr++;
                 }
                 lastReader[0] = (AtomicReader)context.Reader;
-                Debug.Assert(readerContextArray[leafPtr].Reader == context.Reader);
+                Debugging.Assert(() => readerContextArray[leafPtr].Reader == context.Reader);
                 this.scorer = null;
                 lastDoc[0] = -1;
             }
diff --git a/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs b/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
index 25515b6..f0cf871 100644
--- a/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
+++ b/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
@@ -1,9 +1,9 @@
 using J2N.Collections.Generic.Extensions;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Search.Similarities;
 using System;
 using System.Collections.Generic;
 using System.Text;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Search
 {
@@ -71,7 +71,7 @@ namespace Lucene.Net.Search
         {
             lock (this)
             {
-                Debug.Assert(field != null);
+                Debugging.Assert(() => field != null);
                 if (!previousMappings.TryGetValue(field, out Similarity sim) || sim == null)
                 {
                     sim = knownSims[Math.Max(0, Math.Abs(perFieldSeed ^ field.GetHashCode())) % knownSims.Count];
diff --git a/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs b/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
index 945d2d6..9b770f4 100644
--- a/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
+++ b/src/Lucene.Net.TestFramework/Search/ShardSearchingTestBase.cs
@@ -1,6 +1,7 @@
 using J2N.Collections.Generic.Extensions;
 using J2N.Threading;
 using Lucene.Net.Analysis;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
 using Lucene.Net.Store;
@@ -11,7 +12,6 @@ using System.Collections.Concurrent;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 #if FEATURE_SERIALIZABLE_EXCEPTIONS
 using System.Runtime.Serialization;
 #endif
@@ -220,7 +220,7 @@ namespace Lucene.Net.Search
                 }
                 else
                 {
-                    Debug.Assert(searchAfter == null); // not supported yet
+                    Debugging.Assert(() => searchAfter == null); // not supported yet
                     return s.LocalSearch(q, numHits, sort);
                 }
             }
@@ -306,7 +306,7 @@ namespace Lucene.Net.Search
                     this.outerInstance = nodeState;
                     this.nodeVersions = nodeVersions;
                     MyNodeID = nodeID;
-                    Debug.Assert(MyNodeID == nodeState.MyNodeID, "myNodeID=" + nodeID + " NodeState.this.myNodeID=" + nodeState.MyNodeID);
+                    Debugging.Assert(() => MyNodeID == nodeState.MyNodeID, () => "myNodeID=" + nodeID + " NodeState.this.myNodeID=" + nodeState.MyNodeID);
                 }
 
                 public override Query Rewrite(Query original)
@@ -348,7 +348,7 @@ namespace Lucene.Net.Search
 
                 public override TermStatistics TermStatistics(Term term, TermContext context)
                 {
-                    Debug.Assert(term != null);
+                    Debugging.Assert(() => term != null);
                     long docFreq = 0;
                     long totalTermFreq = 0;
                     for (int nodeID = 0; nodeID < nodeVersions.Length; nodeID++)
@@ -364,7 +364,7 @@ namespace Lucene.Net.Search
                             subStats = outerInstance.termStatsCache[key];
                             // We pre-cached during rewrite so all terms
                             // better be here...
-                            Debug.Assert(subStats != null);
+                            Debugging.Assert(() => subStats != null);
                         }
 
                         long nodeDocFreq = subStats.DocFreq;
@@ -419,7 +419,7 @@ namespace Lucene.Net.Search
                         }
                         // Collection stats are pre-shared on reopen, so,
                         // we better not have a cache miss:
-                        Debug.Assert(nodeStats != null, "myNodeID=" + MyNodeID + " nodeID=" + nodeID + " version=" + nodeVersions[nodeID] + " field=" + field);
+                        Debugging.Assert(() => nodeStats != null, () => "myNodeID=" + MyNodeID + " nodeID=" + nodeID + " version=" + nodeVersions[nodeID] + " field=" + field);
 
                         long nodeDocCount = nodeStats.DocCount;
                         if (docCount >= 0 && nodeDocCount >= 0)
@@ -451,7 +451,7 @@ namespace Lucene.Net.Search
                             sumDocFreq = -1;
                         }
 
-                        Debug.Assert(nodeStats.MaxDoc >= 0);
+                        Debugging.Assert(() => nodeStats.MaxDoc >= 0);
                         maxDoc += nodeStats.MaxDoc;
                     }
 
@@ -551,7 +551,7 @@ namespace Lucene.Net.Search
 
                 public override TopFieldDocs Search(Query query, int numHits, Sort sort)
                 {
-                    Debug.Assert(sort != null);
+                    Debugging.Assert(() => sort != null);
                     TopDocs[] shardHits = new TopDocs[nodeVersions.Length];
                     for (int nodeID = 0; nodeID < nodeVersions.Length; nodeID++)
                     {
@@ -604,7 +604,7 @@ namespace Lucene.Net.Search
 
             public void InitSearcher(long[] nodeVersions)
             {
-                Debug.Assert(currentShardSearcher == null);
+                Debugging.Assert(() => currentShardSearcher == null);
                 Array.Copy(nodeVersions, 0, currentNodeVersions, 0, currentNodeVersions.Length);
                 currentShardSearcher = new ShardIndexSearcher(this, GetCurrentNodeVersions(), Mgr.Acquire().IndexReader, MyNodeID);
             }
@@ -781,8 +781,8 @@ namespace Lucene.Net.Search
             for (int nodeID = 0; nodeID < numNodes; nodeID++)
             {
                 IndexSearcher s = m_nodes[nodeID].Mgr.Acquire();
-                Debug.Assert(nodeVersions[nodeID] == m_nodes[nodeID].Searchers.Record(s));
-                Debug.Assert(s != null);
+                Debugging.Assert(() => nodeVersions[nodeID] == m_nodes[nodeID].Searchers.Record(s));
+                Debugging.Assert(() => s != null);
                 try
                 {
                     BroadcastNodeReopen(nodeID, nodeVersions[nodeID], s);
diff --git a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
index ff08f44..16e968f 100644
--- a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
+++ b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
@@ -1,4 +1,6 @@
+using J2N.Runtime.CompilerServices;
 using J2N.Threading.Atomic;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
 using Lucene.Net.Support;
@@ -10,11 +12,9 @@ using System.IO;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Threading;
-using JCG = J2N.Collections.Generic;
 using AssertionError = Lucene.Net.Diagnostics.AssertionException;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
-using J2N.Runtime.CompilerServices;
+using JCG = J2N.Collections.Generic;
 #if FEATURE_SERIALIZABLE_EXCEPTIONS
 using System.Runtime.Serialization;
 #endif
@@ -963,7 +963,7 @@ namespace Lucene.Net.Store
                                             {
                                                 if (endSet.Contains(s) && !startSet.Contains(s))
                                                 {
-                                                    Debug.Assert(pendingDeletions.Contains(s));
+                                                    Debugging.Assert(() => pendingDeletions.Contains(s));
                                                     if (LuceneTestCase.Verbose)
                                                     {
                                                         Console.WriteLine("MDW: Unreferenced check: Ignoring referenced file: " + s + " " + 
@@ -1024,7 +1024,7 @@ namespace Lucene.Net.Store
                                         extras += "\n\nThese files we had previously tried to delete, but couldn't: " + pendingDeletions;
                                     }
 
-                                    Debug.Assert(false, "unreferenced files: before delete:\n    " + Arrays.ToString(startFiles) + "\n  after delete:\n    " + Arrays.ToString(endFiles) + extras);
+                                    Debugging.Assert(() => false, () => "unreferenced files: before delete:\n    " + Arrays.ToString(startFiles) + "\n  after delete:\n    " + Arrays.ToString(endFiles) + extras);
                                 }
 
                                 DirectoryReader ir1 = DirectoryReader.Open(this);
@@ -1034,7 +1034,7 @@ namespace Lucene.Net.Store
                                 DirectoryReader ir2 = DirectoryReader.Open(this);
                                 int numDocs2 = ir2.NumDocs;
                                 ir2.Dispose();
-                                Debug.Assert(numDocs1 == numDocs2, "numDocs changed after opening/closing IW: before=" + numDocs1 + " after=" + numDocs2);
+                                Debugging.Assert(() => numDocs1 == numDocs2, () => "numDocs changed after opening/closing IW: before=" + numDocs1 + " after=" + numDocs2);
                             }
                         }
                     }
diff --git a/src/Lucene.Net.TestFramework/Support/Diagnostics/Debug.cs b/src/Lucene.Net.TestFramework/Support/Diagnostics/Debug.cs
deleted file mode 100644
index e8d9a9d..0000000
--- a/src/Lucene.Net.TestFramework/Support/Diagnostics/Debug.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-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>
-    /// Provides a set of methods that help debug your code.
-    /// </summary>
-    internal static class Debug
-    {
-        /// <summary>
-        /// Checks for a condition; if the condition is <c>false</c>, throws an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The conditional expression to evaluate. If the condition is <c>true</c>, no exception is thrown.</param>
-        public static void Assert(bool condition)
-        {
-            if (Debugging.AssertsEnabled && !condition)
-                throw new AssertionException();
-        }
-
-        /// <summary>
-        /// Checks for a condition; if the condition is <c>false</c>, throws an <see cref="AssertionException"/> with the specified <paramref name="message"/>.
-        /// </summary>
-        /// <param name="condition">The conditional expression to evaluate. If the condition is <c>true</c>, no exception is thrown.</param>
-        /// <param name="message">The message to use </param>
-        public static void Assert(bool condition, string message)
-        {
-            if (Debugging.AssertsEnabled && !condition)
-                throw new AssertionException(message);
-        }
-    }
-}
diff --git a/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
index b142907..861bb3e 100644
--- a/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Support;
 using System;
 using System.Collections.Generic;
 using Assert = Lucene.Net.TestFramework.Assert;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using JCG = J2N.Collections.Generic;
 
 namespace Lucene.Net.Util
@@ -259,7 +259,7 @@ namespace Lucene.Net.Util
         [ExceptionToNetNumericConvention] // LUCENENET: This is for making test porting easier, keeping as-is
         internal int randomIntBetween(int min, int max)
         {
-            Debug.Assert(max >= min, "max must be >= min: " + min + ", " + max);
+            Debugging.Assert(() => max >= min, () => "max must be >= min: " + min + ", " + max);
             long range = (long)max - (long)min;
             if (range < int.MaxValue)
             {
diff --git a/src/Lucene.Net.TestFramework/Util/Automaton/AutomatonTestUtil.cs b/src/Lucene.Net.TestFramework/Util/Automaton/AutomatonTestUtil.cs
index d7f617e..2f2b307 100644
--- a/src/Lucene.Net.TestFramework/Util/Automaton/AutomatonTestUtil.cs
+++ b/src/Lucene.Net.TestFramework/Util/Automaton/AutomatonTestUtil.cs
@@ -1,9 +1,9 @@
 using J2N;
 using J2N.Runtime.CompilerServices;
+using Lucene.Net.Diagnostics;
 using System;
 using System.Collections.Generic;
 using JCG = J2N.Collections.Generic;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Util.Automaton
 {
@@ -191,7 +191,7 @@ namespace Lucene.Net.Util.Automaton
                 }
             }
 
-            Debug.Assert(code >= t.Min && code <= t.Max && (code < UnicodeUtil.UNI_SUR_HIGH_START || code > UnicodeUtil.UNI_SUR_LOW_END), "code=" + code + " min=" + t.Min + " max=" + t.Max);
+            Debugging.Assert(() => code >= t.Min && code <= t.Max && (code < UnicodeUtil.UNI_SUR_HIGH_START || code > UnicodeUtil.UNI_SUR_LOW_END), () => "code=" + code + " min=" + t.Min + " max=" + t.Max);
             return code;
         }
 
@@ -399,7 +399,7 @@ namespace Lucene.Net.Util.Automaton
         {
             int numStates = a.GetNumberOfStates();
             a.ClearNumberedStates(); // force recomputation of cached numbered states
-            Debug.Assert(numStates == a.GetNumberOfStates(), "automaton has " + (numStates - a.GetNumberOfStates()) + " detached states");
+            Debugging.Assert(() => numStates == a.GetNumberOfStates(), () => "automaton has " + (numStates - a.GetNumberOfStates()) + " detached states");
         }
     }
 
diff --git a/src/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs b/src/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
index 1be2cbf..83f4ded 100644
--- a/src/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
@@ -1,6 +1,6 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Search;
 using System;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Assert = Lucene.Net.TestFramework.Assert;
 using BitSet = J2N.Collections.BitSet;
 
@@ -56,7 +56,7 @@ namespace Lucene.Net.Util
         /// Create a random set which has <paramref name="numBitsSet"/> of its <paramref name="numBits"/> bits set. </summary>
         protected static BitSet RandomSet(int numBits, int numBitsSet)
         {
-            Debug.Assert(numBitsSet <= numBits);
+            Debugging.Assert(() => numBitsSet <= numBits);
             BitSet set = new BitSet(numBits);
             Random random = Random;
             if (numBitsSet == numBits)
diff --git a/src/Lucene.Net.TestFramework/Util/FailOnNonBulkMergesInfoStream.cs b/src/Lucene.Net.TestFramework/Util/FailOnNonBulkMergesInfoStream.cs
index 4deb2eb..db6aea8 100644
--- a/src/Lucene.Net.TestFramework/Util/FailOnNonBulkMergesInfoStream.cs
+++ b/src/Lucene.Net.TestFramework/Util/FailOnNonBulkMergesInfoStream.cs
@@ -1,4 +1,4 @@
-using System.Diagnostics;
+using Lucene.Net.Diagnostics;
 
 namespace Lucene.Net.Util
 {
@@ -35,7 +35,7 @@ namespace Lucene.Net.Util
 
         public override void Message(string component, string message)
         {
-            Debug.Assert(!message.Contains("non-bulk merges"));
+            Debugging.Assert(() => !message.Contains("non-bulk merges"));
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs b/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
index 8465d97..a7929e0 100644
--- a/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
+++ b/src/Lucene.Net.TestFramework/Util/Fst/FSTTester.cs
@@ -1,6 +1,7 @@
 using J2N;
 using J2N.Collections;
 using J2N.Collections.Generic.Extensions;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
 using Lucene.Net.Util.Packed;
 using System;
@@ -11,7 +12,6 @@ using System.IO;
 using System.Text;
 using Assert = Lucene.Net.TestFramework.Assert;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Directory = Lucene.Net.Store.Directory;
 using JCG = J2N.Collections.Generic;
 
@@ -103,7 +103,7 @@ namespace Lucene.Net.Util.Fst
             for (int i = 0; i < ir.Length; i++)
             {
                 int x = ir.Int32s[ir.Offset + i];
-                Debug.Assert(x >= 0 && x <= 255);
+                Debugging.Assert(() => x >= 0 && x <= 255);
                 br.Bytes[i] = (byte)x;
             }
             br.Length = ir.Length;
@@ -219,7 +219,7 @@ namespace Lucene.Net.Util.Fst
         // of the term prefix that matches
         private T Run(FST<T> fst, Int32sRef term, int[] prefixLength)
         {
-            Debug.Assert(prefixLength == null || prefixLength.Length == 1);
+            Debugging.Assert(() => prefixLength == null || prefixLength.Length == 1);
             FST.Arc<T> arc = fst.GetFirstArc(new FST.Arc<T>());
             T NO_OUTPUT = fst.Outputs.NoOutput;
             T output = NO_OUTPUT;
@@ -690,7 +690,7 @@ namespace Lucene.Net.Util.Fst
                             if (!termsMap.ContainsKey(term) && term.CompareTo(pairs[upto].Input) > 0)
                             {
                                 int pos = pairs.BinarySearch(new InputOutput<T>(term, default(T)));
-                                Debug.Assert(pos < 0);
+                                Debugging.Assert(() => pos < 0);
                                 upto = -(pos + 1);
 
                                 if (random.NextBoolean())
@@ -887,7 +887,7 @@ namespace Lucene.Net.Util.Fst
                     }
                     else
                     {
-                        Debug.Assert(prune2 > 0);
+                        Debugging.Assert(() => prune2 > 0);
                         if (prune2 > 1 && cmo.Count >= prune2)
                         {
                             keep = true;
diff --git a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
index 0afece7..d89f9b4 100644
--- a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
@@ -1,5 +1,6 @@
 using Lucene.Net.Analysis;
 using Lucene.Net.Codecs;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
@@ -27,7 +28,6 @@ using System.Threading.Tasks;
 using System.Text.RegularExpressions;
 using JCG = J2N.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 using Assert = Lucene.Net.TestFramework.Assert;
 using Directory = Lucene.Net.Store.Directory;
 using FieldInfo = Lucene.Net.Index.FieldInfo;
@@ -2678,7 +2678,7 @@ namespace Lucene.Net.Util
         /// </summary>
         public virtual void AssertTermsStatisticsEquals(string info, Terms leftTerms, Terms rightTerms)
         {
-            Debug.Assert(leftTerms.Comparer == rightTerms.Comparer);
+            Debugging.Assert(() => leftTerms.Comparer == rightTerms.Comparer);
             if (leftTerms.DocCount != -1 && rightTerms.DocCount != -1)
             {
                 Assert.AreEqual(leftTerms.DocCount, rightTerms.DocCount, info);
@@ -3053,7 +3053,7 @@ namespace Lucene.Net.Util
         /// </summary>
         public virtual void AssertStoredFieldsEquals(string info, IndexReader leftReader, IndexReader rightReader)
         {
-            Debug.Assert(leftReader.MaxDoc == rightReader.MaxDoc);
+            Debugging.Assert(() => leftReader.MaxDoc == rightReader.MaxDoc);
             for (int i = 0; i < leftReader.MaxDoc; i++)
             {
                 Document leftDoc = leftReader.Document(i);
@@ -3100,7 +3100,7 @@ namespace Lucene.Net.Util
         /// </summary>
         public virtual void AssertTermVectorsEquals(string info, IndexReader leftReader, IndexReader rightReader)
         {
-            Debug.Assert(leftReader.MaxDoc == rightReader.MaxDoc);
+            Debugging.Assert(() => leftReader.MaxDoc == rightReader.MaxDoc);
             for (int i = 0; i < leftReader.MaxDoc; i++)
             {
                 Fields leftFields = leftReader.GetTermVectors(i);
@@ -3270,7 +3270,7 @@ namespace Lucene.Net.Util
         // TODO: this is kinda stupid, we don't delete documents in the test.
         public virtual void AssertDeletedDocsEquals(string info, IndexReader leftReader, IndexReader rightReader)
         {
-            Debug.Assert(leftReader.NumDeletedDocs == rightReader.NumDeletedDocs);
+            Debugging.Assert(() => leftReader.NumDeletedDocs == rightReader.NumDeletedDocs);
             IBits leftBits = MultiFields.GetLiveDocs(leftReader);
             IBits rightBits = MultiFields.GetLiveDocs(rightReader);
 
@@ -3281,7 +3281,7 @@ namespace Lucene.Net.Util
                 return;
             }
 
-            Debug.Assert(leftReader.MaxDoc == rightReader.MaxDoc);
+            Debugging.Assert(() => leftReader.MaxDoc == rightReader.MaxDoc);
             Assert.AreEqual(leftBits.Length, rightBits.Length, info);
             for (int i = 0; i < leftReader.MaxDoc; i++)
             {
@@ -3365,7 +3365,7 @@ namespace Lucene.Net.Util
         ////        if (TempDirBase == null)
         ////        {
         ////            DirectoryInfo directory = new DirectoryInfo(System.IO.Path.GetTempPath());
-        ////            //Debug.Assert(directory.Exists && directory.Directory != null && directory.CanWrite());
+        ////            //Debugging.Assert(() => directory.Exists && directory.Directory != null && directory.CanWrite());
 
         ////            RandomizedContext ctx = RandomizedContext.Current;
         ////            Type clazz = ctx.GetTargetType;
@@ -3504,7 +3504,7 @@ namespace Lucene.Net.Util
         /// </summary>
         private static void RegisterToRemoveAfterSuite(FileSystemInfo f)
         {
-            Debug.Assert(f != null);
+            Debugging.Assert(() => f != null);
 
             if (LuceneTestCase.LeaveTemporary)
             {
diff --git a/src/Lucene.Net.TestFramework/Util/NullInfoStream.cs b/src/Lucene.Net.TestFramework/Util/NullInfoStream.cs
index c947785..50f9d60 100644
--- a/src/Lucene.Net.TestFramework/Util/NullInfoStream.cs
+++ b/src/Lucene.Net.TestFramework/Util/NullInfoStream.cs
@@ -1,4 +1,4 @@
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
+using Lucene.Net.Diagnostics;
 
 namespace Lucene.Net.Util
 {
@@ -29,13 +29,13 @@ namespace Lucene.Net.Util
     {
         public override void Message(string component, string message)
         {
-            Debug.Assert(component != null);
-            Debug.Assert(message != null);
+            Debugging.Assert(() => component != null);
+            Debugging.Assert(() => message != null);
         }
 
         public override bool IsEnabled(string component)
         {
-            Debug.Assert(component != null);
+            Debugging.Assert(() => component != null);
             return true; // to actually enable logging, we just ignore on message()
         }
 
diff --git a/src/Lucene.Net.TestFramework/Util/TestRuleAssertionsRequired.cs b/src/Lucene.Net.TestFramework/Util/TestRuleAssertionsRequired.cs
index fe08c3e..f3cc295 100644
--- a/src/Lucene.Net.TestFramework/Util/TestRuleAssertionsRequired.cs
+++ b/src/Lucene.Net.TestFramework/Util/TestRuleAssertionsRequired.cs
@@ -56,7 +56,7 @@ namespace Lucene.Net.Util
           {
             try
             {
-              Debug.Assert(false);
+              Debugging.Assert(false);
               string msg = "Test class requires enabled assertions, enable globally (-ea)" + " or for Solr/Lucene subpackages only: " + Description.ClassName;
               Console.Error.WriteLine(msg);
               throw new Exception(msg);
diff --git a/src/Lucene.Net.TestFramework/Util/TestRuleSetupAndRestoreClassEnv.cs b/src/Lucene.Net.TestFramework/Util/TestRuleSetupAndRestoreClassEnv.cs
index 515c22b..eaf6433 100644
--- a/src/Lucene.Net.TestFramework/Util/TestRuleSetupAndRestoreClassEnv.cs
+++ b/src/Lucene.Net.TestFramework/Util/TestRuleSetupAndRestoreClassEnv.cs
@@ -10,6 +10,7 @@ using Lucene.Net.Codecs.Lucene45;
 using Lucene.Net.Codecs.Lucene46;
 using Lucene.Net.Codecs.MockRandom;
 using Lucene.Net.Codecs.SimpleText;
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
 using Lucene.Net.Search;
 using Lucene.Net.Search.Similarities;
@@ -21,7 +22,6 @@ using System.Reflection;
 using System.Threading;
 using JCG = J2N.Collections.Generic;
 using Console = Lucene.Net.Util.SystemConsole;
-using Debug = Lucene.Net.Diagnostics.Debug;
 
 // LUCENENET NOTE: These are primarily here because they are referred to
 // in the XML documentation. Be sure to add a new option if a new test framework
@@ -169,7 +169,7 @@ namespace Lucene.Net.Util
                                                                 !ShouldAvoidCodec("Lucene3x"))) // preflex-only setup
             {
                 codec = Codec.ForName("Lucene3x");
-                Debug.Assert((codec is PreFlexRWCodec), "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (codec is PreFlexRWCodec), () => "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
                 LuceneTestCase.OldFormatImpersonationIsActive = true;
             }
             else if ("Lucene40".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) || ("random".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) &&
@@ -179,8 +179,8 @@ namespace Lucene.Net.Util
             {
                 codec = Codec.ForName("Lucene40");
                 LuceneTestCase.OldFormatImpersonationIsActive = true;
-                Debug.Assert((codec is Lucene40RWCodec), "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
-                Debug.Assert((PostingsFormat.ForName("Lucene40") is Lucene40RWPostingsFormat), "fix your IPostingsFormatFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (codec is Lucene40RWCodec), () => "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (PostingsFormat.ForName("Lucene40") is Lucene40RWPostingsFormat), () => "fix your IPostingsFormatFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
             }
             else if ("Lucene41".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) || ("random".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) &&
                                                                     "random".Equals(LuceneTestCase.TestPostingsFormat, StringComparison.Ordinal) &&
@@ -190,7 +190,7 @@ namespace Lucene.Net.Util
             {
                 codec = Codec.ForName("Lucene41");
                 LuceneTestCase.OldFormatImpersonationIsActive = true;
-                Debug.Assert((codec is Lucene41RWCodec), "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (codec is Lucene41RWCodec), () => "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
             }
             else if ("Lucene42".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) || ("random".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) &&
                                                                     "random".Equals(LuceneTestCase.TestPostingsFormat, StringComparison.Ordinal) &&
@@ -200,7 +200,7 @@ namespace Lucene.Net.Util
             {
                 codec = Codec.ForName("Lucene42");
                 LuceneTestCase.OldFormatImpersonationIsActive = true;
-                Debug.Assert((codec is Lucene42RWCodec), "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (codec is Lucene42RWCodec), () => "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
             }
             else if ("Lucene45".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) || ("random".Equals(LuceneTestCase.TestCodec, StringComparison.Ordinal) &&
                                                                     "random".Equals(LuceneTestCase.TestPostingsFormat, StringComparison.Ordinal) &&
@@ -210,7 +210,7 @@ namespace Lucene.Net.Util
             {
                 codec = Codec.ForName("Lucene45");
                 LuceneTestCase.OldFormatImpersonationIsActive = true;
-                Debug.Assert((codec is Lucene45RWCodec), "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
+                Debugging.Assert(() => (codec is Lucene45RWCodec), () => "fix your ICodecFactory to scan Lucene.Net.Tests before Lucene.Net.TestFramework");
             }
             else if (("random".Equals(LuceneTestCase.TestPostingsFormat, StringComparison.Ordinal) == false) 
                 || ("random".Equals(LuceneTestCase.TestDocValuesFormat, StringComparison.Ordinal) == false))
@@ -275,7 +275,7 @@ namespace Lucene.Net.Util
             }
             else
             {
-                Debug.Assert(false);
+                Debugging.Assert(() => false);
             }
             Codec.Default = codec;
 
diff --git a/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs b/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
index e4bb112..1a8b2a1 100644
--- a/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
+++ b/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
@@ -1,8 +1,8 @@
+using Lucene.Net.Diagnostics;
 using Lucene.Net.Store;
 using Lucene.Net.Support;
 using System;
 using System.Threading;
-using Debug = Lucene.Net.Diagnostics.Debug; // LUCENENET NOTE: We cannot use System.Diagnostics.Debug because those calls will be optimized out of the release!
 
 namespace Lucene.Net.Util
 {
@@ -61,7 +61,7 @@ namespace Lucene.Net.Util
 
         public ThrottledIndexOutput(int bytesPerSecond, long flushDelayMillis, long closeDelayMillis, long seekDelayMillis, long minBytesWritten, IndexOutput @delegate)
         {
-            Debug.Assert(bytesPerSecond > 0);
+            Debugging.Assert(() => bytesPerSecond > 0);
             this.@delegate = @delegate;
             this.bytesPerSecond = bytesPerSecond;
             this.flushDelayMillis = flushDelayMillis;