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

AutoMiningScript

【SpaceEngineer】全自动挖矿脚本

公开
关注 0 Fork 0 Star 0
UTF-8
using System;
using System.Linq;
using VRage.Game.ModAPI.Ingame.Utilities;
using Xunit;
using P = AutoMiningScript.Program;
using Rig = AutoMiningScript.Tests.FleetStateTests.Rig;

namespace AutoMiningScript.Tests
{
    public class FleetOperatorTests
    {
        static string Text(P.Packet packet) { return packet.Body.Get("command", "Text").ToString(); }

        [Theory]
        [InlineData("init", "rescan")]
        [InlineData("rescan", "rescan")]
        [InlineData("diagnose", "diagnose")]
        [InlineData("calibrate", "calibrate")]
        [InlineData("start", "resume")]
        [InlineData("resume", "resume")]
        [InlineData("pause", "pause")]
        [InlineData("return", "return")]
        [InlineData("release", "release")]
        public void FleetCanTargetEachOriginalMinerCommand(string command, string expected)
        {
            var rig = new Rig(2, true); rig.RegisterAll(); rig.Sent.Clear();
            rig.Fleet.Command(command + " miner-1");
            var sent = Assert.Single(rig.Sent, p => p.Kind == "COMMAND");
            Assert.Equal("miner-1", sent.Target); Assert.Equal(expected, Text(sent));
        }

        [Theory]
        [InlineData("init")]
        [InlineData("rescan")]
        [InlineData("diagnose")]
        [InlineData("calibrate")]
        [InlineData("start")]
        [InlineData("resume")]
        [InlineData("pause")]
        [InlineData("return")]
        [InlineData("release")]
        public void ExplicitAllCanOperateEveryOnlineMiner(string command)
        {
            var rig = new Rig(3, true); rig.RegisterAll(); rig.Program.Now = 6;
            rig.Receive("TELEMETRY", rig.Miners[0]); rig.Receive("TELEMETRY", rig.Miners[2]); rig.Sent.Clear();
            rig.Fleet.Command(command + " all");
            Assert.Equal(new[] { "miner-0", "miner-2" }, rig.Sent.Where(p => p.Kind == "COMMAND").Select(p => p.Target).ToArray());
        }

        [Fact]
        public void TargetNamesWithSpacesAndOptionalQuotesRemainExact()
        {
            var rig = new Rig(1, true); rig.Miners[0].Id = "Deep Space Miner 1"; rig.RegisterAll();
            rig.Fleet.Command("return Deep Space Miner 1"); rig.Fleet.Command("diagnose \"Deep Space Miner 1\"");
            Assert.Equal(2, rig.Sent.Count(p => p.Kind == "COMMAND" && p.Target == "Deep Space Miner 1"));
        }

        [Fact]
        public void LocalDiagnoseKeepsItsOriginalMeaningWhileNoTargetCalibrationBroadcasts()
        {
            var rig = new Rig(2, true); rig.RegisterAll(); rig.Fleet.Command("diagnose");
            Assert.DoesNotContain(rig.Sent, p => p.Kind == "COMMAND");
            rig.Fleet.Command("calibrate"); Assert.Equal(2, rig.Sent.Count(p => p.Kind == "COMMAND" && Text(p) == "calibrate"));
        }

        [Fact]
        public void StartResumesCancellationReturnWithoutAssigningAReplacementBeforeDocking()
        {
            var rig = new Rig(1, false); rig.RegisterAll(); rig.Fleet.Command("clear-tasks");
            rig.Fleet.Command("mark 6 6 20 GPS:entry:0:0:-200: GPS:inward:0:0:-201:");
            rig.Sent.Clear(); rig.Fleet.Command("start"); rig.Tick(10);
            Assert.Contains(rig.Sent, p => p.Kind == "COMMAND" && Text(p) == "return");
            Assert.DoesNotContain(rig.Sent, p => p.Kind == "JOB"); Assert.Equal(1, rig.Fleet.CancellationCount);
            rig.Miners[0].CancelledThrough = P.Data.ReadLong(rig.Save(), "fleet", "CancelledThrough");
            rig.SetConnected(0, true); rig.Receive("TELEMETRY", rig.Miners[0]);
            Assert.Equal(0, rig.Fleet.CancellationCount);
            Assert.Contains(rig.Sent, p => p.Kind == "COMMAND" && Text(p) == "resume");
        }

