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

AutoMiningScript

【SpaceEngineer】全自动挖矿脚本

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Collections.Generic;
using System.Linq;
using Sandbox.ModAPI.Ingame;
using VRage.Game.GUI.TextPanel;
using VRageMath;
using Xunit;
using P = AutoMiningScript.Program;

namespace AutoMiningScript.Tests
{
    public class DepartureMassDisplayTests
    {
        sealed class MassRole : P.RoleLogic
        {
            public double Mass;
            public MassRole(P program) : base(program) { }
            public override double MeasuredDepartureMass { get { return Mass; } }
        }

        sealed class Rig
        {
            public readonly P Program;
            public readonly P.Dashboard Dashboard;
            public readonly MassRole Role;
            public readonly List<MySprite> Sprites = new List<MySprite>();

            public Rig(string config)
            {
                config += "\n[Display]\nAutoPage=false\n";
                Program = TestRig.Program(config);
                var surface = new Stub<IMyTextSurface>()
                    .Set("TextureSize", new Vector2(1024, 512)).Set("SurfaceSize", new Vector2(1024, 512))
                    .Method("MeasureStringInPixels", args => new Vector2(args[0].ToString().Sum(c => c >= 0x2e80 ? 32 : 16), 32) * (float)args[2])
                    .Method("DrawFrame", args => new MySpriteDrawFrame(frame =>
                    {
                        Sprites.Clear(); frame.AddToList(Sprites);
                    }));
                var block = new Stub<IMyProgrammableBlock>().Set("EntityId", 20L)
                    .Set("CubeGrid", Program.Me.CubeGrid).Set("CustomName", "PB")
                    .Set("CustomData", config).Set("SurfaceCount", 1).Method("GetSurface", args => surface.Value);
                TestRig.SetBase(Program, "Me", block.Value);
                TestRig.SetBase(Program, "GridTerminalSystem", new Stub<IMyGridTerminalSystem>().Value);
                Dashboard = new P.Dashboard(Program); Role = new MassRole(Program);
            }

            public string[] Draw(double mass, double now = 0)
            {
                Program.Now = now; Role.Mass = mass; Dashboard.Draw(Role);
                return Sprites.Where(s => s.Type == SpriteType.TEXT).Select(s => s.Data).ToArray();
            }
        }

        [Theory]
        [InlineData("")]
        [InlineData("[Flight]\nDepartureMass=0\n")]
        public void AutomaticConfigurationShowsMeasurementPendingInsteadOfZeroKilograms(string config)
        {
            var text = new Rig(config).Draw(0);
            Assert.Contains(P.L.DisplayConfigMass, text);
            Assert.Contains(P.L.DisplayMeasuringMass, text);
            Assert.DoesNotContain("0 kg", text);
        }

        [Fact]
        public void AutomaticMeasurementUpdatesCachedConfigurationAndReturnsToPendingWhenInvalidated()
        {
            var rig = new Rig("[Flight]\nDepartureMass=0\n");
            Assert.Contains(P.L.DisplayMeasuringMass, rig.Draw(0));
            Assert.Contains(P.L.F(P.L.DisplayAutoMass, "13579"), rig.Draw(13579, 0.5));
            var changed = rig.Draw(24680, 1);
            Assert.Contains(P.L.F(P.L.DisplayAutoMass, "24680"), changed);
            Assert.DoesNotContain(P.L.F(P.L.DisplayAutoMass, "13579"), changed);
            Assert.Contains(P.L.DisplayMeasuringMass, rig.Draw(0, 1.5));
        }

        [Fact]
        public void PositiveConfigurationRetainsManualKilogramsEvenWhenAnAutomaticMeasurementExists()
        {
            var text = new Rig("[Flight]\nDepartureMass=90000\n").Draw(13579);
            Assert.Contains("90000 kg", text);
            Assert.DoesNotContain(P.L.F(P.L.DisplayAutoMass, "13579"), text);
            Assert.DoesNotContain(P.L.DisplayMeasuringMass, text);
        }
    }
}