using System.Collections.Specialized;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Presentation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class SystemLocationUpdatesTests
{
private static SystemLocation Place(int key,double distance)=>new(key,(ulong)(100+key),"Location "+key,"",14,SystemLocationCategory.Carrier,1000+key,new(0,0,distance),distance,false,"place-"+key);
private static LiveCollection<SystemLocationLiveRow,SystemLocation,string> Rows()=>new(x=>x.Identity,x=>new(x));
[Test] public void GeometryAndUnchangedDisplayedDistanceCauseNoNotifications()
{
var rows=Rows();var first=Place(1,10000);rows.ApplyLocations([first]);var row=rows[0];var collection=0;var properties=0;
rows.CollectionChanged+=(_,_)=>collection++;row.PropertyChanged+=(_,_)=>properties++;
var changed=first with{Position=new(1,2,3),DistanceMetres=10000.01};var delta=rows.ApplyLocations([changed]);
Check.Equal(0,collection);Check.Equal(0,properties);Check.That(!delta.Changed);Check.That(ReferenceEquals(row,rows[0]));Check.That(ReferenceEquals(changed,row.Record));
}
[Test] public void DistanceChangesOnlyUpdateThatRowsBindingWithoutMovingOtherRows()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,20000);rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var properties=new List<string>();var other=0;var structure=0;
a.PropertyChanged+=(_,e)=>properties.Add(e.PropertyName!);b.PropertyChanged+=(_,_)=>other++;rows.CollectionChanged+=(_,_)=>structure++;
var moved=one with{DistanceMetres=30000};rows.ApplyLocations([two,moved]);
Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[1]));Check.Equal(0,structure);Check.Equal(0,other);Check.That(properties.SequenceEqual(new[]{"Distance"}));Check.Equal("30.0 km",a.Distance);
}
[Test] public void ASignalAppearingAndDisappearingOnlyAddsOrRemovesThatRow()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,30000);var signal=Place(3,20000) with{Category=SystemLocationCategory.Signal};rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var actions=new List<NotifyCollectionChangedAction>();
rows.CollectionChanged+=(_,e)=>actions.Add(e.Action);rows.ApplyLocations([one,signal,two]);Check.That(actions.SequenceEqual(new[]{NotifyCollectionChangedAction.Add}));
Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[2]));actions.Clear();rows.ApplyLocations([one,two]);
Check.That(actions.SequenceEqual(new[]{NotifyCollectionChangedAction.Remove}));Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[1]));
}
[Test] public void ExplicitFilterCanSortButStillReusesTheSameRows()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,20000);rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var far=one with{DistanceMetres=30000};
rows.ApplyLocations([two,far]);rows.ApplyLocations([two,far],sortExisting:true);Check.That(ReferenceEquals(b,rows[0])&&ReferenceEquals(a,rows[1]));
}
}
using System.Collections.Specialized;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Presentation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class SystemLocationUpdatesTests
{
private static SystemLocation Place(int key,double distance)=>new(key,(ulong)(100+key),"Location "+key,"",14,SystemLocationCategory.Carrier,1000+key,new(0,0,distance),distance,false,"place-"+key);
private static LiveCollection<SystemLocationLiveRow,SystemLocation,string> Rows()=>new(x=>x.Identity,x=>new(x));
[Test] public void GeometryAndUnchangedDisplayedDistanceCauseNoNotifications()
{
var rows=Rows();var first=Place(1,10000);rows.ApplyLocations([first]);var row=rows[0];var collection=0;var properties=0;
rows.CollectionChanged+=(_,_)=>collection++;row.PropertyChanged+=(_,_)=>properties++;
var changed=first with{Position=new(1,2,3),DistanceMetres=10000.01};var delta=rows.ApplyLocations([changed]);
Check.Equal(0,collection);Check.Equal(0,properties);Check.That(!delta.Changed);Check.That(ReferenceEquals(row,rows[0]));Check.That(ReferenceEquals(changed,row.Record));
}
[Test] public void DistanceChangesOnlyUpdateThatRowsBindingWithoutMovingOtherRows()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,20000);rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var properties=new List<string>();var other=0;var structure=0;
a.PropertyChanged+=(_,e)=>properties.Add(e.PropertyName!);b.PropertyChanged+=(_,_)=>other++;rows.CollectionChanged+=(_,_)=>structure++;
var moved=one with{DistanceMetres=30000};rows.ApplyLocations([two,moved]);
Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[1]));Check.Equal(0,structure);Check.Equal(0,other);Check.That(properties.SequenceEqual(new[]{"Distance"}));Check.Equal("30.0 km",a.Distance);
}
[Test] public void ASignalAppearingAndDisappearingOnlyAddsOrRemovesThatRow()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,30000);var signal=Place(3,20000) with{Category=SystemLocationCategory.Signal};rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var actions=new List<NotifyCollectionChangedAction>();
rows.CollectionChanged+=(_,e)=>actions.Add(e.Action);rows.ApplyLocations([one,signal,two]);Check.That(actions.SequenceEqual(new[]{NotifyCollectionChangedAction.Add}));
Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[2]));actions.Clear();rows.ApplyLocations([one,two]);
Check.That(actions.SequenceEqual(new[]{NotifyCollectionChangedAction.Remove}));Check.That(ReferenceEquals(a,rows[0])&&ReferenceEquals(b,rows[1]));
}
[Test] public void ExplicitFilterCanSortButStillReusesTheSameRows()
{
var rows=Rows();var one=Place(1,10000);var two=Place(2,20000);rows.ApplyLocations([one,two]);var a=rows[0];var b=rows[1];var far=one with{DistanceMetres=30000};
rows.ApplyLocations([two,far]);rows.ApplyLocations([two,far],sortExisting:true);Check.That(ReferenceEquals(b,rows[0])&&ReferenceEquals(a,rows[1]));
}
}