// Copyright (C) 2026 SharpEmu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later using SharpEmu.HLE; using SharpEmu.Libs.Kernel; using System.Globalization; using System.Text; using Xunit; namespace SharpEmu.Libs.Tests.Kernel; public sealed class KernelMemoryCompatExportsTests { [Fact] public void PosixStat_MissingFileReturnsMinusOne() { const ulong memoryBase = 0x1_0000_0000; const ulong pathAddress = memoryBase + 0x100; const ulong statAddress = memoryBase + 0x400; var memory = new FakeCpuMemory(memoryBase, 0x1000); var context = new CpuContext(memory, Generation.Gen5); memory.WriteCString(pathAddress, "/__sharpemu_test_missing__/shader.cache"); context[CpuRegister.Rdi] = pathAddress; context[CpuRegister.Rsi] = statAddress; var result = KernelMemoryCompatExports.PosixStat(context); Assert.Equal(-1, result); Assert.Equal(ulong.MaxValue, context[CpuRegister.Rax]); } [Fact] public void Sprintf_ReadsVariadicDoubleFromXmmRegister() { const ulong memoryBase = 0x1_0000_0000; const ulong destinationAddress = memoryBase + 0x100; const ulong formatAddress = memoryBase + 0x200; var memory = new FakeCpuMemory(memoryBase, 0x1000); var context = new CpuContext(memory, Generation.Gen5); memory.WriteCString(formatAddress, "%.4f"); context[CpuRegister.Rdi] = destinationAddress; context[CpuRegister.Rsi] = formatAddress; context.SetXmmRegister( 0, unchecked((ulong)BitConverter.DoubleToInt64Bits(0.5576)), 0); var previousCulture = CultureInfo.CurrentCulture; try { CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("es-ES"); var result = KernelMemoryCompatExports.Sprintf(context); Assert.Equal(0, result); Assert.Equal(6UL, context[CpuRegister.Rax]); Span output = stackalloc byte[7]; Assert.True(memory.TryRead(destinationAddress, output)); Assert.Equal("0.5576\0", Encoding.UTF8.GetString(output)); } finally { CultureInfo.CurrentCulture = previousCulture; } } }