From c78ae3afa9871d5c3d854403d25442ab30545fc3 Mon Sep 17 00:00:00 2001 From: Nate Bross Date: Mon, 18 May 2026 19:29:45 -0500 Subject: [PATCH 1/6] feat: decompose pasted script Groups into folder hierarchy Pastes whose root contains elements now expand into one clip per + + + """; + + var entries = GroupPasteDecomposer.TryDecompose(xml); + + Assert.NotNull(entries); + var entry = Assert.Single(entries!); + Assert.Equal("FizzBuzz", entry.Name); + Assert.Equal(new[] { "Paste Targets" }, entry.FolderPath); + + var doc = XDocument.Parse(entry.Xml); + Assert.Equal("fmxmlsnippet", doc.Root!.Name.LocalName); + var script = doc.Root.Element("Script")!; + Assert.Equal("FizzBuzz", script.Attribute("name")!.Value); + Assert.Equal("19", script.Attribute("id")!.Value); + Assert.Null(doc.Root.Element("Group")); + } + + [Fact] + public void MultipleScriptsInGroup_EmitsOneEntryPerScript() + { + var xml = """ + + + + + + """; + + var entries = GroupPasteDecomposer.TryDecompose(xml)!; + var entry = Assert.Single(entries); + var doc = XDocument.Parse(entry.Xml); + Assert.Equal("FMObjectList", doc.Root!.Attribute("type")?.Value); + Assert.NotNull(doc.Root.Element("Script")!.Element("Step")); + } +} diff --git a/tests/SharpFM.Tests/ViewModels/MainWindowViewModelTests.cs b/tests/SharpFM.Tests/ViewModels/MainWindowViewModelTests.cs index 958d82c..fe00058 100644 --- a/tests/SharpFM.Tests/ViewModels/MainWindowViewModelTests.cs +++ b/tests/SharpFM.Tests/ViewModels/MainWindowViewModelTests.cs @@ -277,6 +277,110 @@ private static byte[] BuildClipBytes(string xml) return BitConverter.GetBytes(payload.Length).Concat(payload).ToArray(); } + [Fact] + public async Task PasteFileMakerClipData_GroupWithSingleScript_CreatesClipUnderFolder() + { + var clipboard = new MockClipboardService(); + clipboard.ClipboardData["Mac-XMSC"] = BuildClipBytes( + "" + + "" + + ""); + var vm = CreateVm(clipboard); + vm.FileMakerClips.Clear(); + + await vm.PasteFileMakerClipData(); + + var pasted = Assert.Single(vm.FileMakerClips); + Assert.Equal("FizzBuzz", pasted.Clip.Name); + Assert.Equal(new[] { "Paste Targets" }, pasted.FolderPath); + } + + [Fact] + public async Task PasteFileMakerClipData_GroupWithMultipleScripts_CreatesAllUnderSameFolder() + { + var clipboard = new MockClipboardService(); + clipboard.ClipboardData["Mac-XMSC"] = BuildClipBytes( + "" + + "