        [Fact]
        public void TargetedPauseSurvivesCheckpointAndCancellationConfirmationWithoutAutoResume()
        {
            var before = new Rig(2, false); before.RegisterAll(); before.Fleet.Command("clear-tasks");
            before.Fleet.Command("start"); before.Fleet.Command("pause miner-0");
            var after = new Rig(2, true); after.Restore(before.Checkpoint());
            long watermark = P.Data.ReadLong(after.Save(), "fleet", "CancelledThrough");
            after.Miners[0].CancelledThrough = watermark; after.Miners[1].CancelledThrough = watermark;
            after.RegisterAll();
            Assert.DoesNotContain(after.Sent, p => p.Kind == "COMMAND" && p.Target == "miner-0" && Text(p) == "resume");
            Assert.Contains(after.Sent, p => p.Kind == "COMMAND" && p.Target == "miner-1" && Text(p) == "resume");
        }

        [Theory]
        [InlineData("pause")]
        [InlineData("return")]
        [InlineData("release")]
        public void TargetedStopPreventsNewJobsDespiteStaleServicingTelemetry(string command)
        {
            var rig = new Rig(2, true); rig.RegisterAll(); rig.Fleet.Command("start"); rig.Fleet.Command(command + " miner-0");
            rig.Fleet.Command("mark 30 6 20 GPS:entry:0:0:-200: GPS:inward:0:0:-201:"); rig.Tick(20);
            Assert.DoesNotContain(rig.Fleet.GetJobs(), j => j.Owner == "miner-0");
            Assert.Contains(rig.Fleet.GetJobs(), j => j.Owner == "miner-1");
            rig.Fleet.Command("resume miner-0"); rig.Tick(20);
            Assert.Contains(rig.Fleet.GetJobs(), j => j.Owner == "miner-0");
        }

        [Fact]
        public void TargetedStartDoesNotStartOtherShipsInAPausedFleet()
        {
            var rig = new Rig(2, true); rig.RegisterAll(); rig.Fleet.Command("mark 30 6 20 GPS:entry:0:0:-200: GPS:inward:0:0:-201:");
            rig.Fleet.Command("start miner-1"); rig.Tick(20);
            Assert.Single(rig.Fleet.GetJobs(), j => j.Owner.Length > 0); Assert.Contains(rig.Fleet.GetJobs(), j => j.Owner == "miner-1");
            Assert.DoesNotContain(rig.Sent, p => p.Kind == "COMMAND" && p.Target == "miner-0");
        }

        [Fact]
        public void UnknownTargetDoesNotChangeTheFleetRunningSwitch()
        {
            var rig = new Rig(0, true); Assert.Throws<ArgumentException>(() => rig.Fleet.Command("start absent miner"));
            Assert.False(rig.Save().Get("fleet", "Running").ToBoolean());
        }

        [Fact]
        public void RemoteDiagnosticsRequiresTheRegisteredPhysicalSender()
        {
            var rig = new Rig(1, true); rig.RegisterAll(); var body = new MyIni(); body.Set("diagnostics", "Text", "flight clearance zero");
            rig.Fleet.Receive(new P.Packet { Kind = "DIAGNOSTICS", From = "miner-0", Source = 55, Body = body });
            Assert.DoesNotContain("flight clearance zero", rig.Fleet.Diagnostics);
            rig.Fleet.Receive(new P.Packet { Kind = "DIAGNOSTICS", From = "miner-0", Source = 5000, Body = body });
            Assert.Contains("miner-0\nflight clearance zero", rig.Fleet.Diagnostics);
        }

        [Fact]
        public void ClearingOfflineStoppedMinersDoesNotLeaveStaleOperatorFlags()
        {
            var rig = new Rig(1, false); rig.RegisterAll(); rig.Fleet.Command("pause miner-0");
            rig.Checkpoint(); rig.Program.Now = 6; rig.Fleet.Command("clear-offline");
            var restored = new Rig(1, false); restored.Restore(rig.Program.Storage);
            Assert.Equal(0, P.Data.ReadLong(restored.Save(), "fleet", "OperatorStopCount"));
        }
    }
}