Issue 24: IllegalArgumentException in FilterDataAccess (file1)
Issue 26: UnsupportedOperationException when patching empty base revision (file2)
Issue 25: IOException: Underflow. Rewind past end of the slice in InflaterDataAccess

Repository creation:
hg init

RevlogWriter:
		File repo = new File("/temp/hg/test-log/status-5");
		new File(repo, ".hg/store/data").mkdirs();
		RevlogWriter changelog = new RevlogWriter(repo, ".hg/store/00changelog", false);
		RevlogWriter manifest = new RevlogWriter(repo, ".hg/store/00manifest", false);
		RevlogWriter file1 = new RevlogWriter(repo, ".hg/store/data/file1", false);
		RevlogWriter file2 = new RevlogWriter(repo, ".hg/store/data/file2", false);
		RevlogWriter file3 = new RevlogWriter(repo, ".hg/store/data/file3", true);
		//
		PrintWriter pw = new PrintWriter(new FileWriter(new File(repo, ".hg/store/fncache")));
		pw.append("data/file1.i");
		pw.append('\n');
		pw.append("data/file2.i");
		pw.append('\n');
		pw.append("data/file3.i");
		pw.append('\n');
		pw.append("data/file3.d");
		pw.append('\n');
		pw.close();
		//
		changelog.begin();
		manifest.begin();
		file1.begin();
		file2.begin();
		file3.begin();
		final List<String> filesList = Arrays.asList("file1", "file2", "file3");
		//
		// file 1 has zero-sized patch revision for a non-empty base revision 
		final byte[] file1InitData = "garbage".getBytes();
		file1.writeUncompressed(-1, -1, 0, 0, file1InitData);
		file1.writeRevlogHeader(0, file1InitData.length, 0, 1, 0, -1, file1.calculateRevision(0, -1, file1InitData));
		file1.writeUncompressed(1, -1, 0, 2, patchEntry(3, 5, new byte[] {'A'} ), 6, file1.calculateRevision(1, -1, "garAge".getBytes()));
		//
		// file 2 has zero-sized revision patched by a regular patch
		file2.writeUncompressed(-1, -1, 0, 0, new byte[0]);
		file2.writeUncompressed(0, -1, 0, 1, patchEntry(0, 0, file1InitData), 7, file2.calculateRevision(0, -1, file1InitData));
		file2.writeUncompressed(1, -1, 0, 2, patchEntry(0, 3, new byte[] {'C', 'A', 'B'}), 7, file2.calculateRevision(1, -1, "CABbage".getBytes()));
		//
		// file 3 has separate index and data storage, with data compressed. Pretty much like file1, just another branch in the code
		file3.writeCompressed(-1, -1, 0, 0, file1InitData, file1InitData.length, file3.calculateRevision(-1, -1, file1InitData));
		file3.writeCompressed(0, -1, 0, 1, new byte[0], file1InitData.length, file3.calculateRevision(0, -1, file1InitData));
		file3.writeCompressed(1, -1, 0, 2, patchEntry(0, 4, "OUTR".getBytes()), 7, file3.calculateRevision(1, -1, "OUTRage".getBytes()));
		//
		ManifestEntryBuilder mb = new ManifestEntryBuilder();
		ChangelogEntryBuilder csb = new ChangelogEntryBuilder();
		//
		mb.reset().add("file1", file1.getRevision(0)).add("file2", file2.getRevision(0)).add("file3", file3.getRevision(0));
		manifest.writeUncompressed(-1, -1, 0, 0, mb.build()); // manifest revision 0
		mb.reset().add("file1", file1.getRevision(1)).add("file2", file2.getRevision(1)).add("file3", file3.getRevision(1));
		manifest.writeUncompressed(0, -1, 1, 1, mb.build()); // manifest revision 1
		mb.reset().add("file1", file1.getRevision(2)).add("file2", file2.getRevision(2)).add("file3", file3.getRevision(2));
		manifest.writeUncompressed(1, -1, 2, 2, mb.build()); // manifest revision 2
		//
		csb.setModified(filesList);
		//
		changelog.writeUncompressed(-1, -1, 0, 0, csb.build(manifest.getRevision(0), "1"));
		changelog.writeUncompressed(0, -1, 1, 1, csb.build(manifest.getRevision(1), "2"));
		changelog.writeUncompressed(1, -1, 2, 2, csb.build(manifest.getRevision(2), "3"));
		//
		changelog.end();
		manifest.end();
		file1.end();
		file2.end();
		file3.end();



hg verify shall run without issues
hg up

Note, files need to be touched for HgWorkingCopyStatusCollector to actually deal with their revlog content
You may use 'hg status' to clear state of all files (tests touch them selectively as needed)