diff --git a/SabreTools.DatItems.Test/DatItemToolTests.cs b/SabreTools.DatItems.Test/DatItemToolTests.cs index 8a5a2c74..ea425e13 100644 --- a/SabreTools.DatItems.Test/DatItemToolTests.cs +++ b/SabreTools.DatItems.Test/DatItemToolTests.cs @@ -117,7 +117,7 @@ namespace SabreTools.DatItems.Test SHA256 = sha256.FromHexString(), }; - Formats.File actual = baseFile.ConvertToFile(); + File actual = baseFile.ConvertToFile(); Assert.Equal(crc, actual.CRC); Assert.Equal(md5, actual.MD5); @@ -269,7 +269,7 @@ namespace SabreTools.DatItems.Test string sha1 = TextHelper.NormalizeSHA1("1234abcd")!; string sha256 = TextHelper.NormalizeSHA256("1234abcd")!; - Formats.File file = new Formats.File + File file = new File { CRC = crc, MD5 = md5, diff --git a/SabreTools.DatItems.Test/Formats/DiskTests.cs b/SabreTools.DatItems.Test/Formats/DiskTests.cs new file mode 100644 index 00000000..ef94f277 --- /dev/null +++ b/SabreTools.DatItems.Test/Formats/DiskTests.cs @@ -0,0 +1,247 @@ +using SabreTools.DatItems.Formats; +using Xunit; + +namespace SabreTools.DatItems.Test.Formats +{ + public class DiskTests + { + #region ConvertToRom + + [Fact] + public void ConvertToRomTest() + { + DiskArea diskArea = new DiskArea(); + diskArea.SetName("XXXXXX"); + + Machine machine = new Machine(); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, "XXXXXX"); + + Part part = new Part(); + part.SetName("XXXXXX"); + + Source source = new Source(0, "XXXXXX"); + + Disk disk = new Disk(); + disk.SetName("XXXXXX"); + disk.SetFieldValue(Disk.DiskAreaKey, diskArea); + disk.SetFieldValue(Models.Metadata.Disk.MergeKey, "XXXXXX"); + disk.SetFieldValue(Models.Metadata.Disk.RegionKey, "XXXXXX"); + disk.SetFieldValue(Models.Metadata.Disk.StatusKey, "XXXXXX"); + disk.SetFieldValue(Models.Metadata.Disk.OptionalKey, "XXXXXX"); + disk.SetFieldValue(Models.Metadata.Disk.MD5Key, "XXXXXX"); + disk.SetFieldValue(Models.Metadata.Disk.SHA1Key, "XXXXXX"); + disk.SetFieldValue(DatItem.DupeTypeKey, DupeType.All | DupeType.External); + disk.SetFieldValue(DatItem.MachineKey, machine); + disk.SetFieldValue(Disk.PartKey, part); + disk.SetFieldValue(DatItem.RemoveKey, (bool?)false); + disk.SetFieldValue(DatItem.SourceKey, source); + + Rom actual = disk.ConvertToRom(); + + Assert.Equal("XXXXXX.chd", actual.GetName()); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.MergeKey)); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.RegionKey)); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.StatusKey)); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.OptionalKey)); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.MD5Key)); + Assert.Equal("XXXXXX", actual.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)); + Assert.Equal(DupeType.All | DupeType.External, actual.GetFieldValue(DatItem.DupeTypeKey)); + + Machine? actualMachine = actual.GetFieldValue(DatItem.MachineKey); + Assert.NotNull(actualMachine); + Assert.Equal("XXXXXX", actualMachine.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + + Assert.Equal(false, actual.GetBoolFieldValue(DatItem.RemoveKey)); + + Part? actualPart = actual.GetFieldValue(Rom.PartKey); + Assert.NotNull(actualPart); + Assert.Equal("XXXXXX", actualPart.GetStringFieldValue(Models.Metadata.Part.NameKey)); + + Source? actualSource = actual.GetFieldValue(DatItem.SourceKey); + Assert.NotNull(actualSource); + Assert.Equal(0, actualSource.Index); + Assert.Equal("XXXXXX", actualSource.Name); + } + + #endregion + + #region FillMissingInformation + + [Fact] + public void FillMissingInformation_BothEmpty() + { + Disk self = new Disk(); + Disk other = new Disk(); + + self.FillMissingInformation(other); + + Assert.Null(self.GetStringFieldValue(Models.Metadata.Disk.MD5Key)); + Assert.Null(self.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)); + } + + [Fact] + public void FillMissingInformation_AllMissing() + { + Disk self = new Disk(); + + Disk other = new Disk(); + other.SetFieldValue(Models.Metadata.Disk.MD5Key, "XXXXXX"); + other.SetFieldValue(Models.Metadata.Disk.SHA1Key, "XXXXXX"); + + self.FillMissingInformation(other); + + Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Disk.MD5Key)); + Assert.Equal("XXXXXX", self.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)); + } + + #endregion + + #region GetDuplicateSuffix + + [Fact] + public void GetDuplicateSuffix_Disk_NoHash_Generic() + { + Disk self = new Disk(); + string actual = self.GetDuplicateSuffix(); + Assert.Equal("_1", actual); + } + + [Fact] + public void GetDuplicateSuffix_Disk_MD5() + { + string hash = "XXXXXX"; + Disk self = new Disk(); + self.SetFieldValue(Models.Metadata.Disk.MD5Key, hash); + + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + + [Fact] + public void GetDuplicateSuffix_Disk_SHA1() + { + string hash = "XXXXXX"; + Disk self = new Disk(); + self.SetFieldValue(Models.Metadata.Disk.SHA1Key, hash); + + string actual = self.GetDuplicateSuffix(); + Assert.Equal($"_{hash}", actual); + } + + #endregion + + #region GetKey + + [Theory] + [InlineData(ItemKey.NULL, false, false, "")] + [InlineData(ItemKey.NULL, false, true, "")] + [InlineData(ItemKey.NULL, true, false, "")] + [InlineData(ItemKey.NULL, true, true, "")] + [InlineData(ItemKey.Machine, false, false, "0000000000-Machine")] + [InlineData(ItemKey.Machine, false, true, "Machine")] + [InlineData(ItemKey.Machine, true, false, "0000000000-machine")] + [InlineData(ItemKey.Machine, true, true, "machine")] + [InlineData(ItemKey.CRC, false, false, "00000000")] + [InlineData(ItemKey.CRC, false, true, "00000000")] + [InlineData(ItemKey.CRC, true, false, "00000000")] + [InlineData(ItemKey.CRC, true, true, "00000000")] + [InlineData(ItemKey.MD5, false, false, "DEADBEEF")] + [InlineData(ItemKey.MD5, false, true, "DEADBEEF")] + [InlineData(ItemKey.MD5, true, false, "deadbeef")] + [InlineData(ItemKey.MD5, true, true, "deadbeef")] + [InlineData(ItemKey.SHA1, false, false, "DEADBEEF")] + [InlineData(ItemKey.SHA1, false, true, "DEADBEEF")] + [InlineData(ItemKey.SHA1, true, false, "deadbeef")] + [InlineData(ItemKey.SHA1, true, true, "deadbeef")] + [InlineData(ItemKey.SHA256, false, false, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, false, true, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, true, false, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, true, true, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA384, false, false, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, false, true, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, true, false, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, true, true, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA512, false, false, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, false, true, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, true, false, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, true, true, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SpamSum, false, false, "3::")] + [InlineData(ItemKey.SpamSum, false, true, "3::")] + [InlineData(ItemKey.SpamSum, true, false, "3::")] + [InlineData(ItemKey.SpamSum, true, true, "3::")] + public void GetKeyTest(ItemKey bucketedBy, bool lower, bool norename, string expected) + { + Machine machine = new Machine(); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, "Machine"); + + DatItem datItem = new Disk(); + datItem.SetFieldValue(DatItem.SourceKey, new Source(0)); + datItem.SetFieldValue(DatItem.MachineKey, machine); + datItem.SetFieldValue(Models.Metadata.Disk.MD5Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Disk.SHA1Key, "DEADBEEF"); + + string actual = datItem.GetKey(bucketedBy, lower, norename); + Assert.Equal(expected, actual); + } + + #endregion + + // TODO: Change when Machine retrieval gets fixed + #region GetKeyDB + + [Theory] + [InlineData(ItemKey.NULL, false, false, "")] + [InlineData(ItemKey.NULL, false, true, "")] + [InlineData(ItemKey.NULL, true, false, "")] + [InlineData(ItemKey.NULL, true, true, "")] + [InlineData(ItemKey.Machine, false, false, "0000000000-Machine")] + [InlineData(ItemKey.Machine, false, true, "Machine")] + [InlineData(ItemKey.Machine, true, false, "0000000000-machine")] + [InlineData(ItemKey.Machine, true, true, "machine")] + [InlineData(ItemKey.CRC, false, false, "00000000")] + [InlineData(ItemKey.CRC, false, true, "00000000")] + [InlineData(ItemKey.CRC, true, false, "00000000")] + [InlineData(ItemKey.CRC, true, true, "00000000")] + [InlineData(ItemKey.MD5, false, false, "DEADBEEF")] + [InlineData(ItemKey.MD5, false, true, "DEADBEEF")] + [InlineData(ItemKey.MD5, true, false, "deadbeef")] + [InlineData(ItemKey.MD5, true, true, "deadbeef")] + [InlineData(ItemKey.SHA1, false, false, "DEADBEEF")] + [InlineData(ItemKey.SHA1, false, true, "DEADBEEF")] + [InlineData(ItemKey.SHA1, true, false, "deadbeef")] + [InlineData(ItemKey.SHA1, true, true, "deadbeef")] + [InlineData(ItemKey.SHA256, false, false, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, false, true, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, true, false, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA256, true, true, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")] + [InlineData(ItemKey.SHA384, false, false, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, false, true, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, true, false, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA384, true, true, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b")] + [InlineData(ItemKey.SHA512, false, false, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, false, true, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, true, false, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SHA512, true, true, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")] + [InlineData(ItemKey.SpamSum, false, false, "3::")] + [InlineData(ItemKey.SpamSum, false, true, "3::")] + [InlineData(ItemKey.SpamSum, true, false, "3::")] + [InlineData(ItemKey.SpamSum, true, true, "3::")] + public void GetKeyDBTest(ItemKey bucketedBy, bool lower, bool norename, string expected) + { + Source source = new Source(0); + + Machine machine = new Machine(); + machine.SetFieldValue(Models.Metadata.Machine.NameKey, "Machine"); + + DatItem datItem = new Disk(); + datItem.SetFieldValue(DatItem.MachineKey, machine); + datItem.SetFieldValue(Models.Metadata.Disk.MD5Key, "DEADBEEF"); + datItem.SetFieldValue(Models.Metadata.Disk.SHA1Key, "DEADBEEF"); + + string actual = datItem.GetKeyDB(bucketedBy, source, lower, norename); + Assert.Equal(expected, actual); + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs index 4b6058fd..56c55f79 100644 --- a/SabreTools.DatItems/Formats/Disk.cs +++ b/SabreTools.DatItems/Formats/Disk.cs @@ -81,11 +81,24 @@ namespace SabreTools.DatItems.Formats public Rom ConvertToRom() { var rom = new Rom(_internal.ConvertToRom()!); - rom.GetFieldValue(Rom.DataAreaKey)?.SetName(GetFieldValue(Disk.DiskAreaKey)?.GetName()); + + // Create a DataArea if there was an existing DiskArea + var diskArea = GetFieldValue(Disk.DiskAreaKey); + if (diskArea != null) + { + var dataArea = new DataArea(); + + string? diskAreaName = diskArea.GetStringFieldValue(Models.Metadata.DiskArea.NameKey); + dataArea.SetFieldValue(Models.Metadata.DataArea.NameKey, diskAreaName); + + rom.SetFieldValue(Rom.DataAreaKey, dataArea); + } + rom.SetFieldValue(DatItem.DupeTypeKey, GetFieldValue(DatItem.DupeTypeKey)); - rom.SetFieldValue(DatItem.MachineKey, GetFieldValue(DatItem.MachineKey)!.Clone() as Machine ?? new Machine()); + rom.SetFieldValue(DatItem.MachineKey, GetFieldValue(DatItem.MachineKey)?.Clone() as Machine); + rom.SetFieldValue(Rom.PartKey, GetFieldValue(Disk.PartKey)?.Clone() as Part); rom.SetFieldValue(DatItem.RemoveKey, GetBoolFieldValue(DatItem.RemoveKey)); - rom.SetFieldValue(DatItem.SourceKey, GetFieldValue(DatItem.SourceKey)); + rom.SetFieldValue(DatItem.SourceKey, GetFieldValue(DatItem.SourceKey)?.Clone() as Source); return rom; }