diff --git a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs index 425fd0d4..1eabc2bf 100644 --- a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs +++ b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs @@ -28,10 +28,11 @@ namespace SabreTools.Serialization.Test.CrossModel Validate(newDf.Header); Assert.NotNull(newDf.Game); - var newGame = Assert.Single(newDf.Game); - Validate(newGame); + Assert.Equal(2, newDf.Game.Length); + Validate(newDf.Game[0], nested: false); + Validate(newDf.Game[1], nested: true); - // TODO: Unsupported + // TODO: Unsupported for round-trip Assert.Null(newDf.Dir); } @@ -59,10 +60,11 @@ namespace SabreTools.Serialization.Test.CrossModel Validate(newDf.Header); Assert.NotNull(newDf.Game); - var newGame = Assert.Single(newDf.Game); - Validate(newGame); + Assert.Equal(2, newDf.Game.Length); + Validate(newDf.Game[0], nested: false); + Validate(newDf.Game[1], nested: true); - // TODO: Unsupported + // TODO: Unsupported for round-trip Assert.Null(newDf.Dir); } @@ -253,6 +255,18 @@ namespace SabreTools.Serialization.Test.CrossModel gameBase.Driver = driver; gameBase.SoftwareList = [softwarelist]; + var subdir = new Models.Logiqx.Dir + { + Name = "XXXXXX", + Game = [gameBase], + }; + + var dir = new Models.Logiqx.Dir + { + Name = "XXXXXX", + Subdir = [subdir], + }; + return new Models.Logiqx.Datafile { Build = "XXXXXX", @@ -260,7 +274,7 @@ namespace SabreTools.Serialization.Test.CrossModel SchemaLocation = "XXXXXX", Header = header, Game = [gameBase], - // Dir = [dir], // TODO: Unsupported + Dir = [dir], }; } @@ -317,10 +331,13 @@ namespace SabreTools.Serialization.Test.CrossModel /// /// Validate a GameBase /// - private static void Validate(Models.Logiqx.GameBase? gb) + private static void Validate(Models.Logiqx.GameBase? gb, bool nested) { Assert.NotNull(gb); - Assert.Equal("XXXXXX", gb.Name); + if (nested) + Assert.Equal("XXXXXX\\XXXXXX\\XXXXXX", gb.Name); + else + Assert.Equal("XXXXXX", gb.Name); Assert.Equal("XXXXXX", gb.SourceFile); Assert.Equal("XXXXXX", gb.IsBios); Assert.Equal("XXXXXX", gb.IsDevice); diff --git a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs index 7e1e2d81..7b1d98ca 100644 --- a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs @@ -94,27 +94,40 @@ namespace SabreTools.Serialization.CrossModel /// /// Convert from to an array of /// - private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item) + private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item, string? parent = null) { - if (item.Game == null || item.Game.Length == 0) - return []; + // Get the directory name + string? dirName = item.Name; + if (parent != null) + dirName = $"{parent}\\{item.Name}"; - return Array.ConvertAll(item.Game, g => - { - var machine = ConvertMachineToInternalModel(g); - machine[Models.Metadata.Machine.DirNameKey] = item.Name; - return machine; - }); + // Handle machine items + Models.Metadata.Machine[] machines = []; + if (item.Game != null && item.Game.Length > 0) + machines = Array.ConvertAll(item.Game, g => ConvertMachineToInternalModel(g, dirName)); + + // Handle dir items + List dirs = []; + foreach (var subdir in item.Subdir ?? []) + { + dirs.AddRange(ConvertDirToInternalModel(subdir, dirName)); + } + + return [.. machines, .. dirs]; } /// /// Convert from to /// - private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item) + private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item, string? dir = null) { + string? machineName = item.Name; + if (machineName != null && dir != null) + machineName = $"{dir}\\{machineName}"; + var machine = new Models.Metadata.Machine { - [Models.Metadata.Machine.NameKey] = item.Name, + [Models.Metadata.Machine.NameKey] = machineName, [Models.Metadata.Machine.SourceFileKey] = item.SourceFile, [Models.Metadata.Machine.IsBiosKey] = item.IsBios, [Models.Metadata.Machine.IsDeviceKey] = item.IsDevice,