blob: a71ef90226b42b956004e12e5ca649ca7cdf4e31 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using Lucene.Net.Search;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using Assert = Lucene.Net.TestFramework.Assert;
using BitSet = J2N.Collections.BitSet;
namespace Lucene.Net.Util
{
/*
* 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.
*/
[TestFixture]
public class TestWAH8DocIdSet : BaseDocIdSetTestCase<WAH8DocIdSet>
{
public override WAH8DocIdSet CopyOf(BitSet bs, int length)
{
int indexInterval = TestUtil.NextInt32(Random, 8, 256);
WAH8DocIdSet.Builder builder = (WAH8DocIdSet.Builder)(new WAH8DocIdSet.Builder()).SetIndexInterval(indexInterval);
for (int i = bs.NextSetBit(0); i != -1; i = bs.NextSetBit(i + 1))
{
builder.Add(i);
}
return builder.Build();
}
public WAH8DocIdSet CopyOf(OpenBitSet bs, int length)
{
int indexInterval = TestUtil.NextInt32(Random, 8, 256);
WAH8DocIdSet.Builder builder = (WAH8DocIdSet.Builder)(new WAH8DocIdSet.Builder()).SetIndexInterval(indexInterval);
for (int i = bs.NextSetBit(0); i != -1; i = bs.NextSetBit(i + 1))
{
builder.Add(i);
}
return builder.Build();
}
public override void AssertEquals(int numBits, BitSet ds1, WAH8DocIdSet ds2)
{
base.AssertEquals(numBits, ds1, ds2);
Assert.AreEqual(ds1.Cardinality, ds2.Cardinality());
}
//public override void AssertEquals(int numBits, OpenBitSet ds1, WAH8DocIdSet ds2)
//{
// base.AssertEquals(numBits, ds1, ds2);
// Assert.AreEqual(ds1.Cardinality(), ds2.Cardinality());
//}
[Test]
public virtual void TestUnion()
{
int numBits = TestUtil.NextInt32(Random, 100, 1 << 20);
int numDocIdSets = TestUtil.NextInt32(Random, 0, 4);
IList<BitSet> fixedSets = new List<BitSet>(numDocIdSets);
for (int i = 0; i < numDocIdSets; ++i)
{
fixedSets.Add(RandomSet(numBits, Random.NextSingle() / 16));
}
IList<WAH8DocIdSet> compressedSets = new List<WAH8DocIdSet>(numDocIdSets);
foreach (BitSet set in fixedSets)
{
compressedSets.Add(CopyOf(set, numBits));
}
WAH8DocIdSet union = WAH8DocIdSet.Union(compressedSets);
BitSet expected = new BitSet(numBits);
foreach (BitSet set in fixedSets)
{
for (int doc = set.NextSetBit(0); doc != -1; doc = set.NextSetBit(doc + 1))
{
expected.Set(doc);
}
}
AssertEquals(numBits, expected, union);
}
/// <summary>
/// Create a random set which has <paramref name="numBitsSet"/> of its <paramref name="numBits"/> bits set. </summary>
protected static OpenBitSet RandomOpenSet(int numBits, int numBitsSet)
{
if (Debugging.AssertsEnabled) Debugging.Assert(numBitsSet <= numBits);
OpenBitSet set = new OpenBitSet(numBits);
Random random = Random;
if (numBitsSet == numBits)
{
set.Set(0, numBits);
}
else
{
for (int i = 0; i < numBitsSet; ++i)
{
while (true)
{
int o = random.Next(numBits);
if (!set.Get(o))
{
set.Set(o);
break;
}
}
}
}
return set;
}
/// <summary>
/// Same as <see cref="RandomSet(int, int)"/> but given a load factor. </summary>
protected static OpenBitSet RandomOpenSet(int numBits, float percentSet)
{
return RandomOpenSet(numBits, (int)(percentSet * numBits));
}
/// <summary>
/// Assert that the content of the <see cref="DocIdSet"/> is the same as the content of the <see cref="OpenBitSet"/>.
/// </summary>
#pragma warning disable xUnit1013
public virtual void AssertEquals(int numBits, OpenBitSet ds1, WAH8DocIdSet ds2)
#pragma warning restore xUnit1013
{
// nextDoc
DocIdSetIterator it2 = ds2.GetIterator();
if (it2 == null)
{
Assert.AreEqual(-1, ds1.NextSetBit(0));
}
else
{
Assert.AreEqual(-1, it2.DocID);
for (int doc = ds1.NextSetBit(0); doc != -1; doc = ds1.NextSetBit(doc + 1))
{
Assert.AreEqual(doc, it2.NextDoc());
Assert.AreEqual(doc, it2.DocID);
}
Assert.AreEqual(DocIdSetIterator.NO_MORE_DOCS, it2.NextDoc());
Assert.AreEqual(DocIdSetIterator.NO_MORE_DOCS, it2.DocID);
}
// nextDoc / advance
it2 = ds2.GetIterator();
if (it2 == null)
{
Assert.AreEqual(-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;
}
Assert.AreEqual(doc, it2.NextDoc());
Assert.AreEqual(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;
}
Assert.AreEqual(doc, it2.Advance(target));
Assert.AreEqual(doc, it2.DocID);
}
}
}
// bits()
IBits bits = ds2.Bits;
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)
{
Assert.AreEqual(false, bits.Get(i));
}
if (doc == DocIdSetIterator.NO_MORE_DOCS)
{
break;
}
Assert.AreEqual(true, bits.Get(doc));
}
}
Assert.AreEqual(ds1.Cardinality(), ds2.Cardinality());
}
[Test]
public virtual void TestIntersection()
{
int numBits = TestUtil.NextInt32(Random, 100, 1 << 20);
int numDocIdSets = TestUtil.NextInt32(Random, 1, 4);
IList<OpenBitSet> fixedSets = new List<OpenBitSet>(numDocIdSets);
for (int i = 0; i < numDocIdSets; ++i)
{
fixedSets.Add(RandomOpenSet(numBits, Random.NextSingle()));
}
IList<WAH8DocIdSet> compressedSets = new List<WAH8DocIdSet>(numDocIdSets);
foreach (OpenBitSet set in fixedSets)
{
compressedSets.Add(CopyOf(set, numBits));
}
WAH8DocIdSet union = WAH8DocIdSet.Intersect(compressedSets);
OpenBitSet expected = new OpenBitSet(numBits);
expected.Set(0, expected.Length);
foreach (OpenBitSet set in fixedSets)
{
for (int previousDoc = -1, doc = set.NextSetBit(0); ; previousDoc = doc, doc = set.NextSetBit(doc + 1))
{
if (doc == -1)
{
expected.Clear(previousDoc + 1, set.Length);
break;
}
else
{
expected.Clear(previousDoc + 1, doc);
}
}
}
AssertEquals(numBits, expected, union);
}
}
}