using System.Text.Json; using WirelessTextSyncer.Windows.Models; using WirelessTextSyncer.Windows.Services; namespace WirelessTextSyncer.Windows.Tests; [TestClass] public sealed class SyncMessageTests { [TestMethod] public void DeserializeAndroidInsertTextMessage() { var message = JsonSerializer.Deserialize( """{"action":"insertText","text":"hello"}""", new JsonSerializerOptions(JsonSerializerDefaults.Web)); Assert.IsNotNull(message); Assert.AreEqual(SyncAction.InsertText, message.Action); Assert.AreEqual("hello", message.Text); } [TestMethod] public void DeserializeAndroidBackspaceMessage() { var message = JsonSerializer.Deserialize( """{"action":"backspace"}""", new JsonSerializerOptions(JsonSerializerDefaults.Web)); Assert.IsNotNull(message); Assert.AreEqual(SyncAction.Backspace, message.Action); } [TestMethod] public void DeserializeAndroidReplaceAllMessage() { var message = JsonSerializer.Deserialize( """{"action":"replaceAll","text":"final text"}""", new JsonSerializerOptions(JsonSerializerDefaults.Web)); Assert.IsNotNull(message); Assert.AreEqual(SyncAction.ReplaceAll, message.Action); Assert.AreEqual("final text", message.Text); } [TestMethod] public void ReplaceAllUsesFocusedTextReplacement() { var keyboard = new RecordingKeyboardInjectionService(); var handler = new SyncMessageHandler(keyboard); handler.Handle(new SyncMessage { Action = SyncAction.ReplaceAll, Text = "final text" }); CollectionAssert.AreEqual( new[] { "replace:final text" }, keyboard.Calls); } private sealed class RecordingKeyboardInjectionService : IKeyboardInjectionService { public List Calls { get; } = []; public void InsertText(string text) { Calls.Add($"insert:{text}"); } public void ReplaceFocusedText(string text) { Calls.Add($"replace:{text}"); } public void Backspace() { Calls.Add("backspace"); } public void Enter() { Calls.Add("enter"); } } }