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()); } } } }