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