test(core/browser/platform): 26 extreme RED/GREEN TDD cycles and full regression hardening (3,235 PASS)
Some checks failed
release / test (push) Failing after 14m5s
release / windows (push) Has been cancelled
release / android (push) Has been cancelled
release / linux (push) Has been cancelled
release / macos (push) Has been cancelled

This commit is contained in:
Yun Chan 2026-09-18 23:32:32 +09:00
parent bcd242691f
commit 8677853822
100 changed files with 4814 additions and 333 deletions

View file

@ -0,0 +1,106 @@
using System;
using System.Collections.Generic;
using Paca.Browser;
using Paca.Browser.Content;
using Xunit;
namespace Paca.Tests.Browser;
public class BrowserContentAndRoutingExtremeRedTests
{
// ==========================================
// 1. ChromeInternalUrlRouter
// ==========================================
[Theory]
[InlineData("chrome://settings?category=privacy", ChromeInternalAction.Settings)]
[InlineData("chrome://downloads?q=paca", ChromeInternalAction.Downloads)]
[InlineData("chrome://history#search", ChromeInternalAction.History)]
[InlineData("chrome:///settings", ChromeInternalAction.Settings)]
[InlineData("paca://extensions?id=123", ChromeInternalAction.Extensions)]
[InlineData("chrome://settings/content?site=example.com", ChromeInternalAction.SiteSettings)]
[InlineData("chrome://clear-browsing-data?time=all", ChromeInternalAction.ClearBrowsingData)]
public void ChromeInternalUrlRouter_Route_WithQueryOrFragment_ResolvesActionCorrectly(string url, ChromeInternalAction expected)
{
var action = ChromeInternalUrlRouter.Route(url);
Assert.Equal(expected, action);
}
// ==========================================
// 2. DualSubtitleEngine
// ==========================================
[Theory]
[InlineData(double.NaN)]
[InlineData(double.NegativeInfinity)]
[InlineData(double.PositiveInfinity)]
[InlineData(-1.0)]
public void DualSubtitleEngine_GetDualCues_InvalidTimestamp_ReturnsNull(double timestamp)
{
var engine = new DualSubtitleEngine();
var cues = engine.GetDualCues(timestamp);
Assert.Null(cues);
}
[Fact]
public void DualSubtitleEngine_RegisterAudioTrack_NullOrDuplicate_HandledSafely()
{
var engine = new DualSubtitleEngine();
engine.RegisterAudioTrack(null!);
Assert.Empty(engine.AudioTracks);
var track1 = new AudioTrackInfo(1, "ko", "한국어", true);
var track1Duplicate = new AudioTrackInfo(1, "ko-alt", "한국어 더빙", false);
engine.RegisterAudioTrack(track1);
engine.RegisterAudioTrack(track1Duplicate);
Assert.Single(engine.AudioTracks);
Assert.Equal(1, engine.SelectedAudioTrackId);
}
// ==========================================
// 3. LiveCaptionEngine
// ==========================================
[Theory]
[InlineData(double.NaN)]
[InlineData(-10.0)]
public void LiveCaptionEngine_GetActiveCue_InvalidTimestamp_ReturnsNull(double timestamp)
{
var engine = new LiveCaptionEngine();
var cue = engine.GetActiveCue(timestamp);
Assert.Null(cue);
}
// ==========================================
// 4. MhtmlWebArchivePackager
// ==========================================
[Fact]
public void MhtmlWebArchivePackager_Package_NullRequest_ThrowsArgumentNullException()
{
var packager = new MhtmlWebArchivePackager();
Assert.Throws<ArgumentNullException>(() => packager.Package(null!));
}
[Fact]
public void MhtmlWebArchivePackager_Package_NullResourcesOrData_PackagesWithoutCrashing()
{
var packager = new MhtmlWebArchivePackager();
var req = new WebArchivePackageRequest(
Url: "https://example.com",
Title: "Test Page",
HtmlContent: "<html><body>Hello</body></html>",
Resources: new List<WebArchiveResource>
{
new("https://example.com/null.png", "image/png", null!),
null!
}
);
var mhtml = packager.Package(req);
Assert.NotNull(mhtml);
Assert.Contains("Hello", mhtml);
}
}