Added a MasterVolume property to the AudioManager for unified control over sound effects and music volume. Updated the Play method to incorporate MasterVolume adjustments. Enhanced documentation in CLAUDE.md and architecture.md to reflect changes in audio management and overall engine architecture. Introduced a new test project for audio functionalities in the solution file.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
using MrGameEng.Audio;
|
||||
using Xunit;
|
||||
|
||||
namespace MrGameEng.Audio.Tests;
|
||||
|
||||
public class AudioManagerTests
|
||||
{
|
||||
[Fact]
|
||||
public void MasterVolume_Default_IsOne()
|
||||
{
|
||||
using var audio = new AudioManager();
|
||||
|
||||
Assert.Equal(1f, audio.MasterVolume);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(-0.5f, 0f)]
|
||||
[InlineData(0.4f, 0.4f)]
|
||||
[InlineData(1.7f, 1f)]
|
||||
public void MasterVolume_Clamps_AndMirrorsToMusic(float input, float expected)
|
||||
{
|
||||
using var audio = new AudioManager();
|
||||
|
||||
audio.MasterVolume = input;
|
||||
|
||||
Assert.Equal(expected, audio.MasterVolume);
|
||||
Assert.Equal(expected, audio.Music.Volume);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(-1f, 0f)]
|
||||
[InlineData(0.25f, 0.25f)]
|
||||
[InlineData(2f, 1f)]
|
||||
public void SoundVolume_Clamps(float input, float expected)
|
||||
{
|
||||
using var audio = new AudioManager();
|
||||
|
||||
audio.SoundVolume = input;
|
||||
|
||||
Assert.Equal(expected, audio.SoundVolume);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<OutputType>Exe</OutputType>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
||||
<PackageReference Include="xunit.v3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\MrGameEng.Audio\MrGameEng.Audio.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,115 @@
|
||||
using MrGameEng.Core;
|
||||
using Xunit;
|
||||
|
||||
namespace MrGameEng.Core.Tests;
|
||||
|
||||
public class GameSpeedTests
|
||||
{
|
||||
[Fact]
|
||||
public void Constructor_DefaultSteps_RunsAtFirstStep()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
|
||||
var speed = new GameSpeed(clock);
|
||||
|
||||
Assert.Equal(new[] { 1f, 3f, 6f }, speed.Steps);
|
||||
Assert.False(speed.IsPaused);
|
||||
Assert.Equal(1f, speed.CurrentSpeed);
|
||||
Assert.Equal(1f, clock.TimeScale);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_NonPositiveStep_Throws()
|
||||
{
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => new GameSpeed(new GameClock(), 1f, 0f));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Pause_SetsClockToZero_ResumeRestoresStep()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
var speed = new GameSpeed(clock, 1f, 3f, 6f);
|
||||
speed.SetStep(2);
|
||||
|
||||
speed.Pause();
|
||||
|
||||
Assert.True(speed.IsPaused);
|
||||
Assert.Equal(0f, clock.TimeScale);
|
||||
Assert.Equal(0f, speed.CurrentSpeed);
|
||||
|
||||
speed.Resume();
|
||||
|
||||
Assert.False(speed.IsPaused);
|
||||
Assert.Equal(6f, clock.TimeScale);
|
||||
Assert.Equal(2, speed.StepIndex);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SetStep_OutOfRange_Clamps()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
var speed = new GameSpeed(clock, 1f, 3f, 6f);
|
||||
|
||||
speed.SetStep(99);
|
||||
Assert.Equal(2, speed.StepIndex);
|
||||
Assert.Equal(6f, clock.TimeScale);
|
||||
|
||||
speed.SetStep(-5);
|
||||
Assert.Equal(0, speed.StepIndex);
|
||||
Assert.Equal(1f, clock.TimeScale);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FasterAndSlower_ClampAtEnds_AndUnpause()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
var speed = new GameSpeed(clock, 1f, 3f, 6f);
|
||||
|
||||
speed.Faster();
|
||||
Assert.Equal(1, speed.StepIndex);
|
||||
speed.Faster();
|
||||
speed.Faster(); // clamps at fastest
|
||||
Assert.Equal(2, speed.StepIndex);
|
||||
|
||||
speed.Pause();
|
||||
speed.Slower(); // unpauses and steps down
|
||||
Assert.False(speed.IsPaused);
|
||||
Assert.Equal(1, speed.StepIndex);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Cycle_GoesPauseThroughStepsBackToPause()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
var speed = new GameSpeed(clock, 1f, 3f, 6f);
|
||||
speed.Pause();
|
||||
|
||||
speed.Cycle(); // -> step 0
|
||||
Assert.False(speed.IsPaused);
|
||||
Assert.Equal(0, speed.StepIndex);
|
||||
|
||||
speed.Cycle(); // -> step 1
|
||||
Assert.Equal(1, speed.StepIndex);
|
||||
|
||||
speed.Cycle(); // -> step 2 (fastest)
|
||||
Assert.Equal(2, speed.StepIndex);
|
||||
|
||||
speed.Cycle(); // -> pause
|
||||
Assert.True(speed.IsPaused);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Changed_FiresOnTransitions()
|
||||
{
|
||||
var clock = new GameClock();
|
||||
var speed = new GameSpeed(clock, 1f, 3f, 6f);
|
||||
var count = 0;
|
||||
speed.Changed += () => count++;
|
||||
|
||||
speed.Pause();
|
||||
speed.Resume();
|
||||
speed.Faster();
|
||||
|
||||
Assert.Equal(3, count);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user