You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by mh...@apache.org on 2014/11/09 23:07:48 UTC

[4/7] lucenenet git commit: creating new projects in order to separate out logic create to suppliment .NET with JAVA standard library functionality.

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Lucene.Net.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Lucene.Net.Core.Tests.csproj b/test/Lucene.Net.Core.Tests/Lucene.Net.Core.Tests.csproj
index 54711db..7a3150c 100644
--- a/test/Lucene.Net.Core.Tests/Lucene.Net.Core.Tests.csproj
+++ b/test/Lucene.Net.Core.Tests/Lucene.Net.Core.Tests.csproj
@@ -23,7 +23,7 @@
   <Import Project="..\..\packages\xunit.core.2.0.0-beta-build2700\build\portable-net45+win+wpa81+wp80\xunit.core.props" Condition="Exists('..\..\packages\xunit.core.2.0.0-beta-build2700\build\portable-net45+win+wpa81+wp80\xunit.core.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProjectGuid>{C879C7A6-FBE5-4F22-B363-A4356C7B8E76}</ProjectGuid>
@@ -34,8 +34,8 @@
     <DefaultLanguage>en-US</DefaultLanguage>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <TargetFrameworkProfile>Profile151</TargetFrameworkProfile>
-    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <RestorePackages>true</RestorePackages>
   </PropertyGroup>
@@ -70,6 +70,7 @@
     <Compile Include="Util\TestCharsRef.cs" />
     <Compile Include="Util\TestConstants.cs" />
     <Compile Include="Util\TestInPlaceMergeSorter.cs" />
+    <Compile Include="Util\TestOpenBitSet.cs" />
     <Compile Include="Util\TestPurgableThreadLocal.cs" />
     <Compile Include="Util\TestRamEstimatorUsage.cs" />
     <Compile Include="Util\TestSetOnce.cs" />
@@ -95,6 +96,10 @@
       <Project>{ad8901c0-209d-4132-80aa-257dbaceecb4}</Project>
       <Name>Lucene.Net.Core</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.TestFramework.Core\Lucene.Net.TestFramework.Core.csproj">
+      <Project>{438b8450-e93a-425f-9a9b-11d02e8896d5}</Project>
+      <Name>Lucene.Net.TestFramework.Core</Name>
+    </ProjectReference>
     <ProjectReference Include="..\Lucene.Net.TestFramework\Lucene.Net.TestFramework.csproj">
       <Project>{f0d68fea-b118-43b6-b760-3fb75cde766d}</Project>
       <Name>Lucene.Net.TestFramework</Name>

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/BaseSorterTestCase.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/BaseSorterTestCase.cs b/test/Lucene.Net.Core.Tests/Util/BaseSorterTestCase.cs
index 0318665..3d8931c 100644
--- a/test/Lucene.Net.Core.Tests/Util/BaseSorterTestCase.cs
+++ b/test/Lucene.Net.Core.Tests/Util/BaseSorterTestCase.cs
@@ -98,7 +98,7 @@ namespace Lucene.Net.Util
             var entries = new Entry[length];
             for (var i = 0; i < entries.Length; ++i)
             {
-                strategy.SetValue(this.Random, entries, i);
+                strategy.SetValue(Random, entries, i);
             }
 
             return entries;
@@ -107,8 +107,8 @@ namespace Lucene.Net.Util
         // test(Entry[] array)
         protected Entry[] CopyAndSort(Entry[] entries)
         {
-            int start = this.Random.Next(1000);
-            var toSort = new Entry[start + entries.Length + this.Random.Next(3)];
+            int start = Random.Next(1000);
+            var toSort = new Entry[start + entries.Length + Random.Next(3)];
             Array.Copy(entries, 0, toSort, start, entries.Length);
 
             var sorter = this.CreateSorter(toSort);

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestBroadWord.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestBroadWord.cs b/test/Lucene.Net.Core.Tests/Util/TestBroadWord.cs
index db6bbe3..e91d419 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestBroadWord.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestBroadWord.cs
@@ -98,10 +98,11 @@ namespace Lucene.Net.Util
         }
 
         [Test]
