From 3aff34089683825026a85811c9dc018948d3f753 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sun, 25 Jan 2026 03:55:50 +0300 Subject: [PATCH 1/2] Add Random Filter --- Fluid.Tests/NumberFiltersTests.cs | 17 +++++++++++++++++ Fluid/Filters/NumberFilters.cs | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/Fluid.Tests/NumberFiltersTests.cs b/Fluid.Tests/NumberFiltersTests.cs index 66686ef7..d1e1178f 100644 --- a/Fluid.Tests/NumberFiltersTests.cs +++ b/Fluid.Tests/NumberFiltersTests.cs @@ -247,5 +247,22 @@ public void TimesMaintainsScale() Assert.Equal(6, result.Result.ToNumberValue()); Assert.Equal("6.0", result.Result.ToStringValue()); } + + [Theory] + [InlineData(1, 10)] + [InlineData(-10, -1)] + [InlineData(1.5, 10.5)] + [InlineData(-10.5, -1.5)] + 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); + } } } diff --git a/Fluid/Filters/NumberFilters.cs b/Fluid/Filters/NumberFilters.cs index a4040ba4..8216b14d 100644 --- a/Fluid/Filters/NumberFilters.cs +++ b/Fluid/Filters/NumberFilters.cs @@ -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; } @@ -158,5 +159,18 @@ public static ValueTask Times(FluidValue input, FilterArguments argu return NumberValue.Create(input.ToNumberValue() * first.ToNumberValue()); } + + public static ValueTask 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); + } } } From 41c0fb5e807a648a668c7f4c96709f164ad3aee6 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 26 Mar 2026 00:27:18 +0300 Subject: [PATCH 2/2] Add unit test --- Fluid.Tests/NumberFiltersTests.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Fluid.Tests/NumberFiltersTests.cs b/Fluid.Tests/NumberFiltersTests.cs index d1e1178f..d9c14b92 100644 --- a/Fluid.Tests/NumberFiltersTests.cs +++ b/Fluid.Tests/NumberFiltersTests.cs @@ -1,6 +1,7 @@ using Fluid.Values; using Fluid.Filters; using Xunit; +using System; namespace Fluid.Tests { @@ -251,8 +252,6 @@ public void TimesMaintainsScale() [Theory] [InlineData(1, 10)] [InlineData(-10, -1)] - [InlineData(1.5, 10.5)] - [InlineData(-10.5, -1.5)] public void Random(decimal min, decimal max) { var input = NumberValue.Create(0); @@ -264,5 +263,20 @@ public void Random(decimal min, decimal max) 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(() => NumberFilters.Random(input, arguments, context)); + + Assert.Equal("'minValue' cannot be greater than maxValue. (Parameter 'minValue')", exception.Message); + } } }