public void ValueUnsubscribesFromNodesNoLongerUsed() { var node1 = NodeHelper.MockNode(0); var node2 = NodeHelper.MockNode(0); var node3 = NodeHelper.MockNode(0); var stat = new StatStub(); var nodeRepositoryMock = new Mock <INodeRepository>(); nodeRepositoryMock.Setup(r => r.GetNode(stat, NodeType.Total, Path)).Returns(node1); nodeRepositoryMock.Setup(r => r.GetNode(stat, NodeType.Base, Path)).Returns(node2); nodeRepositoryMock.Setup(r => r.GetNode(stat, NodeType.BaseSet, Path)).Returns(node3); var valueMock = new Mock <IValue>(); valueMock.Setup(v => v.Calculate(It.IsAny <IValueCalculationContext>())) .Returns((IValueCalculationContext c) => c.GetValue(stat) + c.GetValue(stat, NodeType.Base)); var sut = CreateSut(nodeRepositoryMock.Object, valueMock.Object); var _ = sut.Value; valueMock.Setup(v => v.Calculate(It.IsAny <IValueCalculationContext>())) .Returns((IValueCalculationContext c) => c.GetValue(stat, NodeType.BaseSet) + c.GetValue(stat, NodeType.Base)); var invocations = 0; sut.SubscribeToValueChanged(() => invocations++); _ = sut.Value; Mock.Get(node1).RaiseValueChanged(); Assert.AreEqual(0, invocations); Mock.Get(node2).RaiseValueChanged(); Mock.Get(node3).RaiseValueChanged(); Assert.AreEqual(2, invocations); }
public void GetOrAddDoesNotCallStatAddedActionIfInjectedGraphContainsStat() { var stat = new StatStub(); var sut = CreateSut(_ => Assert.Fail(), knownStats: stat); sut.GetOrAdd(stat); }
public void RemoveUnusedNodesRemovesRemainingModifiers() { var stat = new StatStub(); var modifier = MockModifier(stat); var statGraphMock = new Mock <IStatGraph>(); var ruleSet = Mock.Of <IGraphPruningRuleSet>(r => r.CanStatBeConsideredForRemoval(stat, statGraphMock.Object) && r.CanStatGraphBeRemoved(statGraphMock.Object)); var formNodeSelector = new FormNodeSelector(Form.TotalOverride, PathDefinition.MainPath); var modifierNodeCollection = new StatNodeFactory(new EventBuffer(), null !, stat) .Create(formNodeSelector); modifierNodeCollection.Add(MockProvider <ICalculationNode>(), modifier); var formNodeCollection = new Dictionary <FormNodeSelector, IBufferingEventViewProvider <INodeCollection <Modifier> > > { { new FormNodeSelector(Form.TotalOverride, PathDefinition.MainPath), modifierNodeCollection } }; statGraphMock.SetupGet(g => g.FormNodeCollections).Returns(formNodeCollection); var graphMock = MockGraph(stat, statGraphMock.Object); var sut = CreateSut(graphMock.Object, ruleSet); sut.StatAdded(stat); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.RemoveModifier(modifier)); statGraphMock.Verify(g => g.RemoveFormNodeCollection(formNodeSelector)); graphMock.Verify(g => g.Remove(stat)); }
public void RemoveUnusedNodesDoesNotRemoveStatsWithNodes() { var stat = new StatStub(); var graphMock = MockGraph(); var sut = CreateSut(graphMock.Object); sut.GetOrAdd(stat); var nodes = new Dictionary <NodeSelector, ISuspendableEventViewProvider <ICalculationNode> > { { Selector(NodeType.Base), Mock.Of <ISuspendableEventViewProvider <ICalculationNode> >() } }; var statGraph = Mock.Of <IStatGraph>(g => g.Nodes == nodes); var statGraphs = new Dictionary <IStat, IStatGraph> { { stat, statGraph } }; graphMock.SetupGet(g => g.StatGraphs).Returns(statGraphs); SetStats(graphMock, stat); Mock.Get(graphMock.Object.StatGraphs[stat]) .SetupGet(g => g.Nodes).Returns(nodes); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat), Times.Never); }
public void AddModifierDoesNotCallStatAddedActionIfInjectedGraphContainsStat() { var stat = new StatStub(); var sut = CreateSut(_ => Assert.Fail(), knownStats: stat); sut.AddModifier(Helper.MockModifier(stat)); }
public void RemoveUnusedNodesCanRemoveMultipleNodeTypesAtOnce() { var stat = new StatStub(); var statGraphMock = new Mock <IStatGraph>(); var nodeSelectors = new[] { Selector(NodeType.Total), Selector(NodeType.Subtotal) }; var subTotalProviderMock = new Mock <IBufferingEventViewProvider <ICalculationNode> >(); var subTotalSubscriberCount = 1; subTotalProviderMock.SetupGet(p => p.SubscriberCount).Returns(() => subTotalSubscriberCount); var nodes = new Dictionary <NodeSelector, IBufferingEventViewProvider <ICalculationNode> > { { nodeSelectors[0], MockProvider <ICalculationNode>() }, { nodeSelectors[1], subTotalProviderMock.Object }, }; statGraphMock.SetupGet(g => g.Nodes).Returns(nodes); var formNodeCollection = new Dictionary <FormNodeSelector, IBufferingEventViewProvider <INodeCollection <Modifier> > >(); statGraphMock.SetupGet(g => g.FormNodeCollections).Returns(formNodeCollection); statGraphMock.Setup(g => g.RemoveNode(nodeSelectors[0])).Callback(() => subTotalSubscriberCount = 0); var graphMock = MockGraph(stat, statGraphMock.Object); var sut = CreateSut(graphMock.Object); sut.StatAdded(stat); sut.RemoveUnusedNodes(); statGraphMock.Verify(g => g.RemoveNode(nodeSelectors[0])); statGraphMock.Verify(g => g.RemoveNode(nodeSelectors[1])); }
public void RemoveDoesNothingIfStatWasNotAdded() { var stat = new StatStub { ExplicitRegistrationType = Registered }; var sut = CreateSut(); sut.Remove(stat); }
public void RemoveDoesNothingIfStatWasNotAdded() { var stat = new StatStub { IsRegisteredExplicitly = true }; var sut = CreateSut(); sut.Remove(stat); }
public void AddDoesNotAddIfStatIsNotRegisteredExplicitly() { var stat = new StatStub(); var nodeCollection = CreateNodeCollection(); var sut = CreateSut(nodeCollection); sut.Add(stat); CollectionAssert.IsEmpty(nodeCollection); }
public void RemoveCallsInjectedGraph() { var stat = new StatStub(); var graphMock = new Mock <ICalculationGraph>(); var sut = CreateSut(graphMock.Object); sut.Remove(stat); graphMock.Verify(g => g.Remove(stat)); }
public void ModifierRemovedAddsRemovalMark() { var stat = new StatStub(); var graphMock = MockGraph(stat); var sut = CreateSut(graphMock.Object); sut.ModifierRemoved(MockModifier(stat)); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat)); }
private static ValueNode CreateAggregatingSut(INodeCollection <Modifier> nodeCollection) { var stat = new StatStub(); var nodeRepository = Mock.Of <INodeRepository>(r => r.GetFormNodeCollection(stat, Form.More, Path) == nodeCollection); var valueMock = new Mock <IValue>(); valueMock.Setup(v => v.Calculate(It.IsAny <IValueCalculationContext>())) .Returns((IValueCalculationContext c) => c.GetValues(Form.More, stat).FirstOrDefault()); return(CreateSut(nodeRepository, valueMock.Object)); }
public void ModifierRemovedDoesNotAddRemovalMarkIfStatGraphHasModifiers() { var stat = new StatStub(); var graphMock = MockGraph(stat, Mock.Of <IStatGraph>(g => g.ModifierCount == 5)); var sut = CreateSut(graphMock.Object); sut.ModifierRemoved(MockModifier(stat)); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat), Times.Never); }
public void RemoveModifierDoesNotAddRemovalMarkIfStatGraphDoesNotContainStat() { var stat = new StatStub(); var graphMock = MockGraph(); var sut = CreateSut(graphMock.Object); sut.RemoveModifier(MockModifier(stat)); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat), Times.Never); }
public void GetOrAddDoesNotMarkStatForRemovalIfStatGraphsContainsIt() { var stat = new StatStub(); var graphMock = MockGraph(stat); var sut = CreateSut(graphMock.Object); sut.GetOrAdd(stat); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat), Times.Never); }
public void CalculateReturnsCorrectResult(double?subtotal, double?totalOverride, double?expected) { var stat = new StatStub(); var context = Mock.Of <IValueCalculationContext>(c => c.GetValue(stat, NodeType.Subtotal, Path) == (NodeValue?)subtotal && c.GetValue(stat, NodeType.TotalOverride, Path) == (NodeValue?)totalOverride); var sut = CreateSut(stat); var actual = sut.Calculate(context); Assert.AreEqual((NodeValue?)expected, actual); }
public void RemoveRemovesGraph() { var graph = Mock.Of <IStatGraph>(); var stat = new StatStub(); var sut = CreateSut(_ => graph); sut.GetOrAdd(stat); sut.Remove(stat); CollectionAssert.IsEmpty(sut); }
public void ClearClearsUsedNodes() { var stat = new StatStub(); var nodeRepository = Mock.Of <INodeRepository>(r => r.GetNode(stat, NodeType.Total, Path) == MockNode(0)); var sut = CreateSut(nodeRepository); sut.GetValue(stat, NodeType.Total, Path); sut.Clear(); CollectionAssert.IsEmpty(sut.UsedNodes); }
public void GetOrAddReturnedInjectedFactoryResult() { var expected = Mock.Of <IStatGraph>(); var stat = new StatStub(); var sut = CreateSut(GraphFactory); IStatGraph GraphFactory(IStat s) => s == stat ? expected : throw new AssertionException("Unexpected stat"); var actual = sut.GetOrAdd(stat); Assert.AreSame(expected, actual); }
public void RemoveUnusedNodesRemovesAddedStat() { var stat = new StatStub(); var graphMock = MockGraph(stat); var sut = CreateSut(graphMock.Object); sut.StatAdded(stat); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat)); }
public void GetValuesNodeTypeAddsToUsedCollections() { var expected = MockPathCollection(); var stat = new StatStub(); var nodeRepository = Mock.Of <INodeRepository>(r => r.GetPaths(stat) == expected); var sut = CreateSut(nodeRepository); sut.GetValues(stat, NodeType.Base); CollectionAssert.Contains(sut.UsedCollections, expected); }
public void StatGraphsReturnsCorrectResult() { var graph = Mock.Of <IStatGraph>(); var stat = new StatStub(); var sut = CreateSut(_ => graph); sut.GetOrAdd(stat); var actual = sut.StatGraphs; Assert.AreSame(graph, actual[stat]); }
public void CalculateHandlesNullRangeStat() { var expected = new NodeValue(5); var stat = new StatStub(); var context = Mock.Of <IValueCalculationContext>(c => c.GetValue(stat, NodeType.UncappedSubtotal, Path) == expected); var sut = CreateSut(stat); var actual = sut.Calculate(context); Assert.AreEqual(expected, actual); }
public void GetOrAddReturnsInjectedResult() { var expected = Mock.Of <IReadOnlyStatGraph>(); var stat = new StatStub(); var graph = Mock.Of <ICalculationGraph>( g => g.GetOrAdd(stat) == expected && g.StatGraphs.ContainsKey(stat)); var sut = CreateSut(graph); var actual = sut.GetOrAdd(stat); Assert.AreSame(expected, actual); }
public void CalculateReturnsCorrectResult(double?baseSet, double?baseAdd, double?expected) { var stat = new StatStub(); var context = Mock.Of <IValueCalculationContext>(c => c.GetValue(stat, NodeType.BaseSet, Path) == (NodeValue?)baseSet && c.GetValue(stat, NodeType.BaseAdd, Path) == (NodeValue?)baseAdd); var sut = CreateSut(stat); var actual = sut.Calculate(context); Assert.AreEqual((NodeValue?)expected, actual); }
public void CalculateReturnsCorrectResult(double? @base, double?increase, double?more, double?expected) { var stat = new StatStub(); var context = Mock.Of <IValueCalculationContext>(c => c.GetValue(stat, NodeType.Base, Path) == (NodeValue?)@base && c.GetValue(stat, NodeType.Increase, Path) == (NodeValue?)increase && c.GetValue(stat, NodeType.More, Path) == (NodeValue?)more); var sut = CreateSut(stat); var actual = sut.Calculate(context); Assert.AreEqual((NodeValue?)expected, actual); }
public void ClearClearsUsedCollections() { var stat = new StatStub(); var nodeRepository = Mock.Of <INodeRepository>(r => r.GetFormNodeCollection(stat, Form.Increase, Path) == MockNodeCollection()); var sut = CreateSut(nodeRepository); sut.GetValues(Form.Increase, stat, Path); sut.Clear(); CollectionAssert.IsEmpty(sut.UsedCollections); }
public void RemoveModifierCallsDecoratedGraphFirst() { var stat = new StatStub(); var modifier = MockModifier(stat); var graphMock = new Mock <ICalculationGraph>(); graphMock.Setup(g => g.RemoveModifier(modifier)).Callback(() => SetStats(graphMock)); var sut = CreateSut(graphMock.Object); sut.RemoveModifier(modifier); graphMock.Verify(g => g.RemoveModifier(modifier)); }
public void GetValuesReturnsNodeRepositoryValue(double value) { var expected = new NodeValue(value); var nodeCollection = MockNodeCollection(MockNode(expected)); var stat = new StatStub(); var nodeRepository = Mock.Of <INodeRepository>(r => r.GetFormNodeCollection(stat, Form.Increase, Path) == nodeCollection); var sut = CreateSut(nodeRepository); var actual = sut.GetValues(Form.Increase, stat, Path); CollectionAssert.Contains(actual, expected); }
public void AddModifierRemovesRemovalMarks() { var stat = new StatStub(); var graphMock = MockGraph(); var sut = CreateSut(graphMock.Object); sut.GetOrAdd(stat); sut.AddModifier(MockModifier(stat)); sut.RemoveUnusedNodes(); graphMock.Verify(g => g.Remove(stat), Times.Never); }