using System.Text.Json; using XFEEDToolBox.Core.Engineering; using XFEEDToolBox.Core.Planning; using XFEEDToolBox.Core.Presentation; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public class MaterialChecklistTests { [Test] public void InitiallyCoveredMaterialsAreNotAdded() { var checklist=new MaterialChecklist(); var rows=checklist.Update([new("nickel","Nickel",24,30),new("zinc","Zinc",4,4),new("conductivecomponents","Conductive Components",20,5)]); Check.Equal(1,rows.Count);Check.Equal("conductivecomponents",rows[0].Key);Check.Equal("15",rows[0].MissingText); Check.That(checklist.Keys.SequenceEqual(new[]{"conductivecomponents"})); } [Test] public void RestockingMarksTheExistingRowWithoutRemovingOrReplacingIt() { var checklist=new MaterialChecklist();var live=new LiveCollection(m=>m.Key,m=>new(m)); var need=new MaterialNeed("nickel","Nickel",24,5);live.Apply(checklist.Update([need]));var row=live.Single(); var notifications=new List();row.PropertyChanged+=(_,e)=>notifications.Add(e.PropertyName!); var change=live.Apply(checklist.Update([need with{Owned=24}]),reorder:false); Check.That(ReferenceEquals(row,live.Single()));Check.Equal(0,change.Added+change.Removed+change.Moved); Check.Equal(0,row.Missing);Check.Equal("✓",row.MissingText);Check.That(notifications.Contains(nameof(MaterialNeedLiveRow.MissingText))); } [Test] public void CombinedDemandCanAdmitAMaterialThatCoveredTheEarlierJob() { var checklist=new MaterialChecklist();Check.Equal(0,checklist.Update([new("nickel","Nickel",5,8)]).Count); var rows=checklist.Update([new("nickel","Nickel",10,8)]); Check.Equal(1,rows.Count);Check.Equal(2,rows[0].Missing);Check.Equal("2",rows[0].MissingText); Check.Equal("✓",checklist.Update([new("nickel","Nickel",10,12)]).Single().MissingText); } [Test] public void RemovedRequirementsAreNotCarriedIntoANewCoveredJob() { var checklist=new MaterialChecklist();checklist.Update([new("nickel","Nickel",5,0)]); Check.Equal(0,checklist.Update([]).Count);Check.Equal(0,checklist.Keys.Count); Check.Equal(0,checklist.Update([new("nickel","Nickel",2,8)]).Count); } [Test] public void SavedTrackingRestoresCompletedRowsAndClearForgetsThem() { var first=new MaterialChecklist();first.Update([new("nickel","Nickel",5,0)]); var saved=JsonSerializer.Serialize(first.Keys);var restored=new MaterialChecklist();restored.Restore(JsonSerializer.Deserialize(saved)!); Check.Equal("✓",restored.Update([new("nickel","Nickel",5,8)]).Single().MissingText); restored.Clear();Check.Equal(0,restored.Update([new("nickel","Nickel",5,8)]).Count);Check.Equal(0,restored.Keys.Count); } [Test] public void CompletedMaterialsMoveToTheBottomWithoutResettingTheList() { var checklist=new MaterialChecklist();var live=new LiveCollection(m=>m.Key,m=>new(m)); var first=new MaterialNeed("nickel","Nickel",24,0);var second=new MaterialNeed("zinc","Zinc",8,0); live.Apply(checklist.Update([first,second]));var nickel=live[0];var resets=0; live.CollectionChanged+=(_,args)=>{if(args.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Reset)resets++;}; var delta=live.Apply(checklist.Update([first with{Owned=24},second])); Check.That(ReferenceEquals(nickel,live.Last()));Check.Equal("✓",live.Last().MissingText); Check.Equal("zinc",live.First().Key);Check.Equal(0,resets);Check.Equal(0,delta.Added+delta.Removed);Check.That(delta.Moved>0); } }