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