Skip to content

Commit d416ad0

Browse files
committed
Astc tests
1 parent 8220d27 commit d416ad0

13 files changed

Lines changed: 1063 additions & 39 deletions

AssetRipper.TextureDecoder.TestGenerator/AssetRipper.TextureDecoder.TestGenerator.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11+
<ProjectReference Include="..\AssetRipper.TextureDecoder.Paths\AssetRipper.TextureDecoder.Paths.csproj" />
1112
<ProjectReference Include="..\AssetRipper.TextureDecoder.SourceGeneration.Common\AssetRipper.TextureDecoder.SourceGeneration.Common.csproj" />
1213
<ProjectReference Include="..\AssetRipper.TextureDecoder\AssetRipper.TextureDecoder.csproj" />
1314
</ItemGroup>

AssetRipper.TextureDecoder.TestGenerator/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ static void Main()
2222
{
2323
TestClassGenerator.GenerateTestClasses();
2424
GenerateRgbConsoleMethod();
25+
TextureDataClassGenerator.Generate();
2526
Console.WriteLine("Done!");
2627
}
2728

@@ -92,4 +93,4 @@ private static void GenerateRgbConsoleMethod()
9293
}
9394
}
9495
}
95-
}
96+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
using AssetRipper.Text.SourceGeneration;
2+
using System.CodeDom.Compiler;
3+
4+
namespace AssetRipper.TextureDecoder.TestGenerator;
5+
6+
internal static class TextureDataClassGenerator
7+
{
8+
private const string TestFilesFolder = $"{nameof(TestFileFolders)}.{nameof(TestFileFolders.AndroidTestFiles)}";
9+
private const string TextureType = "TextureType";
10+
private const string TextureFormat = "TextureFormat";
11+
private const string ITexture = "ITexture";
12+
private const string Namespace = "AssetRipper.TextureDecoder.Tests";
13+
14+
public static void Generate()
15+
{
16+
IReadOnlyList<TextureMetadata> metadataList = LoadMetadata(TestFileFolders.AndroidTestFiles);
17+
GenerateTextureType(metadataList);
18+
GenerateTextureFormat(metadataList);
19+
GenerateITexture();
20+
GenerateAndroidTextures(metadataList);
21+
}
22+
23+
private static void GenerateTextureType(IReadOnlyList<TextureMetadata> metadataList)
24+
{
25+
GenerateEnum(TextureType, metadataList.Select(m => m.Type).Distinct().Order());
26+
}
27+
28+
private static void GenerateTextureFormat(IReadOnlyList<TextureMetadata> metadataList)
29+
{
30+
GenerateEnum(TextureFormat, metadataList.Select(m => m.Format).Distinct().Order());
31+
}
32+
33+
private static void GenerateEnum(string name, IEnumerable<string?> values)
34+
{
35+
using IndentedTextWriter writer = IndentedTextWriterFactory.Create(ProjectFolders.TestProject, name);
36+
writer.WriteGeneratedCodeWarning();
37+
writer.WriteLine();
38+
writer.WriteFileScopedNamespace(Namespace);
39+
writer.WriteLine();
40+
writer.WriteLine($"public enum {name}");
41+
using (new CurlyBrackets(writer))
42+
{
43+
foreach (string? value in values)
44+
{
45+
writer.WriteLine($"{value},");
46+
}
47+
}
48+
}
49+
50+
private static void GenerateITexture()
51+
{
52+
using IndentedTextWriter writer = IndentedTextWriterFactory.Create(ProjectFolders.TestProject, ITexture);
53+
writer.WriteGeneratedCodeWarning();
54+
writer.WriteLine();
55+
writer.WriteFileScopedNamespace(Namespace);
56+
writer.WriteLine();
57+
writer.WriteLine($"public partial interface {ITexture}");
58+
using (new CurlyBrackets(writer))
59+
{
60+
writer.WriteLine($"static abstract {TextureType} {nameof(TextureMetadata.Type)} {{ get; }}");
61+
writer.WriteLine($"static abstract {TextureFormat} {nameof(TextureMetadata.Format)} {{ get; }}");
62+
writer.WriteLine($"static abstract int {nameof(TextureMetadata.FileSize)} {{ get; }}");
63+
writer.WriteLine($"static abstract int {nameof(TextureMetadata.ImageSize)} {{ get; }}");
64+
writer.WriteLine($"static abstract int {nameof(TextureMetadata.ImageCount)} {{ get; }}");
65+
writer.WriteLine($"static abstract bool {nameof(TextureMetadata.Mips)} {{ get; }}");
66+
writer.WriteLine($"static abstract int {nameof(TextureMetadata.Width)} {{ get; }}");
67+
writer.WriteLine($"static abstract int {nameof(TextureMetadata.Height)} {{ get; }}");
68+
writer.WriteLine("static abstract string Path { get; }");
69+
writer.WriteLine("static abstract byte[] Data { get; }");
70+
}
71+
}
72+
73+
private static IReadOnlyList<TextureMetadata> LoadMetadata(string directory)
74+
{
75+
string[] jsonFiles = Directory.GetFiles(directory, "*.json");
76+
List<TextureMetadata> metadataList = new(jsonFiles.Length);
77+
foreach (string jsonFile in jsonFiles)
78+
{
79+
metadataList.Add(TextureMetadata.FromFile(jsonFile));
80+
}
81+
return metadataList;
82+
}
83+
84+
private static void GenerateAndroidTextures(IReadOnlyList<TextureMetadata> metadataList)
85+
{
86+
const string AndroidTextures = "AndroidTextures";
87+
using IndentedTextWriter writer = IndentedTextWriterFactory.Create(ProjectFolders.TestProject, AndroidTextures);
88+
writer.WriteGeneratedCodeWarning();
89+
writer.WriteLine();
90+
writer.WriteFileScopedNamespace(Namespace);
91+
writer.WriteLine();
92+
writer.WriteLine($"public static partial class {AndroidTextures}");
93+
using (new CurlyBrackets(writer))
94+
{
95+
foreach (TextureMetadata metadata in metadataList)
96+
{
97+
string withOrWithout = metadata.Mips ? "with" : "without";
98+
writer.WriteSummaryDocumentation($"{metadata.Format} {metadata.Width}x{metadata.Height} {withOrWithout} mips");
99+
writer.WriteLine($"public sealed class {metadata.Name} : {ITexture}");
100+
using (new CurlyBrackets(writer))
101+
{
102+
writer.WriteLine($"public const {TextureType} {nameof(TextureMetadata.Type)} = {TextureType}.{metadata.Type};");
103+
writer.WriteLine($"public const {TextureFormat} {nameof(TextureMetadata.Format)} = {TextureFormat}.{metadata.Format};");
104+
writer.WriteLine($"public const int {nameof(TextureMetadata.FileSize)} = {metadata.FileSize};");
105+
writer.WriteLine($"public const int {nameof(TextureMetadata.ImageSize)} = {metadata.ImageSize};");
106+
writer.WriteLine($"public const int {nameof(TextureMetadata.ImageCount)} = {metadata.ImageCount};");
107+
writer.WriteLine($"public const bool {nameof(TextureMetadata.Mips)} = {metadata.Mips.ToString().ToLowerInvariant()};");
108+
writer.WriteLine($"public const int {nameof(TextureMetadata.Width)} = {metadata.Width};");
109+
writer.WriteLine($"public const int {nameof(TextureMetadata.Height)} = {metadata.Height};");
110+
writer.WriteLine($"public const string Path = {TestFilesFolder} + \"{metadata.Name}\";");
111+
writer.WriteSummaryDocumentation($"Length: {metadata.FileSize}");
112+
writer.WriteLine("public static byte[] Data => File.ReadAllBytes(Path);");
113+
writer.WriteLine();
114+
writer.WriteLine($"private {metadata.Name}() {{ }}");
115+
writer.WriteLine($"static {TextureType} {ITexture}.{nameof(TextureMetadata.Type)} => {nameof(TextureMetadata.Type)};");
116+
writer.WriteLine($"static {TextureFormat} {ITexture}.{nameof(TextureMetadata.Format)} => {nameof(TextureMetadata.Format)};");
117+
writer.WriteLine($"static int {ITexture}.{nameof(TextureMetadata.FileSize)} => {nameof(TextureMetadata.FileSize)};");
118+
writer.WriteLine($"static int {ITexture}.{nameof(TextureMetadata.ImageSize)} => {nameof(TextureMetadata.ImageSize)};");
119+
writer.WriteLine($"static int {ITexture}.{nameof(TextureMetadata.ImageCount)} => {nameof(TextureMetadata.ImageCount)};");
120+
writer.WriteLine($"static bool {ITexture}.{nameof(TextureMetadata.Mips)} => {nameof(TextureMetadata.Mips)};");
121+
writer.WriteLine($"static int {ITexture}.{nameof(TextureMetadata.Width)} => {nameof(TextureMetadata.Width)};");
122+
writer.WriteLine($"static int {ITexture}.{nameof(TextureMetadata.Height)} => {nameof(TextureMetadata.Height)};");
123+
writer.WriteLine($"static string {ITexture}.Path => Path;");
124+
}
125+
writer.WriteLine();
126+
}
127+
}
128+
}
129+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace AssetRipper.TextureDecoder.TestGenerator;
5+
6+
public sealed class TextureMetadata
7+
{
8+
[JsonIgnore]
9+
public string? Name { get; set; }
10+
public string? Type { get; set; }
11+
public string? Format { get; set; }
12+
public int FileSize { get; set; }
13+
public int ImageSize { get; set; }
14+
public int ImageCount { get; set; }
15+
public bool Mips { get; set; }
16+
public int Width { get; set; }
17+
public int Height { get; set; }
18+
19+
public static TextureMetadata FromFile(string path)
20+
{
21+
using FileStream stream = File.OpenRead(path);
22+
TextureMetadata result = JsonSerializer.Deserialize(stream, TextureMetadataSerializerContext.Default.TextureMetadata)
23+
?? throw new NullReferenceException(nameof(TextureMetadata));
24+
result.Name = Path.GetFileNameWithoutExtension(path);
25+
return result;
26+
}
27+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace AssetRipper.TextureDecoder.TestGenerator;
4+
5+
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)]
6+
[JsonSerializable(typeof(TextureMetadata))]
7+
internal sealed partial class TextureMetadataSerializerContext : JsonSerializerContext
8+
{
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
global using AssetRipper.TextureDecoder.Paths;

0 commit comments

Comments
 (0)