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);
}
}
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);
}
}