Esempio n. 1
0
 public void SetUp()
 {
     _transformableMocks = new[]
     { new Mock <IValueTransformable>(), new Mock <IValueTransformable>(), new Mock <IValueTransformable>() };
     _stat      = new StatStub();
     _nodeType  = NodeType.Base;
     _selectors = new[]
     {
         new NodeSelector(_nodeType, PathDefinition.MainPath),
         new NodeSelector(_nodeType, new PathDefinition(new ModifierSource.Local.Given(), new StatStub())),
         new NodeSelector(_nodeType, new PathDefinition(new ModifierSource.Local.Given())),
     };
     _transformations = Helper.MockMany <IValueTransformation>(4);
     _behaviors       = new[]
     {
         // _behaviors[0]/_transformations[0] affects all _selectors/_transformableMocks
         new Behavior(new[] { _stat }, new[] { _nodeType }, BehaviorPathInteraction.All,
                      _transformations[0]),
         // _behaviors[1]/_transformations[1] affects _selectors/_transformableMocks 0 and 1
         new Behavior(new[] { _stat }, new[] { _nodeType },
                      BehaviorPathInteraction.Main | BehaviorPathInteraction.Conversion,
                      _transformations[1]),
         // _behaviors[2]/_transformations[2] only affects _selectors[1]/_transformableMocks[1]
         new Behavior(new[] { _stat }, new[] { _nodeType }, BehaviorPathInteraction.Conversion,
                      _transformations[2]),
         // _behaviors[3]/_transformations[3] affects _selectors/_transformableMocks 0 and 2
         new Behavior(new[] { _stat }, new[] { _nodeType }, BehaviorPathInteraction.NonConversion,
                      _transformations[3]),
     };
     _sut = new ValueTransformer();
 }
Esempio n. 2
0
 public void SetUp()
 {
     _transformableMocks = new[]
     { new Mock <IValueTransformable>(), new Mock <IValueTransformable>(), new Mock <IValueTransformable>() };
     _stat      = new StatStub();
     _nodeType  = NodeType.Base;
     _selectors = new[]
     {
         new NodeSelector(_nodeType, PathDefinition.MainPath),
         new NodeSelector(_nodeType, new PathDefinition(new ModifierSource.Local.Given(), new StatStub())),
         new NodeSelector(_nodeType, new PathDefinition(new ModifierSource.Local.Given())),
     };
     _transformations = Helper.MockMany <IValueTransformation>(4);
     _behaviors       = new[]
     {
         // _behaviors[0]/_transformations[0] affects all _selectors/_transformableMocks
         new Behavior(new[] { _stat }, new[] { _nodeType },
                      new FunctionalPathRule(_ => true),
                      _transformations[0]),
         // _behaviors[1]/_transformations[1] affects _selectors/_transformableMocks 0 and 1
         new Behavior(new[] { _stat }, new[] { _nodeType },
                      new FunctionalPathRule(p => p.IsMainPath || p.ConversionStats.Any()),
                      _transformations[1]),
         // _behaviors[2]/_transformations[2] only affects _selectors[1]/_transformableMocks[1]
         new Behavior(new[] { _stat }, new[] { _nodeType },
                      new FunctionalPathRule(p => p.ConversionStats.Any()),
                      _transformations[2]),
         // _behaviors[3]/_transformations[3] affects _selectors/_transformableMocks 0 and 2
         new Behavior(new[] { _stat }, new[] { _nodeType },
                      new FunctionalPathRule(p => p.ConversionStats.IsEmpty()),
                      _transformations[3]),
     };
     _sut = new ValueTransformer();
 }
Esempio n. 3
0
        public void Transform_BadData(string input, Type expected)
        {
            // Arrange
            IValueTransformer valueTransformer = new ValueTransformer();

            // Act
            Action result = () => valueTransformer.Transform(input);

            // Assert
            Assert.Throws(expected, result);
        }
Esempio n. 4
0
        public void Transform_RegularData(string input, string expected)
        {
            // Arrange
            IValueTransformer valueTransformer = new ValueTransformer();

            // Act
            var result = valueTransformer.Transform(input);

            // Assert
            Assert.Equal(expected, result);
        }
