using System; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class BandwidthRateLimiterGateTests { [Fact] public void Gate277_BandwidthRateLimiter_UnlimitedPreset_AllowsFullSpeed() { var limiter = new BandwidthRateLimiter(BandwidthLimitPreset.Unlimited); var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 10_000_000, elapsedMs: 10); Assert.Equal(0, delay); } [Fact] public void Gate278_BandwidthRateLimiter_TokenBucket_EnforcesByteCap() { // 1 MB/s = 1,000,000 bytes/sec var limiter = new BandwidthRateLimiter(bytesPerSecond: 1_000_000); // Downloaded 1MB in 200ms -> should throttle ~800ms var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 1_000_000, elapsedMs: 200); Assert.InRange(delay, 750, 850); } [Fact] public void Gate279_BandwidthRateLimiter_Presets_FormatLabelsCleanly() { Assert.Equal("무제한", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Unlimited)); Assert.Equal("10 MB/s (고속)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Fast10MB)); Assert.Equal("5 MB/s (일반)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Medium5MB)); Assert.Equal("1 MB/s (절약)", BandwidthRateLimiter.GetPresetLabel(BandwidthLimitPreset.Low1MB)); } [Fact] public void Gate280_BandwidthRateLimiter_DynamicRateChange_TakesEffectImmediately() { var limiter = new BandwidthRateLimiter(bytesPerSecond: 1_000_000); Assert.Equal(1_000_000, limiter.BytesPerSecond); // Update mid-stream limiter.SetRate(5_000_000); Assert.Equal(5_000_000, limiter.BytesPerSecond); // Now 1MB at 5MB/s expects 200ms total time, elapsed 100ms -> delay ~100ms var delay = limiter.ComputeThrottleDelayMs(chunkBytes: 1_000_000, elapsedMs: 100); Assert.InRange(delay, 80, 120); } }