XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Xml.Linq;
using XFEEDToolBox.Core.Data;
using XFEEDToolBox.Core.Notifications;
using XFEExtension.NetCore.XUnit.Attributes;

namespace XFEEDToolBox.Test;

[TestFixture]
public class GameAnnouncementTests
{
    private static ObservedJournalEvent Notice(DateTimeOffset at,string message,string sender="Server",string channel="player",string? localised=null)
        =>new(1,at,Check.Event(new{timestamp=at,@event="ReceiveText",From=sender,Channel=channel,Message=message,Message_Localised=localised??message}));
    [Test] public void MaintenanceDeadlineUsesAnnouncementTimeRatherThanDelayedReadTime()
    {
        var at=DateTimeOffset.UtcNow;var result=new GameAnnouncementObserver().Observe(Notice(at,"Server maintenance in 20 minutes"),at.AddSeconds(50));
        Check.Equal(at.AddMinutes(20),result!.MaintenanceAt);Check.Equal("服务器维护公告",result.Title);
    }
    [Test] public void LocalisedAnnouncementIsPreservedAndEscapedForWindows()
    {
        var now=DateTimeOffset.UtcNow;
        var result=new GameAnnouncementObserver().Observe(Notice(now,"Maintenance in 20 minutes",localised:"服务器将在20分钟后维护 <测试> & 通知"),now)!;
        var text=XElement.Parse(result.ToastXml()).Descendants("text").Select(e=>e.Value).ToArray();
        Check.Equal("服务器将在20分钟后维护 <测试> & 通知",result.Message);Check.Equal(result.Message,text[1]);
        Check.Equal(now.AddMinutes(20),result.MaintenanceAt);
    }
    [Test] public void NpcAndCommanderMessagesCannotBecomeServerNotices()
    {
        var now=DateTimeOffset.UtcNow;var observer=new GameAnnouncementObserver();
        Check.That(observer.Observe(Notice(now,"Maintenance in 20 minutes","Server","npc"),now) is null);
        Check.That(observer.Observe(Notice(now,"Maintenance in 20 minutes","Commander","player"),now) is null);
    }
    [Test] public void ReplayedOldAnnouncementsAndDuplicateEventsDoNotNotifyAgain()
    {
        var now=DateTimeOffset.UtcNow;var observer=new GameAnnouncementObserver();var notice=Notice(now,"Server maintenance in 20 minutes");
        Check.That(observer.Observe(notice,now) is not null);Check.That(observer.Observe(notice,now.AddSeconds(1)) is null);
        Check.That(observer.Observe(Notice(now.AddMinutes(-10),"Server maintenance in 20 minutes"),now) is null);
    }
    [Test] public void GeneralAnnouncementsDoNotInventAMaintenanceTime()
    {
        var now=DateTimeOffset.UtcNow;var result=new GameAnnouncementObserver().Observe(Notice(now,"Server event starts in 20 minutes"),now)!;
        Check.Equal("游戏公告",result.Title);Check.That(result.MaintenanceAt is null);
    }
}