Skip to content
Merged
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
20 changes: 10 additions & 10 deletions Fluid.Tests/ColorFiltersTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Fluid.Filters;
using Fluid.Tests.Extensions;
using Fluid.Values;
using System.Globalization;
using System.Linq;
using Xunit;

namespace Fluid.Tests
Expand Down Expand Up @@ -188,7 +188,7 @@ public void ColorExtract(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorExtract(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorExtract(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand Down Expand Up @@ -246,7 +246,7 @@ public void ColorModify(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorModify(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorModify(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand Down Expand Up @@ -304,7 +304,7 @@ public void ColorSaturate(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorSaturate(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorSaturate(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand All @@ -321,7 +321,7 @@ public void ColorDesaturate(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorDesaturate(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorDesaturate(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand All @@ -338,7 +338,7 @@ public void ColorLighten(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorLighten(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorLighten(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand All @@ -355,7 +355,7 @@ public void ColorDarken(string color, object[] arguments, string expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.ColorDarken(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.ColorDarken(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToStringValue());
Expand All @@ -372,7 +372,7 @@ public void ColorDifference(string color, object[] arguments, decimal expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.GetColorDifference(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.GetColorDifference(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToNumberValue());
Expand All @@ -389,7 +389,7 @@ public void BrightnessDifference(string color, object[] arguments, decimal expec
var context = new TemplateContext();

// Act
var result = ColorFilters.GetColorBrightnessDifference(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.GetColorBrightnessDifference(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToNumberValue());
Expand All @@ -406,7 +406,7 @@ public void ColorContrast(string color, object[] arguments, decimal expected)
var context = new TemplateContext();

// Act
var result = ColorFilters.GetColorContrast(input, new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), context);
var result = ColorFilters.GetColorContrast(input, arguments.ToFilterArguments(), context);

// Assert
Assert.Equal(expected, result.Result.ToNumberValue());
Expand Down
13 changes: 13 additions & 0 deletions Fluid.Tests/Extensions/ConversionExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Fluid.Values;
using System.Linq;

namespace Fluid.Tests.Extensions
{
internal static class ConversionExtensions
{
public static FilterArguments ToFilterArguments(this object[] arguments)
{
return new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray());
}
}
}
8 changes: 4 additions & 4 deletions Fluid.Tests/Integration/StandardFilterTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Fluid.Filters;
using Fluid.Tests.Extensions;
using Fluid.Values;
using System;
using System.Linq;
using System.Threading.Tasks;
using Xunit;

Expand Down Expand Up @@ -50,15 +50,15 @@ public void TestUpcase(string expected, object input)
[InlineData("oob", "foobar", "1", "3")]
public void TestSlice(string expected, object input, params object[] arguments)
{
Assert.Equal(expected, StringFilters.Slice(FluidValue.Create(input, TemplateOptions.Default), new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), new TemplateContext()).Result.ToObjectValue());
Assert.Equal(expected, StringFilters.Slice(FluidValue.Create(input, TemplateOptions.Default), arguments.ToFilterArguments(), new TemplateContext()).Result.ToObjectValue());
}

[Theory]
[InlineData("foobar", null, null)]
[InlineData("foobar", 0, "")]
public void TestSliceArgument(object input, params object[] arguments)
{
Assert.Throws<ArgumentException>(() => StringFilters.Slice(FluidValue.Create(input, TemplateOptions.Default), new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), new TemplateContext()).Result.ToObjectValue());
Assert.Throws<ArgumentException>(() => StringFilters.Slice(FluidValue.Create(input, TemplateOptions.Default), arguments.ToFilterArguments(), new TemplateContext()).Result.ToObjectValue());
}

[Theory]
Expand All @@ -76,7 +76,7 @@ public void TestSliceOnArrays(string expected, params object[] arguments)
{
var foobar = new object [] { 'f', 'o', 'o', 'b', 'a', 'r' };

var result = StringFilters.Slice(FluidValue.Create(foobar, TemplateOptions.Default), new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray()), new TemplateContext());
var result = StringFilters.Slice(FluidValue.Create(foobar, TemplateOptions.Default), arguments.ToFilterArguments(), new TemplateContext());
Assert.IsType<ArrayValue>(result.Result);

string resultString = "";
Expand Down
101 changes: 72 additions & 29 deletions Fluid.Tests/StringFiltersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Fluid.Values;
using Fluid.Filters;
using Xunit;
using Fluid.Tests.Extensions;

namespace Fluid.Tests
{
Expand Down Expand Up @@ -126,30 +127,32 @@ public void Prepend()
Assert.Equal("Hello World", result.Result.ToStringValue());
}

[Fact]
public void RemoveFirst()
[Theory]
[InlineData("a b a a", new object[] { "a " }, "b a a")]
[InlineData("1 1 1 1", new object[] { 1 }, " 1 1 1")]
public void RemoveFirst(string input, object[] arguments, string expected)
{
var input = new StringValue("abcabc");

var arguments = new FilterArguments().Add(new StringValue("b"));
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.RemoveFirst(input, arguments, context);
var result = StringFilters.RemoveFirst(filterInput, filterArguments, context);

Assert.Equal("acabc", result.Result.ToStringValue());
Assert.Equal(expected, result.Result.ToStringValue());
}

[Fact]
public void Remove()
[Theory]
[InlineData("a a a a", new object[] { "a" }, " ")]
[InlineData("1 1 1 1", new object[] { 1 }, " ")]
public void Remove(string input, object[] arguments, string expected)
{
var input = new StringValue("abcabc");

var arguments = new FilterArguments().Add(new StringValue("b"));
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.Remove(input, arguments, context);
var result = StringFilters.Remove(filterInput, filterArguments, context);

Assert.Equal("acac", result.Result.ToStringValue());
Assert.Equal(expected, result.Result.ToStringValue());
}

[Fact]
Expand All @@ -161,36 +164,76 @@ public void RemovesReturnsInputWhenArgumentIsEmpty()
var context = new TemplateContext();

var result = StringFilters.Remove(input, arguments, context);

Assert.Equal("abcabc", result.Result.ToStringValue());
}

[Fact]
public void ReplaceFirst()
[Theory]
[InlineData("a a b a", new object[] { " a" }, "a a b")]
[InlineData("1 1 1 1", new object[] { 1 }, "1 1 1 ")]
public void RemoveLast(string input, object[] arguments, string expected)
{
var input = new StringValue("abcabc");

var arguments = new FilterArguments().Add(new StringValue("b")).Add(new StringValue("B"));
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.ReplaceFirst(input, arguments, context);
var result = StringFilters.RemoveLast(filterInput, filterArguments, context);

Assert.Equal("aBcabc", result.Result.ToStringValue());
Assert.Equal(expected, result.Result.ToStringValue());
}

[Fact]
public void Replace()
[Theory]
[InlineData("a a a a", new object[] { "a", "b" }, "b a a a")]
[InlineData("1 1 1 1", new object[] { 1, 2 }, "2 1 1 1")]
[InlineData("1 1 1 1", new object[] { 2, 3 }, "1 1 1 1")]
[InlineData("1 1 1 1", new object[] { "1", 2 }, "2 1 1 1")]
[InlineData("aa bb cc aa bb cc", new object[] { "cc", "dd" }, "aa bb dd aa bb cc")]
public void ReplaceFirst(string input, object[] arguments, string expected)
{
var input = new StringValue("abcabc");
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var arguments = new FilterArguments().Add(new StringValue("b")).Add(new StringValue("B"));
var result = StringFilters.ReplaceFirst(filterInput, filterArguments, context);

Assert.Equal(expected, result.Result.ToStringValue());
}

[Theory]
[InlineData("a a a a", new object[] { "a", "b" }, "b b b b")]
[InlineData("1 1 1 1", new object[] { 1, 2 }, "2 2 2 2")]
[InlineData("1 1 1 1", new object[] { 2, 3 }, "1 1 1 1")]
[InlineData("1 1 1 1", new object[] { "1", 2 }, "2 2 2 2")]
[InlineData("aa bb cc aa bb cc", new object[] { "cc", "dd" }, "aa bb dd aa bb dd")]
public void Replace(string input, object[] arguments, string expected)
{
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.Replace(input, arguments, context);
var result = StringFilters.Replace(filterInput, filterArguments, context);

Assert.Equal("aBcaBc", result.Result.ToStringValue());
Assert.Equal(expected, result.Result.ToStringValue());
}

[Theory]
[InlineData("a a a a", new object[] { "a", "b" }, "a a a b")]
[InlineData("1 1 1 1", new object[] { 1, 2 }, "1 1 1 2")]
[InlineData("1 1 1 1", new object[] { 2, 3 }, "1 1 1 1")]
[InlineData("1 1 1 1", new object[] { "1", 2 }, "1 1 1 2")]
[InlineData("aa bb cc aa bb cc", new object[] { "cc", "dd" }, "aa bb cc aa bb dd")]
public void ReplaceLast(string input, object[] arguments, string expected)
{
var filterInput = new StringValue(input);
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.ReplaceLast(filterInput, filterArguments, context);

Assert.Equal(expected, result.Result.ToStringValue());
}

[Theory]
[InlineData("hello", new object[] { 0 }, "h")]
[InlineData("hello", new object[] { 1 }, "e")]
[InlineData("hello", new object[] { 1, 3 }, "ell")]
Expand All @@ -200,7 +243,7 @@ public void Replace()
public void Slice(object input, object[] arguments, string expected)
{
var filterInput = FluidValue.Create(input, TemplateOptions.Default);
var filterArguments = new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray());
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.Slice(filterInput, filterArguments, context);
Expand All @@ -222,7 +265,7 @@ public void Slice(object input, object[] arguments, string expected)
public void SliceOutsideBounds(object input, object[] arguments, string expected)
{
var filterInput = FluidValue.Create(input, TemplateOptions.Default);
var filterArguments = new FilterArguments(arguments.Select(x => FluidValue.Create(x, TemplateOptions.Default)).ToArray());
var filterArguments = arguments.ToFilterArguments();
var context = new TemplateContext();

var result = StringFilters.Slice(filterInput, filterArguments, context);
Expand Down
32 changes: 32 additions & 0 deletions Fluid/Filters/StringFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ public static FilterCollection WithStringFilters(this FilterCollection filters)
filters.AddFilter("prepend", Prepend);
filters.AddFilter("remove_first", RemoveFirst);
filters.AddFilter("remove", Remove);
filters.AddFilter("remove_last", RemoveLast);
filters.AddFilter("replace_first", ReplaceFirst);
filters.AddFilter("replace", Replace);
filters.AddFilter("replace_last", ReplaceLast);
filters.AddFilter("slice", Slice);
filters.AddFilter("split", Split);
filters.AddFilter("strip", Strip);
Expand Down Expand Up @@ -108,6 +110,21 @@ public static ValueTask<FluidValue> Remove(FluidValue input, FilterArguments arg
return new StringValue(input.ToStringValue().Replace(argument, ""));
}

public static ValueTask<FluidValue> RemoveLast(FluidValue input, FilterArguments arguments, TemplateContext context)
{
var remove = arguments.At(0).ToStringValue();
var value = input.ToStringValue();

var index = value.LastIndexOf(remove);

if (index != -1)
{
return new StringValue(value.Remove(index, remove.Length));
}

return input;
}

public static ValueTask<FluidValue> ReplaceFirst(FluidValue input, FilterArguments arguments, TemplateContext context)
{
string remove = arguments.At(0).ToStringValue();
Expand All @@ -128,6 +145,21 @@ public static ValueTask<FluidValue> Replace(FluidValue input, FilterArguments ar
return new StringValue(input.ToStringValue().Replace(arguments.At(0).ToStringValue(), arguments.At(1).ToStringValue()));
}

public static ValueTask<FluidValue> ReplaceLast(FluidValue input, FilterArguments arguments, TemplateContext context)
{
var remove = arguments.At(0).ToStringValue();
var value = input.ToStringValue();

var index = value.LastIndexOf(remove);

if (index != -1)
{
return new StringValue(value.Substring(0, index) + arguments.At(1).ToStringValue() + value.Substring(index + remove.Length));
}

return input;
}

public static ValueTask<FluidValue> Slice(FluidValue input, FilterArguments arguments, TemplateContext context)
{
var firstArgument = arguments.At(0);
Expand Down