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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text;
using System.Text.Json;
using XFEExtension.NetCore.XUnit.Attributes;
using XFEEDToolBox.Core.Execution;

namespace XFEEDToolBox.Test;

[TestFixture]
public class CommunityGoalCatalogueTests
{
    private static readonly DateTimeOffset Now=DateTimeOffset.FromUnixTimeSeconds(1792799632);
    private static string Hex(string value)=>Convert.ToHexStringLower(Encoding.UTF8.GetBytes(value));
    private static string Body(bool subscribed=false,long market=4210924803,string station="Homer Platform",bool complete=false,long expiry=1793268000,object? contribution=null)
        =>JsonSerializer.Serialize(new{initiatives=new Dictionary<string,object>{["864"]=new{id=864,activityType="tradelist",goalType="trade",market_id=market,expiry,complete,final_state="active",hidden="0",
            bulletin=new{title=Hex(CommunityGoalCatalogue.TradeTitle)},systemName=Hex("AD Leonis"),marketName=Hex(station),
            dynamic=new{complete=false,commanderSubscribed=subscribed,commanderContributionQty=contribution}}}});
    [Test] public void DeliveredContributionAcceptsOriginalIntegerOrDigitString()
    {
        foreach(var quantity in new object[]{192L,"192"})
            Check.Equal(192L,CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse(Body(true,contribution:quantity)),Now,true).Contribution!.Value);
        foreach(var quantity in new object[]{-1L,"-1","+192"," 192","192.0",1.5m,true,"9223372036854775808"})
            Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.Parse(Body(true,contribution:quantity)));
    }
    [Test] public void OriginalHexBulletinAndEmptyPersonalListAreDistinct()
    {
        var goal=CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse(Body()),Now);
        Check.Equal(864UL,goal.Id);Check.That(!goal.Subscribed);Check.Equal(0,CommunityGoalCatalogue.Parse("{\"initiatives\":[]}").Count);
        Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse("{\"initiatives\":[]}"),Now,true));
    }
    [Test] public void GlobalListDoesNotProvePersonalSignup()
    {
        Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse(Body()),Now,true));
        Check.That(CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse(Body(true)),Now,true).Subscribed);
    }
    [Test] public void ExactDestinationAndActiveExpiryAreRequired()
    {
        foreach(var body in new[]{Body(market:3223838208),Body(station:"Bowen Dock"),Body(complete:true),Body(expiry:Now.ToUnixTimeSeconds())})
            Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.RequireTrade(CommunityGoalCatalogue.Parse(body),Now));
    }
    [Test] public void IdentityMismatchDuplicateRowsAndMalformedUtf8AreRejected()
    {
        Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.Parse(Body().Replace("\"id\":864","\"id\":865")));
        var body=Body();using var doc=JsonDocument.Parse(body);var row=doc.RootElement.GetProperty("initiatives").GetProperty("864").GetRawText();
        Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.Parse("{\"initiatives\":{\"864\":"+row+",\"864\":"+row+"}}"));
        Check.Throws<InvalidDataException>(()=>CommunityGoalCatalogue.Parse(body.Replace(Hex(CommunityGoalCatalogue.TradeTitle),"ff")));
    }
}