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<MaterialNeedLiveRow,MaterialNeed,string>(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<string>();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<string[]>(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<MaterialNeedLiveRow,MaterialNeed,string>(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);
}
}
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<MaterialNeedLiveRow,MaterialNeed,string>(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<string>();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<string[]>(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<MaterialNeedLiveRow,MaterialNeed,string>(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);
}
}