using System; using System.Collections.Generic; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class NetworkResilienceSupervisorGateTests { [Fact] public void Gate265_NetworkResilienceSupervisor_PausesActiveDownloads_OnNetworkLoss() { var supervisor = new NetworkResilienceSupervisor(); var item1 = new ResilientDownloadItem("id-1", "video1", ResilientDownloadState.Downloading); var item2 = new ResilientDownloadItem("id-2", "video2", ResilientDownloadState.Downloading); supervisor.RegisterItems(new[] { item1, item2 }); // Network goes down supervisor.OnNetworkStatusChanged(isConnected: false); Assert.Equal(ResilientDownloadState.NetworkPaused, item1.State); Assert.Equal(ResilientDownloadState.NetworkPaused, item2.State); } [Fact] public void Gate266_NetworkResilienceSupervisor_AutomaticallyResumes_OnNetworkRestored() { var supervisor = new NetworkResilienceSupervisor(); var item = new ResilientDownloadItem("id-1", "video1", ResilientDownloadState.Downloading); supervisor.RegisterItems(new[] { item }); supervisor.OnNetworkStatusChanged(isConnected: false); Assert.Equal(ResilientDownloadState.NetworkPaused, item.State); // Network comes back up var resumedItems = supervisor.OnNetworkStatusChanged(isConnected: true); Assert.Equal(ResilientDownloadState.Downloading, item.State); Assert.Single(resumedItems); Assert.Equal("id-1", resumedItems[0].Id); } [Fact] public void Gate267_NetworkResilienceSupervisor_DoesNotResume_UserPausedItems() { var supervisor = new NetworkResilienceSupervisor(); var userPausedItem = new ResilientDownloadItem("id-user", "video_paused", ResilientDownloadState.UserPaused); supervisor.RegisterItems(new[] { userPausedItem }); // Network disconnect then reconnect supervisor.OnNetworkStatusChanged(isConnected: false); var resumed = supervisor.OnNetworkStatusChanged(isConnected: true); Assert.Equal(ResilientDownloadState.UserPaused, userPausedItem.State); Assert.Empty(resumed); } [Fact] public void Gate268_NetworkResilienceSupervisor_JitteredBackoff_CalculatesDelays() { var supervisor = new NetworkResilienceSupervisor(); var delay1 = supervisor.GetJitteredDelayMs(itemIndex: 0, baseDelayMs: 500); var delay2 = supervisor.GetJitteredDelayMs(itemIndex: 1, baseDelayMs: 500); var delay3 = supervisor.GetJitteredDelayMs(itemIndex: 2, baseDelayMs: 500); Assert.True(delay1 >= 500); Assert.True(delay2 > delay1); Assert.True(delay3 > delay2); } }