Fix resolution bug for unity_builtin_extra

This commit is contained in:
Jeremy Pritts 2023-07-26 10:08:49 -04:00
parent c79e7c2425
commit 8a84f82f49
2 changed files with 176 additions and 159 deletions

View File

@ -1,170 +1,183 @@
using AssetRipper.Assets.Bundles;
using AssetRipper.Assets.Collections;
using AssetRipper.IO.Files.ResourceFiles;
using AssetRipper.IO.Files.Streams.Smart;
using AssetRipper.Assets.Bundles;
using AssetRipper.Assets.Collections;
using AssetRipper.IO.Files.ResourceFiles;
using AssetRipper.IO.Files.Streams.Smart;
using AssetRipper.IO.Files.Utils;
namespace AssetRipper.Assets.Tests;
public class ResolutionTests
{
[Test]
public void CollectionResolutionWorksAnywhereInTheHierarchy()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedAssetCollection collection1 = new ProcessedAssetCollection(gameBundle);
collection1.Name = name1;
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ProcessedAssetCollection collection2 = new ProcessedAssetCollection(processedBundle);
collection2.Name = name2;
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(gameBundle.ResolveCollection(name2), Is.EqualTo(collection2));
Assert.That(processedBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(processedBundle.ResolveCollection(name2), Is.EqualTo(collection2));
});
}
[Test]
public void CollectionResolutionIsAbleToFindTheSecondFile()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedBundle processedBundle1 = new();
gameBundle.AddBundle(processedBundle1);
ProcessedAssetCollection collection1 = new ProcessedAssetCollection(processedBundle1);
collection1.Name = name1;
ProcessedBundle processedBundle2 = new();
gameBundle.AddBundle(processedBundle2);
ProcessedAssetCollection collection2 = new ProcessedAssetCollection(processedBundle2);
collection2.Name = name2;
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(gameBundle.ResolveCollection(name2), Is.EqualTo(collection2));
});
}
[Test]
public void ResourceResolutionWorksAnywhereInTheHierarchy()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ResourceFile resource1 = CreateNewResourceFile(name1);
gameBundle.AddResource(resource1);
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource2 = CreateNewResourceFile(name2);
processedBundle.AddResource(resource2);
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(gameBundle.ResolveResource(name2), Is.EqualTo(resource2));
Assert.That(processedBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(processedBundle.ResolveResource(name2), Is.EqualTo(resource2));
});
}
[Test]
public void ResourceResolutionIsAbleToFindTheSecondFile()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedBundle processedBundle1 = new();
gameBundle.AddBundle(processedBundle1);
ResourceFile resource1 = CreateNewResourceFile(name1);
processedBundle1.AddResource(resource1);
ProcessedBundle processedBundle2 = new();
gameBundle.AddBundle(processedBundle2);
ResourceFile resource2 = CreateNewResourceFile(name2);
processedBundle2.AddResource(resource2);
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(gameBundle.ResolveResource(name2), Is.EqualTo(resource2));
});
}
[Test]
public void ResourceResolutionIsAbleToFindAnArchiveFile()
{
const string name = "archive:/name1";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource = CreateNewResourceFile(name);
namespace AssetRipper.Assets.Tests;
public class ResolutionTests
{
[Test]
public void CollectionResolutionWorksAnywhereInTheHierarchy()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedAssetCollection collection1 = new ProcessedAssetCollection(gameBundle);
collection1.Name = name1;
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ProcessedAssetCollection collection2 = new ProcessedAssetCollection(processedBundle);
collection2.Name = name2;
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(gameBundle.ResolveCollection(name2), Is.EqualTo(collection2));
Assert.That(processedBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(processedBundle.ResolveCollection(name2), Is.EqualTo(collection2));
});
}
[Test]
public void CollectionResolutionIsAbleToFindTheSecondFile()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedBundle processedBundle1 = new();
gameBundle.AddBundle(processedBundle1);
ProcessedAssetCollection collection1 = new ProcessedAssetCollection(processedBundle1);
collection1.Name = name1;
ProcessedBundle processedBundle2 = new();
gameBundle.AddBundle(processedBundle2);
ProcessedAssetCollection collection2 = new ProcessedAssetCollection(processedBundle2);
collection2.Name = name2;
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveCollection(name1), Is.EqualTo(collection1));
Assert.That(gameBundle.ResolveCollection(name2), Is.EqualTo(collection2));
});
}
[Test]
public void CollectionResolutionIsAbleToFindUnityBuiltinExtra()
{
const string name = "unity_builtin_extra";
const string reference = $"resources/{name}";
GameBundle gameBundle = new();
ProcessedAssetCollection collection = new ProcessedAssetCollection(gameBundle);
collection.Name = name;
Assert.That(gameBundle.ResolveCollection(FilenameUtils.FixFileIdentifier(reference)), Is.EqualTo(collection));
}
[Test]
public void ResourceResolutionWorksAnywhereInTheHierarchy()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ResourceFile resource1 = CreateNewResourceFile(name1);
gameBundle.AddResource(resource1);
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource2 = CreateNewResourceFile(name2);
processedBundle.AddResource(resource2);
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(gameBundle.ResolveResource(name2), Is.EqualTo(resource2));
Assert.That(processedBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(processedBundle.ResolveResource(name2), Is.EqualTo(resource2));
});
}
[Test]
public void ResourceResolutionIsAbleToFindTheSecondFile()
{
const string name1 = "name1";
const string name2 = "name2";
GameBundle gameBundle = new();
ProcessedBundle processedBundle1 = new();
gameBundle.AddBundle(processedBundle1);
ResourceFile resource1 = CreateNewResourceFile(name1);
processedBundle1.AddResource(resource1);
ProcessedBundle processedBundle2 = new();
gameBundle.AddBundle(processedBundle2);
ResourceFile resource2 = CreateNewResourceFile(name2);
processedBundle2.AddResource(resource2);
Assert.Multiple(() =>
{
Assert.That(gameBundle.ResolveResource(name1), Is.EqualTo(resource1));
Assert.That(gameBundle.ResolveResource(name2), Is.EqualTo(resource2));
});
}
[Test]
public void ResourceResolutionIsAbleToFindAnArchiveFile()
{
const string name = "archive:/name1";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource = CreateNewResourceFile(name);
processedBundle.AddResource(resource);
Assert.That(gameBundle.ResolveResource(name), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindFilesWithCapitalLetters()
{
const string name = "ResourceName.resS";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource = CreateNewResourceFile(name);
Assert.That(gameBundle.ResolveResource(name), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindFilesWithCapitalLetters()
{
const string name = "ResourceName.resS";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource = CreateNewResourceFile(name);
processedBundle.AddResource(resource);
Assert.That(gameBundle.ResolveResource(name), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindExternalFilesFromParentBundles()
{
const string resourceName = "resources.resource";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
Assert.That(gameBundle.ResolveResource(name), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindExternalFilesFromParentBundles()
{
const string resourceName = "resources.resource";
GameBundle gameBundle = new();
ProcessedBundle processedBundle = new();
gameBundle.AddBundle(processedBundle);
ResourceFile resource = CreateNewResourceFile(resourceName);
gameBundle.ResourceProvider = new SingleResourceProvider(resource);
Assert.That(processedBundle.ResolveResource(resourceName), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindExternalFilesFromGameBundles()
{
const string resourceName = "resources.resource";
GameBundle gameBundle = new();
Assert.That(processedBundle.ResolveResource(resourceName), Is.EqualTo(resource));
}
[Test]
public void ResourceResolutionIsAbleToFindExternalFilesFromGameBundles()
{
const string resourceName = "resources.resource";
GameBundle gameBundle = new();
ResourceFile resource = CreateNewResourceFile(resourceName);
gameBundle.ResourceProvider = new SingleResourceProvider(resource);
Assert.That(gameBundle.ResolveResource(resourceName), Is.EqualTo(resource));
Assert.That(gameBundle.ResolveResource(resourceName), Is.EqualTo(resource));
}
private sealed record class SingleResourceProvider(ResourceFile Resource) : IResourceProvider
@ -176,5 +189,5 @@ public class ResolutionTests
}
}
private static ResourceFile CreateNewResourceFile(string name) => new ResourceFile(SmartStream.CreateMemory(), name, name);
}
private static ResourceFile CreateNewResourceFile(string name) => new ResourceFile(SmartStream.CreateMemory(), name, name);
}

View File

@ -34,11 +34,15 @@ namespace AssetRipper.IO.Files.Utils
name = FixResourcePath(name);
if (IsDefaultResource(name))
{
return DefaultResourceName1;
//I'm not sure why uTiny was redirecting these to an alternate name.
//return DefaultResourceName1;
return name;
}
else if (IsBuiltinExtra(name))
{
return BuiltinExtraName1;
//I'm not sure why uTiny was redirecting these to an alternate name.
//return BuiltinExtraName1;
return name;
}
else
{