private void Verify(BytesStore bytes, byte[] expected, int totalLength)
{
Assert.AreEqual(totalLength, bytes.Position);
if (totalLength == 0)
{
return;
}
if (VERBOSE)
{
Console.WriteLine(" verify...");
}
// First verify whole thing in one blast:
byte[] actual = new byte[totalLength];
if (Random.NextBoolean())
{
if (VERBOSE)
{
Console.WriteLine(" bulk: reversed");
}
// reversed
FST.BytesReader r2 = bytes.GetReverseReader();
Assert.IsTrue(r2.IsReversed);
r2.Position = totalLength - 1;
r2.ReadBytes(actual, 0, actual.Length);
int start = 0;
int end = totalLength - 1;
while (start < end)
{
byte b = actual[start];
actual[start] = actual[end];
actual[end] = b;
start++;
end--;
}
}
else
{
// forward
if (VERBOSE)
{
Console.WriteLine(" bulk: forward");
}
FST.BytesReader r3 = bytes.GetForwardReader();
Assert.IsFalse(r3.IsReversed);
r3.ReadBytes(actual, 0, actual.Length);
}
for (int i = 0; i < totalLength; i++)
{
assertEquals("byte @ index=" + i, expected[i], actual[i]);
}
FST.BytesReader r;
// Then verify ops:
bool reversed = Random.NextBoolean();
if (reversed)
{
if (VERBOSE)
{
Console.WriteLine(" ops: reversed");
}
r = bytes.GetReverseReader();
}
else
{
if (VERBOSE)
{
Console.WriteLine(" ops: forward");
}
r = bytes.GetForwardReader();
}
if (totalLength > 1)
{
int numOps = TestUtil.NextInt32(Random, 100, 200);
for (int op = 0; op < numOps; op++)
{
int numBytes = Random.Next(Math.Min(1000, totalLength - 1));
int pos;
if (reversed)
{
pos = TestUtil.NextInt32(Random, numBytes, totalLength - 1);
}
else
{
pos = Random.Next(totalLength - numBytes);
}
if (VERBOSE)
{
Console.WriteLine(" op iter=" + op + " reversed=" + reversed + " numBytes=" + numBytes + " pos=" + pos);
}
byte[] temp = new byte[numBytes];
r.Position = pos;
Assert.AreEqual(pos, r.Position);
r.ReadBytes(temp, 0, temp.Length);
for (int i = 0; i < numBytes; i++)
{
byte expectedByte;
if (reversed)
{
expectedByte = expected[pos - i];
}
else
{
expectedByte = expected[pos + i];
}
assertEquals("byte @ index=" + i, expectedByte, temp[i]);
}
int left;
int expectedPos;
if (reversed)
{
expectedPos = pos - numBytes;
left = (int)r.Position;
}
else
{
expectedPos = pos + numBytes;
left = (int)(totalLength - r.Position);
}
Assert.AreEqual(expectedPos, r.Position);
if (left > 4)
{
int skipBytes = Random.Next(left - 4);
int expectedInt = 0;
if (reversed)
{
expectedPos -= skipBytes;
expectedInt |= (expected[expectedPos--] & 0xFF) << 24;
expectedInt |= (expected[expectedPos--] & 0xFF) << 16;
expectedInt |= (expected[expectedPos--] & 0xFF) << 8;
expectedInt |= (expected[expectedPos--] & 0xFF);
}
else
{
expectedPos += skipBytes;
expectedInt |= (expected[expectedPos++] & 0xFF) << 24;
expectedInt |= (expected[expectedPos++] & 0xFF) << 16;
expectedInt |= (expected[expectedPos++] & 0xFF) << 8;
expectedInt |= (expected[expectedPos++] & 0xFF);
}
if (VERBOSE)
{
Console.WriteLine(" skip numBytes=" + skipBytes);
Console.WriteLine(" readInt");
}
r.SkipBytes(skipBytes);
Assert.AreEqual(expectedInt, r.ReadInt32());
}
}
}
}