/// <summary> /// Verifies the <paramref name="parameter"/> in the <paramref name="expectedValue"/>, /// <paramref name="valueType"/> and that it <paramref name="rendered"/> correctly. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parameter"></param> /// <param name="expectedValue"></param> /// <param name="valueType"></param> /// <param name="rendered"></param> private static void VerifyParameter <T>(IParameter <T> parameter, T expectedValue, Type valueType, string rendered) => parameter.AssertNotNull() .AssertEqual(valueType.AssertNotNull(), x => x.ValueType) .AssertEqual(expectedValue, x => x.Value) .ToString().AssertEqual(rendered);
/// <summary> /// Verifies the <paramref name="parameter"/> in the <paramref name="expectedValue"/> /// and <paramref name="precision"/>, <paramref name="valueType"/> and that it /// <paramref name="rendered"/> correctly. /// </summary> /// <param name="parameter"></param> /// <param name="expectedValue"></param> /// <param name="precision"></param> /// <param name="valueType"></param> /// <param name="rendered"></param> private static void VerifyParameter(IParameter <double> parameter, double expectedValue, int precision, Type valueType, string rendered) => parameter.AssertNotNull() .AssertEqual(valueType.AssertNotNull(), x => x.ValueType) .AssertEqual(expectedValue, precision, x => x.Value) .ToString().AssertEqual(rendered);
public void Each_Parameter_Renders_Correctly(IParameter parameter, Type valueOrItemType, object value, string rendered, long ordinal, int?precision) { const int defaultPrecision = 0; valueOrItemType.AssertNotNull(); value.AssertNotNull(); ordinal.AssertTrue(x => x > 0L); rendered.AssertNotNull().AssertCollectionNotEmpty(); switch (parameter.AssertNotNull().AssertEqual(ordinal, x => x.Ordinal)) { case IParameter <bool> boolParam when value is bool boolValue: VerifyParameter(boolParam, boolValue, valueOrItemType, rendered); break; case IParameter <int> intParam when value is int intValue: VerifyParameter(intParam, intValue, valueOrItemType, rendered); break; case IParameter <long> longParam when value is long longValue: VerifyParameter(longParam, longValue, valueOrItemType, rendered); break; case IParameter <Month> monthParam when value is Month monthValue: VerifyParameter(monthParam, monthValue, valueOrItemType, rendered); break; case IParameter <AnnotatedWeekday> weekdayParam when value is AnnotatedWeekday weekdayValue: VerifyParameter(weekdayParam, weekdayValue, valueOrItemType, rendered); break; case IParameter <double> doubleParam when value is double doubleValue: VerifyParameter(doubleParam, doubleValue, precision.AssertNotNull() ?? defaultPrecision, valueOrItemType, rendered); break; case IRepeatedParameter <bool> boolParam when value is IEnumerable <bool> boolValues: VerifyRepeatedParameter(boolParam, FilterValues(boolValues), valueOrItemType, rendered); break; case IRepeatedParameter <int> intParam when value is IEnumerable <int> intValues: VerifyRepeatedParameter(intParam, FilterValues(intValues), valueOrItemType, rendered); break; case IRepeatedParameter <long> longParam when value is IEnumerable <long> longValues: VerifyRepeatedParameter(longParam, FilterValues(longValues), valueOrItemType, rendered); break; case IRepeatedParameter <Month> monthParam when value is IEnumerable <Month> monthValues: VerifyRepeatedParameter(monthParam, FilterValues(monthValues), valueOrItemType, rendered); break; case IRepeatedParameter <AnnotatedWeekday> weekdayParam when value is IEnumerable <AnnotatedWeekday> weekdayValues: VerifyRepeatedParameter(weekdayParam, FilterValues(weekdayValues), valueOrItemType, rendered); break; case IRepeatedParameter <double> doubleParam when value is IEnumerable <double> doubleValues: VerifyRepeatedParameter(doubleParam, FilterValues(doubleValues), precision.AssertNotNull() ?? defaultPrecision, valueOrItemType, rendered); break; default: string message = null; // Borderline repeating ourselves here, but it is not terrible. string RenderValue(object x) => x is bool ?$"{x}".ToLower() : x is double y ? $"{y:R}" : $"{x}"; if (value is IEnumerable enumerableValue) { var renderedValue = Join(", ", Enumerate(enumerableValue).Select(RenderValue)); message = $"Repeated '{parameter.GetType().FullName}' ({valueOrItemType.FullName}) with" + $" '{nameof(value)}' [{renderedValue}] is an unexpected combination."; } string GetSingleParameterMessage() { return($"Single '{parameter.GetType().FullName}' ({valueOrItemType.FullName}) with" + $" '{nameof(value)}' ({RenderValue(value)}) is an unexpected combination."); } throw new InvalidOperationException(message ?? GetSingleParameterMessage()); } }