using System; using System.Linq; using Paca.Browser.Media; using Paca.Browser.Tabs; using Xunit; namespace Paca.Tests.Browser; public class ChromeMediaSessionPiPTests { [Fact] public void MediaSessionCoordinator_Tracks_Active_Sessions() { var coordinator = new MediaSessionCoordinator(); var tabId1 = Guid.NewGuid(); var tabId2 = Guid.NewGuid(); coordinator.RegisterOrUpdateSession(new MediaSessionItem( tabId1, "Cool Music Video", "YouTube", "https://www.youtube.com/watch?v=123", IsPlaying: true, SupportsPiP: true, Duration: 210.0, CurrentPosition: 45.0 )); coordinator.RegisterOrUpdateSession(new MediaSessionItem( tabId2, "Podcast Episode 99", "Spotify", "https://open.spotify.com/track/456", IsPlaying: false, SupportsPiP: false, Duration: 3600.0, CurrentPosition: 1200.0 )); Assert.Equal(2, coordinator.ActiveSessions.Count); var primary = coordinator.GetPrimaryPlayingSession(); Assert.NotNull(primary); Assert.Equal(tabId1, primary.TabId); Assert.Equal("Cool Music Video", primary.Title); // Update tab1 to paused and tab2 to playing coordinator.RegisterOrUpdateSession(primary with { IsPlaying = false }); var tab2Item = coordinator.ActiveSessions.First(s => s.TabId == tabId2); coordinator.RegisterOrUpdateSession(tab2Item with { IsPlaying = true }); var newPrimary = coordinator.GetPrimaryPlayingSession(); Assert.NotNull(newPrimary); Assert.Equal(tabId2, newPrimary.TabId); // Remove session when tab closes coordinator.RemoveSession(tabId1); Assert.Single(coordinator.ActiveSessions); Assert.Equal(tabId2, coordinator.ActiveSessions[0].TabId); } [Fact] public void MediaSessionCoordinator_Generates_Valid_PiP_Scripts() { var coordinator = new MediaSessionCoordinator(); var pipScript = coordinator.GeneratePiPInjectionScript(); Assert.Contains("requestPictureInPicture", pipScript); Assert.Contains("document.pictureInPictureElement", pipScript); var toggleScript = coordinator.GeneratePlayPauseToggleScript(); Assert.Contains(".paused", toggleScript); Assert.Contains(".play()", toggleScript); Assert.Contains(".pause()", toggleScript); } [Fact] public void OmniboxActionEvaluator_Matches_Media_And_PiP() { var pipActions = OmniboxActionEvaluator.GetMatchingActions("pip"); Assert.Contains(pipActions, a => a.ActionId == "action:media-controls"); var mediaActions = OmniboxActionEvaluator.GetMatchingActions("미디어 컨트롤"); Assert.Contains(mediaActions, a => a.ActionId == "action:media-controls"); var action = OmniboxActionEvaluator.AllActions.FirstOrDefault(a => a.ActionId == "action:media-controls"); Assert.NotNull(action); Assert.Contains("PIP", action.DisplayTitle); } }