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/07/21 09:48:36 UTC

[lucenenet] 02/24: PERFORMANCE: Lucene.Net.TestFramework: Refactored Assert class to test for additional conditions locally, since NUnit is extremely slow when calling some methods in a tight loop. Eliminated object overloads and changed to generic to enforce comparing similar types by default unless opting in by specifying object as the generic type.

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 04c9d1c42f24ae8a9ab8b75f1bd0c8e983feb7e4
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Fri Jul 17 05:35:20 2020 +0700

    PERFORMANCE: Lucene.Net.TestFramework: Refactored Assert class to test for additional conditions locally, since NUnit is extremely slow when calling some methods in a tight loop. Eliminated object overloads and changed to generic to enforce comparing similar types by default unless opting in by specifying object as the generic type.
---
 .../Support/TestFramework/Assert.cs                | 169 +++++++++++++--------
 .../Support/JavaCompatibility/LuceneTestCase.cs    |  18 ++-
 .../Taxonomy/TestTaxonomyFacetCounts.cs            |   2 +-
 .../Taxonomy/TestTaxonomyFacetCounts2.cs           |  26 ++--
 src/Lucene.Net.Tests.Grouping/TestGrouping.cs      |   4 +-
 .../SessionTokenTest.cs                            |   6 +-
 .../Support/TestApiConsistency.cs                  |   2 +-
 .../TokenAttributes/TestCharTermAttributeImpl.cs   |   4 +-
 .../Index/TestIndexWriterForceMerge.cs             |   1 +
 src/Lucene.Net.Tests/Util/Fst/TestFSTs.cs          |   2 +-
 src/Lucene.Net.Tests/Util/TestBytesRef.cs          |   2 +-
 src/Lucene.Net.Tests/Util/TestNumericUtils.cs      |   1 -
 12 files changed, 145 insertions(+), 92 deletions(-)

diff --git a/src/Lucene.Net.TestFramework.NUnit/Support/TestFramework/Assert.cs b/src/Lucene.Net.TestFramework.NUnit/Support/TestFramework/Assert.cs
index 08ed9cb..cbf4e13 100644
--- a/src/Lucene.Net.TestFramework.NUnit/Support/TestFramework/Assert.cs
+++ b/src/Lucene.Net.TestFramework.NUnit/Support/TestFramework/Assert.cs
@@ -3,6 +3,7 @@ using Lucene.Net.Support;
 using Lucene.Net.Support.IO;
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Linq;
 using _NUnit = NUnit.Framework;
 using JCG = J2N.Collections.Generic;
