public void TestCreateWriteRead() { NPOIFSFileSystem fs = new NPOIFSFileSystem(); // Initially has a BAT but not SBAT Assert.AreEqual(POIFSConstants.FAT_SECTOR_BLOCK, fs.GetNextBlock(0)); Assert.AreEqual(POIFSConstants.END_OF_CHAIN, fs.GetNextBlock(1)); Assert.AreEqual(POIFSConstants.UNUSED_BLOCK, fs.GetNextBlock(2)); // Check that the SBAT is empty Assert.AreEqual(POIFSConstants.END_OF_CHAIN, fs.Root.Property.StartBlock); // Write and read it MemoryStream baos = new MemoryStream(); fs.WriteFilesystem(baos); byte[] temp = baos.ToArray(); fs = new NPOIFSFileSystem(new MemoryStream(temp)); //fs = new NPOIFSFileSystem(new MemoryStream(baos.ToArray())); // Check it's still like that Assert.AreEqual(POIFSConstants.FAT_SECTOR_BLOCK, fs.GetNextBlock(0)); Assert.AreEqual(POIFSConstants.END_OF_CHAIN, fs.GetNextBlock(1)); Assert.AreEqual(POIFSConstants.UNUSED_BLOCK, fs.GetNextBlock(2)); Assert.AreEqual(POIFSConstants.END_OF_CHAIN, fs.Root.Property.StartBlock); // Now add a normal stream and a mini stream // TODO // TODO The rest of the test }
public void TestGetFreeBlockWithNoneSpare() { NPOIFSFileSystem fs = new NPOIFSFileSystem(_inst.OpenResourceAsStream("BlockSize512.zvi")); int free; Assert.AreEqual(POIFSConstants.FAT_SECTOR_BLOCK, fs.GetNextBlock(99)); for (int i = 100; i < 128; i++) Assert.AreEqual(POIFSConstants.UNUSED_BLOCK, fs.GetNextBlock(i)); Assert.AreEqual(true, fs.GetBATBlockAndIndex(0).Block.HasFreeSectors); for (int i = 100; i < 128; i++) fs.SetNextBlock(i, POIFSConstants.END_OF_CHAIN); Assert.AreEqual(false, fs.GetBATBlockAndIndex(0).Block.HasFreeSectors); try { Assert.AreEqual(false, fs.GetBATBlockAndIndex(128).Block.HasFreeSectors); Assert.Fail("Should only be one BAT"); } //catch (IndexOutOfRangeException) catch(ArgumentOutOfRangeException) { } // Now ask for a free one, will need to extend the file Assert.AreEqual(129, fs.GetFreeBlock()); Assert.AreEqual(false, fs.GetBATBlockAndIndex(0).Block.HasFreeSectors); Assert.AreEqual(true, fs.GetBATBlockAndIndex(128).Block.HasFreeSectors); Assert.AreEqual(POIFSConstants.FAT_SECTOR_BLOCK, fs.GetNextBlock(128)); Assert.AreEqual(POIFSConstants.UNUSED_BLOCK, fs.GetNextBlock(129)); // Fill up to hold 109 BAT blocks for (int i = 0; i < 109; i++) { fs.GetFreeBlock(); int startOffset = i * 128; while (fs.GetBATBlockAndIndex(startOffset).Block.HasFreeSectors) { free = fs.GetFreeBlock(); fs.SetNextBlock(free, POIFSConstants.END_OF_CHAIN); } } Assert.AreEqual(false, fs.GetBATBlockAndIndex(109 * 128 - 1).Block.HasFreeSectors); try { Assert.AreEqual(false, fs.GetBATBlockAndIndex(109 * 128).Block.HasFreeSectors); Assert.Fail("Should only be 109 BATs"); } // catch (IndexOutOfRangeException) catch(ArgumentOutOfRangeException) { } free = fs.GetFreeBlock(); Assert.AreEqual(false, fs.GetBATBlockAndIndex(109 * 128 - 1).Block.HasFreeSectors); Assert.AreEqual(true, fs.GetBATBlockAndIndex(110 * 128 - 1).Block.HasFreeSectors); try { Assert.AreEqual(false, fs.GetBATBlockAndIndex(110 * 128).Block.HasFreeSectors); Assert.Fail("Should only be 110 BATs"); } //catch (IndexOutOfRangeException) catch(ArgumentOutOfRangeException) { } for (int i = 109; i < 109 + 127; i++) { fs.GetFreeBlock(); int startOffset = i * 128; while (fs.GetBATBlockAndIndex(startOffset).Block.HasFreeSectors) { free = fs.GetFreeBlock(); fs.SetNextBlock(free, POIFSConstants.END_OF_CHAIN); } } // Should now have 109+127 = 236 BATs Assert.AreEqual(false, fs.GetBATBlockAndIndex(236 * 128 - 1).Block.HasFreeSectors); try { Assert.AreEqual(false, fs.GetBATBlockAndIndex(236 * 128).Block.HasFreeSectors); Assert.Fail("Should only be 236 BATs"); } catch (ArgumentOutOfRangeException) { } // Ask for another, will get our 2nd XBAT free = fs.GetFreeBlock(); Assert.AreEqual(false, fs.GetBATBlockAndIndex(236 * 128 - 1).Block.HasFreeSectors); Assert.AreEqual(true, fs.GetBATBlockAndIndex(237 * 128 - 1).Block.HasFreeSectors); try { Assert.AreEqual(false, fs.GetBATBlockAndIndex(237 * 128).Block.HasFreeSectors); Assert.Fail("Should only be 237 BATs"); } // catch (IndexOutOfRangeException) { } catch (ArgumentOutOfRangeException) { } // Check the counts int numBATs = 0; int numXBATs = 0; for (int i = 0; i < 237 * 128; i++) { if (fs.GetNextBlock(i) == POIFSConstants.FAT_SECTOR_BLOCK) { numBATs++; } if (fs.GetNextBlock(i) == POIFSConstants.DIFAT_SECTOR_BLOCK) { numXBATs++; } } Assert.AreEqual(237, numBATs); #if !HIDE_UNREACHABLE_CODE if (1 == 2) { // TODO Fix this - actual is 128 Assert.AreEqual(2, numXBATs); } #endif MemoryStream stream = new MemoryStream(); fs.WriteFilesystem(stream); HeaderBlock header = new HeaderBlock(new MemoryStream(stream.ToArray())); Assert.AreEqual(237, header.BATCount); #if !HIDE_UNREACHABLE_CODE if (1 == 2) // TODO Fix this - actual is 128 { Assert.AreEqual(2, header.XBATCount); fs = new NPOIFSFileSystem(new MemoryStream(stream.ToArray())); } #endif }