public void AddingSiblingFiles() { var table = new HierarchicalRomFileTable(); var itemC1 = new RomFileInfo { Length = 1, Offset = 1 }; var itemC2 = new RomFileInfo { Length = 2, Offset = 2 }; var itemC3 = new RomFileInfo { Length = 3, Offset = 3 }; table.AddFile("/a/b/c1", ref itemC1); table.AddFile("/a/b/c2", ref itemC2); table.AddFile("/a/b/c3", ref itemC3); table.TryOpenFile("/a/b/c1", out RomFileInfo actualItemC1); table.TryOpenFile("/a/b/c2", out RomFileInfo actualItemC2); table.TryOpenFile("/a/b/c3", out RomFileInfo actualItemC3); Assert.Equal(itemC1, actualItemC1); Assert.Equal(itemC2, actualItemC2); Assert.Equal(itemC3, actualItemC3); }
public void AddingCousinFiles() { var table = new HierarchicalRomFileTable(); var itemB1 = new RomFileInfo { Length = 1, Offset = 1 }; var itemB2 = new RomFileInfo { Length = 2, Offset = 2 }; var itemB3 = new RomFileInfo { Length = 3, Offset = 3 }; table.AddFile("/a/b1/c", ref itemB1); table.AddFile("/a/b2/c", ref itemB2); table.AddFile("/a/b3/c", ref itemB3); table.TryOpenFile("/a/b1/c", out RomFileInfo actualItemB1); table.TryOpenFile("/a/b2/c", out RomFileInfo actualItemB2); table.TryOpenFile("/a/b3/c", out RomFileInfo actualItemB3); Assert.Equal(itemB1, actualItemB1); Assert.Equal(itemB2, actualItemB2); Assert.Equal(itemB3, actualItemB3); }
public void ChildFileIterationPeek() { var table = new HierarchicalRomFileTable(); var itemA = new RomFileInfo { Length = 1, Offset = 1 }; var itemB = new RomFileInfo { Length = 2, Offset = 2 }; table.AddFile("/a/a", ref itemA); table.AddFile("/a/b", ref itemB); table.TryOpenDirectory("/a", out FindPosition position); table.TryOpenFile(position.NextFile, out RomFileInfo peekItemA); Assert.Equal(itemA, peekItemA); table.FindNextFile(ref position, out RomFileInfo iterateItemA, out _); Assert.Equal(itemA, iterateItemA); table.TryOpenFile(position.NextFile, out RomFileInfo peekItemB); Assert.Equal(itemB, peekItemB); table.FindNextFile(ref position, out RomFileInfo iterateItemB, out _); Assert.Equal(itemB, iterateItemB); }
public void AddingEmptyPathThrows() { var table = new HierarchicalRomFileTable(); var item = new RomFileInfo(); Assert.Throws <ArgumentException>(() => table.AddFile("", ref item)); }
public void ChildFileIteration() { const int fileCount = 10; var table = new HierarchicalRomFileTable(); for (int i = 0; i < fileCount; i++) { var item = new RomFileInfo { Length = i, Offset = i }; table.AddFile($"/a/{i}", ref item); } bool openDirSuccess = table.TryOpenDirectory("/a", out FindPosition position); Assert.True(openDirSuccess, "Error opening directory"); for (int i = 0; i < fileCount; i++) { var expectedItem = new RomFileInfo { Length = i, Offset = i }; string expectedName = i.ToString(); bool success = table.FindNextFile(ref position, out RomFileInfo actualItem, out string actualName); Assert.True(success, $"Failed reading file {i}"); Assert.Equal(expectedItem, actualItem); Assert.Equal(expectedName, actualName); } bool endOfFilesSuccess = table.FindNextFile(ref position, out _, out _); Assert.False(endOfFilesSuccess, "Table returned more files than it should"); }
public void OpeningFileAsDirectoryFails() { var table = new HierarchicalRomFileTable(); var fileInfo = new RomFileInfo(); table.AddFile("/file", ref fileInfo); bool success = table.TryOpenDirectory("/file", out _); Assert.False(success); }
public void UpdateExistingFile() { const string path = "/a/b"; var table = new HierarchicalRomFileTable(); var originalItem = new RomFileInfo { Length = 1, Offset = 1 }; var newItem = new RomFileInfo { Length = 1, Offset = 1 }; table.AddFile(path, ref originalItem); table.AddFile(path, ref newItem); bool success = table.TryOpenFile(path, out RomFileInfo readItem); Assert.True(success, "Table read failed"); Assert.Equal(newItem, readItem); }
public void SimpleAddAndRead() { const string path = "/a/b"; var table = new HierarchicalRomFileTable(); var item = new RomFileInfo { Length = 1, Offset = 1 }; table.AddFile(path, ref item); bool success = table.TryOpenFile(path, out RomFileInfo readItem); Assert.True(success, "Table read failed"); Assert.Equal(item, readItem); }
public ArchiveFileSystem(IFile headerFile, IFile dataFile) { var header = new byte[headerFile.GetSize()]; headerFile.Read(header, 0); DecryptArh(header); using (var stream = new MemoryStream(header)) using (var reader = new BinaryReader(stream)) { stream.Position = 4; Field4 = reader.ReadInt32(); NodeCount = reader.ReadInt32(); StringTableOffset = reader.ReadInt32(); StringTableLength = reader.ReadInt32(); NodeTableOffset = reader.ReadInt32(); NodeTableLength = reader.ReadInt32(); FileTableOffset = reader.ReadInt32(); FileCount = reader.ReadInt32(); Key = reader.ReadUInt32() ^ 0xF3F35353; stream.Position = StringTableOffset; StringTable = reader.ReadBytes(StringTableLength); Nodes = new Node[NodeCount]; stream.Position = NodeTableOffset; for (int i = 0; i < NodeCount; i++) { Nodes[i] = new Node { Next = reader.ReadInt32(), Prev = reader.ReadInt32() }; } FileInfo = new FileInfo[FileCount]; stream.Position = FileTableOffset; for (int i = 0; i < FileCount; i++) { FileInfo[i] = new FileInfo(reader); } AddAllFilenames(); } DataFile = dataFile.AsStorage(); FileTable = new HierarchicalRomFileTable(); var romFileInfo = new RomFileInfo(); File.WriteAllLines("archive.txt", FileInfo.Select(x => x.Filename)); for (int i = 0; i < FileInfo.Length; i++) { if (FileInfo[i].Filename == null) { continue; } romFileInfo.Offset = i; FileTable.AddFile(FileInfo[i].Filename, ref romFileInfo); } FileTable.TrimExcess(); }