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<IMyGasTank>().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<MyInventoryItem>)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<Exception>(() => P.Telemetry.FromIni(packet));
}
}
}
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<IMyGasTank>().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<MyInventoryItem>)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<Exception>(() => P.Telemetry.FromIni(packet));
}
}
}