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 Sprites = new List(); public Rig(string config) { config += "\n[Display]\nAutoPage=false\n"; Program = TestRig.Program(config); var surface = new Stub() .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().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().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); } } }