Esempio n. 5
0
        private static (ICalculationGraph, ICalculationGraphPruner) CreateCalculationGraph(
            TransformableNodeFactory nodeFactory, StatRegistry statRegistry, ValueTransformer valueTransformer,
            IEventBuffer eventBuffer)
        {
            var coreGraph = new CoreCalculationGraph(
                s => CreateStatGraph(nodeFactory, valueTransformer, eventBuffer, s), nodeFactory);
            var eventGraph = new CalculationGraphWithEvents(coreGraph);

            var defaultPruningRuleSet            = new DefaultPruningRuleSet(statRegistry);
            var defaultPruner                    = new CalculationGraphPruner(eventGraph, defaultPruningRuleSet);
            var userSpecifiedValuePruningRuleSet =
                new UserSpecifiedValuePruningRuleSet(defaultPruningRuleSet, statRegistry);
            var userSpecifiedValuePruner =
                new CalculationGraphPruner(eventGraph, userSpecifiedValuePruningRuleSet);
            var pruner = new CompositeCalculationGraphPruner(defaultPruner, userSpecifiedValuePruner);

            eventGraph.StatAdded       += StatAdded;
            eventGraph.StatRemoved     += StatRemoved;
            eventGraph.ModifierAdded   += ModifierAdded;
            eventGraph.ModifierRemoved += ModifierRemoved;
            return(eventGraph, pruner);

            void StatAdded(IStat stat)
            {
                statRegistry.Add(stat);
                valueTransformer.AddBehaviors(stat.Behaviors);
                defaultPruner.StatAdded(stat);
                userSpecifiedValuePruner.StatAdded(stat);
            }

            void StatRemoved(IStat stat)
            {
                statRegistry.Remove(stat);
                valueTransformer.RemoveBehaviors(stat.Behaviors);
                defaultPruner.StatRemoved(stat);
                userSpecifiedValuePruner.StatRemoved(stat);
            }

            void ModifierAdded(Modifier modifier)
            {
                defaultPruner.ModifierAdded(modifier);
                userSpecifiedValuePruner.ModifierAdded(modifier);
            }

            void ModifierRemoved(Modifier modifier)
            {
                defaultPruner.ModifierRemoved(modifier);
                userSpecifiedValuePruner.ModifierRemoved(modifier);
            }
        }
Esempio n. 6
0
        private LinkedList <NetMeterProperty> ReplaceValues(PropertyIterator iter, ValueTransformer transform)
        {
            LinkedList <NetMeterProperty> props = new LinkedList <NetMeterProperty>();

            while (iter.hasNext())
            {
                NetMeterProperty val = iter.next();
                if (log.IsDebugEnabled)
                {
                    log.Debug("About to replace in property of type: " + val.GetType() + ": " + val);
                }
                if (typeof(StringProperty).IsAssignableFrom(val.GetType()))
                {
                    // Must not convert TestElement.gui_class etc
                    if (!val.getName().Equals(TestElement.GUI_CLASS) &&
                        !val.getName().Equals(TestElement.TEST_CLASS))
                    {
                        val = transform.transformValue(val);
                        if (log.IsDebugEnabled)
                        {
                            log.Debug("Replacement result: " + val);
                        }
                    }
                }
                else if (typeof(MultiProperty).IsAssignableFrom(val.GetType()))
                {
                    MultiProperty multiVal = (MultiProperty)val;
                    LinkedList <NetMeterProperty> newValues = ReplaceValues(multiVal.iterator(), transform);
                    multiVal.Clear();
                    foreach (NetMeterProperty jmp in newValues)
                    {
                        multiVal.addProperty(jmp);
                    }
                    if (log.IsDebugEnabled)
                    {
                        log.Debug("Replacement result: " + multiVal);
                    }
                }
                else
                {
                    if (log.IsDebugEnabled)
                    {
                        log.Debug("Won't replace " + val);
                    }
                }
                props.AddLast(val);
            }
            return(props);
        }
Esempio n. 7
0
        /// <summary>
        /// Creates an <see cref="ICalculator"/>.
        /// </summary>
        public static ICalculator Create()
        {
            var eventBuffer            = new EventBuffer();
            var innerNodeFactory       = new NodeFactory(eventBuffer);
            var nodeFactory            = new TransformableNodeFactory(innerNodeFactory, v => new TransformableValue(v));
            var statRegistryCollection = new NodeCollection <IStat>(eventBuffer);
            var statRegistry           = new StatRegistry(statRegistryCollection);
            var valueTransformer       = new ValueTransformer();

            var(graph, pruner) = CreateCalculationGraph(nodeFactory, statRegistry, valueTransformer, eventBuffer);

            var defaultView   = new DefaultViewNodeRepository(graph);
            var bufferingView = new BufferingViewNodeRepository(graph);

            innerNodeFactory.NodeRepository = defaultView;
            statRegistry.NodeRepository     = bufferingView;

            return(new Calculator(eventBuffer, graph, pruner, bufferingView, statRegistryCollection));
        }
