圣遗物分解套装筛选的改进和JS引擎的约束 (#2319)

This commit is contained in:
FishmanTheMurloc
2025-10-10 22:09:34 +08:00
committed by GitHub
parent 2bf9eb9495
commit f5e22d20cb
6 changed files with 111 additions and 38 deletions

View File

@@ -1,7 +1,9 @@
using BetterGenshinImpact.GameTask.AutoArtifactSalvage;
using BetterGenshinImpact.GameTask.Model.GameUI;
using BetterGenshinImpact.UnitTest.CoreTests.RecognitionTests.OCRTests;
using Microsoft.ClearScript;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Time.Testing;
using OpenCvSharp;
using System;
using System.Collections.Concurrent;
@@ -219,18 +221,16 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoArtifactSalvageTests
}
[Theory]
[InlineData(@"ArtifactAffixes.png", @"(async function (artifact) {
var hasATK = Array.from(artifact.MinorAffixes).some(affix => affix.Type == 'ATK');
var hasDEF = Array.from(artifact.MinorAffixes).some(affix => affix.Type == 'DEF');
Output = hasATK && hasDEF;
})(ArtifactStat);", false)]
[InlineData(@"ArtifactAffixes.png", @"(async function (artifact) {
var level = artifact.Level;
var hasATKPercent = Array.from(artifact.MinorAffixes).some(affix => affix.Type == 'ATKPercent');
var hasDEF = Array.from(artifact.MinorAffixes).some(affix => affix.Type == 'DEF');
Output = level == 0 && hasATKPercent && hasDEF;
})(ArtifactStat);", true)]
public void IsMatchJavaScript_JSShouldBeRight(string screenshot, string js, bool expected)
[InlineData(@"ArtifactAffixes.png", @"
var hasATK = Array.from(ArtifactStat.MinorAffixes).some(affix => affix.Type == 'ATK');
var hasDEF = Array.from(ArtifactStat.MinorAffixes).some(affix => affix.Type == 'DEF');
Output = hasATK && hasDEF;", false)]
[InlineData(@"ArtifactAffixes.png", @"
var level = ArtifactStat.Level;
var hasATKPercent = Array.from(ArtifactStat.MinorAffixes).some(affix => affix.Type == 'ATKPercent');
var hasDEF = Array.from(ArtifactStat.MinorAffixes).some(affix => affix.Type == 'DEF');
Output = level == 0 && hasATKPercent && hasDEF;", true)]
public async Task IsMatchJavaScript_JSShouldBeRight(string screenshot, string js, bool expected)
{
//
using Mat mat = new Mat(@$"..\..\..\Assets\AutoArtifactSalvage\{screenshot}");
@@ -239,10 +239,29 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoArtifactSalvageTests
//
AutoArtifactSalvageTask sut = new AutoArtifactSalvageTask(new AutoArtifactSalvageTaskParam(5, null, null, null, null, cultureInfo, this.stringLocalizer), new FakeLogger());
ArtifactStat artifact = sut.GetArtifactStat(mat, paddle.Get(), out string _);
bool result = IsMatchJavaScript(artifact, js);
bool result = await IsMatchJavaScript(artifact, js, new FakeLogger());
//
Assert.Equal(expected, result);
}
/// <summary>
/// 测试JavaScript运行超时的情况应抛出正确的异常
/// </summary>
/// <returns></returns>
[Fact]
public async Task IsMatchJavaScript_Timeout_ShouldThrowException()
{
//
string js = @"while (true) {};";
FakeTimeProvider timeProvider = new FakeTimeProvider();
//
Task sut = IsMatchJavaScript(new ArtifactStat("", new ArtifactAffix(ArtifactAffixType.ATK, 0), [], 0), js, new FakeLogger(), timeProvider);
timeProvider.Advance(TimeSpan.FromSeconds(3));
//
await Assert.ThrowsAsync<ScriptInterruptedException>(()=> sut);
}
}
}

View File

@@ -13,6 +13,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.Model.GameUI
[Theory]
[InlineData(@"GameUI\ArtifactSetFilterBright.png", 20, 2)]
[InlineData(@"GameUI\ArtifactSetFilterDark.png", 20, 2)]
[InlineData(@"GameUI\ArtifactSetFilterBlack.png", 20, 2)] // 只能识别到较少item12个的一个特例用于验证Cell聚簇算法补齐效果
/// <summary>
/// 测试获取圣遗物套装筛选界面中的项目,结果应正确
/// </summary>