Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Fluid.Tests/NumberFiltersTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Fluid.Values;
using Fluid.Filters;
using Xunit;
using System;

namespace Fluid.Tests
{
Expand Down Expand Up @@ -247,5 +248,35 @@ public void TimesMaintainsScale()
Assert.Equal(6, result.Result.ToNumberValue());
Assert.Equal("6.0", result.Result.ToStringValue());
}

[Theory]
[InlineData(1, 10)]
[InlineData(-10, -1)]
public void Random(decimal min, decimal max)
{
var input = NumberValue.Create(0);

var arguments = new FilterArguments([NumberValue.Create(min), NumberValue.Create(max)]);
var context = new TemplateContext();

var result = NumberFilters.Random(input, arguments, context);

Assert.InRange(result.Result.ToNumberValue(), min, max);
}

[Theory]
[InlineData(10, 1)]
[InlineData(-1, -10)]
public void Random_ThrowsException_IfMinimumIsGreaterThanMaximum(decimal min, decimal max)
{
var input = NumberValue.Create(0);

var arguments = new FilterArguments([NumberValue.Create(min), NumberValue.Create(max)]);
var context = new TemplateContext();

var exception = Assert.Throws<ArgumentOutOfRangeException>(() => NumberFilters.Random(input, arguments, context));

Assert.Equal("'minValue' cannot be greater than maxValue. (Parameter 'minValue')", exception.Message);
}
}
}
14 changes: 14 additions & 0 deletions Fluid/Filters/NumberFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public static FilterCollection WithNumberFilters(this FilterCollection filters)
filters.AddFilter("plus", Plus);
filters.AddFilter("round", Round);
filters.AddFilter("times", Times);
filters.AddFilter("random", Random);

return filters;
}
Expand Down Expand Up @@ -158,5 +159,18 @@ public static ValueTask<FluidValue> Times(FluidValue input, FilterArguments argu

return NumberValue.Create(input.ToNumberValue() * first.ToNumberValue());
}

public static ValueTask<FluidValue> Random(FluidValue input, FilterArguments arguments, TemplateContext context)
{
LiquidException.ThrowFilterArgumentsCount("random", expected: 2, arguments);

var min = arguments.At(0).ToNumberValue();
var max = arguments.At(1).ToNumberValue();

var random = new Random();
var value = random.Next((int)min, (int)max + 1);

return NumberValue.Create(value);
}
}
}