XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEExtension.NetCore.XUnit.Attributes;

namespace XFEEDToolBox.Test;

[TestFixture]
public class GalaxyOriginalCameraInputTests
{
    private static void Near(double expected,double actual)=>Check.That(Math.Abs(expected-actual)<1e-9,$"expected {expected}, got {actual}");

    [Test] public void OriginalKeyboardUsesActualYawDistanceAndKeepsIndependentAxes()
    {
        var actual=new GalaxyCameraPose(new(1,2,3),Math.PI/2,.2,20);
        var target=new GalaxyCameraPose(new(100,200,300),0,.4,40);
        var input=GalaxyOriginalCameraInput.Keyboard(1,1,1,1,1,0,.1);
        var moved=GalaxyOriginalCameraInput.Apply(actual,target,input);
        var step=21*GalaxyOriginalCameraInput.TranslationScale*GalaxyOriginalCameraInput.AxisTranslationScale*.1;
        Near(100+step,moved.Focus.X);Near(200+step,moved.Focus.Y);Near(300-step,moved.Focus.Z);
        Near(.4-GalaxyOriginalCameraInput.AngularGain*.1,moved.Pitch);
        Near(GalaxyOriginalCameraInput.AngularGain*.1,moved.Yaw);
        Near(40,moved.Distance);
        // Three simultaneous keys have three full axis contributions.
        Near(Math.Sqrt(3)*step,moved.Focus.DistanceTo(target.Focus));
    }

    [Test] public void KeyboardZoomIsBaseTwoAndMouseWheelHasNoTimeMultiplier()
    {
        var pose=new GalaxyCameraPose(new(0,0,0),0,.4,40);
        var input=GalaxyOriginalCameraInput.Keyboard(0,0,0,0,0,1,.1);
        Near(40*Math.Pow(2,GalaxyOriginalCameraInput.ZoomExponentGain*.1),GalaxyOriginalCameraInput.Apply(pose,pose,input).Distance);
        var wheel=GalaxyOriginalCameraInput.Mouse(GalaxyMouseButtons.None,0,0,120);
        Near(40*Math.Pow(2,-120*GalaxyOriginalCameraInput.WheelScale*GalaxyOriginalCameraInput.ZoomExponentGain),
            GalaxyOriginalCameraInput.Apply(pose,pose,wheel).Distance);
        var left=GalaxyOriginalCameraInput.Mouse(GalaxyMouseButtons.Left,10,20);
        Near(10*GalaxyOriginalCameraInput.MouseAxisScale,left.Yaw);Near(20*GalaxyOriginalCameraInput.MouseAxisScale,left.Pitch);
        var both=GalaxyOriginalCameraInput.Mouse(GalaxyMouseButtons.Left|GalaxyMouseButtons.Right,10,20);
        Near(-left.Yaw,both.Right);Near(left.Pitch,both.Forward);Near(0,both.Yaw);
    }

    [Test] public void GreatestAbsoluteContributionWinsAndTiesKeepFirst()
    {
        var first=new GalaxyCameraInputValues(.1,-.2,.3,-.4,.5,-.6);
        var next=new GalaxyCameraInputValues(-.2,.1,-.3,.5,-.4,.7);
        Check.Equal(new GalaxyCameraInputValues(-.2,-.2,.3,.5,.5,.7),GalaxyOriginalCameraInput.Combine(first,next));
    }

    [Test] public void HomeFloorsOnlyHeightCapsFarDistanceAndPreservesAngles()
    {
        var pose=new GalaxyCameraPose(new(100,200,300),9.7,.6,80);
        var home=GalaxyOriginalCameraInput.Home(pose,new(3,-1.2,7));
        Check.Equal(new Coordinates(3,-2,7),home.Focus);Near(17.75,home.Distance);
        Near(pose.Yaw,home.Yaw);Near(pose.Pitch,home.Pitch);
        Near(8,GalaxyOriginalCameraInput.Home(pose with{Distance=8},new(3,1.8,7)).Distance);
    }

    [Test] public void OriginalInputClampsTargetsAndRejectsNonFiniteValues()
    {
        var pose=new GalaxyCameraPose(new(0,1.4,0),0,.4,20);
        var moved=GalaxyOriginalCameraInput.Apply(pose,pose,new(100,0,0,0,0,-100));
        Near(GalaxyOriginalCameraControls.MinimumDistance,moved.Distance);
        Near(GalaxyOriginalCameraControls.MaximumPitch,moved.Pitch);Near(1,moved.Focus.Y);
        Check.Throws<ArgumentException>(()=>GalaxyOriginalCameraInput.Mouse(GalaxyMouseButtons.Left,double.NaN,0));
        Check.Throws<ArgumentOutOfRangeException>(()=>GalaxyOriginalCameraInput.Keyboard(0,0,0,0,0,0,-1));
    }
}