using System; using System.Collections.Generic; using System.Reflection; using Sandbox.ModAPI.Ingame; using VRage; using VRage.Game.ModAPI.Ingame; using Xunit; using P = AutoMiningScript.Program; namespace AutoMiningScript.Tests { public class DockedServiceTests { static void Write(object target, string name, object value) { target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(target, value); } [Theory] [InlineData(false, false, false, 0)] [InlineData(true, false, false, 1)] [InlineData(false, true, false, 2)] [InlineData(true, true, false, 3)] [InlineData(false, false, true, 2)] [InlineData(true, false, true, 3)] public void DockedMinerReportsActualServiceAndFinishesWithoutANextJob(bool ore, bool batteryLow, bool hydrogenLow, int expected) { var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease"); Write(r.Miner, "job", null); Write(r.Miner, "running", false); var battery = TestRig.Battery(r.Program, batteryLow ? 2 : 10, 10); r.Hardware.Batteries.Clear(); r.Hardware.Batteries.Add(battery.Value); var tank = new Stub().Set("CubeGrid", r.Program.Me.CubeGrid).Set("IsFunctional", true) .Set("Capacity", 10000f).Set("FilledRatio", hydrogenLow ? .2d : 1d); r.Hardware.UsesHydrogen = true; r.Hardware.Tanks.Add(tank.Value); object item = default(MyInventoryItem); typeof(MyInventoryItem).GetField("Type").SetValue(item, MyItemType.MakeOre("Stone")); typeof(MyInventoryItem).GetField("Amount").SetValue(item, (MyFixedPoint)1); bool hasOre = ore; r.CargoInventory.Method("GetItems", a => { if (hasOre) ((List)a[0]).Add((MyInventoryItem)item); return null; }); r.Resources.Update(.5, P.FlightState.Servicing, 0, 0); r.Miner.Tick(.1); var t = P.Telemetry.FromIni(r.Miner.GetTelemetry()[0].ToIni()); Assert.True(t.Connected); Assert.Equal(expected, t.ServiceFlags); Assert.Equal(P.L.Service(expected), P.L.State(t)); Assert.Equal(P.L.Service(expected), t.Reason); // Base transfers and replenishment complete while the miner remains stopped. hasOre = false; battery.Set("CurrentStoredPower", 10f); tank.Set("FilledRatio", 1d); r.Resources.Update(.5, P.FlightState.Servicing, 0, 0); r.Miner.Tick(.1); t = P.Telemetry.FromIni(r.Miner.GetTelemetry()[0].ToIni()); Assert.Equal(0, t.ServiceFlags); Assert.Equal(P.L.DisplayStateStandby, P.L.State(t)); Assert.False(r.Resources.NeedsCharge); Assert.False(r.Resources.NeedsHydrogen); } [Fact] public void ChargingAboveTargetStillHonorsThePendingSortieBudget() { var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease"); r.Resources.NeedsCharge = true; r.Resources.Battery = .91; r.Resources.StoredMWh = 9.1; r.Resources.SortieBudgetMWh = 9.5; r.Resources.Service(.1); Assert.True(r.Resources.NeedsCharge); r.Resources.Battery = .96; r.Resources.StoredMWh = 9.6; r.Resources.Service(.1); Assert.False(r.Resources.NeedsCharge); } [Fact] public void FailedInventoryScanDoesNotClaimStandbyAndFaultStateStaysVisible() { var r = new MinerStateTests.MinerRig(); r.PrepareDeparture("valid-lease"); r.Resources.ScanProblem = "inventory unavailable"; r.Miner.Tick(.1); var t = r.Miner.GetTelemetry()[0]; Assert.Equal(-1, t.ServiceFlags); Assert.Equal("inventory unavailable", t.Reason); t.State = P.FlightState.Fault; t.ServiceFlags = 0; Assert.Equal(P.L.DisplayStateFault, P.L.State(t)); } [Fact] public void OldTelemetryAndDisconnectedShipsKeepFlightStateLabels() { var packet = new P.Telemetry { Connected = true, State = P.FlightState.Docked }.ToIni(); packet.Delete("telemetry", "ServiceFlags"); var t = P.Telemetry.FromIni(packet); Assert.Equal(-1, t.ServiceFlags); Assert.Equal(P.L.DisplayStateDocked, P.L.State(t)); t.Connected = false; t.State = P.FlightState.Departing; t.ServiceFlags = 3; Assert.Equal(P.L.DisplayStateDeparting, P.L.State(t)); packet.Set("telemetry", "ServiceFlags", 4); Assert.ThrowsAny(() => P.Telemetry.FromIni(packet)); } } }