sharpemu/tests/SharpEmu.Libs.Tests/UserService/UserServiceExportsTests.cs

59 lines
2.5 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.HLE;
using SharpEmu.Libs.UserService;
using Xunit;
namespace SharpEmu.Libs.Tests.UserService;
public sealed class UserServiceExportsTests
{
[Theory]
[InlineData(0x10000000)]
[InlineData(1)]
public void GetUserNumberWritesOneBasedSlotWithoutOverwritingAdjacentData(int userId)
{
const ulong address = 0x1_0000_0000;
var memory = new FakeCpuMemory(address, 0x100);
var ctx = new CpuContext(memory, Generation.Gen5);
Assert.True(memory.TryWrite(address, new byte[] { 0xEE, 0xEE, 0xEE, 0xEE, 0xAA, 0xBB, 0xCC, 0xDD }));
ctx[CpuRegister.Rdi] = unchecked((ulong)userId);
ctx[CpuRegister.Rsi] = address;
Assert.Equal(0, UserServiceExports.UserServiceGetUserNumber(ctx));
Span<byte> actual = stackalloc byte[8];
Assert.True(memory.TryRead(address, actual));
Assert.Equal(new byte[] { 1, 0, 0, 0, 0xAA, 0xBB, 0xCC, 0xDD }, actual.ToArray());
}
[Theory]
[InlineData(0x10000001, 0x1_0000_0000UL, unchecked((int)0x80960009))]
[InlineData(0x10000000, 0UL, unchecked((int)0x80960005))]
[InlineData(0x10000000, 0x2_0000_0000UL, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT)]
public void GetUserNumberValidatesUserAndOutput(int userId, ulong address, int expected)
{
var ctx = new CpuContext(new FakeCpuMemory(0x1_0000_0000, 0x100), Generation.Gen5);
ctx[CpuRegister.Rdi] = unchecked((ulong)userId);
ctx[CpuRegister.Rsi] = address;
Assert.Equal(expected, UserServiceExports.UserServiceGetUserNumber(ctx));
}
[Fact]
public void TerminateResetsTheLoginEvent()
{
const ulong address = 0x1_0000_0000;
var memory = new FakeCpuMemory(address, 0x100);
var ctx = new CpuContext(memory, Generation.Gen5);
Assert.Equal(0, UserServiceExports.UserServiceTerminate(ctx));
Assert.Equal(0, UserServiceExports.UserServiceInitialize(ctx));
ctx[CpuRegister.Rdi] = address;
Assert.Equal(0, UserServiceExports.UserServiceGetEvent(ctx));
Assert.Equal(unchecked((int)0x80960007), UserServiceExports.UserServiceGetEvent(ctx));
Assert.Equal(0, UserServiceExports.UserServiceTerminate(ctx));
Assert.Equal(0UL, ctx[CpuRegister.Rax]);
Assert.Equal(0, UserServiceExports.UserServiceInitialize(ctx));
Assert.Equal(0, UserServiceExports.UserServiceGetEvent(ctx));
Assert.Equal(0, UserServiceExports.UserServiceTerminate(ctx));
}
}