From 049a79c9969f3c227d261c87941c986fa8a64a14 Mon Sep 17 00:00:00 2001 From: adelikat Date: Sat, 23 May 2020 09:27:47 -0500 Subject: [PATCH] separate the logic of creating an inputlog from generate on screen input display. Some duplicated code by doing this but I'll take that over tangled code, and more importantly, this separates the need of having an instaniated movie in order to display input --- .../display/IInputDisplayGenerator.cs | 69 ++++++++++++++++++ .../movie/bk2/Bk2LogEntryGenerator.cs | 25 ++----- .../movie/interfaces/ILogEntryGenerator.cs | 5 -- .../DisplayManager/OSDManager.cs | 2 +- .../Display/InputDisplayTests.cs | 72 +++++++++++++++++++ .../Client.Common/Movie/LogGeneratorTests.cs | 37 ++-------- 6 files changed, 153 insertions(+), 57 deletions(-) create mode 100644 src/BizHawk.Client.Common/display/IInputDisplayGenerator.cs create mode 100644 src/BizHawk.Tests/Client.Common/Display/InputDisplayTests.cs diff --git a/src/BizHawk.Client.Common/display/IInputDisplayGenerator.cs b/src/BizHawk.Client.Common/display/IInputDisplayGenerator.cs new file mode 100644 index 0000000000..528de1bef5 --- /dev/null +++ b/src/BizHawk.Client.Common/display/IInputDisplayGenerator.cs @@ -0,0 +1,69 @@ +using System.Linq; +using System.Text; +using BizHawk.Emulation.Common; + +namespace BizHawk.Client.Common +{ + public interface IInputDisplayGenerator + { + /// + /// Generates a display friendly version of the input log entry + /// + string Generate(); + } + + /// + /// An implementation of that + /// uses .bk2 mnemonics as the basis for display + /// + public class Bk2InputDisplayGenerator + { + private readonly string _systemId; + private readonly IController _source; + + public Bk2InputDisplayGenerator(string systemId, IController source) + { + _systemId = systemId; + _source = source; + } + + public string Generate() + { + var sb = new StringBuilder(); + + foreach (var group in _source.Definition.ControlsOrdered) + { + if (group.Any()) + { + foreach (var button in group) + { + if (_source.Definition.AxisControls.Contains(button)) + { + int i = _source.Definition.AxisControls.IndexOf(button); + var mid = _source.Definition.AxisRanges[i].Mid; + + var val = (int)_source.AxisValue(button); + + if (val == mid) + { + sb.Append(" "); + } + else + { + sb.Append(val.ToString().PadLeft(5, ' ')).Append(','); + } + } + else if (_source.Definition.BoolButtons.Contains(button)) + { + sb.Append(_source.IsPressed(button) + ? Bk2MnemonicLookup.Lookup(button, _systemId) + : ' '); + } + } + } + } + + return sb.ToString(); + } + } +} diff --git a/src/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs b/src/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs index a170379680..8f22b6c66b 100644 --- a/src/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs +++ b/src/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs @@ -17,8 +17,6 @@ namespace BizHawk.Client.Common _source = source; } - public string GenerateInputDisplay() => CreateLogEntry(forInputDisplay: true); - public bool IsEmpty => EmptyEntry == GenerateLogEntry(); public string EmptyEntry => CreateLogEntry(createEmpty: true); @@ -63,14 +61,11 @@ namespace BizHawk.Client.Common return dict; } - private string CreateLogEntry(bool createEmpty = false, bool forInputDisplay = false) + private string CreateLogEntry(bool createEmpty = false) { var sb = new StringBuilder(); - if (!forInputDisplay) - { - sb.Append('|'); - } + sb.Append('|'); foreach (var group in _source.Definition.ControlsOrdered) { @@ -93,14 +88,7 @@ namespace BizHawk.Client.Common val = (int)_source.AxisValue(button); } - if (forInputDisplay && val == mid) - { - sb.Append(" "); - } - else - { - sb.Append(val.ToString().PadLeft(5, ' ')).Append(','); - } + sb.Append(val.ToString().PadLeft(5, ' ')).Append(','); } else if (_source.Definition.BoolButtons.Contains(button)) { @@ -112,15 +100,12 @@ namespace BizHawk.Client.Common { sb.Append(_source.IsPressed(button) ? Bk2MnemonicLookup.Lookup(button, _systemId) - : forInputDisplay ? ' ' : '.'); + : '.'); } } } - if (!forInputDisplay) - { - sb.Append('|'); - } + sb.Append('|'); } } diff --git a/src/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs b/src/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs index c29ca3652e..d40c7666f6 100644 --- a/src/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs +++ b/src/BizHawk.Client.Common/movie/interfaces/ILogEntryGenerator.cs @@ -25,11 +25,6 @@ namespace BizHawk.Client.Common /// IDictionary Map(); - /// - /// Generates a display friendly version of the input log entry - /// - string GenerateInputDisplay(); - /// /// Gets a value indicating whether or not the current controller state is "empty" /// diff --git a/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs b/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs index ae6fdb3f67..314071cd3b 100644 --- a/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs +++ b/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs @@ -224,7 +224,7 @@ namespace BizHawk.Client.EmuHawk private string MakeStringFor(IController controller) { - return Global.MovieSession.Movie.LogGeneratorInstance(controller).GenerateInputDisplay(); + return new Bk2InputDisplayGenerator(Global.Emulator.SystemId, controller).Generate(); } public string MakeIntersectImmediatePrevious() diff --git a/src/BizHawk.Tests/Client.Common/Display/InputDisplayTests.cs b/src/BizHawk.Tests/Client.Common/Display/InputDisplayTests.cs new file mode 100644 index 0000000000..6204a0e67e --- /dev/null +++ b/src/BizHawk.Tests/Client.Common/Display/InputDisplayTests.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using BizHawk.Client.Common; +using BizHawk.Emulation.Common; + +namespace BizHawk.Tests.Client.Common.Display +{ + [TestClass] + public class InputDisplayTests + { + private const int MidValue = 100; + private SimpleController _boolController = null!; + private SimpleController _floatController = null!; + + [TestInitialize] + public void Initializer() + { + _boolController = new SimpleController + { + Definition = new ControllerDefinition { BoolButtons = { "A" } } + }; + + _floatController = new SimpleController + { + Definition = new ControllerDefinition + { + AxisControls = { "StickX", "StickY" }, + AxisRanges = + { + new ControllerDefinition.AxisRange(0, MidValue, 200), + new ControllerDefinition.AxisRange(0, MidValue, 200) + } + } + }; + } + + [TestMethod] + public void Generate_BoolPressed_GeneratesMnemonic() + { + _boolController["A"] = true; + var displayGenerator = new Bk2InputDisplayGenerator("NES", _boolController); + var actual = displayGenerator.Generate(); + Assert.AreEqual("A", actual); + } + + [TestMethod] + public void Generate_BoolUnPressed_GeneratesSpace() + { + _boolController["A"] = false; + var displayGenerator = new Bk2InputDisplayGenerator("NES", _boolController); + var actual = displayGenerator.Generate(); + Assert.AreEqual(" ", actual); + } + + [TestMethod] + public void Generate_Floats() + { + var displayGenerator = new Bk2InputDisplayGenerator("NES", _floatController); + var actual = displayGenerator.Generate(); + Assert.AreEqual(" 0, 0,", actual); + } + + [TestMethod] + public void Generate_MidRangeDisplaysEmpty() + { + _floatController.AcceptNewAxes(("StickX", MidValue)); + var displayGenerator = new Bk2InputDisplayGenerator("NES", _floatController); + var actual = displayGenerator.Generate(); + Assert.AreEqual(" 0,", actual); + } + } +} diff --git a/src/BizHawk.Tests/Client.Common/Movie/LogGeneratorTests.cs b/src/BizHawk.Tests/Client.Common/Movie/LogGeneratorTests.cs index 98ab1f2856..0423ac7d27 100644 --- a/src/BizHawk.Tests/Client.Common/Movie/LogGeneratorTests.cs +++ b/src/BizHawk.Tests/Client.Common/Movie/LogGeneratorTests.cs @@ -9,9 +9,7 @@ namespace BizHawk.Common.Tests.Client.Common.Movie public class LogGeneratorTests { private SimpleController _boolController = null!; - private Bk2LogEntryGenerator _lg = null!; private SimpleController _floatController = null!; - private Bk2LogEntryGenerator _floatLg = null!; [TestInitialize] public void Initializer() @@ -33,9 +31,6 @@ namespace BizHawk.Common.Tests.Client.Common.Movie } } }; - - _lg = new Bk2LogEntryGenerator("NES", _boolController); - _floatLg = new Bk2LogEntryGenerator("NES", _floatController); } [TestMethod] @@ -59,7 +54,8 @@ namespace BizHawk.Common.Tests.Client.Common.Movie public void GenerateLogEntry_BoolPressed_GeneratesMnemonic() { _boolController["A"] = true; - var actual = _lg.GenerateLogEntry(); + var lg = new Bk2LogEntryGenerator("NES", _boolController); + var actual = lg.GenerateLogEntry(); Assert.AreEqual("|A|", actual); } @@ -67,38 +63,17 @@ namespace BizHawk.Common.Tests.Client.Common.Movie public void GenerateLogEntry_BoolUnPressed_GeneratesPeriod() { _boolController["A"] = false; - var actual = _lg.GenerateLogEntry(); + var lg = new Bk2LogEntryGenerator("NES", _boolController); + var actual = lg.GenerateLogEntry(); Assert.AreEqual("|.|", actual); } [TestMethod] public void GenerateLogEntry_Floats() { - var actual = _floatLg.GenerateLogEntry(); + var lg = new Bk2LogEntryGenerator("NES", _floatController); + var actual = lg.GenerateLogEntry(); Assert.AreEqual("| 0, 0,|", actual); } - - [TestMethod] - public void GenerateInputDisplay_BoolPressed_GeneratesMnemonic() - { - _boolController["A"] = true; - var actual = _lg.GenerateInputDisplay(); - Assert.AreEqual("A", actual); - } - - [TestMethod] - public void GenerateInputDisplay_BoolUnPressed_GeneratesSpace() - { - _boolController["A"] = false; - var actual = _lg.GenerateInputDisplay(); - Assert.AreEqual(" ", actual); - } - - [TestMethod] - public void GenerateInputDisplay_Floats() - { - var actual = _floatLg.GenerateInputDisplay(); - Assert.AreEqual(" 0, 0,", actual); - } } } \ No newline at end of file