示例#1
0
        private int FindConstraint(string axis, IValueComparer valueComparer, string dataTypeName, string value)
        {
            var constraint = _constraints.FirstOrDefault(item =>
                                                         item.Axis.Equals(axis, StringComparison.InvariantCultureIgnoreCase)
                                                         &&
                                                         valueComparer.IsSatisfiedBy(dataTypeName, item.Value, item.Comparison, value)
                                                         );

            if (constraint == null)
            {
                throw new InvalidOperationException(
                          $"There is no {axis.ToLower()} constraint in matrix '{Name}' where argument '{RowArgumentId}' is satisfied by '{value}'.");
            }

            return(constraint.Index);
        }
示例#2
0
        public IActionResult Run(Guid id)
        {
            using (_databaseContextFactory.Create())
            {
                var test = _testRepository.Get(id);

                var executionContext = _executionService.Execute(test.FormulaId, test.ArgumentValues(), new ContextLogger(ContextLogLevel.Verbose));
                var result           = executionContext.GetResult();

                return(Ok(new
                {
                    Passed = _valueComparer.IsSatisfiedBy(test.ExpectedResultDataTypeName, test.ExpectedResult, "==", result.ToString(CultureInfo.InvariantCulture)),
                    Exception = executionContext.Exception.AllMessages(),
                    Result = result,
                    LogLines = executionContext.Logger.Lines,
                    Results = executionContext.GetResults()
                }));
            }
        }
        private FormulaContext Execute(ExecutionContext executionContext, Guid formulaId, IContextLogger logger)
        {
            var formula = GetFormula(formulaId);

            executionContext.CyclicInvariant(formula.Name);

            using (var formulaContext = executionContext.FormulaContext(formula.Name))
            {
                foreach (var constraint in formula.Constraints)
                {
                    var argument      = GetArgument(constraint.ArgumentId);
                    var argumentValue = executionContext.GetArgumentValue(constraint.ArgumentId);

                    if (!_valueComparer.IsSatisfiedBy(argument.DataType, argumentValue, constraint.Comparison,
                                                      constraint.Value))
                    {
                        if (logger.LogLevel == ContextLogLevel.Verbose)
                        {
                            logger.LogVerbose($"[disqualified] {argument.Name} is '{argumentValue}' and should {constraint.Comparison} '{constraint.Value}'");
                        }

                        return(formulaContext.Disqualified(
                                   argument,
                                   argumentValue,
                                   constraint.Comparison,
                                   constraint.Value));
                    }
                }

                foreach (var operation in formula.Operations)
                {
                    decimal value = 0;

                    switch (operation.ValueProviderName.ToLower())
                    {
                    case "decimal":
                    {
                        value = Convert.ToDecimal(operation.InputParameter);

                        break;
                    }

                    case "argument":
                    {
                        value = Convert.ToDecimal(executionContext.GetArgumentValue(new Guid(operation.InputParameter)));

                        break;
                    }

                    case "matrix":
                    {
                        var matrix = GetMatrix(new Guid(operation.InputParameter));

                        value =
                            Convert.ToDecimal(matrix.GetValue(_valueComparer, executionContext,
                                                              GetArgument(matrix.RowArgumentId),
                                                              matrix.ColumnArgumentId.HasValue ? GetArgument(matrix.ColumnArgumentId.Value) : null));

                        break;
                    }

                    case "formula":
                    {
                        value = Execute(executionContext, new Guid(operation.InputParameter), logger).Result;

                        break;
                    }

                    case "result":
                    {
                        value = formulaContext.Result;

                        break;
                    }
                    }

                    if (logger.LogLevel == ContextLogLevel.Verbose)
                    {
                        logger.LogVerbose($"[operation] {formulaContext.Result} {operation.GetOperator()} {value}");
                    }

                    operation.Perform(formulaContext, value);
                }

                return(formulaContext);
            }
        }