using BehaviourTree;
using BetterGenshinImpact.GameTask.AutoFishing.Model;
using BetterGenshinImpact.GameTask.AutoFishing;
using BetterGenshinImpact.GameTask.Model.Area.Converter;
using BetterGenshinImpact.GameTask.Model.Area;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BehaviourTree.Composites;
using BehaviourTree.FluentBuilder;
using Microsoft.Extensions.Time.Testing;
namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests
{
public partial class BehavioursTests
{
[Fact]
///
/// 即使抛竿的瞬间、开始检测咬杆时遇到了假阳性,CheckRaiseHook也能驳回这种情况,返回失败
///
public void CheckRaiseHook_BreakThrough_When_ThrowRod_ShouldFail()
{
//
Mat mat = new Mat(@$"..\..\..\Assets\AutoFishing\20250314164703100_FishBite_Succeeded_FP.png");
FakeInputSimulator input = new FakeInputSimulator();
FakeDrawContent drawContent = new FakeDrawContent();
FakeSystemInfo systemInfo = new FakeSystemInfo(new Vanara.PInvoke.RECT(0, 0, mat.Width, mat.Height), 1);
AutoFishingAssets autoFishingAssets = new AutoFishingAssets(systemInfo);
var imageRegion = new GameCaptureRegion(mat, 0, 0, new DesktopRegion(input.Mouse), converter: new ScaleConverter(1d), drawContent);
var blackboard = new Blackboard(sleep: i => { }, autoFishingAssets: autoFishingAssets)
{
};
FakeTimeProvider timeProvider = new FakeTimeProvider();
FakeLogger logger = new FakeLogger();
//
var sut = FluentBuilder.Create()
.MySimpleParallel("下杆中", SimpleParallelPolicy.OnlyOneMustSucceed)
.PushLeaf(() => new CheckThrowRod("检查抛竿结果", blackboard, logger, false, timeProvider)) // todo 后面串联一个召回率高的下杆中检测方法
.PushLeaf(() => new FishBite("自动提竿", blackboard, logger, false, input, OcrService, drawContent))
.PushLeaf(() => new FishBiteTimeout("下杆超时检查", 15, logger, false, input, timeProvider))
.End()
.Build();
BehaviourStatus actual = sut.Tick(imageRegion);
//
Assert.Equal(BehaviourStatus.Succeeded, actual); // 此时下杆中状态瞬间完成,进入拉条
//
sut = FluentBuilder.Create()
.MySimpleParallel("拉条中", policy: SimpleParallelPolicy.OnlyOneMustSucceed)
.PushLeaf(() => new CheckRaiseHook("检查提竿结果", blackboard, logger, false, timeProvider))
.Sequence("拉条序列")
.PushLeaf(() => new GetFishBoxArea("等待拉条出现", blackboard, logger, false, timeProvider))
.PushLeaf(() => new Fishing("钓鱼拉条", blackboard, logger, false, input, timeProvider, drawContent))
.End()
.End()
.Build();
//
actual = sut.Tick(imageRegion);
//
Assert.Equal(BehaviourStatus.Running, actual);
//
timeProvider.Advance(TimeSpan.FromSeconds(1)); // 1秒后浮漂落入水面
mat = new Mat(@$"..\..\..\Assets\AutoFishing\20250306111749714_CheckThrowRod_Succeeded.png"); // 一张正常下杆的图片
imageRegion = new GameCaptureRegion(mat, 0, 0, new DesktopRegion(input.Mouse), converter: new ScaleConverter(1d), drawContent);
//
actual = sut.Tick(imageRegion);
//
Assert.Equal(BehaviourStatus.Running, actual);
//
timeProvider.Advance(TimeSpan.FromSeconds(2));
//
actual = sut.Tick(imageRegion);
//
Assert.Equal(BehaviourStatus.Failed, actual);
}
}
}