@@ -31,6 +32,8 @@ namespace Lucene.Net.TestFramework
     /// </summary>
     internal partial class Assert
     {
+        private const string FailureFormat = "Expected: {0}, Actual: {1}";
+
         //
         // Summary:
         //     We don't actually want any instances of this object, but some people like to
@@ -52,9 +55,10 @@ namespace Lucene.Net.TestFramework
         //
         //   actual:
         //     The actual value
-        public static void AreEqual(object expected, object actual)
+        public static void AreEqual<T>(T expected, T actual)
         {
-            _NUnit.Assert.AreEqual(expected, actual);
+            if (!JCG.EqualityComparer<T>.Default.Equals(expected, actual))
+                Fail(FailureFormat, expected, actual);
         }
         //
         // Summary:
@@ -75,10 +79,53 @@ namespace Lucene.Net.TestFramework
         //
         //   args:
         //     Array of objects to be used in formatting the message
-        public static void AreEqual(object expected, object actual, string message, params object[] args)
+        public static void AreEqual<T>(T expected, T actual, string message, params object[] args)
         {
-            _NUnit.Assert.AreEqual(expected, actual, message, args);
+            if (!JCG.EqualityComparer<T>.Default.Equals(expected, actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
+
+        //
+        // Summary:
+        //     Verifies that two objects are equal. Two objects are considered equal if both
+        //     are null, or if both have the same value. NUnit has special semantics for some
+        //     object types. If they are not equal an NUnit.Framework.AssertionException is
+        //     thrown.
+        //
+        // Parameters:
+        //   expected:
+        //     The value that is expected
+        //
+        //   actual:
+        //     The actual value
+        public static void AreEqual(string expected, string actual)
+        {
+            if (!StringComparer.Ordinal.Equals(expected, actual))
+                Fail(FailureFormat, expected, actual);
+        }
+
+        //
+        // Summary:
+        //     Verifies that two objects are equal. Two objects are considered equal if both
+        //     are null, or if both have the same value. NUnit has special semantics for some
+        //     object types. If they are not equal an NUnit.Framework.AssertionException is
+        //     thrown.
+        //
+        // Parameters:
+        //   expected:
+        //     The value that is expected
+        //
+        //   message:
+        //     The message to display in case of failure
+        //
+        //   actual:
+        //     The actual value
+        public static void AreEqual(string expected, string actual, string message, params object[] args)
+        {
+            if (!StringComparer.Ordinal.Equals(expected, actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
+        }
+
         //
         // Summary:
         //     Verifies that two objects are equal. Two objects are considered equal if both
@@ -94,7 +141,8 @@ namespace Lucene.Net.TestFramework
         //     The actual value
         public static void AreEqual(bool expected, bool actual)
         {
-            _NUnit.Assert.IsTrue(expected.Equals(actual));
+            if (!expected.Equals(actual))
+                Fail(FailureFormat, expected, actual);
         }
         //
         // Summary:
@@ -117,8 +165,10 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void AreEqual(bool expected, bool actual, string message, params object[] args)
         {
-            _NUnit.Assert.IsTrue(expected.Equals(actual), message, args);
+            if (!expected.Equals(actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
+
         //
         // Summary:
         //     Verifies that two doubles are equal considering a delta. If the expected value
@@ -142,7 +192,8 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void AreEqual(double expected, double actual, double delta, string message, params object[] args)
         {
-            _NUnit.Assert.AreEqual(expected, actual, delta, message, args);
+            if (Math.Abs(expected - actual) > delta)
+                _NUnit.Assert.AreEqual(expected, actual, delta, message, args);
         }
         //
         // Summary:
@@ -161,7 +212,8 @@ namespace Lucene.Net.TestFramework
         //     The maximum acceptable difference between the the expected and the actual
         public static void AreEqual(double expected, double actual, double delta)
         {
-            _NUnit.Assert.AreEqual(expected, actual, delta);
+            if (Math.Abs(expected - actual) > delta)
+                _NUnit.Assert.AreEqual(expected, actual, delta);
         }
         //
         // Summary:
@@ -187,9 +239,7 @@ namespace Lucene.Net.TestFramework
         public static void AreEqual(float expected, float actual, float delta, string message, params object[] args)
         {
             if (Math.Abs(expected - actual) > delta)
-            {
                 _NUnit.Assert.AreEqual(expected, actual, delta, message, args);
-            }
         }
         //
         // Summary:
@@ -209,9 +259,7 @@ namespace Lucene.Net.TestFramework
         public static void AreEqual(float expected, float actual, float delta)
         {
             if (Math.Abs(expected - actual) > delta)
-            {
                 _NUnit.Assert.AreEqual(expected, actual, delta);
-            }
         }
         //
         // Summary:
@@ -228,7 +276,8 @@ namespace Lucene.Net.TestFramework
         //     The actual value
         public static void AreEqual(int expected, int actual)
         {
-            _NUnit.Assert.True(expected.Equals(actual));
+            if (!expected.Equals(actual))
+                Fail(FailureFormat, expected, actual);
         }
 
         //
@@ -247,9 +296,10 @@ namespace Lucene.Net.TestFramework
         //
         //   actual:
         //     The actual value
-        public static void AreEqual(int expected, int actual, string message)
+        public static void AreEqual(int expected, int actual, string message, params object[] args)
         {
-            _NUnit.Assert.True(expected.Equals(actual), message);
+            if (!expected.Equals(actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         //
@@ -267,7 +317,8 @@ namespace Lucene.Net.TestFramework
         //     The actual value
         public static void AreEqual(long expected, long actual)
         {
-            _NUnit.Assert.True(expected.Equals(actual));
+            if (!expected.Equals(actual))
+                Fail(FailureFormat, expected, actual);
         }
 
         //
@@ -286,9 +337,10 @@ namespace Lucene.Net.TestFramework
         //
         //   actual:
         //     The actual value
-        public static void AreEqual(long expected, long actual, string message)
+        public static void AreEqual(long expected, long actual, string message, params object[] args)
         {
-            _NUnit.Assert.True(expected.Equals(actual), message);
+            if (!expected.Equals(actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         //
@@ -306,7 +358,8 @@ namespace Lucene.Net.TestFramework
         //     The actual value
         public static void AreEqual(byte expected, byte actual)
         {
-            _NUnit.Assert.True(expected.Equals(actual));
+            if (!expected.Equals(actual))
+                Fail(FailureFormat, expected, actual);
         }
 
         //
@@ -325,9 +378,10 @@ namespace Lucene.Net.TestFramework
         //
         //   actual:
         //     The actual value
-        public static void AreEqual(byte expected, byte actual, string message)
+        public static void AreEqual(byte expected, byte actual, string message, params object[] args)
         {
-            _NUnit.Assert.True(expected.Equals(actual), message);
+            if (!expected.Equals(actual))
+                Fail(string.Concat(string.Format(FailureFormat, expected, actual), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
 
@@ -360,74 +414,55 @@ namespace Lucene.Net.TestFramework
         public static void AreEqual<T>(ISet<T> expected, ISet<T> actual, bool aggressive = true)
         {
             if (!GetSetComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail("Expected: '{0}', Actual: '{1}'", FormatCollection(expected), FormatCollection(actual));
-            }
+                Fail(FailureFormat, FormatCollection(expected), FormatCollection(actual));
         }
 
         public static void AreEqual<T>(ISet<T> expected, ISet<T> actual, bool aggressive, string message, params object[] args)
         {
             if (!GetSetComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(message, args);
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         public static void AreEqual<T>(ISet<T> expected, ISet<T> actual, bool aggressive, Func<string> getMessage)
         {
             if (!GetSetComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(getMessage());
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, getMessage()));
         }
 
         public static void AreEqual<T>(IList<T> expected, IList<T> actual, bool aggressive = true)
         {
             if (!GetListComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail("Expected: '{0}', Actual: '{1}'", FormatCollection(expected), FormatCollection(actual));
-            }
-
+                Fail(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)));
         }
 
         public static void AreEqual<T>(IList<T> expected, IList<T> actual, bool aggressive, string message, params object[] args)
         {
             if (!GetListComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(message, args);
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         public static void AreEqual<T>(IList<T> expected, IList<T> actual, bool aggressive, Func<string> getMessage)
         {
             if (!GetListComparer<T>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(getMessage());
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, getMessage()));
         }
 
         public static void AreEqual<TKey, TValue>(IDictionary<TKey, TValue> expected, IDictionary<TKey, TValue> actual, bool aggressive = true)
         {
             if (!GetDictionaryComparer<TKey, TValue>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail("Expected: '{0}', Actual: '{1}'", FormatCollection(expected), FormatCollection(actual));
-            }
+                Fail(FailureFormat, FormatCollection(expected), FormatCollection(actual));
         } 
 
         public static void AreEqual<TKey, TValue>(IDictionary<TKey, TValue> expected, IDictionary<TKey, TValue> actual, bool aggressive, string message, params object[] args)
         {
             if (!GetDictionaryComparer<TKey, TValue>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(message, args);
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         public static void AreEqual<TKey, TValue>(IDictionary<TKey, TValue> expected, IDictionary<TKey, TValue> actual, bool aggressive, Func<string> getMessage)
         {
             if (!GetDictionaryComparer<TKey, TValue>(aggressive).Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(getMessage());
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, getMessage()));
         }
 
 
@@ -435,18 +470,14 @@ namespace Lucene.Net.TestFramework
         public static void AreEqual<T>(T[] expected, T[] actual)
         {
             if (!J2N.Collections.ArrayEqualityComparer<T>.OneDimensional.Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail("Expected: '{0}', Actual: '{1}'", FormatCollection(expected), FormatCollection(actual));
-            }
+                Fail(FailureFormat, FormatCollection(expected), FormatCollection(actual));
         }
 
         // From CollectionAssert
         public static void AreEqual<T>(T[] expected, T[] actual, string message, params object[] args)
         {
             if (!J2N.Collections.ArrayEqualityComparer<T>.OneDimensional.Equals(expected, actual))
-            {
-                _NUnit.Assert.Fail(message, args);
-            }
+                Fail(string.Concat(string.Format(FailureFormat, FormatCollection(expected), FormatCollection(actual)), Environment.NewLine, Environment.NewLine, string.Format(message, args)));
         }
 
         //
@@ -603,7 +634,8 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void False(bool condition, string message, params object[] args)
         {
-            _NUnit.Assert.False(condition, message, args);
+            if (condition)
+                _NUnit.Assert.Fail(message, args);
         }
         //
         // Summary:
@@ -615,7 +647,8 @@ namespace Lucene.Net.TestFramework
         //     The evaluated condition
         public static void False(bool condition)
         {
-            _NUnit.Assert.False(condition);
+            if (condition)
+                _NUnit.Assert.Fail("Expected: False  Actual: True");
         }
 
         //
@@ -628,7 +661,8 @@ namespace Lucene.Net.TestFramework
         //     The evaluated condition
         public static void IsFalse(bool condition)
         {
-            _NUnit.Assert.IsFalse(condition);
+            if (condition)
+                _NUnit.Assert.Fail("Expected: False  Actual: True");
         }
 
         //
@@ -647,7 +681,8 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void IsFalse(bool condition, string message, params object[] args)
         {
-            _NUnit.Assert.IsFalse(condition, message, args);
+            if (condition)
+                _NUnit.Assert.Fail(message, args);
         }
 
         //
@@ -727,7 +762,8 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void IsTrue(bool condition, string message, params object[] args)
         {
-            _NUnit.Assert.IsTrue(condition, message, args);
+            if (!condition)
+                _NUnit.Assert.Fail(message, args);
         }
 
         //
@@ -740,7 +776,8 @@ namespace Lucene.Net.TestFramework
         //     The evaluated condition
         public static void IsTrue(bool condition)
         {
-            _NUnit.Assert.IsTrue(condition);
+            if (!condition)
+                _NUnit.Assert.Fail("Expected: True  Actual: False");
         }
 
         //
@@ -821,7 +858,8 @@ namespace Lucene.Net.TestFramework
         //     Array of objects to be used in formatting the message
         public static void True(bool condition, string message, params object[] args)
         {
-            _NUnit.Assert.True(condition, message, args);
+            if (!condition)
+                _NUnit.Assert.Fail(message, args);
         }
 
         //
@@ -834,7 +872,8 @@ namespace Lucene.Net.TestFramework
         //     The evaluated condition
         public static void True(bool condition)
         {
-            _NUnit.Assert.True(condition);
+            if (!condition)
+                _NUnit.Assert.Fail("Expected: True  Actual: False");
         }
 
 
@@ -848,7 +887,7 @@ namespace Lucene.Net.TestFramework
             _NUnit.Assert.Greater(arg1, arg2);
         }
 
-        public static Exception Throws<TException>(Action action, string message, params string[] args)
+        public static Exception Throws<TException>(Action action, string message, params object[] args)
         {
             return Throws(typeof(TException), action, message, args);
         }
@@ -863,7 +902,7 @@ namespace Lucene.Net.TestFramework
             return _NUnit.Assert.Throws(expectedExceptionType, () => action());
         }
 
-        public static Exception Throws(Type expectedExceptionType, Action action, string message, params string[] args)
+        public static Exception Throws(Type expectedExceptionType, Action action, string message, params object[] args)
         {
             return _NUnit.Assert.Throws(expectedExceptionType, () => action(), message, args);
         }
diff --git a/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
index e267119..0782bb6 100644
--- a/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Support/JavaCompatibility/LuceneTestCase.cs
@@ -68,12 +68,22 @@ namespace Lucene.Net.Util
             Assert.IsFalse(condition, message);
         }
 
-        internal static void assertEquals(object expected, object actual)
+        internal static void assertEquals<T>(T expected, T actual)
         {
             Assert.AreEqual(expected, actual);
         }
 
-        internal static void assertEquals(string message, object expected, object actual)
+        internal static void assertEquals<T>(string message, T expected, T actual)
+        {
+            Assert.AreEqual(expected, actual, message);
+        }
+
+        internal static void assertEquals(string expected, string actual)
+        {
+            Assert.AreEqual(expected, actual);
+        }
+
+        internal static void assertEquals(string message, string expected, string actual)
         {
             Assert.AreEqual(expected, actual, message);
         }
@@ -213,12 +223,12 @@ namespace Lucene.Net.Util
             Assert.AreEqual(a1, a2);
         }
 
-        internal static void assertSame(Object expected, Object actual)
+        internal static void assertSame(object expected, object actual)
         {
             Assert.AreSame(expected, actual);
         }
 
-        internal static void assertSame(string message, Object expected, Object actual)
+        internal static void assertSame(string message, object expected, object actual)
         {
             Assert.AreSame(expected, actual, message);
         }
diff --git a/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts.cs b/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts.cs
index be5d70f..a2fe4c1 100644
--- a/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts.cs
+++ b/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts.cs
@@ -683,7 +683,7 @@ namespace Lucene.Net.Facet.Taxonomy
             Facets facets = GetTaxonomyFacetCounts(taxoReader, config, sfc);
             IList<FacetResult> res1 = facets.GetAllDims(10);
             IList<FacetResult> res2 = facets.GetAllDims(10);
-            Assert.AreEqual(res1, res2, "calling getFacetResults twice should return the .equals()=true result");
+            Assert.AreEqual(res1, res2, aggressive: false, "calling getFacetResults twice should return the .equals()=true result");
 
             IOUtils.Dispose(taxoWriter, iw, taxoReader, taxoDir, r, indexDir);
         }
diff --git a/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts2.cs b/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts2.cs
index dba7829..4bf4ca2 100644
--- a/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts2.cs
+++ b/src/Lucene.Net.Tests.Facet/Taxonomy/TestTaxonomyFacetCounts2.cs
@@ -297,13 +297,13 @@ namespace Lucene.Net.Facet.Taxonomy
             Assert.AreEqual(-1, (int)result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(termExpectedCounts[CP_A + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(termExpectedCounts[CP_A + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
             result = facets.GetTopChildren(NUM_CHILDREN_CP_B, CP_B);
-            Assert.AreEqual(termExpectedCounts[CP_B], result.Value);
+            Assert.AreEqual(termExpectedCounts[CP_B].GetValueOrDefault(), result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(termExpectedCounts[CP_B + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(termExpectedCounts[CP_B + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
 
             IOUtils.Dispose(indexReader, taxoReader);
@@ -326,17 +326,17 @@ namespace Lucene.Net.Facet.Taxonomy
             int prevValue = int.MaxValue;
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_A + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_A + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
                 Assert.True((int)labelValue.Value <= prevValue, "wrong sort order of sub results: labelValue.value=" + labelValue.Value + " prevValue=" + prevValue);
                 prevValue = (int)labelValue.Value;
             }
 
             result = facets.GetTopChildren(NUM_CHILDREN_CP_B, CP_B);
-            Assert.AreEqual(allExpectedCounts[CP_B], result.Value);
+            Assert.AreEqual(allExpectedCounts[CP_B].GetValueOrDefault(), result.Value);
             prevValue = int.MaxValue;
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_B + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_B + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
                 Assert.True((int)labelValue.Value <= prevValue, "wrong sort order of sub results: labelValue.value=" + labelValue.Value + " prevValue=" + prevValue);
                 prevValue = (int)labelValue.Value;
             }
@@ -360,13 +360,13 @@ namespace Lucene.Net.Facet.Taxonomy
             Assert.AreEqual(-1, (int)result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_A + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_A + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
             result = facets.GetTopChildren(int.MaxValue, CP_B);
-            Assert.AreEqual(allExpectedCounts[CP_B], result.Value);
+            Assert.AreEqual(allExpectedCounts[CP_B].GetValueOrDefault(), result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_B + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_B + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
 
             IOUtils.Dispose(indexReader, taxoReader);
@@ -385,16 +385,16 @@ namespace Lucene.Net.Facet.Taxonomy
             Facets facets = GetTaxonomyFacetCounts(taxoReader, Config, sfc);
 
             FacetResult result = facets.GetTopChildren(NUM_CHILDREN_CP_C, CP_C);
-            Assert.AreEqual(allExpectedCounts[CP_C], result.Value);
+            Assert.AreEqual(allExpectedCounts[CP_C].GetValueOrDefault(), result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_C + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_C + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
             result = facets.GetTopChildren(NUM_CHILDREN_CP_D, CP_D);
-            Assert.AreEqual(allExpectedCounts[CP_C], result.Value);
+            Assert.AreEqual(allExpectedCounts[CP_C].GetValueOrDefault(), result.Value);
             foreach (LabelAndValue labelValue in result.LabelValues)
             {
-                Assert.AreEqual(allExpectedCounts[CP_D + "/" + labelValue.Label], labelValue.Value);
+                Assert.AreEqual(allExpectedCounts[CP_D + "/" + labelValue.Label].GetValueOrDefault(), labelValue.Value);
             }
 
             IOUtils.Dispose(indexReader, taxoReader);
diff --git a/src/Lucene.Net.Tests.Grouping/TestGrouping.cs b/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
index 3b06e52..8a0ec5e 100644
--- a/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
+++ b/src/Lucene.Net.Tests.Grouping/TestGrouping.cs
@@ -317,13 +317,13 @@ namespace Lucene.Net.Search.Grouping
 
             if (group.GroupValue.GetType().IsAssignableFrom(typeof(BytesRef)))
             {
-                assertEquals(new BytesRef(expected), group.GroupValue);
+                assertEquals<object>(new BytesRef(expected), group.GroupValue);
             }
             else if (group.GroupValue.GetType().IsAssignableFrom(typeof(MutableValueStr)))
             {
                 MutableValueStr v = new MutableValueStr();
                 v.Value = new BytesRef(expected);
-                assertEquals(v, group.GroupValue);
+                assertEquals<object>(v, group.GroupValue);
             }
             else
             {
diff --git a/src/Lucene.Net.Tests.Replicator/SessionTokenTest.cs b/src/Lucene.Net.Tests.Replicator/SessionTokenTest.cs
index 03d8448..c07b11b 100644
--- a/src/Lucene.Net.Tests.Replicator/SessionTokenTest.cs
+++ b/src/Lucene.Net.Tests.Replicator/SessionTokenTest.cs
@@ -51,7 +51,11 @@ namespace Lucene.Net.Replicator
             assertEquals(session1.Version, session2.Version);
             assertEquals(1, session2.SourceFiles.Count);
             assertEquals(session1.SourceFiles.Count, session2.SourceFiles.Count);
-            assertEquals(session1.SourceFiles.Keys, session2.SourceFiles.Keys);
+
+            // LUCENENET: Collections don't compare automatically in .NET and J2N has no structural equality
+            // checking on Keys, so using CollectionAssert here. This is set
+            // equality (where order doesn't matter) because in Java the keys and values collections are sets.
+            CollectionAssert.AreEquivalent(session1.SourceFiles.Keys, session2.SourceFiles.Keys);
             IList<RevisionFile> files1 = session1.SourceFiles.Values.First();
             IList<RevisionFile> files2 = session2.SourceFiles.Values.First();
             assertEquals(files1, files2, aggressive: false);
diff --git a/src/Lucene.Net.Tests.TestFramework/Support/TestApiConsistency.cs b/src/Lucene.Net.Tests.TestFramework/Support/TestApiConsistency.cs
index 503aa6a..0a81377 100644
--- a/src/Lucene.Net.Tests.TestFramework/Support/TestApiConsistency.cs
+++ b/src/Lucene.Net.Tests.TestFramework/Support/TestApiConsistency.cs
@@ -39,7 +39,7 @@ namespace Lucene.Net.Tests.TestFramework
         [TestCase(typeof(Lucene.Net.RandomExtensions))]
         public override void TestPrivateFieldNames(Type typeFromTargetAssembly)
         {
-            base.TestPrivateFieldNames(typeFromTargetAssembly, @"ApiScanTestBase|TestUtil.MaxRecursionBound");
+            base.TestPrivateFieldNames(typeFromTargetAssembly, @"ApiScanTestBase|TestUtil.MaxRecursionBound|Assert.FailureFormat");
         }
 
         [Test, LuceneNetSpecific]
diff --git a/src/Lucene.Net.Tests/Analysis/TokenAttributes/TestCharTermAttributeImpl.cs b/src/Lucene.Net.Tests/Analysis/TokenAttributes/TestCharTermAttributeImpl.cs
index 8fdd621..1612f67 100644
--- a/src/Lucene.Net.Tests/Analysis/TokenAttributes/TestCharTermAttributeImpl.cs
+++ b/src/Lucene.Net.Tests/Analysis/TokenAttributes/TestCharTermAttributeImpl.cs
@@ -327,9 +327,9 @@ namespace Lucene.Net.Analysis.TokenAttributes
             //              "01234567890123456789012345678901234567890123456789"
             Assert.AreEqual("0123456789012345678901234567890123456789012345678934567890123456789012345678901234567890123456789", t.ToString());
             t.SetEmpty().Append(/*(ICharSequence)*/ new StringBuilder("01234567890123456789"), 5, 17 - 5); // LUCENENET: StringBuilder doesn't implement ICharSequence
-            Assert.AreEqual(new StringCharSequence("567890123456"), t.ToString());
+            Assert.AreEqual((ICharSequence)new StringCharSequence("567890123456"), t /*.ToString()*/);
             t.Append(new StringBuilder(t.ToString()));
-            Assert.AreEqual(new StringCharSequence("567890123456567890123456"), t.ToString());
+            Assert.AreEqual((ICharSequence)new StringCharSequence("567890123456567890123456"), t /*.ToString()*/);
             // very wierd, to test if a subSlice is wrapped correct :)
             //CharBuffer buf = CharBuffer.wrap("012345678901234567890123456789".ToCharArray(), 3, 15); // LUCENENET: No CharBuffer in .NET
             StringBuilder buf = new StringBuilder("012345678901234567890123456789", 3, 15, 16);
diff --git a/src/Lucene.Net.Tests/Index/TestIndexWriterForceMerge.cs b/src/Lucene.Net.Tests/Index/TestIndexWriterForceMerge.cs
index e388c66..df28691 100644
--- a/src/Lucene.Net.Tests/Index/TestIndexWriterForceMerge.cs
+++ b/src/Lucene.Net.Tests/Index/TestIndexWriterForceMerge.cs
@@ -38,6 +38,7 @@ namespace Lucene.Net.Index
         private static readonly FieldType storedTextType = new FieldType(TextField.TYPE_NOT_STORED);
 
         [Test]
+        [Slow] // Occasionally
         public virtual void TestPartialMerge()
         {
             Directory dir = NewDirectory();
diff --git a/src/Lucene.Net.Tests/Util/Fst/TestFSTs.cs b/src/Lucene.Net.Tests/Util/Fst/TestFSTs.cs
index 2d01699..ecab235 100644
--- a/src/Lucene.Net.Tests/Util/Fst/TestFSTs.cs
+++ b/src/Lucene.Net.Tests/Util/Fst/TestFSTs.cs
@@ -501,7 +501,7 @@ namespace Lucene.Net.Util.Fst
             dir.Dispose();
         }
 
-        private void AssertSame<T1>(TermsEnum termsEnum, BytesRefFSTEnum<T1> fstEnum, bool storeOrd)
+        private void AssertSame(TermsEnum termsEnum, BytesRefFSTEnum<long?> fstEnum, bool storeOrd) // LUCENENET specific - changed to long? so we don't need a cast
         {
             if (termsEnum.Term == null)
             {
diff --git a/src/Lucene.Net.Tests/Util/TestBytesRef.cs b/src/Lucene.Net.Tests/Util/TestBytesRef.cs
index 93b9ba3..3da8ac5 100644
--- a/src/Lucene.Net.Tests/Util/TestBytesRef.cs
+++ b/src/Lucene.Net.Tests/Util/TestBytesRef.cs
@@ -69,7 +69,7 @@ namespace Lucene.Net.Util
             for (int i = 0; i < 100; i++)
             {
                 ICharSequence s = new StringCharSequence(TestUtil.RandomUnicodeString(Random));
-                string s2 = (new BytesRef(s)).Utf8ToString();
+                ICharSequence s2 = (new BytesRef(s)).Utf8ToString().AsCharSequence();
                 Assert.AreEqual(s, s2);
             }
 
diff --git a/src/Lucene.Net.Tests/Util/TestNumericUtils.cs b/src/Lucene.Net.Tests/Util/TestNumericUtils.cs
index 9b1554e..f1d1d73 100644
--- a/src/Lucene.Net.Tests/Util/TestNumericUtils.cs
+++ b/src/Lucene.Net.Tests/Util/TestNumericUtils.cs
@@ -361,7 +361,6 @@ namespace Lucene.Net.Util
         }
 
         [Test]
-        [Slow]
         public virtual void TestRandomSplit()
         {
             long num = (long)AtLeast(10);