Skip to content

Commit 5c71183

Browse files
committed
temp: test increment
1 parent dc209db commit 5c71183

30 files changed

Lines changed: 806 additions & 268 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,3 +389,5 @@ MigrationBackup/
389389
# Fody - auto-generated XML schema
390390
FodyWeavers.xsd
391391

392+
/.reasonix/truncated-results
393+
/.reasonix/truncated-results

Minecraft-Mod-Language-Package.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Language.Core", "src\Langua
1515
EndProject
1616
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Packer.Core", "Packer.Core\Packer.Core.csproj", "{36E5BD2C-A1E5-4915-B78D-2AE4A0FFEFBA}"
1717
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Packer.Core.Tests", "Packer.Core.Tests\Packer.Core.Tests.csproj", "{6FFC28B8-ADDC-ED3C-5B4A-891CF05D8EDD}"
19+
EndProject
1820
Global
1921
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2022
Debug|Any CPU = Debug|Any CPU
@@ -45,6 +47,10 @@ Global
4547
{36E5BD2C-A1E5-4915-B78D-2AE4A0FFEFBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
4648
{36E5BD2C-A1E5-4915-B78D-2AE4A0FFEFBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
4749
{36E5BD2C-A1E5-4915-B78D-2AE4A0FFEFBA}.Release|Any CPU.Build.0 = Release|Any CPU
50+
{6FFC28B8-ADDC-ED3C-5B4A-891CF05D8EDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51+
{6FFC28B8-ADDC-ED3C-5B4A-891CF05D8EDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
52+
{6FFC28B8-ADDC-ED3C-5B4A-891CF05D8EDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
53+
{6FFC28B8-ADDC-ED3C-5B4A-891CF05D8EDD}.Release|Any CPU.Build.0 = Release|Any CPU
4854
EndGlobalSection
4955
GlobalSection(SolutionProperties) = preSolution
5056
HideSolutionNode = FALSE
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using Packer.Core.Model;
2+
using Packer.Core.Model.Abstract;
3+
using Packer.Core.Model.Configuration;
4+
using Packer.Core.Model.ModProvider;
5+
using Packer.Core.Model.ResourceFile;
6+
using Serilog;
7+
8+
namespace Packer.Core.Tests;
9+
10+
public class DiagnosticTests
11+
{
12+
static DiagnosticTests()
13+
{
14+
Environment.CurrentDirectory = @"C:\Users\16229\source\OpenSourceLibrary\Minecraft-Mod-Language-Package";
15+
Log.Logger = new LoggerConfiguration().WriteTo.Console().MinimumLevel.Warning().CreateLogger();
16+
}
17+
18+
[Fact]
19+
public void Createdeco_Composition_TargetPath()
20+
{
21+
var ns = new AssetsNamespaceResource(
22+
@"projects/assets/create-deco/1.21/createdeco",
23+
"createdeco", "create-deco", "1.21");
24+
25+
foreach (var policy in ns.PackerPolicies)
26+
{
27+
foreach (var provider in policy.CreateProviders(ns, new FloatingConfig(
28+
[], [], [], [], new Dictionary<string, string>(), new Dictionary<string, string>())))
29+
{
30+
var dest = provider.Destination;
31+
Assert.Equal("assets/createdeco/lang/zh_cn.json", dest);
32+
}
33+
}
34+
}
35+
36+
[Fact]
37+
public void Justhammers_Policy_Resolves()
38+
{
39+
var ns = new AssetsNamespaceResource(
40+
@"projects/assets/justhammers/1.21/justhammers",
41+
"justhammers", "justhammers", "1.21");
42+
43+
// Indirect target: projects/assets/justhammers/1.19/justhammers
44+
// Verify the policy loads
45+
Assert.NotEmpty(ns.PackerPolicies);
46+
}
47+
48+
[Fact]
49+
public void Minecraft_Font_Domain_Is_Included()
50+
{
51+
var globalFloating = new FloatingConfig(
52+
InclusionDomains: ["font", "textures", "gui"],
53+
ExclusionDomains: [],
54+
InclusionPaths: [],
55+
ExclusionPaths: [],
56+
CharacterReplacement: new Dictionary<string, string>(),
57+
DestinationReplacement: new Dictionary<string, string>());
58+
59+
var ns = new AssetsNamespaceResource(
60+
@"projects/assets/minecraft/1.21/minecraft",
61+
"minecraft", "minecraft", "1.21");
62+
63+
var merged = globalFloating.Merge(ns.LocalConfig);
64+
65+
foreach (var policy in ns.PackerPolicies)
66+
{
67+
foreach (var provider in policy.CreateProviders(ns, merged))
68+
{
69+
if (provider.Destination.Contains("font/default.json"))
70+
{
71+
return; // found it
72+
}
73+
}
74+
}
75+
Assert.Fail("assets/minecraft/font/default.json not produced");
76+
}
77+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
using Packer.Core.Model;
2+
using Packer.Core.Model.Abstract;
3+
using Packer.Core.Model.Configuration;
4+
using Packer.Core.Model.ModProvider;
5+
using Packer.Core.Model.ResourceFile;
6+
using Serilog;
7+
using System.IO.Compression;
8+
using System.Text.Json;
9+
using System.Text.Json.Serialization.Metadata;
10+
11+
namespace Packer.Core.Tests;
12+
13+
public class IntegrationTests
14+
{
15+
private static readonly Lazy<HashSet<string>> _dests = new(() => RunPack("1.21"));
16+
private static readonly HashSet<string> _empty = [];
17+
18+
static IntegrationTests()
19+
{
20+
Environment.CurrentDirectory = @"C:\Users\16229\source\OpenSourceLibrary\Minecraft-Mod-Language-Package";
21+
Log.Logger = new LoggerConfiguration()
22+
.WriteTo.Console()
23+
.MinimumLevel.Warning()
24+
.CreateLogger();
25+
}
26+
27+
private static HashSet<string> RunPack(string version)
28+
{
29+
var config = JsonSerializer.Deserialize<Config>(
30+
File.ReadAllText($"config/packer/{version}.json"),
31+
new JsonSerializerOptions
32+
{
33+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
34+
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
35+
})!;
36+
37+
var provider = new AssetsModProvider();
38+
var namespaces = provider.GetModsByVersion(version);
39+
var filtered = namespaces.Where(g => !config.Base.ExclusionMods.Contains(g.Key));
40+
var allProviders = filtered
41+
.SelectMany(g => g)
42+
.Where(ns => !config.Base.ExclusionNamespaces.Contains(ns.NamespaceName))
43+
.SelectMany(ns => ns.PackerPolicies
44+
.SelectMany(p => p.CreateProviders(ns, config.Floating.Merge(ns.LocalConfig))))
45+
.ToList();
46+
47+
var groups = allProviders.ToLookup(p => p.Destination);
48+
var merged = groups.Select(group =>
49+
{
50+
if (!group.Skip(1).Any()) return group.First();
51+
if (group.All(p => p is KVPFile))
52+
{
53+
var r = group.Cast<KVPFile>().Aggregate((a, n) => a.Merge(n));
54+
if (r is ResourceFileProvider rfp) rfp.Namespace = group.Cast<KVPFile>().First().Namespace;
55+
return r;
56+
}
57+
return group.First();
58+
}).ToList();
59+
60+
foreach (var p in merged.OfType<TextFile>())
61+
p.EffectiveConfig = config.Floating;
62+
63+
var initial = new List<IResourceFileProvider>
64+
{
65+
new RawFile("./projects/templates/pack.png", "pack.png"),
66+
new TextFile(File.ReadAllText("./projects/templates/LICENSE"), "LICENSE"),
67+
config.Base.LoadReadmeTemp(),
68+
config.Base.LoadMetaTemp()
69+
};
70+
71+
var dests = new HashSet<string>();
72+
using var ms = new MemoryStream();
73+
using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, leaveOpen: true))
74+
{
75+
foreach (var p in merged.Concat(initial))
76+
{
77+
using var content = p.GetContentStream();
78+
var entry = archive.CreateEntry(p.Destination);
79+
using var es = entry.Open();
80+
content.CopyTo(es);
81+
dests.Add(p.Destination);
82+
}
83+
}
84+
return dests;
85+
}
86+
87+
private HashSet<string> Dests => _dests.Value;
88+
89+
[Fact]
90+
public void Createdeco_Composition_Output()
91+
=> Assert.Contains("assets/createdeco/lang/zh_cn.json", Dests);
92+
93+
[Fact]
94+
public void Justhammers_Indirect_Output()
95+
=> Assert.Contains("assets/justhammers/lang/zh_cn.json", Dests);
96+
97+
[Fact]
98+
public void Minecraft_Font_Assets()
99+
{
100+
Assert.Contains("assets/minecraft/font/default.json", Dests);
101+
Assert.Contains("assets/minecraft/font/uniform.json", Dests);
102+
Assert.Contains("assets/minecraft/textures/font/2em_dash.png", Dests);
103+
}
104+
105+
[Fact]
106+
public void No_Composition_Source_Files()
107+
{
108+
Assert.DoesNotContain("assets/createdeco/lang/zh_cn-composition.json", Dests);
109+
Assert.DoesNotContain("assets/bibliobiomes/lang/zh_cn-composition.json", Dests);
110+
}
111+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
namespace Packer.Core.Tests;
2+
3+
/// <summary>
4+
/// 每次访问都输出并返回随机值——不缓存。
5+
/// record 相等性不会触发此属性。
6+
/// </summary>
7+
public record LazyRecord(string Id)
8+
{
9+
public int LazyValue
10+
{
11+
get
12+
{
13+
Console.WriteLine("你好");
14+
return Random.Shared.Next(100);
15+
}
16+
}
17+
}
18+
19+
public class LazyRecordTests
20+
{
21+
[Fact]
22+
public void Record_Equality_Does_Not_Trigger_Properties()
23+
{
24+
var a = new LazyRecord("x");
25+
var b = new LazyRecord("x");
26+
27+
// Equals 只比较 Id,不访问 LazyValue → "你好" 不会输出
28+
Assert.Equal(a, b);
29+
}
30+
31+
[Fact]
32+
public void Property_Is_Reevaluated_Each_Access()
33+
{
34+
var r = new LazyRecord("x");
35+
var v1 = r.LazyValue; // 输出 "你好"
36+
var v2 = r.LazyValue; // 再次输出 "你好",值可能不同
37+
Assert.NotEqual(v1, v2); // 随机值,两次不一样
38+
}
39+
}

Packer.Core.Tests/MinecraftDiag.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using Packer.Core.Model;
2+
using Packer.Core.Model.Configuration;
3+
using Packer.Core.Model.ModProvider;
4+
using Packer.Core.Model.ResourceFile;
5+
using Serilog;
6+
7+
namespace Packer.Core.Tests;
8+
9+
public class MinecraftDiag
10+
{
11+
static MinecraftDiag()
12+
{
13+
Environment.CurrentDirectory = @"C:\Users\16229\source\OpenSourceLibrary\Minecraft-Mod-Language-Package";
14+
Log.Logger = new LoggerConfiguration().WriteTo.Console().MinimumLevel.Warning().CreateLogger();
15+
}
16+
17+
[Fact]
18+
public void Indirect_To_120_Produces_Font()
19+
{
20+
var ns21 = new AssetsNamespaceResource(
21+
@"projects/assets/minecraft/1.21/minecraft",
22+
"minecraft", "minecraft", "1.21");
23+
24+
var targetPath = @"projects/assets/minecraft/1.20/minecraft";
25+
var targetDir = new DirectoryInfo(targetPath);
26+
var exists = targetDir.Exists;
27+
var hasFont = Directory.Exists(Path.Combine(targetPath, "font"));
28+
29+
var targetNs = new AssetsNamespaceResource(
30+
targetDir.FullName, targetDir.Name, "minecraft", "1.20");
31+
32+
var policies = targetNs.PackerPolicies.ToList();
33+
var policyTypes = policies.Select(p => p.GetType().Name).ToList();
34+
35+
var globalFloating = new FloatingConfig(
36+
InclusionDomains: ["font", "textures", "gui"],
37+
ExclusionDomains: [],
38+
InclusionPaths: [],
39+
ExclusionPaths: [],
40+
CharacterReplacement: new Dictionary<string, string>(),
41+
DestinationReplacement: new Dictionary<string, string>());
42+
43+
var providers = new List<string>();
44+
foreach (var policy in policies)
45+
{
46+
foreach (var p in policy.CreateProviders(ns21, globalFloating))
47+
providers.Add(p.Destination);
48+
}
49+
50+
var msg = $"Target dir exists: {exists}\nHas font/: {hasFont}\n" +
51+
$"Policy types: [{string.Join(", ", policyTypes)}]\n" +
52+
$"Providers: {providers.Count}";
53+
if (providers.Count > 0)
54+
msg += "\n" + string.Join("\n", providers.OrderBy(x => x).Take(20));
55+
56+
File.WriteAllText("diag_mc.txt", msg);
57+
Assert.Fail("See diag_mc.txt");
58+
}
59+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using Packer.Core.Model.ModProvider;
2+
3+
namespace Packer.Core.Tests;
4+
5+
public class NamespaceRecordTests
6+
{
7+
[Fact]
8+
public void AssetsNamespaceResource_Equality_Is_Based_On_Four_Fields()
9+
{
10+
var a = new AssetsNamespaceResource(
11+
@"projects/assets/minecraft/1.21/minecraft",
12+
"minecraft", "minecraft", "1.21");
13+
14+
var b = new AssetsNamespaceResource(
15+
@"projects/assets/minecraft/1.21/minecraft",
16+
"minecraft", "minecraft", "1.21");
17+
18+
var c = new AssetsNamespaceResource(
19+
@"projects/assets/jei/1.21/jei",
20+
"jei", "jei", "1.21");
21+
22+
Assert.Equal(a, b); // 四个字段相同 → 相等
23+
Assert.NotEqual(a, c); // 不同 → 不相等
24+
Assert.Equal(a.GetHashCode(), b.GetHashCode()); // HashSet 用
25+
}
26+
27+
[Fact]
28+
public void AssetsNamespaceResource_Lazy_Properties_Are_Null_Before_Access()
29+
{
30+
var ns = new AssetsNamespaceResource(
31+
@"projects/assets/minecraft/1.21/minecraft",
32+
"minecraft", "minecraft", "1.21");
33+
34+
// 没有访问过 LocalConfig / PackerPolicies
35+
// 它们都是 field ??= LoadXxx() 的懒加载模式
36+
// 没有公开的方式检查 field 是否为 null,但可以通过
37+
// 确认没有抛异常来验证构造本身没问题
38+
Assert.NotNull(ns);
39+
Assert.Equal("minecraft", ns.NamespaceName);
40+
Assert.Equal("minecraft", ns.ModName);
41+
Assert.Equal("1.21", ns.ModVersion);
42+
Assert.EndsWith("minecraft", ns.LocalPath);
43+
}
44+
45+
[Fact]
46+
public void GitChangedModProvider_GetChangedPaths_Returns_Deduped()
47+
{
48+
// 不真正跑 git diff,只验证 HashSet 去重逻辑
49+
var set = new HashSet<AssetsNamespaceResource>
50+
{
51+
new(@"dir", "ns1", "mod1", "1.21"),
52+
new(@"dir", "ns1", "mod1", "1.21"), // 重复
53+
new(@"dir2", "ns2", "mod2", "1.21")
54+
};
55+
56+
Assert.Equal(2, set.Count);
57+
}
58+
}

0 commit comments

Comments
 (0)