diff --git a/AssetEditor.sln b/AssetEditor.sln index b1c6a54de..0234a8c21 100644 --- a/AssetEditor.sln +++ b/AssetEditor.sln @@ -102,6 +102,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetEditorUpdater", "Asset EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetEditorTests", "Testing\AssetEditorTests\AssetEditorTests.csproj", "{4E51AFDA-E5D2-9D14-22C8-F790FE265A65}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Ipc", "Ipc", "{60CD305C-A8D3-460D-9620-4B60E9BB0894}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Editors.Ipc", "Editors\Ipc\IpcEditor\Editors.Ipc.csproj", "{8F022F40-E780-42CD-BB81-D59E9DAFC111}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Ipc", "Editors\Ipc\Test.Ipc\Test.Ipc.csproj", "{34E82457-C19B-4EEF-B901-0E7CF1D97BCE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -240,6 +246,14 @@ Global {4E51AFDA-E5D2-9D14-22C8-F790FE265A65}.Debug|Any CPU.Build.0 = Debug|Any CPU {4E51AFDA-E5D2-9D14-22C8-F790FE265A65}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E51AFDA-E5D2-9D14-22C8-F790FE265A65}.Release|Any CPU.Build.0 = Release|Any CPU + {8F022F40-E780-42CD-BB81-D59E9DAFC111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F022F40-E780-42CD-BB81-D59E9DAFC111}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F022F40-E780-42CD-BB81-D59E9DAFC111}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F022F40-E780-42CD-BB81-D59E9DAFC111}.Release|Any CPU.Build.0 = Release|Any CPU + {34E82457-C19B-4EEF-B901-0E7CF1D97BCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34E82457-C19B-4EEF-B901-0E7CF1D97BCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34E82457-C19B-4EEF-B901-0E7CF1D97BCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34E82457-C19B-4EEF-B901-0E7CF1D97BCE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -286,6 +300,9 @@ Global {0FCE7A0E-6478-A603-6491-6FE675F54000} = {3123DC8F-5FAD-45A9-8DCC-7C5E0E61FAEB} {E759BE6D-E0A4-46B8-A02A-E8573F579E2F} = {3123DC8F-5FAD-45A9-8DCC-7C5E0E61FAEB} {4E51AFDA-E5D2-9D14-22C8-F790FE265A65} = {18424B6A-CB8A-4CE1-935C-72459F31521B} + {60CD305C-A8D3-460D-9620-4B60E9BB0894} = {07AC615B-A8FC-4E1A-BDD5-BC11452429A0} + {8F022F40-E780-42CD-BB81-D59E9DAFC111} = {60CD305C-A8D3-460D-9620-4B60E9BB0894} + {34E82457-C19B-4EEF-B901-0E7CF1D97BCE} = {60CD305C-A8D3-460D-9620-4B60E9BB0894} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AB5968F3-98ED-4AFF-98EA-0DBEDCACADF2} diff --git a/AssetEditor/App.xaml.cs b/AssetEditor/App.xaml.cs index b436aebf1..73f294bd6 100644 --- a/AssetEditor/App.xaml.cs +++ b/AssetEditor/App.xaml.cs @@ -4,11 +4,11 @@ using System.Windows; using System.Windows.Threading; using AssetEditor.Services; -using AssetEditor.Services.Ipc; using AssetEditor.UiCommands; using AssetEditor.ViewModels; using AssetEditor.Views; using CommunityToolkit.Diagnostics; +using Editors.Ipc; using Microsoft.Extensions.DependencyInjection; using Shared.Core.DependencyInjection; using Shared.Core.DevConfig; diff --git a/AssetEditor/AssetEditor.csproj b/AssetEditor/AssetEditor.csproj index 872a8aec1..0f7f43d23 100644 --- a/AssetEditor/AssetEditor.csproj +++ b/AssetEditor/AssetEditor.csproj @@ -19,6 +19,7 @@ + diff --git a/AssetEditor/DependencyInjectionContainer.cs b/AssetEditor/DependencyInjectionContainer.cs index a8fde5af5..9633f055f 100644 --- a/AssetEditor/DependencyInjectionContainer.cs +++ b/AssetEditor/DependencyInjectionContainer.cs @@ -1,5 +1,4 @@ using AssetEditor.Services; -using AssetEditor.Services.Ipc; using AssetEditor.UiCommands; using AssetEditor.ViewModels; using AssetEditor.Views; @@ -31,12 +30,6 @@ public override void Register(IServiceCollection serviceCollection) serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); - serviceCollection.AddTransient(); - serviceCollection.AddTransient(); - serviceCollection.AddTransient(); - serviceCollection.AddTransient(); - serviceCollection.AddTransient(); - serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); diff --git a/AssetEditor/Services/DependencyInjectionConfig.cs b/AssetEditor/Services/DependencyInjectionConfig.cs index 470e40da1..fd9bd917b 100644 --- a/AssetEditor/Services/DependencyInjectionConfig.cs +++ b/AssetEditor/Services/DependencyInjectionConfig.cs @@ -34,6 +34,7 @@ public DependencyInjectionConfig(bool loadResources = true) new Editor.VisualSkeletonEditor.DependencyInjectionContainer(), new Editors.AnimatioReTarget.DependencyInjectionContainer(), new Editors.Twui.DependencyInjectionContainer(), + new Editors.Ipc.DependencyInjectionContainer(), // Host application new DependencyInjectionContainer(), diff --git a/AssetEditor/Services/EditorManager.cs b/AssetEditor/Services/EditorManager.cs index e8efb3988..5da794368 100644 --- a/AssetEditor/Services/EditorManager.cs +++ b/AssetEditor/Services/EditorManager.cs @@ -15,21 +15,6 @@ namespace AssetEditor.Services { - public interface IEditorManager : IEditorCreator - { - IList GetAllEditors(); - int GetCurrentEditor(); - - public void CloseTool(IEditorInterface tool); - public bool ShouldBlockCloseCommand(IEditorInterface editor, bool hasUnsavedFiles); - - public void CloseOtherTools(IEditorInterface tool); - public void CloseAllTools(IEditorInterface tool); - public void CloseToolsToLeft(IEditorInterface tool); - public void CloseToolsToRight(IEditorInterface tool); - public bool Drop(IEditorInterface node, IEditorInterface targetNode = default, bool insertAfterTargetNode = default); - } - public partial class EditorManager : ObservableObject, IEditorManager { private readonly ILogger _logger = Logging.Create(); @@ -51,6 +36,14 @@ public EditorManager(IGlobalEventHub eventHub, IPackFileService packFileService, public IList GetAllEditors() => CurrentEditorsList; public int GetCurrentEditor() => SelectedEditorIndex; + + public void SetEditorAsCurrent(IEditorInterface editor) + { + var index = CurrentEditorsList.IndexOf(editor); + if (index >= 0) + SelectedEditorIndex = index; + } + public IEditorInterface CreateFromFile(PackFile file, EditorEnums? preferedEditor) { if (file == null) diff --git a/AssetEditor/Services/Ipc/AssetEditorIpcServer.cs b/Editors/Ipc/IpcEditor/AssetEditorIpcServer.cs similarity index 97% rename from AssetEditor/Services/Ipc/AssetEditorIpcServer.cs rename to Editors/Ipc/IpcEditor/AssetEditorIpcServer.cs index 1326f65ed..023198e6a 100644 --- a/AssetEditor/Services/Ipc/AssetEditorIpcServer.cs +++ b/Editors/Ipc/IpcEditor/AssetEditorIpcServer.cs @@ -1,16 +1,12 @@ -using System; -using System.IO; -using System.IO.Pipes; +using System.IO.Pipes; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using System.Threading; -using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Serilog; using Shared.Core.ErrorHandling; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class AssetEditorIpcServer : IDisposable { diff --git a/Editors/Ipc/IpcEditor/DependencyInjectionContainer.cs b/Editors/Ipc/IpcEditor/DependencyInjectionContainer.cs new file mode 100644 index 000000000..8d5e98394 --- /dev/null +++ b/Editors/Ipc/IpcEditor/DependencyInjectionContainer.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +using Shared.Core.DependencyInjection; +using Shared.Core.ToolCreation; + +namespace Editors.Ipc +{ + public class DependencyInjectionContainer : DependencyContainer + { + public override void Register(IServiceCollection serviceCollection) + { + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddSingleton(); + } + + public override void RegisterTools(IEditorDatabase factory) + { + + } + } +} diff --git a/Editors/Ipc/IpcEditor/Editors.Ipc.csproj b/Editors/Ipc/IpcEditor/Editors.Ipc.csproj new file mode 100644 index 000000000..590d8d600 --- /dev/null +++ b/Editors/Ipc/IpcEditor/Editors.Ipc.csproj @@ -0,0 +1,16 @@ + + + + net10.0-windows + enable + enable + + + + + + + + + + diff --git a/AssetEditor/Services/Ipc/ExternalFileOpenExecutor.cs b/Editors/Ipc/IpcEditor/ExternalFileOpenExecutor.cs similarity index 93% rename from AssetEditor/Services/Ipc/ExternalFileOpenExecutor.cs rename to Editors/Ipc/IpcEditor/ExternalFileOpenExecutor.cs index 0cb369b5b..14516a27c 100644 --- a/AssetEditor/Services/Ipc/ExternalFileOpenExecutor.cs +++ b/Editors/Ipc/IpcEditor/ExternalFileOpenExecutor.cs @@ -11,7 +11,7 @@ using Shared.Core.PackFiles.Models; using Shared.Core.ToolCreation; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class ExternalFileOpenExecutor : IExternalFileOpenExecutor { @@ -106,12 +106,10 @@ private bool TryImportIntoExistingKitbash(PackFile file) private void SelectEditor(IEditorInterface editor) { - if (_editorManager is not EditorManager concreteEditorManager) + if (_editorManager is not IEditorManager concreteEditorManager) return; - var index = concreteEditorManager.CurrentEditorsList.IndexOf(editor); - if (index >= 0) - concreteEditorManager.SelectedEditorIndex = index; + _editorManager.SetEditorAsCurrent(editor); } public static bool ShouldForceKitbash(PackFile file) diff --git a/AssetEditor/Services/Ipc/ExternalPackFileLookup.cs b/Editors/Ipc/IpcEditor/ExternalPackFileLookup.cs similarity index 86% rename from AssetEditor/Services/Ipc/ExternalPackFileLookup.cs rename to Editors/Ipc/IpcEditor/ExternalPackFileLookup.cs index 50272e5d4..df9f76eb6 100644 --- a/AssetEditor/Services/Ipc/ExternalPackFileLookup.cs +++ b/Editors/Ipc/IpcEditor/ExternalPackFileLookup.cs @@ -1,7 +1,7 @@ -using Shared.Core.PackFiles; +using Shared.Core.PackFiles; using Shared.Core.PackFiles.Models; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class ExternalPackFileLookup : IExternalPackFileLookup { diff --git a/AssetEditor/Services/Ipc/ExternalPackLoader.cs b/Editors/Ipc/IpcEditor/ExternalPackLoader.cs similarity index 96% rename from AssetEditor/Services/Ipc/ExternalPackLoader.cs rename to Editors/Ipc/IpcEditor/ExternalPackLoader.cs index 8ce3018f1..e688481df 100644 --- a/AssetEditor/Services/Ipc/ExternalPackLoader.cs +++ b/Editors/Ipc/IpcEditor/ExternalPackLoader.cs @@ -1,16 +1,11 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; using Serilog; using Shared.Core.ErrorHandling; using Shared.Core.PackFiles; using Shared.Core.PackFiles.Models; using Shared.Core.PackFiles.Utility; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class ExternalPackLoader : IExternalPackLoader { diff --git a/AssetEditor/Services/Ipc/IExternalFileOpenExecutor.cs b/Editors/Ipc/IpcEditor/IExternalFileOpenExecutor.cs similarity index 60% rename from AssetEditor/Services/Ipc/IExternalFileOpenExecutor.cs rename to Editors/Ipc/IpcEditor/IExternalFileOpenExecutor.cs index 455deb1de..8e3acbcb7 100644 --- a/AssetEditor/Services/Ipc/IExternalFileOpenExecutor.cs +++ b/Editors/Ipc/IpcEditor/IExternalFileOpenExecutor.cs @@ -1,8 +1,6 @@ -using System.Threading; -using System.Threading.Tasks; -using Shared.Core.PackFiles.Models; +using Shared.Core.PackFiles.Models; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public interface IExternalFileOpenExecutor { diff --git a/AssetEditor/Services/Ipc/IIpcRequestHandler.cs b/Editors/Ipc/IpcEditor/IIpcRequestHandler.cs similarity index 87% rename from AssetEditor/Services/Ipc/IIpcRequestHandler.cs rename to Editors/Ipc/IpcEditor/IIpcRequestHandler.cs index 41da5d6bf..7a89fc9b4 100644 --- a/AssetEditor/Services/Ipc/IIpcRequestHandler.cs +++ b/Editors/Ipc/IpcEditor/IIpcRequestHandler.cs @@ -1,8 +1,6 @@ -using System.Threading; -using System.Threading.Tasks; -using Shared.Core.PackFiles.Models; +using Shared.Core.PackFiles.Models; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public interface IIpcRequestHandler { diff --git a/AssetEditor/Services/Ipc/IpcRequest.cs b/Editors/Ipc/IpcEditor/IpcRequest.cs similarity index 89% rename from AssetEditor/Services/Ipc/IpcRequest.cs rename to Editors/Ipc/IpcEditor/IpcRequest.cs index c9632ade4..8083ae8e7 100644 --- a/AssetEditor/Services/Ipc/IpcRequest.cs +++ b/Editors/Ipc/IpcEditor/IpcRequest.cs @@ -1,4 +1,4 @@ -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class IpcRequest { diff --git a/AssetEditor/Services/Ipc/IpcRequestHandler.cs b/Editors/Ipc/IpcEditor/IpcRequestHandler.cs similarity index 96% rename from AssetEditor/Services/Ipc/IpcRequestHandler.cs rename to Editors/Ipc/IpcEditor/IpcRequestHandler.cs index fdcf96080..2b252b434 100644 --- a/AssetEditor/Services/Ipc/IpcRequestHandler.cs +++ b/Editors/Ipc/IpcEditor/IpcRequestHandler.cs @@ -1,10 +1,7 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Serilog; +using Serilog; using Shared.Core.ErrorHandling; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class IpcRequestHandler : IIpcRequestHandler { diff --git a/AssetEditor/Services/Ipc/IpcResponse.cs b/Editors/Ipc/IpcEditor/IpcResponse.cs similarity index 92% rename from AssetEditor/Services/Ipc/IpcResponse.cs rename to Editors/Ipc/IpcEditor/IpcResponse.cs index 6f9510758..84453b6b0 100644 --- a/AssetEditor/Services/Ipc/IpcResponse.cs +++ b/Editors/Ipc/IpcEditor/IpcResponse.cs @@ -1,4 +1,4 @@ -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class IpcResponse { diff --git a/AssetEditor/Services/Ipc/IpcUserNotifier.cs b/Editors/Ipc/IpcEditor/IpcUserNotifier.cs similarity index 90% rename from AssetEditor/Services/Ipc/IpcUserNotifier.cs rename to Editors/Ipc/IpcEditor/IpcUserNotifier.cs index e6ea5801f..1fe89a6f9 100644 --- a/AssetEditor/Services/Ipc/IpcUserNotifier.cs +++ b/Editors/Ipc/IpcEditor/IpcUserNotifier.cs @@ -1,9 +1,7 @@ -using System.Threading; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; using Shared.Core.Services; -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public class IpcUserNotifier : IIpcUserNotifier { diff --git a/AssetEditor/Services/Ipc/PackPathResolver.cs b/Editors/Ipc/IpcEditor/PackPathResolver.cs similarity index 96% rename from AssetEditor/Services/Ipc/PackPathResolver.cs rename to Editors/Ipc/IpcEditor/PackPathResolver.cs index c0e5ef7e3..6d30f3bbd 100644 --- a/AssetEditor/Services/Ipc/PackPathResolver.cs +++ b/Editors/Ipc/IpcEditor/PackPathResolver.cs @@ -1,6 +1,4 @@ -using System; - -namespace AssetEditor.Services.Ipc +namespace Editors.Ipc { public static class PackPathResolver { diff --git a/Testing/AssetEditorTests/Ipc/ExternalFileOpenExecutorTests.cs b/Editors/Ipc/Test.Ipc/ExternalFileOpenExecutorTests.cs similarity index 79% rename from Testing/AssetEditorTests/Ipc/ExternalFileOpenExecutorTests.cs rename to Editors/Ipc/Test.Ipc/ExternalFileOpenExecutorTests.cs index 2c5489cc8..b6dad4499 100644 --- a/Testing/AssetEditorTests/Ipc/ExternalFileOpenExecutorTests.cs +++ b/Editors/Ipc/Test.Ipc/ExternalFileOpenExecutorTests.cs @@ -1,59 +1,59 @@ -using AssetEditor.Services.Ipc; +using Editors.Ipc; using Shared.Core.PackFiles.Models; -namespace AssetEditorTests.Ipc +namespace Test.Ipc { - [TestClass] + public class ExternalFileOpenExecutorTests { - [TestMethod] + [Test] public void ShouldForceKitbash_ReturnsTrue_ForWsmodel() { var file = PackFile.CreateFromBytes("arb_base_elephant_1.wsmodel", []); var result = ExternalFileOpenExecutor.ShouldForceKitbash(file); - Assert.IsTrue(result); + Assert.That(result, Is.True); } - [TestMethod] + [Test] public void ShouldForceKitbash_ReturnsTrue_ForVariantMeshDefinition() { var file = PackFile.CreateFromBytes("arb_base_elephant.variantmeshdefinition", []); var result = ExternalFileOpenExecutor.ShouldForceKitbash(file); - Assert.IsTrue(result); + Assert.That(result, Is.True); } - [TestMethod] + [Test] public void ShouldForceKitbash_ReturnsFalse_ForRigidModel() { var file = PackFile.CreateFromBytes("arb_base_elephant.rigid_model_v2", []); var result = ExternalFileOpenExecutor.ShouldForceKitbash(file); - Assert.IsFalse(result); + Assert.That(result, Is.False); } - [TestMethod] + [Test] public void CanImportIntoKitbash_ReturnsTrue_ForRigidModel() { var file = PackFile.CreateFromBytes("arb_base_elephant.rigid_model_v2", []); var result = ExternalFileOpenExecutor.CanImportIntoKitbash(file); - Assert.IsTrue(result); + Assert.That(result, Is.True); } - [TestMethod] + [Test] public void CanImportIntoKitbash_ReturnsFalse_ForUnsupportedFile() { var file = PackFile.CreateFromBytes("something.anim", []); var result = ExternalFileOpenExecutor.CanImportIntoKitbash(file); - Assert.IsFalse(result); + Assert.That(result, Is.False); } } } diff --git a/Testing/AssetEditorTests/Ipc/IpcRequestHandlerTests.cs b/Editors/Ipc/Test.Ipc/IpcRequestHandlerTests.cs similarity index 72% rename from Testing/AssetEditorTests/Ipc/IpcRequestHandlerTests.cs rename to Editors/Ipc/Test.Ipc/IpcRequestHandlerTests.cs index 389038b67..24e9c6135 100644 --- a/Testing/AssetEditorTests/Ipc/IpcRequestHandlerTests.cs +++ b/Editors/Ipc/Test.Ipc/IpcRequestHandlerTests.cs @@ -1,12 +1,11 @@ -using AssetEditor.Services.Ipc; +using Editors.Ipc; using Shared.Core.PackFiles.Models; -namespace AssetEditorTests.Ipc +namespace Test.Ipc { - [TestClass] public class IpcRequestHandlerTests { - [TestMethod] + [Test] public async Task HandleAsync_ReturnsUnsupportedAction_ForUnknownAction() { var packLoader = new FakePackLoader(); @@ -17,25 +16,25 @@ public async Task HandleAsync_ReturnsUnsupportedAction_ForUnknownAction() var result = await sut.HandleAsync(new IpcRequest { Action = "ping", Path = "x" }, CancellationToken.None); - Assert.IsFalse(result.Ok); - Assert.AreEqual("Unsupported action", result.Error); - Assert.AreEqual(0, opener.OpenCallCount); - Assert.AreEqual(0, notifier.CallCount); - Assert.AreEqual(0, packLoader.CallCount); + Assert.That(result.Ok, Is.False); + Assert.That(result.Error, Is.EqualTo("Unsupported action")); + Assert.That(opener.OpenCallCount, Is.Zero); + Assert.That(notifier.CallCount, Is.Zero); + Assert.That(packLoader.CallCount, Is.Zero); } - [TestMethod] + [Test] public async Task HandleAsync_ReturnsError_ForEmptyPath() { var sut = new IpcRequestHandler(new FakePackLoader(), new FakeLookup(), new FakeOpenExecutor(), new FakeNotifier()); var result = await sut.HandleAsync(new IpcRequest { Action = "open", Path = " " }, CancellationToken.None); - Assert.IsFalse(result.Ok); - Assert.AreEqual("Path is empty", result.Error); + Assert.That(result.Ok, Is.False); + Assert.That(result.Error, Is.EqualTo("Path is empty")); } - [TestMethod] + [Test] public async Task HandleAsync_ReturnsNotFound_AndShowsDialog_WhenLookupFails() { var packLoader = new FakePackLoader(); @@ -50,17 +49,17 @@ public async Task HandleAsync_ReturnsNotFound_AndShowsDialog_WhenLookupFails() Path = @"C:\tmp\variantmeshes\foo\bar.rigid_model_v2" }, CancellationToken.None); - Assert.IsFalse(result.Ok); - Assert.AreEqual("File not found", result.Error); - Assert.AreEqual(@"variantmeshes\foo\bar.rigid_model_v2", result.NormalizedPath); - Assert.AreEqual(@"variantmeshes\foo\bar.rigid_model_v2", lookup.LastRequestedPath); - Assert.AreEqual(1, notifier.CallCount); - Assert.AreEqual(@"variantmeshes\foo\bar.rigid_model_v2", notifier.LastPath); - Assert.AreEqual(0, opener.OpenCallCount); - Assert.AreEqual(0, packLoader.CallCount); + Assert.That(result.Ok, Is.False); + Assert.That(result.Error, Is.EqualTo("File not found")); + Assert.That(result.NormalizedPath, Is.EqualTo(@"variantmeshes\foo\bar.rigid_model_v2")); + Assert.That(lookup.LastRequestedPath, Is.EqualTo(@"variantmeshes\foo\bar.rigid_model_v2")); + Assert.That(notifier.CallCount, Is.EqualTo(1)); + Assert.That(notifier.LastPath, Is.EqualTo(@"variantmeshes\foo\bar.rigid_model_v2")); + Assert.That(opener.OpenCallCount, Is.Zero); + Assert.That(packLoader.CallCount, Is.Zero); } - [TestMethod] + [Test] public async Task HandleAsync_OpensFile_AndReturnsOk_WhenLookupSucceeds() { var packFile = PackFile.CreateFromBytes("bird.rigid_model_v2", []); @@ -76,16 +75,16 @@ public async Task HandleAsync_OpensFile_AndReturnsOk_WhenLookupSucceeds() Path = @"variantmeshes\foo\bird.rigid_model_v2" }, CancellationToken.None); - Assert.IsTrue(result.Ok); - Assert.AreEqual(1, opener.OpenCallCount); - Assert.AreSame(packFile, opener.LastFile); - Assert.IsTrue(opener.LastBringToFront); - Assert.IsFalse(opener.LastOpenInExistingKitbashTab); - Assert.AreEqual(0, notifier.CallCount); - Assert.AreEqual(0, packLoader.CallCount); + Assert.That(result.Ok, Is.True); + Assert.That(opener.OpenCallCount, Is.EqualTo(1)); + Assert.That(opener.LastFile, Is.SameAs(packFile)); + Assert.That(opener.LastBringToFront, Is.True); + Assert.That(opener.LastOpenInExistingKitbashTab, Is.False); + Assert.That(notifier.CallCount, Is.Zero); + Assert.That(packLoader.CallCount, Is.Zero); } - [TestMethod] + [Test] public async Task HandleAsync_DoesNotBringToFront_WhenBringToFrontFalse() { var packFile = PackFile.CreateFromBytes("bird.rigid_model_v2", []); @@ -101,14 +100,14 @@ public async Task HandleAsync_DoesNotBringToFront_WhenBringToFrontFalse() BringToFront = false }, CancellationToken.None); - Assert.IsTrue(result.Ok); - Assert.AreEqual(1, opener.OpenCallCount); - Assert.IsFalse(opener.LastBringToFront); - Assert.IsFalse(opener.LastOpenInExistingKitbashTab); - Assert.AreEqual(0, packLoader.CallCount); + Assert.That(result.Ok, Is.True); + Assert.That(opener.OpenCallCount, Is.EqualTo(1)); + Assert.That(opener.LastBringToFront, Is.False); + Assert.That(opener.LastOpenInExistingKitbashTab, Is.False); + Assert.That(packLoader.CallCount, Is.Zero); } - [TestMethod] + [Test] public async Task HandleAsync_LoadsPackFromDisk_WhenPackPathProvided() { var packFile = PackFile.CreateFromBytes("arb_base_elephant.rigid_model_v2", []); @@ -124,14 +123,14 @@ public async Task HandleAsync_LoadsPackFromDisk_WhenPackPathProvided() PackPathOnDisk = "k:/SteamLibrary/steamapps/common/Total War WARHAMMER III/data/ovn_araby.pack" }, CancellationToken.None); - Assert.IsTrue(result.Ok); - Assert.AreEqual(1, packLoader.CallCount); - Assert.AreEqual("k:/SteamLibrary/steamapps/common/Total War WARHAMMER III/data/ovn_araby.pack", packLoader.LastPackPath); - Assert.AreEqual(1, opener.OpenCallCount); - Assert.IsFalse(opener.LastOpenInExistingKitbashTab); + Assert.That(result.Ok, Is.True); + Assert.That(packLoader.CallCount, Is.EqualTo(1)); + Assert.That(packLoader.LastPackPath, Is.EqualTo("k:/SteamLibrary/steamapps/common/Total War WARHAMMER III/data/ovn_araby.pack")); + Assert.That(opener.OpenCallCount, Is.EqualTo(1)); + Assert.That(opener.LastOpenInExistingKitbashTab, Is.False); } - [TestMethod] + [Test] public async Task HandleAsync_ReturnsFailure_WhenPackLoadFails() { var packLoader = new FakePackLoader @@ -150,14 +149,14 @@ public async Task HandleAsync_ReturnsFailure_WhenPackLoadFails() PackPathOnDisk = @"k:\mods\ovn_araby.pack" }, CancellationToken.None); - Assert.IsFalse(result.Ok); - Assert.AreEqual("Pack file load failed", result.Error); - Assert.AreEqual(1, packLoader.CallCount); - Assert.AreEqual(0, opener.OpenCallCount); - Assert.AreEqual(0, notifier.CallCount); + Assert.That(result.Ok, Is.False); + Assert.That(result.Error, Is.EqualTo("Pack file load failed")); + Assert.That(packLoader.CallCount, Is.EqualTo(1)); + Assert.That(opener.OpenCallCount, Is.Zero); + Assert.That(notifier.CallCount, Is.Zero); } - [TestMethod] + [Test] public async Task HandleAsync_PassesOpenInExistingKitbashTabFlag_ToExecutor() { var packFile = PackFile.CreateFromBytes("arb_base_elephant_1.wsmodel", []); @@ -173,9 +172,9 @@ public async Task HandleAsync_PassesOpenInExistingKitbashTabFlag_ToExecutor() OpenInExistingKitbashTab = true }, CancellationToken.None); - Assert.IsTrue(result.Ok); - Assert.AreEqual(1, opener.OpenCallCount); - Assert.IsTrue(opener.LastOpenInExistingKitbashTab); + Assert.That(result.Ok, Is.True); + Assert.That(opener.OpenCallCount, Is.EqualTo(1)); + Assert.That(opener.LastOpenInExistingKitbashTab, Is.True); } private class FakeLookup : IExternalPackFileLookup diff --git a/Testing/AssetEditorTests/Ipc/PackPathResolverTests.cs b/Editors/Ipc/Test.Ipc/PackPathResolverTests.cs similarity index 67% rename from Testing/AssetEditorTests/Ipc/PackPathResolverTests.cs rename to Editors/Ipc/Test.Ipc/PackPathResolverTests.cs index c0f0d1c60..abd4d6557 100644 --- a/Testing/AssetEditorTests/Ipc/PackPathResolverTests.cs +++ b/Editors/Ipc/Test.Ipc/PackPathResolverTests.cs @@ -1,48 +1,39 @@ -using AssetEditor.Services.Ipc; +using Editors.Ipc; -namespace AssetEditorTests.Ipc +namespace Test.Ipc { - [TestClass] public class PackPathResolverTests { - [TestMethod] + [Test] public void ResolvePackPath_ExtractsVariantMeshesSuffix_FromAbsolutePath() { var input = @"C:\games\wh3\data\variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2"; - var result = PackPathResolver.ResolvePackPath(input); - - Assert.AreEqual(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2", result); + Assert.That(result, Is.EqualTo(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2")); } - [TestMethod] + [Test] public void ResolvePackPath_NormalizesForwardSlashes_AndQuotes() { var input = "\"variantmeshes/wh_variantmodels/bi1/cth/bird.rigid_model_v2\""; - var result = PackPathResolver.ResolvePackPath(input); - - Assert.AreEqual(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2", result); + Assert.That(result, Is.EqualTo(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2")); } - [TestMethod] + [Test] public void ResolvePackPath_CollapsesRepeatedBackslashes() { var input = @"variantmeshes\\wh_variantmodels\\bi1\\cth\\bird.rigid_model_v2"; - var result = PackPathResolver.ResolvePackPath(input); - - Assert.AreEqual(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2", result); + Assert.That(result, Is.EqualTo(@"variantmeshes\wh_variantmodels\bi1\cth\bird.rigid_model_v2")); } - [TestMethod] + [Test] public void ResolvePackPath_ReturnsInput_WhenNoKnownRootFound() { var input = @"custom_folder\mesh.rigid_model_v2"; - var result = PackPathResolver.ResolvePackPath(input); - - Assert.AreEqual(input, result); + Assert.That(input, Is.EqualTo(result)); } } } diff --git a/Editors/Ipc/Test.Ipc/Test.Ipc.csproj b/Editors/Ipc/Test.Ipc/Test.Ipc.csproj new file mode 100644 index 000000000..68a842903 --- /dev/null +++ b/Editors/Ipc/Test.Ipc/Test.Ipc.csproj @@ -0,0 +1,25 @@ + + + + net10.0-windows + enable + enable + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Shared/SharedCore/ToolCreation/IEditorInterface.cs b/Shared/SharedCore/ToolCreation/IEditorInterface.cs index 0926db3e9..720652b4b 100644 --- a/Shared/SharedCore/ToolCreation/IEditorInterface.cs +++ b/Shared/SharedCore/ToolCreation/IEditorInterface.cs @@ -28,4 +28,23 @@ public interface IEditorCreator IEditorInterface Create(EditorEnums editor, Action? onInitializeCallback = null); Window CreateWindow(PackFile packFile, EditorEnums? preferedEditor = null); } + + public interface IEditorManager : IEditorCreator + { + IList GetAllEditors(); + int GetCurrentEditor(); + void SetEditorAsCurrent(IEditorInterface editor); + + public void CloseTool(IEditorInterface tool); + public bool ShouldBlockCloseCommand(IEditorInterface editor, bool hasUnsavedFiles); + + public void CloseOtherTools(IEditorInterface tool); + public void CloseAllTools(IEditorInterface tool); + public void CloseToolsToLeft(IEditorInterface tool); + public void CloseToolsToRight(IEditorInterface tool); + public bool Drop(IEditorInterface node, IEditorInterface targetNode = default, bool insertAfterTargetNode = default); + + + + } }