-        [Perf] // TODO: implement a real performance test.
+        [Performance] // TODO: implement a real performance test.
         public void TestPerfSelectAllBitsBroad()
         {
-            for (int j = 0; j < 100000; j++)
+            var length = AtLeast(5000);
+            for (int j = 0; j < length; j++)
             { // 1000000 for real perf test
                 for (int i = 0; i < 64; i++)
                 {
@@ -111,10 +112,12 @@ namespace Lucene.Net.Util
             }
         }
 
-        [Test][Perf]
+        [Test]
+        [Performance]
         public void TestPerfSelectAllBitsNaive()
         {
-            for (int j = 0; j < 10000; j++)
+            var length = AtLeast(5000);
+            for (int j = 0; j < length; j++)
             { // real perftest: 1000000
                 for (int i = 0; i < 64; i++)
                 {

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestByteArrayRef.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestByteArrayRef.cs b/test/Lucene.Net.Core.Tests/Util/TestByteArrayRef.cs
index f7b6897..bb6de32 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestByteArrayRef.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestByteArrayRef.cs
@@ -28,7 +28,7 @@ namespace Lucene.Net.Util
         [Test]
         public virtual void TestAppend()
         {
-            var random = this.Random;
+            var random = Random;
             var  list = new BytesRefArray(Counter.NewCounter());
             IList<string> stringList = new List<string>();
             for (int j = 0; j < 2; j++)
@@ -38,7 +38,7 @@ namespace Lucene.Net.Util
                     list.Clear();
                     stringList.Clear();
                 }
-                int entries = this.AtLeast(500);
+                int entries = Random.AtLeast(500);
                 var spare = new BytesRefBuilder();
                 int initSize = list.Length;
                 for (int i = 0; i < entries; i++)
@@ -78,7 +78,7 @@ namespace Lucene.Net.Util
         [Test]
         public virtual void TestSort()
         {
-            var random = this.Random;
+            var random = Random;
             var list = new BytesRefArray(Util.Counter.NewCounter());
             var stringList = new List<string>();
 
@@ -89,7 +89,7 @@ namespace Lucene.Net.Util
                     list.Clear();
                     stringList.Clear();
                 }
-                int entries = this.AtLeast(500);
+                int entries = Random.AtLeast(500);
                 var spare = new BytesRef();
                 int initSize = list.Length;
                 for (int i = 0; i < entries; i++)

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestByteBlockPool.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestByteBlockPool.cs b/test/Lucene.Net.Core.Tests/Util/TestByteBlockPool.cs
index 0bfff1b..95321cc 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestByteBlockPool.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestByteBlockPool.cs
@@ -52,17 +52,17 @@ namespace Lucene.Net.Util
             var bytesUsed = Counter.NewCounter();
             var  pool = new ByteBlockPool(new ByteBlockPool.DirectTrackingAllocator(bytesUsed));
             
-            var reuseFirst = this.Random.NextBoolean();
+            var reuseFirst = Random.NextBoolean();
             for (var j = 0; j < 2; j++)
             {
                 IList<BytesRefProxy> list = new List<BytesRefProxy>();
-                int maxLength = this.AtLeast(500),
-                    numValues = this.AtLeast(100);
+                int maxLength = Random.AtLeast(500),
+                    numValues = Random.AtLeast(100);
                 
                
                 numValues.Times(i =>
                 {
-                    string value = this.Random.RandomRealisticUnicodeString(maxLength: maxLength);
+                    string value = Random.RandomRealisticUnicodeString(maxLength: maxLength);
                     list.Add(new BytesRefProxy(value));
                     var @ref = new BytesRefProxy();
                     @ref.CopyChars(value);
@@ -80,7 +80,7 @@ namespace Lucene.Net.Util
                     Equal(expected, @ref);
                     position += @ref.Length;
                 }
-                pool.Reset(this.Random.NextBoolean(), reuseFirst);
+                pool.Reset(Random.NextBoolean(), reuseFirst);
                 if (reuseFirst)
                 {
                     Equal(ByteBlockPool.BYTE_BLOCK_SIZE, bytesUsed.Count);

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestBytesRef.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestBytesRef.cs b/test/Lucene.Net.Core.Tests/Util/TestBytesRef.cs
index 034d89f..7a19bf7 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestBytesRef.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestBytesRef.cs
@@ -50,7 +50,7 @@ namespace Lucene.Net.Util
         {
             100.Times((i) =>
             {
-                var utf8Str1 = this.Random.ToUnicodeString();
+                var utf8Str1 = Random.ToUnicodeString();
                 var utf8Str2 = new BytesRef(utf8Str1).Utf8ToString();
                 Equal(utf8Str1, utf8Str2);
             });

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestCharsRef.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestCharsRef.cs b/test/Lucene.Net.Core.Tests/Util/TestCharsRef.cs
index 35b789c..02ab41b 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestCharsRef.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestCharsRef.cs
@@ -31,13 +31,13 @@ namespace Lucene.Net.Util
         [Test]
         public void TestUtf16InUtf8Order()
         {
-            var iterations = this.AtLeast(1000);
+            var iterations = AtLeast(1000);
             var utf8 = new BytesRef[iterations];
             var utf16 = new CharsRef[iterations];
 
             iterations.Times((i) =>
             {
-                var s = this.Random.RandomUnicodeString();
+                var s = Random.RandomUnicodeString();
                 utf8[i] = new BytesRef(s);
                 utf16[i] = new CharsRef(s);
             });
@@ -55,11 +55,11 @@ namespace Lucene.Net.Util
         public void TestAppend() {
             var builder = new CharsRefBuilder();
             var sb = new StringBuilder();
-            int iterations = this.AtLeast(10);
+            int iterations = Random.AtLeast(10);
 
             iterations.Times((i) => {
-                var charArray = this.Random.RandomRealisticUnicodeString(1, 100).ToCharArray();
-                int offset = this.Random.Next(charArray.Length);
+                var charArray = Random.RandomRealisticUnicodeString(1, 100).ToCharArray();
+                int offset = Random.Next(charArray.Length);
                 int length = charArray.Length - offset;
                 sb.Append(charArray, offset, length);
                 builder.Append(charArray, offset, length);  
@@ -72,11 +72,11 @@ namespace Lucene.Net.Util
         [Test]
         public void TestCopy()
         {
-            var iterations = this.AtLeast(10);
+            var iterations = Random.AtLeast(10);
             iterations.Times((i) => {
                 var builder = new CharsRefBuilder();
-                var charArray = this.Random.RandomRealisticUnicodeString(1, 100).ToCharArray();
-                int offset = this.Random.Next(charArray.Length),
+                var charArray = Random.RandomRealisticUnicodeString(1, 100).ToCharArray();
+                int offset = Random.Next(charArray.Length),
                     length = charArray.Length - offset;
 
                String str = new String(charArray, offset, length);

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestOpenBitSet.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestOpenBitSet.cs b/test/Lucene.Net.Core.Tests/Util/TestOpenBitSet.cs
new file mode 100644
index 0000000..13a09dc
--- /dev/null
+++ b/test/Lucene.Net.Core.Tests/Util/TestOpenBitSet.cs
@@ -0,0 +1,439 @@
+/*
+ * 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.
+ */
+
+
+
+namespace Lucene.Net.Util
+{
+    using Lucene.Net.Random;
+    using Lucene.Net.Support;
+    using System.Collections;
+
+    using DocIdSetIterator = Lucene.Net.Search.DocIdSetIterator;
+
+    /*
+    public class TestOpenBitSet : BaseDocIdSetTestCase<OpenBitSet>
+    {
+        public override OpenBitSet CopyOf(BitArray bs, int length)
+        {
+            OpenBitSet set = new OpenBitSet(length);
+            for (int doc = bs.NextSetBit(0); doc != -1; doc = bs.NextSetBit(doc + 1))
+            {
+                set.Set(doc);
+            }
+            return set;
+        }
+
+        internal virtual void DoGet(BitArray a, OpenBitSet b)
+        {
+            int max = a.Count;
+            for (int i = 0; i < max; i++)
+            {
+                if (a.Get(i) != b.Get(i))
+                {
+                    Assert.Fail("mismatch: BitSet=[" + i + "]=" + a.Get(i));
+                }
+                if (a.Get(i) != b.Get((long)i))
+                {
+                    Assert.Fail("mismatch: BitSet=[" + i + "]=" + a.Get(i));
+                }
+            }
+        }
+
+        internal virtual void DoGetFast(BitArray a, OpenBitSet b, int max)
+        {
+            for (int i = 0; i < max; i++)
+            {
+                if (a.Get(i) != b.FastGet(i))
+                {
+                    Assert.Fail("mismatch: BitSet=[" + i + "]=" + a.Get(i));
+                }
+                if (a.Get(i) != b.FastGet((long)i))
+                {
+                    Assert.Fail("mismatch: BitSet=[" + i + "]=" + a.Get(i));
+                }
+            }
+        }
+
+        internal virtual void DoNextSetBit(BitArray a, OpenBitSet b)
+        {
+            int aa = -1, bb = -1;
+            do
+            {
+                aa = a.NextSetBit(aa + 1);
+                bb = b.NextSetBit(bb + 1);
+                Assert.AreEqual(aa, bb);
+            } while (aa >= 0);
+        }
+
+        internal virtual void DoNextSetBitLong(BitArray a, OpenBitSet b)
+        {
+            int aa = -1, bb = -1;
+            do
+            {
+                aa = a.NextSetBit(aa + 1);
+                bb = (int)b.NextSetBit((long)(bb + 1));
+                Assert.AreEqual(aa, bb);
+            } while (aa >= 0);
+        }
+
+        internal virtual void DoPrevSetBit(BitArray a, OpenBitSet b)
+        {
+            int aa = a.Count + Random().Next(100);
+            int bb = aa;
+            do
+            {
+                // aa = a.PrevSetBit(aa-1);
+                aa--;
+                while ((aa >= 0) && (!a.Get(aa)))
+                {
+                    aa--;
+                }
+                bb = b.PrevSetBit(bb - 1);
+                Assert.AreEqual(aa, bb);
+            } while (aa >= 0);
+        }
+
+        internal virtual void DoPrevSetBitLong(BitArray a, OpenBitSet b)
+        {
+            int aa = a.Count + Random().Next(100);
+            int bb = aa;
+            do
+            {
+                // aa = a.PrevSetBit(aa-1);
+                aa--;
+                while ((aa >= 0) && (!a.Get(aa)))
+                {
+                    aa--;
+                }
+                bb = (int)b.PrevSetBit((long)(bb - 1));
+                Assert.AreEqual(aa, bb);
+            } while (aa >= 0);
+        }
+
+        // test interleaving different OpenBitSetIterator.Next()/skipTo()
+        internal virtual void DoIterate(BitArray a, OpenBitSet b, int mode)
+        {
+            if (mode == 1)
+            {
+                DoIterate1(a, b);
+            }
+            if (mode == 2)
+            {
+                DoIterate2(a, b);
+            }
+        }
+
+        internal virtual void DoIterate1(BitArray a, OpenBitSet b)
+        {
+            int aa = -1, bb = -1;
+            OpenBitSetIterator iterator = new OpenBitSetIterator(b);
+            do
+            {
+                aa = a.NextSetBit(aa + 1);
+                bb = Random().NextBoolean() ? iterator.NextDoc() : iterator.Advance(bb + 1);
+                Assert.AreEqual(aa == -1 ? DocIdSetIterator.NO_MORE_DOCS : aa, bb);
+            } while (aa >= 0);
+        }
+
+        internal virtual void DoIterate2(BitArray a, OpenBitSet b)
+        {
+            int aa = -1, bb = -1;
+            OpenBitSetIterator iterator = new OpenBitSetIterator(b);
+            do
+            {
+                aa = a.NextSetBit(aa + 1);
+                bb = Random().NextBoolean() ? iterator.NextDoc() : iterator.Advance(bb + 1);
+                Assert.AreEqual(aa == -1 ? DocIdSetIterator.NO_MORE_DOCS : aa, bb);
+            } while (aa >= 0);
+        }
+
+        internal virtual void DoRandomSets(int maxSize, int iter, int mode)
+        {
+            BitArray a0 = null;
+            OpenBitSet b0 = null;
+
+            for (int i = 0; i < iter; i++)
+            {
+                int sz = Random().Next(maxSize);
+                BitArray a = new BitArray(sz);
+                OpenBitSet b = new OpenBitSet(sz);
+
+                // test the various ways of setting bits
+                if (sz > 0)
+                {
+                    int nOper = Random().Next(sz);
+                    for (int j = 0; j < nOper; j++)
+                    {
+                        int idx;
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, true);
+                        b.FastSet(idx);
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, true);
+                        b.FastSet((long)idx);
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, false);
+                        b.FastClear(idx);
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, false);
+                        b.FastClear((long)idx);
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, !a.Get(idx));
+                        b.FastFlip(idx);
+
+                        bool val = b.FlipAndGet(idx);
+                        bool val2 = b.FlipAndGet(idx);
+                        Assert.IsTrue(val != val2);
+
+                        idx = Random().Next(sz);
+                        a.Set(idx, !a.Get(idx));
+                        b.FastFlip((long)idx);
+
+                        val = b.FlipAndGet((long)idx);
+                        val2 = b.FlipAndGet((long)idx);
+                        Assert.IsTrue(val != val2);
+
+                        val = b.GetAndSet(idx);
+                        Assert.IsTrue(val2 == val);
+                        Assert.IsTrue(b.Get(idx));
+
+                        if (!val)
+                        {
+                            b.FastClear(idx);
+                        }
+                        Assert.IsTrue(b.Get(idx) == val);
+                    }
+                }
+
+                // test that the various ways of accessing the bits are equivalent
+                DoGet(a, b);
+                DoGetFast(a, b, sz);
+
+                // test ranges, including possible extension
+                int fromIndex, toIndex;
+                fromIndex = Random().Next(sz + 80);
+                toIndex = fromIndex + Random().Next((sz >> 1) + 1);
+                BitArray aa = (BitArray)a.Clone();
+                aa.Flip(fromIndex, toIndex);
+                OpenBitSet bb = (OpenBitSet)b.Clone();
+                bb.Flip(fromIndex, toIndex);
+
+                DoIterate(aa, bb, mode); // a problem here is from flip or doIterate
+
+                fromIndex = Random().Next(sz + 80);
+                toIndex = fromIndex + Random().Next((sz >> 1) + 1);
+                aa = (BitArray)a.Clone();
+                aa.Clear(fromIndex, toIndex);
+                bb = (OpenBitSet)b.Clone();
+                bb.Clear(fromIndex, toIndex);
+
+                DoNextSetBit(aa, bb); // a problem here is from clear() or nextSetBit
+                DoNextSetBitLong(aa, bb);
+
+                DoPrevSetBit(aa, bb);
+                DoPrevSetBitLong(aa, bb);
+
+                fromIndex = Random().Next(sz + 80);
+                toIndex = fromIndex + Random().Next((sz >> 1) + 1);
+                aa = (BitArray)a.Clone();
+                aa.Set(fromIndex, toIndex);
+                bb = (OpenBitSet)b.Clone();
+                bb.Set(fromIndex, toIndex);
+
+                DoNextSetBit(aa, bb); // a problem here is from set() or nextSetBit
+                DoNextSetBitLong(aa, bb);
+
+                DoPrevSetBit(aa, bb);
+                DoPrevSetBitLong(aa, bb);
+
+                if (a0 != null)
+                {
+                    Assert.AreEqual(a.Equals(a0), b.Equals(b0));
+
+                    Assert.AreEqual(a.Cardinality(), b.Cardinality());
+
+                    BitArray a_and = (BitArray)a.Clone();
+                    a_and = a_and.And(a0);
+                    BitArray a_or = (BitArray)a.Clone();
+                    a_or = a_or.Or(a0);
+                    BitArray a_xor = (BitArray)a.Clone();
+                    a_xor = a_xor.Xor(a0);
+                    BitArray a_andn = (BitArray)a.Clone();
+                    a_andn.AndNot(a0);
+
+                    OpenBitSet b_and = (OpenBitSet)b.Clone();
+                    Assert.AreEqual(b, b_and);
+                    b_and.And(b0);
+                    OpenBitSet b_or = (OpenBitSet)b.Clone();
+                    b_or.Or(b0);
+                    OpenBitSet b_xor = (OpenBitSet)b.Clone();
+                    b_xor.Xor(b0);
+                    OpenBitSet b_andn = (OpenBitSet)b.Clone();
+                    b_andn.AndNot(b0);
+
+                    DoIterate(a_and, b_and, mode);
+                    DoIterate(a_or, b_or, mode);
+                    DoIterate(a_xor, b_xor, mode);
+                    DoIterate(a_andn, b_andn, mode);
+
+                    Assert.AreEqual(a_and.Cardinality(), b_and.Cardinality());
+                    Assert.AreEqual(a_or.Cardinality(), b_or.Cardinality());
+                    Assert.AreEqual(a_xor.Cardinality(), b_xor.Cardinality());
+                    Assert.AreEqual(a_andn.Cardinality(), b_andn.Cardinality());
+
+                    // test non-mutating popcounts
+                    Assert.AreEqual(b_and.Cardinality(), OpenBitSet.IntersectionCount(b, b0));
+                    Assert.AreEqual(b_or.Cardinality(), OpenBitSet.UnionCount(b, b0));
+                    Assert.AreEqual(b_xor.Cardinality(), OpenBitSet.XorCount(b, b0));
+                    Assert.AreEqual(b_andn.Cardinality(), OpenBitSet.AndNotCount(b, b0));
+                }
+
+                a0 = a;
+                b0 = b;
+            }
+        }
+
+        // large enough to flush obvious bugs, small enough to run in <.5 sec as part of a
+        // larger testsuite.
+        [Test]
+        public virtual void TestSmall()
+        {
+            DoRandomSets(AtLeast(1200), AtLeast(1000), 1);
+            DoRandomSets(AtLeast(1200), AtLeast(1000), 2);
+        }
+
+        // uncomment to run a bigger test (~2 minutes).
+        /*
+        public void TestBig() {
+          doRandomSets(2000,200000, 1);
+          doRandomSets(2000,200000, 2);
+        }
+        */
+
+        /*
+
+        [Test]
+        public virtual void TestEquals()
+        {
+            OpenBitSet b1 = new OpenBitSet(1111);
+            OpenBitSet b2 = new OpenBitSet(2222);
+            Assert.IsTrue(b1.Equals(b2));
+            Assert.IsTrue(b2.Equals(b1));
+            b1.Set(10);
+            Assert.IsFalse(b1.Equals(b2));
+            Assert.IsFalse(b2.Equals(b1));
+            b2.Set(10);
+            Assert.IsTrue(b1.Equals(b2));
+            Assert.IsTrue(b2.Equals(b1));
+            b2.Set(2221);
+            Assert.IsFalse(b1.Equals(b2));
+            Assert.IsFalse(b2.Equals(b1));
+            b1.Set(2221);
+            Assert.IsTrue(b1.Equals(b2));
+            Assert.IsTrue(b2.Equals(b1));
+
+            // try different type of object
+            Assert.IsFalse(b1.Equals(new object()));
+        }
+
+        [Test]
+        public virtual void TestHashCodeEquals()
+        {
+            OpenBitSet bs1 = new OpenBitSet(200);
+            OpenBitSet bs2 = new OpenBitSet(64);
+            bs1.Set(3);
+            bs2.Set(3);
+            Assert.AreEqual(bs1, bs2);
+            Assert.AreEqual(bs1.GetHashCode(), bs2.GetHashCode());
+        }
+
+        private OpenBitSet MakeOpenBitSet(int[] a)
+        {
+            OpenBitSet bs = new OpenBitSet();
+            foreach (int e in a)
+            {
+                bs.Set(e);
+            }
+            return bs;
+        }
+
+        private BitArray MakeBitSet(int[] a)
+        {
+            BitArray bs = new BitArray(a.Length);
+            foreach (int e in a)
+            {
+                bs.Set(e, true);
+            }
+            return bs;
+        }
+
+        private void CheckPrevSetBitArray(int[] a)
+        {
+            OpenBitSet obs = MakeOpenBitSet(a);
+            BitArray bs = MakeBitSet(a);
+            DoPrevSetBit(bs, obs);
+        }
+
+        [Test]
+        public virtual void TestPrevSetBit()
+        {
+            CheckPrevSetBitArray(new int[] { });
+            CheckPrevSetBitArray(new int[] { 0 });
+            CheckPrevSetBitArray(new int[] { 0, 2 });
+        }
+
+        [Test]
+        public virtual void TestEnsureCapacity()
+        {
+            OpenBitSet bits = new OpenBitSet(1);
+            int bit = Random().Next(100) + 10;
+            bits.EnsureCapacity(bit); // make room for more bits
+            bits.FastSet(bit - 1);
+            Assert.IsTrue(bits.FastGet(bit - 1));
+            bits.EnsureCapacity(bit + 1);
+            bits.FastSet(bit);
+            Assert.IsTrue(bits.FastGet(bit));
+            bits.EnsureCapacity(3); // should not change numBits nor grow the array
+            bits.FastSet(3);
+            Assert.IsTrue(bits.FastGet(3));
+            bits.FastSet(bit - 1);
+            Assert.IsTrue(bits.FastGet(bit - 1));
+
+            // test ensureCapacityWords
+            int numWords = Random().Next(10) + 2; // make sure we grow the array (at least 128 bits)
+            bits.EnsureCapacityWords(numWords);
+            bit = TestUtil.NextInt(Random(), 127, (numWords << 6) - 1); // pick a bit >= to 128, but still within range
+            bits.FastSet(bit);
+            Assert.IsTrue(bits.FastGet(bit));
+            bits.FastClear(bit);
+            Assert.IsFalse(bits.FastGet(bit));
+            bits.FastFlip(bit);
+            Assert.IsTrue(bits.FastGet(bit));
+            bits.EnsureCapacityWords(2); // should not change numBits nor grow the array
+            bits.FastSet(3);
+            Assert.IsTrue(bits.FastGet(3));
+            bits.FastSet(bit - 1);
+            Assert.IsTrue(bits.FastGet(bit - 1));
+        }
+    }*/
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Core.Tests/Util/TestWeakIdentityMap.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestWeakIdentityMap.cs b/test/Lucene.Net.Core.Tests/Util/TestWeakIdentityMap.cs
index ee18cac..e6bf2f0 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestWeakIdentityMap.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestWeakIdentityMap.cs
@@ -31,7 +31,7 @@ namespace Lucene.Net.Util
         [Test]
         public async virtual void TestSimpleHashMap()
         {
-            var map = WeakIdentityMap<string, string>.NewHashMap(this.Random.NextBoolean());
+            var map = WeakIdentityMap<string, string>.NewHashMap(Random.NextBoolean());
             // we keep strong references to the keys,
             // so WeakIdentityMap will not forget about them:
             string key1 = "foo",
@@ -190,7 +190,7 @@ namespace Lucene.Net.Util
             // don't make threadCount and keyCount random, otherwise easily OOMs or fails otherwise:
             const int threadCount = 8, keyCount = 1024;
             var tasks = new List<Task>();
-            var map = WeakIdentityMap<object, int?>.NewConcurrentHashMap(this.Random.NextBoolean());
+            var map = WeakIdentityMap<object, int?>.NewConcurrentHashMap(Random.NextBoolean());
             // we keep strong references to the keys,
             // so WeakIdentityMap will not forget about them:
             var keys = new AtomicReferenceArray<object>(keyCount);
@@ -201,7 +201,7 @@ namespace Lucene.Net.Util
 
             for (var t = 0; t < threadCount; t++)
             {
-                var rnd = new Random(this.Random.Next());
+                var rnd = new Random(Random.Next());
                 tasks.Add(Task.Run(() =>
                 {
                        
@@ -272,7 +272,7 @@ namespace Lucene.Net.Util
             public void Run()
             {
 // ReSharper disable once InvokeAsExtensionMethod
-                var count =  this.outerInstance.AtLeast(10000);
+                var count =  AtLeast(10000);
                 for (var i = 0; i < count; i++)
                 {
                     var j = rnd.Next(keyCount);

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/Lucene.Net.Java.Tests.csproj
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/Lucene.Net.Java.Tests.csproj b/test/Lucene.Net.Java.Tests/Lucene.Net.Java.Tests.csproj
new file mode 100644
index 0000000..f1114ce
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/Lucene.Net.Java.Tests.csproj
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{06FE85CA-11BA-4E69-81B4-1FA6E031E0B7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Lucene.Net.Java</RootNamespace>
+    <AssemblyName>Lucene.Net.Java.Tests</AssemblyName>
+    <DefaultLanguage>en-US</DefaultLanguage>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+    <RestorePackages>true</RestorePackages>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <!-- A reference to the entire .NET Framework is automatically included -->
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Util\InsertionSortTests.cs" />
+    <Compile Include="Util\SortTestClass.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="xunit.abstractions">
+      <HintPath>..\..\packages\xunit.abstractions.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.abstractions.dll</HintPath>
+    </Reference>
+    <Reference Include="xunit.assert">
+      <HintPath>..\..\packages\xunit.assert.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
+    </Reference>
+    <Reference Include="xunit.core">
+      <HintPath>..\..\packages\xunit.core.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\Lucene.Net.Java\Lucene.Net.Java.csproj">
+      <Project>{4ad3fe35-aa0a-4c3c-a043-12711625df74}</Project>
+      <Name>Lucene.Net.Java</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.TestFramework.Core\Lucene.Net.TestFramework.Core.csproj">
+      <Project>{438b8450-e93a-425f-9a9b-11d02e8896d5}</Project>
+      <Name>Lucene.Net.TestFramework.Core</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
+  </Target>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/Properties/AssemblyInfo.cs b/test/Lucene.Net.Java.Tests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..879cf92
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Resources;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Lucene.Net.Java.Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Lucene.Net.Java.Tests")]
+[assembly: AssemblyCopyright("Copyright ©  2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/Util/InsertionSortTests.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/Util/InsertionSortTests.cs b/test/Lucene.Net.Java.Tests/Util/InsertionSortTests.cs
new file mode 100644
index 0000000..e2e798d
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/Util/InsertionSortTests.cs
@@ -0,0 +1,71 @@
+
+namespace Lucene.Net.Java.Util
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using global::Java.Util;
+
+    public class InsertionSortTests : SortTestClass
+    {
+
+        [Test]
+        public void TestSort()
+        {
+            var length = Random.Next(20);
+            var array = new int[length];
+            Arrays.Fill(array, () => Random.Next());
+
+            InsertionSort.Sort(array);
+            
+            this.AssertSort(array);
+
+            Throws<ArgumentNullException>(() =>
+            {
+                int[] test = null;
+                
+                // ReSharper disable ExpressionIsAlwaysNull
+                InsertionSort.Sort(test);
+            });
+        }
+
+        [Test]
+        public void TestSortWithSlice()
+        {
+            var offset = Random.Next(5, 10);
+            var length = Random.Next(30, 35);
+            var list = new char[length];
+
+            Ok(list.Length > offset);
+            Arrays.Fill(list, () => (char) Random.Next(97, 122));
+           
+            var copy = list.ToList();
+
+            InsertionSort.Sort(list, offset, length - offset - 5);
+ 
+            this.AssertSort(list, offset, length - offset - 5);
+            
+            // ensure what was outside of the slice was not sorted
+            for (var i = 0; i < offset; i++)
+            {
+                Equal(list[i], copy[i]);
+            }
+
+            for (var i = length - 5; i < length; i++)
+            {
+                Equal(list[i], copy[i]);
+            }
+
+            var listB = new char[10];
+
+            // verify exceptions
+            Throws<ArgumentNullException>(() => InsertionSort.Sort((IList<int>)null, -1, 10));
+            Throws<ArgumentOutOfRangeException>(() => InsertionSort.Sort(listB, -1, 10));
+            Throws<ArgumentOutOfRangeException>(() => InsertionSort.Sort(listB, 0, -10));
+            Throws<ArgumentOutOfRangeException>(() => InsertionSort.Sort(listB, 10, 10));
+            Throws<ArgumentOutOfRangeException>(() => InsertionSort.Sort(listB, 0, 11));
+            Throws<ArgumentOutOfRangeException>(() => InsertionSort.Sort(listB, -9, 5));
+
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/Util/SortTestClass.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/Util/SortTestClass.cs b/test/Lucene.Net.Java.Tests/Util/SortTestClass.cs
new file mode 100644
index 0000000..6078100
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/Util/SortTestClass.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Lucene.Net.Java.Util
+{
+    public class SortTestClass : TestClass
+    {
+
+        protected void AssertSort<T>(IList<T> list, int start = 0, int count = -1) where T : IComparable<T>
+        {
+            if(count == -1)
+                count = list.Count;
+
+            count.Times(i =>
+            {
+                if (i < start)
+                   return;
+                
+
+                var current = list[i];
+
+                if (i > start)
+                {
+                    var previous = list[i - 1];
+                    Ok(previous.CompareTo(current) <= 0, "previous value, {0}, should be less than or equal to {1} at index {2}", previous, current, i);
+                }
+
+                if (i < (count - 2))
+                {
+                    var next = list[i + 1];
+                    Ok(next.CompareTo(current) >= 0, "next value, {0}, should be greater than or equal to {1} at index {2}", next, current, i);
+                }
+            });
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/packages.config
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/packages.config b/test/Lucene.Net.Java.Tests/packages.config
new file mode 100644
index 0000000..b71d5c9
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/packages.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ 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.
+
+-->
+<packages>
+  <package id="xunit" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.abstractions" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.assert" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.core" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+</packages>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.Java.Tests/project.json
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Java.Tests/project.json b/test/Lucene.Net.Java.Tests/project.json
new file mode 100644
index 0000000..27f9bf3
--- /dev/null
+++ b/test/Lucene.Net.Java.Tests/project.json
@@ -0,0 +1,37 @@
+{
+    "licenses": ["apache 2.0"],
+    "version": "5.0.0.0",
+    "compilationOptions": {
+        "warningsAsErrors": false,
+        "define": ["XUNIT"]
+    },
+    "sources": ["../src"],
+    "code": "**/*.cs",
+    "commands": {
+        "test": "Xunit.KRunner"
+    },
+    
+    
+    "dependencies": {
+        "Lucene.Net.Java":  "",
+        "Lucene.Net.TestFramework.Core": "",
+        "Xunit.KRunner": "1.0.0-*",
+        "System.Console": "4.0.0.0"
+    },
+
+    "configurations" : {
+        "net451": {},
+        "net45" : { 
+            "dependencies": {
+            }
+        },
+        "k10" : { 
+            "dependencies": {
+                "System.Runtime": "4.0.20.0",
+                "System.Diagnostics.Debug": "4.0.10.0"
+              
+            }
+            
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/CategoryAttribute.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/CategoryAttribute.cs b/test/Lucene.Net.TestFramework.Core/CategoryAttribute.cs
new file mode 100644
index 0000000..ce21ef4
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/CategoryAttribute.cs
@@ -0,0 +1,44 @@
+
+
+
+namespace Lucene.Net
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using Xunit.Abstractions;
+    using Xunit.Sdk;
+
+    [TraitDiscoverer("CategoryDiscoverer", "TraitExtensibility")]
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    public class CategoryAttribute : System.Attribute, Xunit.Sdk.ITraitAttribute
+    {
+        public string Name { get; private set; }
+
+        public CategoryAttribute(string category)
+        {
+            this.Name = category;
+        }
+    }
+
+    /// <summary>
+    /// This class discovers all of the tests and test classes that have
+    /// applied the Category attribute
+    /// </summary>
+    public class CategoryDiscoverer : ITraitDiscoverer
+    {
+        /// <summary>
+        /// Gets the trait values from the Category attribute.
+        /// </summary>
+        /// <param name="traitAttribute">The trait attribute containing the trait values.</param>
+        /// <returns>The trait values.</returns>
+        public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
+        {
+            var ctorArgs = traitAttribute.GetConstructorArguments().ToList();
+
+            yield return new KeyValuePair<string, string>("Category", ctorArgs[0].ToString());
+           
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/ExtensionMethods.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/ExtensionMethods.cs b/test/Lucene.Net.TestFramework.Core/ExtensionMethods.cs
new file mode 100644
index 0000000..e4a7f95
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/ExtensionMethods.cs
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+namespace Lucene.Net
+{
+    using System;
+    /// <summary>
+    /// Extension methods to make writing tests easier.
+    /// </summary>
+    public static class ExtensionMethods
+    {
+        /// <summary>
+        /// Performs a loop for the specified number of times. 
+        /// </summary>
+        /// <param name="value">The number of times to perform a loop.</param>
+        /// <param name="invoke">The code that should be ivnoked for each iteration.</param>
+        public static void Times(this int value, Action<int> invoke)
+        {
+            for(var i = 0; i < value; i++)
+            {
+                invoke(i);
+            }
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/Lucene.Net.TestFramework.Core.csproj
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/Lucene.Net.TestFramework.Core.csproj b/test/Lucene.Net.TestFramework.Core/Lucene.Net.TestFramework.Core.csproj
new file mode 100644
index 0000000..3e66773
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/Lucene.Net.TestFramework.Core.csproj
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{438B8450-E93A-425F-9A9B-11D02E8896D5}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Lucene.Net</RootNamespace>
+    <AssemblyName>Lucene.Net.TestFramework.Core</AssemblyName>
+    <DefaultLanguage>en-US</DefaultLanguage>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;XUNIT</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <!-- A reference to the entire .NET Framework is automatically included -->
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CategoryAttribute.cs" />
+    <Compile Include="ExtensionMethods.cs" />
+    <Compile Include="NightlyAttribute.cs" />
+    <Compile Include="PerformanceAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RandomExtensions.cs" />
+    <Compile Include="Settings.cs" />
+    <Compile Include="TestAttribute.cs" />
+    <Compile Include="TestClass.cs" />
+    <Compile Include="TicketAttribute.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="xunit.abstractions">
+      <HintPath>..\..\packages\xunit.abstractions.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.abstractions.dll</HintPath>
+    </Reference>
+    <Reference Include="xunit.assert">
+      <HintPath>..\..\packages\xunit.assert.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monoandroid+monotouch10\xunit.assert.dll</HintPath>
+    </Reference>
+    <Reference Include="xunit.core">
+      <HintPath>..\..\packages\xunit.core.2.0.0-beta-build2700\lib\portable-net45+win+wpa81+wp80+monotouch+monoandroid\xunit.core.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/NightlyAttribute.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/NightlyAttribute.cs b/test/Lucene.Net.TestFramework.Core/NightlyAttribute.cs
new file mode 100644
index 0000000..0eba11d
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/NightlyAttribute.cs
@@ -0,0 +1,18 @@
+
+
+
+namespace Lucene.Net
+{
+    using System;
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    public class NightlyAttribute : CategoryAttribute
+    {
+
+        public NightlyAttribute()
+            : base("Nightly")
+        {
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/PerformanceAttribute.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/PerformanceAttribute.cs b/test/Lucene.Net.TestFramework.Core/PerformanceAttribute.cs
new file mode 100644
index 0000000..f854a55
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/PerformanceAttribute.cs
@@ -0,0 +1,17 @@
+
+
+namespace Lucene.Net
+{
+    using System;
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    public class PerformanceAttribute : CategoryAttribute
+    {
+
+        public PerformanceAttribute()
+            : base("Performance")
+        {
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/Properties/AssemblyInfo.cs b/test/Lucene.Net.TestFramework.Core/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d561817
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Resources;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Lucene.Net.TestFramework.Core")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Lucene.Net.TestFramework.Core")]
+[assembly: AssemblyCopyright("Copyright ©  2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/RandomExtensions.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/RandomExtensions.cs b/test/Lucene.Net.TestFramework.Core/RandomExtensions.cs
new file mode 100644
index 0000000..bff600e
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/RandomExtensions.cs
@@ -0,0 +1,30 @@
+
+
+
+namespace Lucene.Net
+{
+    using System;
+
+    public static class RandomExtensions
+    {
+
+        public static int AtLeast(this Random random, int minimumValue)
+        {
+            minimumValue = Settings.Nightly ? (2*minimumValue) : minimumValue;
+            minimumValue = minimumValue*Settings.RandomMultiplier;
+
+            // Even with the current short number of tests,
+            // some of tests take too long to complete due to the
+            // number of loops and computations created by using
+            // high numbers with AtLeast. This is to cut
+            // down on local development test time.
+            if (!Settings.Nightly && minimumValue > 100)
+            {
+                minimumValue = 100;
+            }
+
+            var max = minimumValue + (minimumValue / 2);
+            return random.Next(minimumValue, max);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/Settings.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/Settings.cs b/test/Lucene.Net.TestFramework.Core/Settings.cs
new file mode 100644
index 0000000..e7a3382
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/Settings.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Lucene.Net
+{
+    public static class Settings
+    {
+
+        public static bool Nightly { get; set; }
+
+        public static int RandomMultiplier { get; set; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/TestAttribute.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/TestAttribute.cs b/test/Lucene.Net.TestFramework.Core/TestAttribute.cs
new file mode 100644
index 0000000..5f8b3c5
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/TestAttribute.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Lucene.Net
+{
+    /// <summary>
+    /// Summary description for TestAttribute
+    /// </summary>
+    public class TestAttribute : Xunit.FactAttribute
+    {
+
+        public string JavaMethodName { get; set; }
+
+        public TestAttribute(string displayName, string javaMethodName = null, string skip = null)
+        {
+            
+            // ReSharper disable DoNotCallOverridableMethodsInConstructor
+            this.DisplayName = displayName;
+            this.Skip = skip;
+            this.JavaMethodName = javaMethodName;
+        }
+
+        public TestAttribute()
+        {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/TestClass.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/TestClass.cs b/test/Lucene.Net.TestFramework.Core/TestClass.cs
new file mode 100644
index 0000000..df433a0
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/TestClass.cs
@@ -0,0 +1,226 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Lucene.Net
+{
+    using System.Diagnostics;
+    using System.Threading;
+
+    public class TestClass
+    {
+        private static readonly ThreadLocal<System.Random> random;
+
+
+        public static Random Random
+        {
+            get { return random.Value; }
+        }
+
+        static TestClass()
+        {
+            random = new ThreadLocal<System.Random>(() => 
+                new System.Random((int) DateTime.Now.Ticks & 0x0000FFFF));
+        }
+
+        public class LuceneAssertionException : Exception
+        {
+            //
+            // For guidelines regarding the creation of new exception types, see
+            //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
+            // and
+            //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
+            //
+
+            public LuceneAssertionException()
+            {
+            }
+
+            public LuceneAssertionException(string message) : base(message)
+            {
+            }
+
+            public LuceneAssertionException(string message, Exception inner) : base(message, inner)
+            {
+            }
+
+#if NET45
+            protected LuceneAssertionException(
+                System.Runtime.Serialization.SerializationInfo info,
+                StreamingContext context) : base(info, context)
+            {
+            }
+#endif
+        }
+
+#if XUNIT
+
+        [DebuggerHidden]
+        public static void Null(object value, string message = null, params  object[] args)
+        {
+            try
+            {
+                Assert.Null(value);
+            }
+            catch (Exception ex)
+            {
+                var msg = message ?? "The value must be null.";
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+        }
+
+        public static void NotNull(object value, string message = null, params object[] args)
+        {
+            try
+            {
+                Assert.NotNull(value);
+            }
+            catch (Exception ex)
+            {
+                var msg = message ?? "The value must not be null.";
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+        }
+
+        /// <summary>
+        /// Asserts that two object are the same.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        /// <param name="actual">The actual value.</param>
+        [DebuggerHidden]
+        public static void Same(object expected, object actual)
+        {
+            Assert.Same(expected, actual);
+        }
+
+        /// <summary>
+        /// Assert that two objects are not the same.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        /// <param name="actual">The actual value.</param>
+        [DebuggerHidden]
+        public static void NotSame(object expected, object actual)
+        {
+            Assert.NotSame(expected, actual);
+        }
+
+        [DebuggerHidden]
+        public static void Equal(string expected, string actual, string message = null, params object[] args)
+        {
+            try
+            {
+                Assert.Equal(expected, actual);
+            }
+            catch (Exception ex)
+            {
+                if (message == null)
+                    throw;
+
+                var msg = message;
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+        }
+
+        [DebuggerHidden]
+        public static void Equal<T>(T expected, T actual, string message = null, params object[] args)
+        {
+            try
+            {
+                Assert.Equal(expected, actual);
+            }
+            catch (Exception ex)
+            {
+                if (message == null)
+                    throw;
+
+                var msg = message;
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+        }
+
+        [DebuggerHidden]
+        public static void Equal<T>(IEnumerable<T> expected, IEnumerable<T> actual, string message= null, params object[] args)
+        {
+            try
+            {
+                Assert.Equal(expected, actual);
+            }
+            catch (Exception ex)
+            {
+                if (message == null)
+                    throw;
+
+                var msg = message;
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+        }
+
+        [DebuggerHidden]
+        public static void NotEqual<T>(T expected, T actual, string message = null, params object[] args)
+        {
+            try
+            {
+                Assert.NotEqual(expected, actual);
+            }
+            catch (Exception ex)
+            {
+                if (message == null)
+                    throw;
+
+                var msg = message;
+                if (args != null && args.Length > 0)
+                    msg = string.Format(msg, args);
+
+                throw new LuceneAssertionException(msg, ex);
+            }
+           
+        }
+
+
+        [DebuggerHidden]
+        public static void Ok(bool condition, string message = null, params object[] values)
+        {
+            if (!string.IsNullOrWhiteSpace(message))
+            {
+                var exceptionMessage = message;
+
+                if(values != null && values.Length > 0)
+                {
+                    exceptionMessage = String.Format(exceptionMessage, values);
+                }
+
+                Assert.True(condition, exceptionMessage);
+            }
+            else 
+            {
+                Assert.True(condition);    
+            }
+        }
+
+        [DebuggerHidden]
+        public static T Throws<T>(Action code) where T : Exception
+        {
+            return Assert.Throws<T>(code);
+        }
+        
+        #endif
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/TicketAttribute.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/TicketAttribute.cs b/test/Lucene.Net.TestFramework.Core/TicketAttribute.cs
new file mode 100644
index 0000000..80e973b
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/TicketAttribute.cs
@@ -0,0 +1,52 @@
+
+
+namespace Lucene.Net
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Linq;
+    using Xunit.Abstractions;
+    using Xunit.Sdk;
+
+    [TraitDiscoverer("TicketDiscoverer", "TraitExtensibility")]
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    public class TicketAttribute : System.Attribute, Xunit.Sdk.ITraitAttribute
+    {
+        public string Ticket { get; private set; }
+
+        public string Description { get; private set; }
+
+        public TicketAttribute(string ticket, string description)
+        {
+            this.Ticket = ticket;
+            this.Description = description;
+        }
+    }
+
+
+    /// <summary>
+    /// This class discovers all of the tests and test classes that have
+    /// applied the Category attribute
+    /// </summary>
+    public class TicketDiscoverer : ITraitDiscoverer
+    {
+        /// <summary>
+        /// Gets the trait values from the Category attribute.
+        /// </summary>
+        /// <param name="traitAttribute">The trait attribute containing the trait values.</param>
+        /// <returns>The trait values.</returns>
+        public IEnumerable<KeyValuePair<string, string>> GetTraits(IAttributeInfo traitAttribute)
+        {
+            var ctorArgs = traitAttribute.GetConstructorArguments().ToList();
+            var message = "";
+
+            if (ctorArgs.Count > 0)
+                message = ctorArgs[1].ToString();
+
+
+            yield return new KeyValuePair<string, string>("Ticket", ctorArgs[0].ToString());
+            yield return new KeyValuePair<string, string>("Ticket Description", message);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/packages.config
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/packages.config b/test/Lucene.Net.TestFramework.Core/packages.config
new file mode 100644
index 0000000..b71d5c9
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/packages.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ 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.
+
+-->
+<packages>
+  <package id="xunit" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.abstractions" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.assert" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+  <package id="xunit.core" version="2.0.0-beta-build2700" targetFramework="portable-net45+win+wpa81+wp80" />
+</packages>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework.Core/project.json
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework.Core/project.json b/test/Lucene.Net.TestFramework.Core/project.json
new file mode 100644
index 0000000..a6b6ae4
--- /dev/null
+++ b/test/Lucene.Net.TestFramework.Core/project.json
@@ -0,0 +1,34 @@
+{
+    "licenses": ["apache 2.0"],
+      "version": "5.0.0.0",
+    "compilationOptions": {
+        "warningsAsErrors": false,
+        "define": ["XUNIT"]
+    },
+    "sources": ["../src"],
+    "code": "**/*.cs",
+    "commands": {
+        "test": "Xunit.KRunner"
+    },
+
+    
+    "dependencies": {
+        "Xunit.KRunner": "1.0.0-*"
+    },
+
+    "configurations" : {
+        "net451": {},
+        "net45" : { 
+            "dependencies": {
+            }
+        },
+        "k10" : { 
+            "dependencies": {
+                "System.Runtime": "4.0.20.0",
+                "System.Linq": "",
+                "System.Diagnostics.Debug": "4.0.10.0",
+                "System.Threading": ""
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework/Lucene.Net.TestFramework.csproj
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework/Lucene.Net.TestFramework.csproj b/test/Lucene.Net.TestFramework/Lucene.Net.TestFramework.csproj
index b44dcff..2714c6f 100644
--- a/test/Lucene.Net.TestFramework/Lucene.Net.TestFramework.csproj
+++ b/test/Lucene.Net.TestFramework/Lucene.Net.TestFramework.csproj
@@ -23,7 +23,7 @@
   <Import Project="..\..\packages\xunit.core.2.0.0-beta-build2700\build\portable-net45+win+wpa81+wp80\xunit.core.props" Condition="Exists('..\..\packages\xunit.core.2.0.0-beta-build2700\build\portable-net45+win+wpa81+wp80\xunit.core.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProjectGuid>{F0D68FEA-B118-43B6-B760-3FB75CDE766D}</ProjectGuid>
@@ -34,8 +34,8 @@
     <DefaultLanguage>en-US</DefaultLanguage>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <TargetFrameworkProfile>Profile151</TargetFrameworkProfile>
-    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
     <RestorePackages>true</RestorePackages>
   </PropertyGroup>
@@ -57,12 +57,11 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Compile Include="Util\ExtensionMethods.cs" />
+    <Compile Include="Util\BaseDocIdSetTestCase.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Random\RandomExtensions.cs" />
     <Compile Include="Util\LuceneTestCase.cs" />
     <Compile Include="Util\RamUsageTester.cs" />
-    <Compile Include="Util\TestAttribute.cs" />
     <Compile Include="Util\TestUtil.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -77,13 +76,19 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="packages.config" />
+    <None Include="packages.config">
+      <SubType>Designer</SubType>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\src\Lucene.Net.Core\Lucene.Net.Core.csproj">
       <Project>{ad8901c0-209d-4132-80aa-257dbaceecb4}</Project>
       <Name>Lucene.Net.Core</Name>
     </ProjectReference>
+    <ProjectReference Include="..\Lucene.Net.TestFramework.Core\Lucene.Net.TestFramework.Core.csproj">
+      <Project>{438b8450-e93a-425f-9a9b-11d02e8896d5}</Project>
+      <Name>Lucene.Net.TestFramework.Core</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework/Random/RandomExtensions.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework/Random/RandomExtensions.cs b/test/Lucene.Net.TestFramework/Random/RandomExtensions.cs
index eb0112f..00cbc59 100644
--- a/test/Lucene.Net.TestFramework/Random/RandomExtensions.cs
+++ b/test/Lucene.Net.TestFramework/Random/RandomExtensions.cs
@@ -33,12 +33,7 @@ namespace Lucene.Net.Random
     {
 
 
-        public static int AtLeast(this LuceneTestCase instance, int minimumValue)
-        {
-            int min = (LuceneTestCase.TEST_NIGHTLY ? 2 * minimumValue : minimumValue) * LuceneTestCase.RANDOM_MULTIPLIER;
-            int max = min + (min / 2);
-            return instance.Random.NextBetween(min, max);
-        }
+      
 
 	    /// <summary>
 	    /// Returns an integer between the min and max value. This is compatable 

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs b/test/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
new file mode 100644
index 0000000..0292187
--- /dev/null
+++ b/test/Lucene.Net.TestFramework/Util/BaseDocIdSetTestCase.cs
@@ -0,0 +1,226 @@
+/*
+ * 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.
+ */
+
+namespace Lucene.Net.Util
+{
+    using Lucene.Net.Random;
+    using Lucene.Net.Support;
+    using System;
+    using System.Collections;
+    using System.Diagnostics;
+    using DocIdSet = Lucene.Net.Search.DocIdSet;
+    using DocIdSetIterator = Lucene.Net.Search.DocIdSetIterator;
+
+  
+
+    /// <summary>
+    /// Base test class for <seealso cref="DocIdSet"/>s. </summary>
+    public abstract class BaseDocIdSetTestCase<T> : LuceneTestCase
+        where T : Lucene.Net.Search.DocIdSet
+    {
+        /// <summary>
+        /// Create a copy of the given <seealso cref="BitSet"/> which has <code>length</code> bits. </summary>
+        public abstract T CopyOf(BitArray bs, int length);
+
+        /// <summary>
+        /// Create a random set which has <code>numBitsSet</code> of its <code>numBits</code> bits set. </summary>
+        protected internal BitArray RandomSet(int numberOfBits, int numberOfBitsSet)
+        {
+            Debug.Assert(numberOfBitsSet <= numberOfBits);
+            BitArray set = new BitArray(numberOfBits);
+            if (numberOfBitsSet == numberOfBits)
+            {
+                set.Set(0, numberOfBits != 0); //convert int to boolean
+            }
+            else
+            {
+                for (int i = 0; i < numberOfBitsSet; ++i)
+                {
+                    while (true)
+                    {
+                        int o = Random.Next(numberOfBits);
+                        if (!set.Get(o))
+                        {
+                            set.Set(o, true);
+                            break;
+                        }
+                    }
+                }
+            }
+            return set;
+        }
+
+        /// <summary>
+        /// Same as <seealso cref="#randomSet(int, int)"/> but given a load factor. </summary>
+        protected internal BitArray RandomSet(int numBits, float percentSet)
+        {
+            return RandomSet(numBits, (int)(percentSet * numBits));
+        }
+
+        /// <summary>
+        /// Test length=0. </summary>
+        public virtual void TestNoBit()
+        {
+            BitArray bs = new BitArray(1);
+            T copy = CopyOf(bs, 0);
+            AssertEquals(0, bs, copy);
+        }
+
+        /// <summary>
+        /// Test length=1. </summary>
+        public virtual void Test1Bit()
+        {
+            BitArray bs = new BitArray(1);
+            if (Random.NextBoolean())
+            {
+                bs.Set(0, true);
+            }
+            T copy = CopyOf(bs, 1);
+            AssertEquals(1, bs, copy);
+        }
+
+        /// <summary>
+        /// Test length=2. </summary>
+        public virtual void Test2Bits()
+        {
+            BitArray bs = new BitArray(2);
+            if (Random.NextBoolean())
+            {
+                bs.Set(0, true);
+            }
+            if (Random.NextBoolean())
+            {
+                bs.Set(1, true);
+            }
+            T copy = CopyOf(bs, 2);
+            AssertEquals(2, bs, copy);
+        }
+
+        /// <summary>
+        /// Compare the content of the set against a <seealso cref="BitSet"/>. </summary>
+        public virtual void TestAgainstBitSet()
+        {
+            int numBits = Random.NextBetween(100, 1 << 20);
+            // test various random sets with various load factors
+            foreach (float percentSet in new float[] { 0f, 0.0001f, (float)Random.NextDouble() / 2, 0.9f, 1f })
+            {
+                BitArray set = RandomSet(numBits, percentSet);
+                T copy = CopyOf(set, numBits);
+                AssertEquals(numBits, set, copy);
+            }
+            // test one doc
+            BitArray set_ = new BitArray(numBits);
+            set_.Set(0, true); // 0 first
+            T copy_ = CopyOf(set_, numBits);
+            AssertEquals(numBits, set_, copy_);
+            set_.Set(0, false);
+            set_.Set(Random.Next(numBits), true);
+            copy_ = CopyOf(set_, numBits); // then random index
+            AssertEquals(numBits, set_, copy_);
+            // test regular increments
+            for (int inc = 2; inc < 1000; inc += Random.NextBetween(1, 100))
+            {
+                set_ = new BitArray(numBits);
+                for (int d = Random.Next(10); d < numBits; d += inc)
+                {
+                    set_.Set(d, true);
+                }
+                copy_ = CopyOf(set_, numBits);
+                AssertEquals(numBits, set_, copy_);
+            }
+        }
+
+        /// <summary>
+        /// Assert that the content of the <seealso cref="DocIdSet"/> is the same as the content of the <seealso cref="BitSet"/>. </summary>
+        public virtual void AssertEquals(int numBits, BitArray ds1, T ds2)
+        {
+            /*
+            // nextDoc
+            DocIdSetIterator it2 = ds2.GetIterator();
+            if (it2 == null)
+            {
+                Equal(-1, ds1.NextSetBit(0));
+            }
+            else
+            {
+                Equal(-1, it2.DocId);
+                for (int doc = ds1.NextSetBit(0); doc != -1; doc = ds1.NextSetBit(doc + 1))
+                {
+                    Equal(doc, it2.NextDoc());
+                    Equal(doc, it2.DocId);
+                }
+                Equal(DocIdSetIterator.NO_MORE_DOCS, it2.NextDoc());
+                Equal(DocIdSetIterator.NO_MORE_DOCS, it2.DocId);
+            }
+
+            // nextDoc / advance
+            it2 = ds2.GetIterator();
+            if (it2 == null)
+            {
+                Equal(-1, ds1.NextSetBit(0));
+            }
+            else
+            {
+                for (int doc = -1; doc != DocIdSetIterator.NO_MORE_DOCS; )
+                {
+                    if (Random.NextBoolean())
+                    {
+                        doc = ds1.NextSetBit(doc + 1);
+                        if (doc == -1)
+                        {
+                            doc = DocIdSetIterator.NO_MORE_DOCS;
+                        }
+                        Equal(doc, it2.NextDoc());
+                        Equal(doc, it2.DocId);
+                    }
+                    else
+                    {
+                        int target = doc + 1 + Random.Next(Random.NextBoolean() ? 64 : Math.Max(numBits / 8, 1));
+                        doc = ds1.NextSetBit(target);
+                        if (doc == -1)
+                        {
+                            doc = DocIdSetIterator.NO_MORE_DOCS;
+                        }
+                        Equal(doc, it2.Advance(target));
+                        Equal(doc, it2.DocId);
+                    }
+                }
+            }
+
+            // bits()
+            var bits = ds2.GetBits();
+            if (bits != null)
+            {
+                // test consistency between bits and iterator
+                it2 = ds2.GetIterator();
+                for (int previousDoc = -1, doc = it2.NextDoc(); ; previousDoc = doc, doc = it2.NextDoc())
+                {
+                    int max = doc == DocIdSetIterator.NO_MORE_DOCS ? bits.Length : doc;
+                    for (int i = previousDoc + 1; i < max; ++i)
+                    {
+                        Equal(false, bits[i]);
+                    }
+                    if (doc == DocIdSetIterator.NO_MORE_DOCS)
+                    {
+                        break;
+                    }
+                    Equal(true, bits[doc]);
+                }
+            }*/
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/4b4d4d93/test/Lucene.Net.TestFramework/Util/ExtensionMethods.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework/Util/ExtensionMethods.cs b/test/Lucene.Net.TestFramework/Util/ExtensionMethods.cs
deleted file mode 100644
index 94cac09..0000000
--- a/test/Lucene.Net.TestFramework/Util/ExtensionMethods.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.
- */
-
-namespace Lucene.Net.Util
-{
-    using System;
-    using Lucene.Net.Random;
-    /// <summary>
-    /// Extension methods to make writing tests easier.
-    /// </summary>
-    public static class ExtensionMethods
-    {
-        /// <summary>
-        /// Performs a loop for the specified number of times. 
-        /// </summary>
-        /// <param name="value">The number of times to perform a loop.</param>
-        /// <param name="invoke">The code that should be ivnoked for each iteration.</param>
-        public static void Times(this int value, Action<int> invoke)
-        {
-            for(var i = 0; i < value; i++)
-            {
-                invoke(i);
-            }
-        }
-
-    }
-}