Files

319 lines
10 KiB
C#
Raw Permalink Normal View History

2026-03-24 18:03:01 -04:00
using System.Collections.Generic;
using SabreTools.Metadata.DatFiles.Formats;
using SabreTools.Metadata.DatItems;
using SabreTools.Metadata.DatItems.Formats;
using SabreTools.Metadata.Filter;
using Xunit;
namespace SabreTools.Metadata.DatFiles.Test
{
public partial class DatFileTests
{
#region ExecuteFilters
[Fact]
public void ExecuteFilters_Items()
{
FilterObject filterObject = new FilterObject("rom.crc", "deadbeef", Operation.NotEquals);
FilterRunner filterRunner = new FilterRunner([filterObject]);
Source source = new Source(0, source: null);
Machine machine = new Machine { Name = "machine" };
2026-03-24 18:03:01 -04:00
2026-04-04 22:31:23 -04:00
DatItem datItem = new Rom
{
Name = "rom.bin",
CRC32 = "deadbeef",
2026-04-04 22:31:23 -04:00
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
datFile.AddItem(datItem, statsOnly: false);
datFile.BucketBy(ItemKey.Machine);
datFile.ExecuteFilters(filterRunner);
var actualDatItems = datFile.GetItemsForBucket("machine");
DatItem actualRom = Assert.Single(actualDatItems);
Assert.True(actualRom.RemoveFlag);
2026-03-24 18:03:01 -04:00
}
[Fact]
public void ExecuteFilters_ItemsDB()
{
FilterObject filterObject = new FilterObject("rom.crc", "deadbeef", Operation.NotEquals);
FilterRunner filterRunner = new FilterRunner([filterObject]);
Source source = new Source(0, source: null);
Machine machine = new Machine { Name = "machine" };
2026-03-24 18:03:01 -04:00
2026-04-04 22:31:23 -04:00
DatItem datItem = new Rom
{
Name = "rom.bin",
CRC32 = "deadbeef",
2026-04-04 22:31:23 -04:00
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
long sourceIndex = datFile.AddSourceDB(source);
long machineIndex = datFile.AddMachineDB(machine);
_ = datFile.AddItemDB(datItem, machineIndex, sourceIndex, statsOnly: false);
datFile.BucketBy(ItemKey.Machine);
datFile.ExecuteFilters(filterRunner);
var actualDatItems = datFile.GetItemsForBucketDB("machine");
DatItem actualRom = Assert.Single(actualDatItems).Value;
Assert.True(actualRom.RemoveFlag);
2026-03-24 18:03:01 -04:00
}
#endregion
#region MachineDescriptionToName
[Fact]
public void MachineDescriptionToName_Items()
{
Source source = new Source(0, source: null);
2026-04-03 22:17:31 -04:00
Machine machine = new Machine
{
Name = "machine",
Description = "description"
};
2026-03-24 18:03:01 -04:00
2026-04-03 22:17:31 -04:00
DatItem datItem = new Rom
{
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
datFile.AddItem(datItem, statsOnly: false);
datFile.MachineDescriptionToName();
// The name of the bucket is not expected to change
DatItem actual = Assert.Single(datFile.GetItemsForBucket("machine"));
Machine? actualMachine = actual.Machine;
2026-03-24 18:03:01 -04:00
Assert.NotNull(actualMachine);
2026-04-02 13:21:37 -04:00
Assert.Equal("description", actualMachine.Name);
2026-04-02 11:18:49 -04:00
Assert.Equal("description", actualMachine.Description);
2026-03-24 18:03:01 -04:00
}
[Fact]
public void MachineDescriptionToName_ItemsDB()
{
2026-04-03 22:17:31 -04:00
Machine machine = new Machine
{
Name = "machine",
Description = "description"
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
_ = datFile.AddMachineDB(machine);
datFile.MachineDescriptionToName();
Machine actualMachine = Assert.Single(datFile.GetMachinesDB()).Value;
2026-04-02 13:21:37 -04:00
Assert.Equal("description", actualMachine.Name);
2026-04-02 11:18:49 -04:00
Assert.Equal("description", actualMachine.Description);
2026-03-24 18:03:01 -04:00
}
#endregion
#region SetOneRomPerGame
[Fact]
public void SetOneRomPerGame_Items()
{
Source source = new Source(0, source: null);
Machine machine = new Machine { Name = "machine" };
2026-03-24 18:03:01 -04:00
2026-04-03 22:17:31 -04:00
DatItem rom = new Rom
{
Name = "rom.bin",
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatItem disk = new Disk
{
Name = "disk",
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
datFile.AddItem(rom, statsOnly: false);
datFile.AddItem(disk, statsOnly: false);
datFile.BucketBy(ItemKey.Machine);
datFile.SetOneRomPerGame();
var actualDatItems = datFile.GetItemsForBucket("machine");
Assert.Equal(2, actualDatItems.Count);
DatItem actualRom = Assert.Single(actualDatItems.FindAll(i => i is Rom));
Machine? actualRomMachine = actualRom.Machine;
2026-03-24 18:03:01 -04:00
Assert.NotNull(actualRomMachine);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine/rom", actualRomMachine.Name);
2026-03-24 18:03:01 -04:00
DatItem actualDisk = Assert.Single(actualDatItems.FindAll(i => i is Disk));
Machine? actualDiskMachine = actualDisk.Machine;
2026-03-24 18:03:01 -04:00
Assert.NotNull(actualDiskMachine);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine/disk", actualDiskMachine.Name);
2026-03-24 18:03:01 -04:00
}
[Fact]
public void SetOneRomPerGame_ItemsDB()
{
Source source = new Source(0, source: null);
Machine machine = new Machine { Name = "machine" };
2026-03-24 18:03:01 -04:00
DatItem rom = new Rom { Name = "rom.bin" };
2026-03-24 18:03:01 -04:00
DatItem disk = new Disk { Name = "disk" };
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
long sourceIndex = datFile.AddSourceDB(source);
long machineIndex = datFile.AddMachineDB(machine);
_ = datFile.AddItemDB(rom, machineIndex, sourceIndex, statsOnly: false);
_ = datFile.AddItemDB(disk, machineIndex, sourceIndex, statsOnly: false);
datFile.BucketBy(ItemKey.Machine);
datFile.SetOneRomPerGame();
var actualDatItems = datFile.GetItemsForBucketDB("machine");
Assert.Equal(2, actualDatItems.Count);
var actualRom = Assert.Single(actualDatItems, i => i.Value is Rom);
var actualRomMachine = datFile.GetMachineForItemDB(actualRom.Key);
Assert.NotNull(actualRomMachine.Value);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine/rom", actualRomMachine.Value.Name);
2026-03-24 18:03:01 -04:00
var actualDisk = Assert.Single(actualDatItems, i => i.Value is Disk);
var actualDiskMachine = datFile.GetMachineForItemDB(actualDisk.Key);
Assert.NotNull(actualDiskMachine.Value);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine/disk", actualDiskMachine.Value.Name);
2026-03-24 18:03:01 -04:00
}
#endregion
#region SetOneGamePerRegion
[Fact]
public void SetOneGamePerRegion_Items()
{
Machine nowhereMachine = new Machine { Name = "machine (Nowhere)" };
2026-03-24 18:03:01 -04:00
2026-04-03 22:17:31 -04:00
Machine worldMachine = new Machine
{
Name = "machine (World)",
CloneOf = "machine (Nowhere)"
};
2026-03-24 18:03:01 -04:00
DatItem nowhereRom = new Rom
{
Name = "rom.bin",
Machine = nowhereMachine
};
2026-03-24 18:03:01 -04:00
DatItem worldRom = new Rom
{
Name = "rom.nib",
Machine = worldMachine
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
datFile.AddItem(nowhereRom, statsOnly: false);
datFile.AddItem(worldRom, statsOnly: false);
List<string> regions = ["World", "Nowhere"];
datFile.SetOneGamePerRegion(regions);
Assert.Empty(datFile.GetItemsForBucket("machine (nowhere)"));
var actualDatItems = datFile.GetItemsForBucket("machine (world)");
DatItem actualWorldRom = Assert.Single(actualDatItems);
Machine? actualWorldMachine = actualWorldRom.Machine;
2026-03-24 18:03:01 -04:00
Assert.NotNull(actualWorldMachine);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine (World)", actualWorldMachine.Name);
2026-03-24 18:03:01 -04:00
}
[Fact]
public void SetOneGamePerRegion_ItemsDB()
{
Machine nowhereMachine = new Machine { Name = "machine (Nowhere)" };
2026-03-24 18:03:01 -04:00
2026-04-03 22:17:31 -04:00
Machine worldMachine = new Machine
{
Name = "machine (World)",
CloneOf = "machine (Nowhere)"
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
_ = datFile.AddMachineDB(nowhereMachine);
_ = datFile.AddMachineDB(worldMachine);
List<string> regions = ["World", "Nowhere"];
datFile.SetOneGamePerRegion(regions);
var actualWorldMachine = Assert.Single(datFile.GetMachinesDB());
Assert.NotNull(actualWorldMachine.Value);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine (World)", actualWorldMachine.Value.Name);
2026-03-24 18:03:01 -04:00
}
#endregion
#region StripSceneDatesFromItems
[Fact]
public void StripSceneDatesFromItems_Items()
{
Source source = new Source(0, source: null);
Machine machine = new Machine { Name = "10.10.10-machine-name" };
2026-03-24 18:03:01 -04:00
2026-04-03 22:17:31 -04:00
DatItem datItem = new Rom
{
Machine = machine,
Source = source
};
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
datFile.AddItem(datItem, statsOnly: false);
datFile.StripSceneDatesFromItems();
// The name of the bucket is not expected to change
DatItem actual = Assert.Single(datFile.GetItemsForBucket("10.10.10-machine-name"));
Machine? actualMachine = actual.Machine;
2026-03-24 18:03:01 -04:00
Assert.NotNull(actualMachine);
2026-04-02 13:21:37 -04:00
Assert.Equal("machine-name", actualMachine.Name);
2026-03-24 18:03:01 -04:00
}
[Fact]
public void StripSceneDatesFromItems_ItemsDB()
{
Machine machine = new Machine { Name = "10.10.10-machine-name" };
2026-03-24 18:03:01 -04:00
DatFile datFile = new Logiqx(datFile: null, useGame: false);
_ = datFile.AddMachineDB(machine);
datFile.StripSceneDatesFromItems();
Machine actualMachine = Assert.Single(datFile.GetMachinesDB()).Value;
2026-04-02 13:21:37 -04:00
Assert.Equal("machine-name", actualMachine.Name);
2026-03-24 18:03:01 -04:00
}
#endregion
}
}