/** * Returns the BATBlock that handles the specified offset, * and the relative index within it */ public override BATBlockAndIndex GetBATBlockAndIndex(int offset) { return(BATBlock.GetBATBlockAndIndex(offset, _header, _bat_blocks)); }
public void TestGetBATBlockAndIndex() { HeaderBlock header = new HeaderBlock(POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS); List <BATBlock> blocks = new List <BATBlock>(); int offset; // First, try a one BAT block file header.BATCount = (1); blocks.Add( BATBlock.CreateBATBlock(header.BigBlockSize, new ByteBuffer(512, 512)) ); offset = 0; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1; Assert.AreEqual(1, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 127; Assert.AreEqual(127, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); // Now go for one with multiple BAT blocks header.BATCount = (2); blocks.Add( BATBlock.CreateBATBlock(header.BigBlockSize, new ByteBuffer(512, 512)) ); offset = 0; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 127; Assert.AreEqual(127, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 128; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 129; Assert.AreEqual(1, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); // The XBAT count makes no difference, as we flatten in memory header.BATCount = (1); header.XBATCount = (1); offset = 0; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 126; Assert.AreEqual(126, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 127; Assert.AreEqual(127, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 128; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 129; Assert.AreEqual(1, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); // Check with the bigger block size too header = new HeaderBlock(POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS); offset = 0; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1022; Assert.AreEqual(1022, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1023; Assert.AreEqual(1023, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1024; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); // Biggr block size, back to real BATs header.BATCount = (2); offset = 0; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1022; Assert.AreEqual(1022, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1023; Assert.AreEqual(1023, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(0, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); offset = 1024; Assert.AreEqual(0, BATBlock.GetBATBlockAndIndex(offset, header, blocks).Index); Assert.AreEqual(1, blocks.IndexOf(BATBlock.GetBATBlockAndIndex(offset, header, blocks).Block)); }