2024-03-11 16:26:28 -04:00
|
|
|
using SabreTools.Core.Tools;
|
2020-12-19 15:53:19 -08:00
|
|
|
using SabreTools.DatItems;
|
2021-02-02 10:23:43 -08:00
|
|
|
using SabreTools.DatItems.Formats;
|
2020-12-19 15:53:19 -08:00
|
|
|
using SabreTools.FileTypes;
|
|
|
|
|
using SabreTools.FileTypes.Aaru;
|
|
|
|
|
using SabreTools.FileTypes.Archives;
|
|
|
|
|
using SabreTools.FileTypes.CHD;
|
|
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
namespace SabreTools.Test.DatItems
|
|
|
|
|
{
|
|
|
|
|
public class DatItemTests
|
|
|
|
|
{
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(FileType.None, ItemType.Rom)]
|
|
|
|
|
[InlineData(FileType.Folder, null)]
|
|
|
|
|
[InlineData(FileType.AaruFormat, ItemType.Media)]
|
|
|
|
|
[InlineData(FileType.CHD, ItemType.Disk)]
|
|
|
|
|
[InlineData(FileType.ZipArchive, ItemType.Rom)]
|
|
|
|
|
public void CreateBaseFileTest(FileType fileType, ItemType? expected)
|
|
|
|
|
{
|
|
|
|
|
var baseFile = CreateBaseFile(fileType);
|
|
|
|
|
var actual = DatItem.Create(baseFile);
|
2024-03-11 16:26:28 -04:00
|
|
|
Assert.Equal(expected, actual?.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>());
|
2020-12-19 15:53:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void DuplicateStatusUnequalTest()
|
|
|
|
|
{
|
|
|
|
|
var rom = new Rom();
|
|
|
|
|
var disk = new Disk();
|
|
|
|
|
var actual = rom.GetDuplicateStatus(disk);
|
|
|
|
|
Assert.Equal((DupeType)0x00, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void DuplicateStatusExternalAllTest()
|
|
|
|
|
{
|
2024-03-09 23:43:43 -05:00
|
|
|
var machineA = new Machine();
|
|
|
|
|
machineA.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
|
|
|
|
var machineB = new Machine();
|
|
|
|
|
machineB.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romA = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romA.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romA.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romA.CopyMachineInformation(machineA);
|
2024-03-09 21:34:26 -05:00
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romB = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romB.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romB.SetFieldValue<Source?>(DatItem.SourceKey, new Source(1));
|
2024-03-09 23:43:43 -05:00
|
|
|
romB.CopyMachineInformation(machineB);
|
2020-12-19 15:53:19 -08:00
|
|
|
|
|
|
|
|
var actual = romA.GetDuplicateStatus(romB);
|
|
|
|
|
Assert.Equal(DupeType.External | DupeType.All, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void DuplicateStatusExternalHashTest()
|
|
|
|
|
{
|
2024-03-09 23:43:43 -05:00
|
|
|
var machineA = new Machine();
|
|
|
|
|
machineA.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
|
|
|
|
var machineB = new Machine();
|
|
|
|
|
machineB.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "not-name-same");
|
|
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romA = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romA.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romA.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romA.CopyMachineInformation(machineA);
|
2024-03-09 21:34:26 -05:00
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romB = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romB.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romB.SetFieldValue<Source?>(DatItem.SourceKey, new Source(1));
|
2024-03-09 23:43:43 -05:00
|
|
|
romB.CopyMachineInformation(machineB);
|
2020-12-19 15:53:19 -08:00
|
|
|
|
|
|
|
|
var actual = romA.GetDuplicateStatus(romB);
|
|
|
|
|
Assert.Equal(DupeType.External | DupeType.Hash, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void DuplicateStatusInternalAllTest()
|
|
|
|
|
{
|
2024-03-09 23:43:43 -05:00
|
|
|
var machineA = new Machine();
|
|
|
|
|
machineA.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
|
|
|
|
var machineB = new Machine();
|
|
|
|
|
machineB.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romA = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romA.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romA.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romA.CopyMachineInformation(machineA);
|
2024-03-09 21:34:26 -05:00
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romB = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romB.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romB.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romB.CopyMachineInformation(machineB);
|
2020-12-19 15:53:19 -08:00
|
|
|
|
|
|
|
|
var actual = romA.GetDuplicateStatus(romB);
|
|
|
|
|
Assert.Equal(DupeType.Internal | DupeType.All, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void DuplicateStatusInternalHashTest()
|
|
|
|
|
{
|
2024-03-09 23:43:43 -05:00
|
|
|
var machineA = new Machine();
|
|
|
|
|
machineA.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "name-same");
|
|
|
|
|
|
|
|
|
|
var machineB = new Machine();
|
|
|
|
|
machineB.SetFieldValue<string?>(Models.Metadata.Machine.NameKey, "not-name-same");
|
|
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romA = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romA.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romA.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romA.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romA.CopyMachineInformation(machineA);
|
2024-03-09 21:34:26 -05:00
|
|
|
|
2024-03-10 16:49:07 -04:00
|
|
|
var romB = new Rom();
|
2024-03-08 21:12:13 -05:00
|
|
|
romB.SetName("same-name");
|
2024-03-09 21:34:26 -05:00
|
|
|
romB.SetFieldValue(Models.Metadata.Rom.CRCKey, "DEADBEEF");
|
2024-10-19 23:17:37 -04:00
|
|
|
romB.SetFieldValue<Source?>(DatItem.SourceKey, new Source(0));
|
2024-03-09 23:43:43 -05:00
|
|
|
romB.CopyMachineInformation(machineB);
|
2020-12-19 15:53:19 -08:00
|
|
|
|
|
|
|
|
var actual = romA.GetDuplicateStatus(romB);
|
|
|
|
|
Assert.Equal(DupeType.Internal | DupeType.Hash, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(null, null, true)]
|
|
|
|
|
[InlineData(null, new byte[0], true)]
|
|
|
|
|
[InlineData(new byte[0], null, true)]
|
|
|
|
|
[InlineData(new byte[] { 0x00 }, new byte[] { 0x00, 0x01 }, false)]
|
|
|
|
|
[InlineData(new byte[] { 0x00 }, new byte[] { 0x01 }, false)]
|
|
|
|
|
[InlineData(new byte[] { 0x00 }, new byte[] { 0x00 }, true)]
|
2024-03-05 13:32:49 -05:00
|
|
|
public void ConditionalHashEqualsTest(byte[]? first, byte[]? second, bool expected)
|
2020-12-19 15:53:19 -08:00
|
|
|
{
|
2023-08-14 18:43:56 -04:00
|
|
|
bool actual = SabreTools.Core.Tools.Utilities.ConditionalHashEquals(first, second);
|
2020-12-19 15:53:19 -08:00
|
|
|
Assert.Equal(expected, actual);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: Add tests for DatItem.Merge
|
|
|
|
|
// TODO: Add tests for ResolveNames
|
|
|
|
|
// TODO: Add tests for Sort
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Create a BaseFile for testing
|
|
|
|
|
/// </summary>
|
2023-04-19 16:39:58 -04:00
|
|
|
private static BaseFile CreateBaseFile(FileType fileType)
|
2020-12-19 15:53:19 -08:00
|
|
|
{
|
|
|
|
|
return fileType switch
|
|
|
|
|
{
|
|
|
|
|
FileType.Folder => new Folder(),
|
|
|
|
|
FileType.AaruFormat => new AaruFormat(),
|
|
|
|
|
FileType.CHD => new CHDFileV5(),
|
|
|
|
|
FileType.ZipArchive => new ZipArchive(),
|
|
|
|
|
_ => new BaseFile(),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|