Initial commit: SpdUp Windows Gaming Booster v1.0.0
- .NET 8 WPF app with full MVVM architecture - One-click boost: CPU, RAM, GPU, network, services, timer resolution - Real-time system monitor (LibreHardwareMonitor) - Auto game detection (30+ games) - RAM optimizer with kernel-level cleanup - Network optimizer (TCP registry tweaks) - Service manager, process manager, shader cache cleaner - Desktop widget overlay - Debug log viewer - Custom dark gaming theme with trans pride colors - 84 unit tests (xUnit) - Inno Setup installer script - Landing page website
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
using SpdUp.Models;
|
||||
using SpdUp.Services;
|
||||
|
||||
namespace SpdUp.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// Tests for services that can be tested without admin/system access.
|
||||
/// </summary>
|
||||
public class ServiceTests
|
||||
{
|
||||
// ── NetworkService.PingAsync ──────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public async Task PingAsync_Localhost_ReturnsPositive()
|
||||
{
|
||||
var ms = await NetworkService.PingAsync("127.0.0.1", 2000);
|
||||
Assert.True(ms >= 0, $"Ping to localhost should succeed, got {ms}");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task PingAsync_InvalidHost_ReturnsNegative()
|
||||
{
|
||||
var ms = await NetworkService.PingAsync("0.0.0.0", 500);
|
||||
// 0.0.0.0 typically fails or returns -1
|
||||
// On some machines it may succeed — accept either
|
||||
Assert.True(ms >= -1);
|
||||
}
|
||||
|
||||
// ── GameDetectionService ─────────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void GameDetectionService_InitialState_NoGameDetected()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
using var gds = new GameDetectionService(settings);
|
||||
|
||||
Assert.Null(gds.CurrentGameProcess);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GameDetectionService_AddGameProcess()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
using var gds = new GameDetectionService(settings);
|
||||
|
||||
gds.AddGameProcess("TestGame");
|
||||
// AddGameProcess should not throw
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GameDetectionService_StartAndStop_DoesNotThrow()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
using var gds = new GameDetectionService(settings);
|
||||
|
||||
gds.Start(60000); // very long interval so it doesn't actually poll during test
|
||||
gds.Stop();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GameDetectionService_Dispose_DoesNotThrow()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
var gds = new GameDetectionService(settings);
|
||||
gds.Dispose();
|
||||
// Double dispose should not throw
|
||||
gds.Dispose();
|
||||
}
|
||||
|
||||
// ── OptimizationService ──────────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void OptimizationService_InitialState()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
var svc = new OptimizationService(settings);
|
||||
|
||||
Assert.False(svc.IsBoosted);
|
||||
Assert.Null(svc.BoostedProcessName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OptimizationService_Events_CanSubscribe()
|
||||
{
|
||||
var settings = new AppSettings();
|
||||
var svc = new OptimizationService(settings);
|
||||
|
||||
bool activated = false;
|
||||
bool deactivated = false;
|
||||
svc.BoostActivated += _ => activated = true;
|
||||
svc.BoostDeactivated += () => deactivated = true;
|
||||
|
||||
// Just verify event subscription doesn't throw
|
||||
Assert.False(activated);
|
||||
Assert.False(deactivated);
|
||||
}
|
||||
|
||||
// ── ServiceManagementService ─────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void KnownNonCriticalServices_ContainsExpectedEntries()
|
||||
{
|
||||
var known = ServiceManagementService.KnownNonCriticalServices;
|
||||
|
||||
Assert.True(known.ContainsKey("SysMain"));
|
||||
Assert.True(known.ContainsKey("WSearch"));
|
||||
Assert.True(known.ContainsKey("DiagTrack"));
|
||||
Assert.True(known.ContainsKey("XblAuthManager"));
|
||||
Assert.True(known.Count >= 10, "Should have at least 10 known services");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetServiceList_NonExistentService_ReturnsNotFound()
|
||||
{
|
||||
var entries = ServiceManagementService.GetServiceList(new[] { "SpdUpFakeService12345" });
|
||||
|
||||
Assert.Single(entries);
|
||||
Assert.Equal("NotFound", entries[0].Status);
|
||||
Assert.Equal("SpdUpFakeService12345", entries[0].ServiceName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetServiceList_EmptyInput_ReturnsEmpty()
|
||||
{
|
||||
var entries = ServiceManagementService.GetServiceList(Array.Empty<string>());
|
||||
Assert.Empty(entries);
|
||||
}
|
||||
|
||||
// ── ShaderCleanResult ────────────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void ShaderCleanResult_MBFreed_LargeValue()
|
||||
{
|
||||
var r = new ShaderCleanResult(100, 1_073_741_824); // 1 GB
|
||||
Assert.Equal(1024.0, r.MBFreed, 0.1);
|
||||
}
|
||||
|
||||
// ── RamOptimizationService ───────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void RamOptimizationService_GetMemoryStatus_ReturnsValidValues()
|
||||
{
|
||||
var (totalMB, availMB, loadPercent) = RamOptimizationService.GetMemoryStatus();
|
||||
|
||||
Assert.True(totalMB > 0, "Total RAM should be > 0");
|
||||
Assert.True(availMB > 0, "Available RAM should be > 0");
|
||||
Assert.True(availMB <= totalMB, "Available should be <= total");
|
||||
Assert.InRange(loadPercent, (uint)1, (uint)100);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user