diff --git a/Fluid.Tests/MiscFiltersTests.cs b/Fluid.Tests/MiscFiltersTests.cs index 75fcf97b..46493151 100644 --- a/Fluid.Tests/MiscFiltersTests.cs +++ b/Fluid.Tests/MiscFiltersTests.cs @@ -26,18 +26,29 @@ public async Task DefaultReturnsValueIfDefined() Assert.Equal("foo", result.ToStringValue()); } - [Fact] - public async Task DefaultReturnsDefaultIfNotDefinedOrEmptyOrFalse() - { - foreach (var value in new FluidValue[] { NilValue.Instance, new StringValue(""), BooleanValue.False, ArrayValue.Empty }) - { - var arguments = new FilterArguments().Add(new StringValue("bar")); - var context = new TemplateContext(); + [Theory] + [InlineData("foo", "foo", "bar", false)] + [InlineData("bar", null, "bar", false)] + [InlineData("bar", false, "bar", false)] + [InlineData("bar", new int[0], "bar", false)] + [InlineData("bar", "", "bar", false)] + [InlineData("bar", "empty", "bar", false)] + [InlineData("foo", "foo", "bar", true)] + [InlineData("bar", null, "bar", true)] + [InlineData("bar", "", "bar", true)] + [InlineData(false, false, "bar", true)] + [InlineData("bar", new int[0], "bar", true)] + [InlineData("bar", "empty", "bar", true)] + public async Task DefaultReturnsDefaultIfNotDefinedOrEmptyOrFalse(object expected, object input, object @default, bool allowFalse) + { + var arguments = new FilterArguments() + .Add("default", FluidValue.Create(@default, TemplateOptions.Default)) + .Add("allow_false", FluidValue.Create(allowFalse, TemplateOptions.Default)); - var result = await MiscFilters.Default(value, arguments, context); + var context = new TemplateContext(); + var result = await MiscFilters.Default("empty" == input as string ? EmptyValue.Instance : FluidValue.Create(input, TemplateOptions.Default), arguments, context); - Assert.Equal("bar", result.ToStringValue()); - } + Assert.Equal(expected, result.ToObjectValue()); } [Fact] diff --git a/Fluid/Filters/MiscFilters.cs b/Fluid/Filters/MiscFilters.cs index 434e15ad..5853023f 100644 --- a/Fluid/Filters/MiscFilters.cs +++ b/Fluid/Filters/MiscFilters.cs @@ -105,9 +105,21 @@ public static ValueTask Handleize(FluidValue input, FilterArguments public static ValueTask Default(FluidValue input, FilterArguments arguments, TemplateContext context) { - if (input.IsNil() || input == BooleanValue.False || EmptyValue.Instance.Equals(input)) + var falseCheck = arguments.HasNamed("allow_false") && arguments["allow_false"] == BooleanValue.True; + + if (falseCheck) + { + if (input.IsNil() || EmptyValue.Instance.Equals(input)) + { + return arguments.At(0); + } + } + else { - return arguments.At(0); + if (input.IsNil() || input == BooleanValue.False || EmptyValue.Instance.Equals(input)) + { + return arguments.At(0); + } } return input;