using System; using System.IO; using System.Linq; using System.Windows.Controls; using Paca.App; using Paca.Browser; using Paca.Browser.Tabs; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.Browser; public class ChromeParityMilestone7Tests { private static TabManager CreateManager() => new(() => new TabItem()); [Fact] public void TabManager_MoveTabLeft_And_Right_탭을_좌우로_이동한다() { var mgr = CreateManager(); var t1 = mgr.NewTab("https://site1.com"); var t2 = mgr.NewTab("https://site2.com"); var t3 = mgr.NewTab("https://site3.com"); // [t1, t2, t3] -> t2를 왼쪽으로 이동 -> [t2, t1, t3] mgr.MoveTabLeft(t2); Assert.Equal(t2, mgr.Tabs[0]); Assert.Equal(t1, mgr.Tabs[1]); Assert.Equal(t3, mgr.Tabs[2]); // t2는 이미 맨 왼쪽(0)이므로 더 왼쪽으로 가도 0 유지 mgr.MoveTabLeft(t2); Assert.Equal(t2, mgr.Tabs[0]); // t2를 오른쪽으로 2번 이동 -> [t1, t3, t2] mgr.MoveTabRight(t2); mgr.MoveTabRight(t2); Assert.Equal(t1, mgr.Tabs[0]); Assert.Equal(t3, mgr.Tabs[1]); Assert.Equal(t2, mgr.Tabs[2]); // t2는 이미 맨 오른쪽이므로 더 오른쪽으로 가도 마지막 유지 mgr.MoveTabRight(t2); Assert.Equal(t2, mgr.Tabs[2]); } [Fact] public void TabManager_MoveActiveTabLeft_And_Right_활성탭을_좌우로_이동한다() { var mgr = CreateManager(); var t1 = mgr.NewTab("https://site1.com"); var t2 = mgr.NewTab("https://site2.com"); var t3 = mgr.NewTab("https://site3.com"); mgr.Activate(t3); mgr.MoveActiveTabLeft(); // t3을 2번에서 1번 인덱스로 Assert.Equal(t1, mgr.Tabs[0]); Assert.Equal(t3, mgr.Tabs[1]); Assert.Equal(t2, mgr.Tabs[2]); Assert.Same(t3, mgr.ActiveTab); } [Theory] [InlineData("https://example.com/doc", "hello world", "https://example.com/doc#:~:text=hello%20world")] [InlineData("https://example.com/doc", "alpha-beta, gamma & delta", "https://example.com/doc#:~:text=alpha%2Dbeta%2C%20gamma%20%26%20delta")] public void TextFragmentHelper_Generate_W3C_사양에_맞게_인코딩한다(string url, string text, string expected) { var link = TextFragmentHelper.Generate(url, text); Assert.Equal(expected, link); } [Fact] public void TextFragmentHelper_TryParse_프래그먼트_텍스트를_정확히_추출한다() { var url = "https://example.com/doc#:~:text=alpha%2Dbeta%2C%20gamma%20%26%20delta"; var success = TextFragmentHelper.TryParse(url, out var text); Assert.True(success); Assert.Equal("alpha-beta, gamma & delta", text); } [Fact] public void BuildTabContextMenu_탭_좌우_이동_옵션이_포함된다() { using var sta = StaDispatcher.Start(); WpfTestApp.Ensure(sta.Dispatcher); sta.Invoke(() => { var dataDir = Path.Combine(Path.GetTempPath(), $"vd_tab_move_{Guid.NewGuid():N}"); Environment.SetEnvironmentVariable("VD_DATA_DIR", dataDir); try { var win = new MainWindow(); win.TabsManager.Tabs.Clear(); var t1 = win.TabsManager.NewTab("https://site1.com"); var t2 = win.TabsManager.NewTab("https://site2.com"); var menu = win.BuildTabContextMenu(t1); var items = menu.Items.OfType().Select(m => m.Header?.ToString()).ToList(); Assert.Contains("탭을 왼쪽으로 이동", items); Assert.Contains("탭을 오른쪽으로 이동", items); } finally { try { if (Directory.Exists(dataDir)) Directory.Delete(dataDir, true); } catch { } } }); } }