示例#1
0
        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);
        }
示例#2
0
        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));
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#8
0
        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);
        }
示例#10
0
        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));
        }
示例#12
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#17
0
        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);
        }
示例#18
0
        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);
        }
示例#19
0
        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));
        }
示例#21
0
        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);
        }
示例#22
0
        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);
        }
示例#24
0
        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);
        }
示例#25
0
        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);
        }
示例#26
0
        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);
        }
示例#27
0
        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);
        }
示例#28
0
        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));
        }
示例#29
0
        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);
        }
示例#30
0
        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);
        }