Esempio n. 8
0
        private static IStatGraph CreateStatGraph(
            TransformableNodeFactory nodeFactory, ValueTransformer valueTransformer, IStat stat)
        {
            var paths = new PathDefinitionCollection(SuspendableEventViewProvider.Create(
                                                         new ObservableCollection <PathDefinition>(), new SuspendableObservableCollection <PathDefinition>()));
            var coreGraph = new CoreStatGraph(new StatNodeFactory(nodeFactory, stat), paths);

            return(new StatGraphWithEvents(coreGraph, NodeAdded, NodeRemoved));

            void NodeAdded(NodeSelector selector)
            {
                var node          = coreGraph.Nodes[selector];
                var transformable = nodeFactory.TransformableDictionary[node];

                valueTransformer.AddTransformable(stat, selector, transformable);
            }

            void NodeRemoved(NodeSelector selector) => valueTransformer.RemoveTransformable(stat, selector);
        }
Esempio n. 9
0
        private static PrunableCalculationGraph CreateCalculationGraph(
            TransformableNodeFactory nodeFactory, StatRegistry statRegistry, ValueTransformer valueTransformer)
        {
            var coreGraph =
                new CoreCalculationGraph(s => CreateStatGraph(nodeFactory, valueTransformer, s), nodeFactory);
            var eventGraph = new CalculationGraphWithEvents(coreGraph, StatAdded, StatRemoved);

            return(new PrunableCalculationGraph(eventGraph, statRegistry));

            void StatAdded(IStat stat)
            {
                statRegistry.Add(stat);
                valueTransformer.AddBehaviors(stat.Behaviors);
            }

            void StatRemoved(IStat stat)
            {
                statRegistry.Remove(stat);
                valueTransformer.RemoveBehaviors(stat.Behaviors);
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Creates an <see cref="ICalculator"/>.
        /// </summary>
        public static ICalculator CreateCalculator()
        {
            var innerNodeFactory       = new NodeFactory();
            var nodeFactory            = new TransformableNodeFactory(innerNodeFactory, v => new TransformableValue(v));
            var statRegistryCollection = new NodeCollection <IStat>();
            var statRegistry           = new StatRegistry(statRegistryCollection);
            var valueTransformer       = new ValueTransformer();

            var prunableGraph = CreateCalculationGraph(nodeFactory, statRegistry, valueTransformer);

            var defaultView     = new DefaultViewNodeRepository(prunableGraph);
            var suspendableView = new SuspendableViewNodeRepository(prunableGraph);

            innerNodeFactory.NodeRepository = defaultView;
            statRegistry.NodeRepository     = suspendableView;

            var suspender = new SuspendableEventsComposite();

            suspender.Add(new StatGraphCollectionSuspender(prunableGraph));
            suspender.Add(statRegistryCollection);

            return(new Calculator(suspender, prunableGraph, prunableGraph, suspendableView, statRegistryCollection));
        }
Esempio n. 11
0
 private LinkedList<NetMeterProperty> ReplaceValues(PropertyIterator iter, ValueTransformer transform)
 {
     LinkedList<NetMeterProperty> props = new LinkedList<NetMeterProperty>();
     while (iter.hasNext()) {
         NetMeterProperty val = iter.next();
         if (log.IsDebugEnabled)
         {
             log.Debug("About to replace in property of type: " + val.GetType() + ": " + val);
         }
         if (typeof(StringProperty).IsAssignableFrom(val.GetType()))
         {
             // Must not convert TestElement.gui_class etc
             if (!val.getName().Equals(TestElement.GUI_CLASS) &&
                     !val.getName().Equals(TestElement.TEST_CLASS))
             {
                 val = transform.transformValue(val);
                 if (log.IsDebugEnabled)
                 {
                     log.Debug("Replacement result: " + val);
                 }
             }
         }
         else if (typeof(MultiProperty).IsAssignableFrom(val.GetType()))
         {
             MultiProperty multiVal = (MultiProperty) val;
             LinkedList<NetMeterProperty> newValues = ReplaceValues(multiVal.iterator(), transform);
             multiVal.Clear();
             foreach (NetMeterProperty jmp in newValues)
             {
                 multiVal.addProperty(jmp);
             }
             if (log.IsDebugEnabled)
             {
                 log.Debug("Replacement result: " + multiVal);
             }
         }
         else
         {
             if (log.IsDebugEnabled)
             {
                 log.Debug("Won't replace " + val);
             }
         }
         props.AddLast(val);
     }
     return props;
 }