using System; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class MediaFileNameTemplateGateTests { [Fact] public void Gate361_MediaFileNameTemplate_SubstitutesTokens_Accurately() { var ctx = new MediaTemplateContext { Title = "Rolling in the Deep", Artist = "Adele", Channel = "AdeleVEVO", Domain = "youtube.com", Resolution = "1080p", UploadDate = new DateTime(2010, 11, 30), TrackNumber = 1 }; var template = "[{domain}] {artist} - {title} ({resolution})"; var result = MediaFileNameTemplateEngine.FormatFileName(template, ctx); Assert.Equal("[youtube.com] Adele - Rolling in the Deep (1080p)", result); } [Fact] public void Gate362_MediaFileNameTemplate_HandlesNullTokens_Gracefully() { var ctx = new MediaTemplateContext { Title = "Solo Track", Artist = null, Resolution = null }; var template = "{artist} - {title} [{resolution}]"; var result = MediaFileNameTemplateEngine.FormatFileName(template, ctx); // Null tokens are omitted or stripped cleanly Assert.Equal("Solo Track", result); } [Fact] public void Gate363_MediaFileNameTemplate_SanitizesIllegalCharacters() { var dirty = "Who: Are / You * In ? | Check \"This\""; var clean = MediaFileNameTemplateEngine.SanitizePathSegment(dirty); Assert.DoesNotContain(":", clean); Assert.DoesNotContain("/", clean); Assert.DoesNotContain("*", clean); Assert.DoesNotContain("<", clean); Assert.DoesNotContain(">", clean); Assert.DoesNotContain("?", clean); Assert.DoesNotContain("|", clean); Assert.DoesNotContain("\"", clean); } [Fact] public void Gate364_MediaFileNameTemplate_TruncatesExcessiveLength_PreservingFormat() { var longTitle = new string('A', 300); var ctx = new MediaTemplateContext { Title = longTitle }; var formatted = MediaFileNameTemplateEngine.FormatFileName("{title}", ctx, maxLength: 50); Assert.Equal(50, formatted.Length); Assert.StartsWith("AAAA", formatted); } }