mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Fix HierarchicalRomFileTable not working and add tests
This commit is contained in:
parent
01b14c6476
commit
5e321b7601
2 changed files with 207 additions and 1 deletions
|
@ -207,6 +207,8 @@ namespace LibHac.IO.RomFs
|
|||
path = PathTools.Normalize(path);
|
||||
ReadOnlySpan<byte> pathBytes = GetUtf8Bytes(path);
|
||||
|
||||
if(path == "/") throw new ArgumentException("Path cannot be empty");
|
||||
|
||||
CreateFileRecursiveInternal(pathBytes, ref fileInfo);
|
||||
}
|
||||
|
||||
|
@ -347,7 +349,7 @@ namespace LibHac.IO.RomFs
|
|||
{
|
||||
ref FileRomEntry entry = ref FileTable.AddOrGet(ref key, out int offset, out bool alreadyExists, out _);
|
||||
entry.Info = fileInfo;
|
||||
if (alreadyExists) entry.NextSibling = -1;
|
||||
if (!alreadyExists) entry.NextSibling = -1;
|
||||
|
||||
ref DirectoryRomEntry parent = ref DirectoryTable.GetValueReference(prevOffset);
|
||||
|
||||
|
|
204
tests/LibHac.Tests/RomFsTests.cs
Normal file
204
tests/LibHac.Tests/RomFsTests.cs
Normal file
|
@ -0,0 +1,204 @@
|
|||
using System;
|
||||
using LibHac.IO.RomFs;
|
||||
using Xunit;
|
||||
|
||||
namespace LibHac.Tests
|
||||
{
|
||||
public class RomFsTests
|
||||
{
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddingDirectory()
|
||||
{
|
||||
var table = new HierarchicalRomFileTable();
|
||||
var expectedPosition = new FindPosition { NextDirectory = -1, NextFile = -1 };
|
||||
|
||||
table.AddDirectory("/dir");
|
||||
bool success = table.TryOpenDirectory("/dir", out FindPosition position);
|
||||
|
||||
Assert.True(success, "Opening directory failed");
|
||||
Assert.Equal(expectedPosition, position);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddingEmptyPathThrows()
|
||||
{
|
||||
var table = new HierarchicalRomFileTable();
|
||||
var item = new RomFileInfo();
|
||||
|
||||
Assert.Throws<ArgumentException>(() => table.AddFile("", ref item));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OpeningNonexistentFileFails()
|
||||
{
|
||||
var table = new HierarchicalRomFileTable();
|
||||
|
||||
bool success = table.TryOpenFile("/foo", out _);
|
||||
Assert.False(success);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OpeningNonexistentDirectoryFails()
|
||||
{
|
||||
var table = new HierarchicalRomFileTable();
|
||||
|
||||
bool success = table.TryOpenDirectory("/foo", out _);
|
||||
Assert.False(success);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OpeningDirectoryAsFileFails()
|
||||
{
|
||||
var table = new HierarchicalRomFileTable();
|
||||
table.AddDirectory("/dir");
|
||||
|
||||
bool success = table.TryOpenFile("/dir", out _);
|
||||
Assert.False(success);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue