public virtual void TestRandom() { int iters = AtLeast(10); for (int iter = 0; iter < iters; iter++) { int numBytes = TestUtil.NextInt(Random(), 1, 200000); sbyte[] expected = new sbyte[numBytes]; int blockBits = TestUtil.NextInt(Random(), 8, 15); BytesStore bytes = new BytesStore(blockBits); if (VERBOSE) { Console.WriteLine("TEST: iter=" + iter + " numBytes=" + numBytes + " blockBits=" + blockBits); } int pos = 0; while (pos < numBytes) { int op = Random().Next(8); if (VERBOSE) { Console.WriteLine(" cycle pos=" + pos); } switch (op) { case 0: { // write random byte sbyte b = (sbyte)Random().Next(256); if (VERBOSE) { Console.WriteLine(" writeByte b=" + b); } expected[pos++] = b; bytes.WriteByte(b); } break; case 1: { // write random byte[] int len = Random().Next(Math.Min(numBytes - pos, 100)); sbyte[] temp = new sbyte[len]; Random().NextBytes(temp); if (VERBOSE) { Console.WriteLine(" writeBytes len=" + len + " bytes=" + Arrays.ToString(temp)); } Array.Copy(temp, 0, expected, pos, temp.Length); bytes.WriteBytes(temp, 0, temp.Length); pos += len; } break; case 2: { // write int @ absolute pos if (pos > 4) { int x = Random().Next(); int randomPos = Random().Next(pos - 4); if (VERBOSE) { Console.WriteLine(" abs writeInt pos=" + randomPos + " x=" + x); } bytes.writeInt(randomPos, x); expected[randomPos++] = (sbyte)(x >> 24); expected[randomPos++] = (sbyte)(x >> 16); expected[randomPos++] = (sbyte)(x >> 8); expected[randomPos++] = (sbyte)x; } } break; case 3: { // reverse bytes if (pos > 1) { int len = TestUtil.NextInt(Random(), 2, Math.Min(100, pos)); int start; if (len == pos) { start = 0; } else { start = Random().Next(pos - len); } int end = start + len - 1; if (VERBOSE) { Console.WriteLine(" reverse start=" + start + " end=" + end + " len=" + len + " pos=" + pos); } bytes.reverse(start, end); while (start <= end) { sbyte b = expected[end]; expected[end] = expected[start]; expected[start] = b; start++; end--; } } } break; case 4: { // abs write random byte[] if (pos > 2) { int randomPos = Random().Next(pos - 1); int len = TestUtil.NextInt(Random(), 1, Math.Min(pos - randomPos - 1, 100)); sbyte[] temp = new sbyte[len]; Random().NextBytes(temp); if (VERBOSE) { Console.WriteLine(" abs writeBytes pos=" + randomPos + " len=" + len + " bytes=" + Arrays.ToString(temp)); } Array.Copy(temp, 0, expected, randomPos, temp.Length); bytes.WriteBytes(randomPos, temp, 0, temp.Length); } } break; case 5: { // copyBytes if (pos > 1) { int src = Random().Next(pos - 1); int dest = TestUtil.NextInt(Random(), src + 1, pos - 1); int len = TestUtil.NextInt(Random(), 1, Math.Min(300, pos - dest)); if (VERBOSE) { Console.WriteLine(" copyBytes src=" + src + " dest=" + dest + " len=" + len); } Array.Copy(expected, src, expected, dest, len); bytes.copyBytes(src, dest, len); } } break; case 6: { // skip int len = Random().Next(Math.Min(100, numBytes - pos)); if (VERBOSE) { Console.WriteLine(" skip len=" + len); } pos += len; bytes.skipBytes(len); // NOTE: must fill in zeros in case truncate was // used, else we get false fails: if (len > 0) { sbyte[] zeros = new sbyte[len]; bytes.WriteBytes(pos - len, zeros, 0, len); } } break; case 7: { // absWriteByte if (pos > 0) { int dest = Random().Next(pos); sbyte b = (sbyte)Random().Next(256); expected[dest] = b; bytes.WriteByte(dest, b); } break; } } Assert.AreEqual(pos, bytes.Position); if (pos > 0 && Random().Next(50) == 17) { // truncate int len = TestUtil.NextInt(Random(), 1, Math.Min(pos, 100)); bytes.truncate(pos - len); pos -= len; Arrays.fill(expected, pos, pos + len, (sbyte)0); if (VERBOSE) { Console.WriteLine(" truncate len=" + len + " newPos=" + pos); } } if ((pos > 0 && Random().Next(200) == 17)) { Verify(bytes, expected, pos); } } BytesStore bytesToVerify; if (Random().NextBoolean()) { if (VERBOSE) { Console.WriteLine("TEST: save/load final bytes"); } Directory dir = NewDirectory(); IndexOutput @out = dir.CreateOutput("bytes", IOContext.DEFAULT); bytes.writeTo(@out); @out.Dispose(); IndexInput @in = dir.OpenInput("bytes", IOContext.DEFAULT); bytesToVerify = new BytesStore(@in, numBytes, TestUtil.NextInt(Random(), 256, int.MaxValue)); @in.Dispose(); dir.Dispose(); } else { bytesToVerify = bytes; } Verify(bytesToVerify, expected, numBytes); } }