Files
Yaroze.NET/tests/Yaroze.Tests/CDROM/CdRomDeviceTests.cs
T
2026-01-24 17:23:50 +01:00

167 lines
4.4 KiB
C#

using System.IO;
using Xunit;
using Yaroze.Core.CDROM;
using Yaroze.Core.Interrupts;
namespace Yaroze.Tests.CDROM;
public class CdRomDeviceTests
{
[Fact]
public void CdRomDevice_ContainsCorrectAddressRange()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act & Assert
Assert.True(cdrom.Contains(0x1F801800));
Assert.True(cdrom.Contains(0x1F801801));
Assert.True(cdrom.Contains(0x1F801802));
Assert.True(cdrom.Contains(0x1F801803));
Assert.False(cdrom.Contains(0x1F801804));
Assert.False(cdrom.Contains(0x1F8017FF));
}
[Fact]
public void CdRomDevice_ReadsStatus()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act
byte status = cdrom.Read8(0x1F801800);
// Assert
// Initial status should have index 0, empty FIFOs
Assert.Equal(0, status & 0x03); // Index = 0
Assert.Equal(0, status & 0x20); // Response FIFO empty
}
[Fact]
public void CdRomDevice_WritesIndexRegister()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act
cdrom.Write8(0x1F801800, 0x01); // Set index to 1
byte status = cdrom.Read8(0x1F801800);
// Assert
Assert.Equal(0x01, status & 0x03); // Index should be 1
}
[Fact]
public void CdRomDevice_ExecutesGetStatCommand()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act
cdrom.Write8(0x1F801800, 0x00); // Set index to 0
cdrom.Write8(0x1F801801, 0x01); // Execute GetStat command
// Read response
byte response = cdrom.Read8(0x1F801801);
// Assert
Assert.Equal(0x02, response); // Motor on status
}
[Fact]
public void CdRomDevice_HandlesSetLocCommand()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act
cdrom.Write8(0x1F801800, 0x00); // Set index to 0
// Send SetLoc parameters (MM, SS, FF in BCD)
cdrom.Write8(0x1F801802, 0x00); // 00 minutes
cdrom.Write8(0x1F801802, 0x02); // 02 seconds
cdrom.Write8(0x1F801802, 0x00); // 00 frames
// Execute SetLoc command
cdrom.Write8(0x1F801801, 0x02);
// Read response
byte response = cdrom.Read8(0x1F801801);
// Assert
Assert.Equal(0x02, response); // Motor on status
}
[Fact]
public void CdRomDevice_LoadsDisc()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
var binPath = CreateTempBinFile(2352 * 100);
try
{
// Act
cdrom.LoadDisc(binPath);
// Assert - no exception should be thrown
// Device should be ready to read sectors
Assert.True(true);
}
finally
{
File.Delete(binPath);
}
}
[Fact]
public void CdRomDevice_ResetClearsState()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Set some state
cdrom.Write8(0x1F801800, 0x02); // Set index to 2
cdrom.Write8(0x1F801802, 0xFF); // Write parameter
// Act
cdrom.Reset();
// Assert
byte status = cdrom.Read8(0x1F801800);
Assert.Equal(0, status & 0x03); // Index should be 0
Assert.Equal(0, status & 0x08); // Parameter FIFO should be empty
}
[Fact]
public void CdRomDevice_ReadsDmaWord()
{
// Arrange
var interrupts = new InterruptController();
var cdrom = new CdRomDevice(interrupts);
// Act
uint word = cdrom.ReadDmaWord();
// Assert - Should return 0 when no data is loaded
// (actual behavior depends on implementation)
Assert.True(true); // Just verify no exception
}
private string CreateTempBinFile(int size)
{
var tempPath = Path.Combine(Path.GetTempPath(), $"test_{System.Guid.NewGuid()}.bin");
var data = new byte[size];
File.WriteAllBytes(tempPath, data);
return tempPath;
}
}