static ParameterInteraction CreateInteraction(Model <T> model, Expression expression, IList <ParameterBase> parameters, ParameterExpression parameterExpr) { Func <T, bool> filter = expression is Expression <Func <T, bool> >? ((Expression <Func <T, bool> >)expression).Compile() : Expression.Lambda <Func <T, bool> >(expression, parameterExpr).Compile(); var parameterIndices = (from parameter in parameters select model.Parameters.IndexOf(parameter)).ToList(); parameterIndices.Sort(); ParameterInteraction interaction = new ParameterInteraction(parameterIndices); List <int[]> valueTable = ParameterInteractionTable <T> .GenerateValueTable(model.Parameters, interaction); foreach (var valueIndices in valueTable) { ValueCombinationState comboState = filter(BuildVariation(model, parameterIndices, valueIndices)) ? ValueCombinationState.Covered : ValueCombinationState.Excluded; interaction.Combinations.Add(new ValueCombination(valueIndices, interaction) { State = comboState }); } return(interaction); }
// helper to implement Constraint.GetExcludeCombinations internal static ParameterInteraction GetExcludedCombinations <T>(Model model, Constraint constraint, Parameter first, Parameter second, T value, Func <T, T, bool> comparison) { Debug.Assert(first != null && model != null && constraint != null && comparison != null); List <int> parameterIndices = new List <int>(); parameterIndices.Add(model.Parameters.IndexOf(first)); if (second != null) { parameterIndices.Add(model.Parameters.IndexOf(second)); } parameterIndices.Sort(); ParameterInteraction interaction = new ParameterInteraction(parameterIndices); List <int[]> valueTable = ParameterInteractionTable.GenerateValueTable(model.Parameters, interaction); foreach (var valueIndices in valueTable) { T value1, value2; value1 = (T)first[valueIndices[0]]; if (second == null) { value2 = value; } else { value2 = (T)second[valueIndices[1]]; } ValueCombinationState comboState = comparison(value1, value2) ? ValueCombinationState.Covered : ValueCombinationState.Excluded; interaction.Combinations.Add(new ValueCombination(valueIndices, interaction) { State = comboState }); } return(interaction); }