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); }
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); } }