blob: 63c8cfbb64d67c9e416637c744ea85d6fb08260d [file] [log] [blame]
using Lucene.Net.Attributes;
using Lucene.Net.Support;
using NUnit.Framework;
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 TestBroadWord : LuceneTestCase
{
private void TstRank(long x)
{
Assert.AreEqual(Number.BitCount(x), BroadWord.BitCount(x), "rank(" + x + ")");
}
[Test]
public virtual void TestRank1()
{
TstRank(0L);
TstRank(1L);
TstRank(3L);
TstRank(0x100L);
TstRank(0x300L);
TstRank(unchecked((long)0x8000000000000001L));
}
private void TstSelect(long x, int r, int exp)
{
Assert.AreEqual(exp, BroadWord.SelectNaive(x, r), "selectNaive(" + x + "," + r + ")");
Assert.AreEqual(exp, BroadWord.Select(x, r), "select(" + x + "," + r + ")");
}
[Test]
public virtual void TestSelectFromZero()
{
TstSelect(0L, 1, 72);
}
[Test]
public virtual void TestSelectSingleBit()
{
for (int i = 0; i < 64; i++)
{
TstSelect((1L << i), 1, i);
}
}
[Test]
public virtual void TestSelectTwoBits()
{
for (int i = 0; i < 64; i++)
{
for (int j = i + 1; j < 64; j++)
{
long x = (1L << i) | (1L << j);
//System.out.println(getName() + " i: " + i + " j: " + j);
TstSelect(x, 1, i);
TstSelect(x, 2, j);
TstSelect(x, 3, 72);
}
}
}
[Test]
public virtual void TestSelectThreeBits()
{
for (int i = 0; i < 64; i++)
{
for (int j = i + 1; j < 64; j++)
{
for (int k = j + 1; k < 64; k++)
{
long x = (1L << i) | (1L << j) | (1L << k);
TstSelect(x, 1, i);
TstSelect(x, 2, j);
TstSelect(x, 3, k);
TstSelect(x, 4, 72);
}
}
}
}
[Test]
public virtual void TestSelectAllBits()
{
for (int i = 0; i < 64; i++)
{
TstSelect(unchecked((long)0xFFFFFFFFFFFFFFFFL), i + 1, i);
}
}
[Test, LongRunningTest]
public virtual void TestPerfSelectAllBitsBroad()
{
for (int j = 0; j < 100000; j++) // 1000000 for real perf test
{
for (int i = 0; i < 64; i++)
{
Assert.AreEqual(i, BroadWord.Select(unchecked((long)0xFFFFFFFFFFFFFFFFL), i + 1));
}
}
}
[Test]
public virtual void TestPerfSelectAllBitsNaive()
{
for (int j = 0; j < 10000; j++) // real perftest: 1000000
{
for (int i = 0; i < 64; i++)
{
Assert.AreEqual(i, BroadWord.SelectNaive(unchecked((long)0xFFFFFFFFFFFFFFFFL), i + 1));
}
}
}
[Test]
public virtual void TestSmalleru_87_01()
{
// 0 <= arguments < 2 ** (k-1), k=8, see paper
for (long i = 0x0L; i <= 0x7FL; i++)
{
for (long j = 0x0L; i <= 0x7FL; i++)
{
long ii = i * BroadWord.L8_L;
long jj = j * BroadWord.L8_L;
Assert.AreEqual(ToStringUtils.Int64Hex((i < j) ? unchecked(0x80L * BroadWord.L8_L) : 0x0L), ToStringUtils.Int64Hex(BroadWord.SmallerUpTo7_8(ii, jj)), ToStringUtils.Int64Hex(ii) + " < " + ToStringUtils.Int64Hex(jj));
}
}
}
[Test]
public virtual void TestSmalleru_8_01()
{
// 0 <= arguments < 2 ** k, k=8, see paper
for (long i = 0x0L; i <= 0xFFL; i++)
{
for (long j = 0x0L; i <= 0xFFL; i++)
{
long ii = i * BroadWord.L8_L;
long jj = j * BroadWord.L8_L;
Assert.AreEqual(ToStringUtils.Int64Hex((i < j) ? unchecked(0x80L * BroadWord.L8_L) : 0x0L), ToStringUtils.Int64Hex(BroadWord.Smalleru_8(ii, jj)), ToStringUtils.Int64Hex(ii) + " < " + ToStringUtils.Int64Hex(jj));
}
}
}
[Test]
public virtual void TestNotEquals0_8()
{
// 0 <= arguments < 2 ** k, k=8, see paper
for (long i = 0x0L; i <= 0xFFL; i++)
{
long ii = i * BroadWord.L8_L;
Assert.AreEqual(ToStringUtils.Int64Hex((i != 0L) ? unchecked(0x80L * BroadWord.L8_L) : 0x0L), ToStringUtils.Int64Hex(BroadWord.NotEquals0_8(ii)), ToStringUtils.Int64Hex(ii) + " <> 0");
}
}
}
}