releases/tests/Paca.Tests/Browser/ChromeParityMilestone7Tests.cs

110 lines
3.9 KiB
C#

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<MenuItem>().Select(m => m.Header?.ToString()).ToList();
Assert.Contains("탭을 왼쪽으로 이동", items);
Assert.Contains("탭을 오른쪽으로 이동", items);
}
finally
{
try { if (Directory.Exists(dataDir)) Directory.Delete(dataDir, true); } catch { }
}
});
}
}