Skip to content

Commit 5194ce8

Browse files
authored
Replace JsonWriterOptions with JsonSerializationOptions (#847)
1 parent 87c37c4 commit 5194ce8

20 files changed

+257
-287
lines changed

Fluid.Tests/Domain/Person.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public class Address
1616

1717
public enum Colors
1818
{
19-
Blue,
20-
Red,
21-
Yellow
19+
Blue = 0,
20+
Red = 1,
21+
Yellow = 2
2222
}
2323
}

Fluid.Tests/FunctionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public async Task FunctionCallsAreInvoked()
3535
Assert.True(template != null, error);
3636
var context = new TemplateContext();
3737
context.SetValue("a", new FunctionValue((args, c) => new StringValue("hello")));
38-
context.SetValue("b", new FunctionValue((args, c) => new ValueTask<FluidValue>(new StringValue("world"))));
38+
context.SetValue("b", new FunctionValue((args, c) => new StringValue("world")));
3939

4040
// Use a loop to exercise the arguments cache
4141
for (var i = 0; i < 10; i++)

Fluid.Tests/MiscFiltersTests.cs

Lines changed: 22 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using Fluid.Filters;
2+
using Fluid.Tests.Domain;
23
using Fluid.Values;
34
using Newtonsoft.Json.Linq;
45
using System;
56
using System.Globalization;
67
using System.Linq;
78
using System.Text.Encodings.Web;
89
using System.Text.Json;
10+
using System.Text.Json.Serialization;
911
using System.Threading.Tasks;
1012
using TimeZoneConverter;
1113
using Xunit;
@@ -693,59 +695,6 @@ public async Task Json(object value, string expected)
693695
Assert.Equal(expected, result.ToStringValue());
694696
}
695697

696-
[Fact]
697-
public async Task JsonShouldHideMembers()
698-
{
699-
var inputObject = new JsonAccessStrategy();
700-
var templateOptions = new TemplateOptions();
701-
templateOptions.MemberAccessStrategy.Register<JsonAccessStrategy, FluidValue>((obj, name, context) =>
702-
{
703-
return name switch
704-
{
705-
nameof(JsonAccessStrategy.Visible) => new StringValue(obj.Visible),
706-
nameof(JsonAccessStrategy.Null) => new StringValue(obj.Null),
707-
_ => NilValue.Instance
708-
};
709-
});
710-
711-
var input = FluidValue.Create(inputObject, templateOptions);
712-
var expected = "{\"Visible\":\"Visible\",\"Null\":\"\"}";
713-
714-
var arguments = new FilterArguments();
715-
var context = new TemplateContext(templateOptions);
716-
717-
var result = await MiscFilters.Json(input, arguments, context);
718-
719-
Assert.Equal(expected, result.ToStringValue());
720-
}
721-
722-
[Fact]
723-
public async Task JsonShouldHandleCircularReferences()
724-
{
725-
var model = TestObjects.RecursiveReferenceObject;
726-
var input = FluidValue.Create(model, TemplateOptions.Default);
727-
var to = new TemplateOptions();
728-
to.MemberAccessStrategy.Register<TestObjects.Node>();
729-
730-
var result = await MiscFilters.Json(input, new FilterArguments(), new TemplateContext(to));
731-
732-
Assert.Equal("{\"Name\":\"Object1\",\"NodeRef\":{\"Name\":\"Child1\",\"NodeRef\":\"Circular reference has been detected.\"}}", result.ToStringValue());
733-
}
734-
735-
[Fact]
736-
public async Task JsonShouldHandleCircularReferencesOnSiblingPropertiesSeparately()
737-
{
738-
var model = TestObjects.SiblingPropertiesHaveSameReferenceObject;
739-
var input = FluidValue.Create(model, TemplateOptions.Default);
740-
var to = new TemplateOptions();
741-
to.MemberAccessStrategy.Register<TestObjects.Node>();
742-
to.MemberAccessStrategy.Register<TestObjects.MultipleNode>();
743-
744-
var result = await MiscFilters.Json(input, new FilterArguments(), new TemplateContext(to));
745-
746-
Assert.Equal("{\"Name\":\"MultipleNode1\",\"Node1\":{\"Name\":\"Object1\",\"NodeRef\":{\"Name\":\"Child1\",\"NodeRef\":\"Circular reference has been detected.\"}},\"Node2\":{\"Name\":\"Object1\",\"NodeRef\":{\"Name\":\"Child1\",\"NodeRef\":\"Circular reference has been detected.\"}}}", result.ToStringValue());
747-
}
748-
749698
[Fact]
750699
public async Task JsonShouldIgnoreStaticMembers()
751700
{
@@ -771,7 +720,7 @@ public async Task JsonShouldWriteNullIfDictionaryNotReturnFluidIndexable()
771720
options.MemberAccessStrategy.Register(model.GetType());
772721
var input = FluidValue.Create(model, options);
773722
var result = await MiscFilters.Json(input, new FilterArguments(), new TemplateContext(options));
774-
Assert.Equal("{\"Id\":1,\"WithoutIndexable\":null,\"Bool\":true}", result.ToStringValue());
723+
Assert.Equal("{\"Id\":1,\"WithoutIndexable\":{\"Type\":5,\"Value\":{}},\"Bool\":true}", result.ToStringValue());
775724
}
776725

777726
[Fact]
@@ -815,7 +764,10 @@ public async Task JsonShouldUseJsonSerializerOption()
815764
{
816765
var options = new TemplateOptions
817766
{
818-
JavaScriptEncoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
767+
JsonSerializerOptions = new JsonSerializerOptions
768+
{
769+
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
770+
}
819771
};
820772

821773
var input = FluidValue.Create("你好,这是一条短信", options);
@@ -825,57 +777,37 @@ public async Task JsonShouldUseJsonSerializerOption()
825777
}
826778

827779
[Fact]
828-
public async Task JsonShouldUseJsonWriterOptionsFromTemplateOptions()
780+
public async Task JsonShouldSerializeEnumsAsNumbers()
829781
{
830-
var options = new TemplateOptions
831-
{
832-
JsonWriterOptions = new JsonWriterOptions
833-
{
834-
Indented = true
835-
}
836-
};
782+
var options = new TemplateOptions();
783+
options.MemberAccessStrategy.Register<Domain.Colors>();
837784

838-
var input = FluidValue.Create(new { name = "test", value = 123 }, options);
839-
options.MemberAccessStrategy.Register(input.ToObjectValue().GetType());
785+
var input = FluidValue.Create(Domain.Colors.Red, options);
840786
var context = new TemplateContext(options);
841787
var result = await MiscFilters.Json(input, new FilterArguments(), context);
842788

843-
// Indented JSON should have newlines
844-
Assert.Contains("\n", result.ToStringValue());
789+
// Enum should be serialized as number (1 for Red)
790+
Assert.Equal("1", result.ToStringValue());
845791
}
846-
792+
847793
[Fact]
848-
public async Task JsonShouldUseJsonWriterOptionsFromTemplateContext()
794+
public async Task JsonShouldSerializeEnumsAsStrings()
849795
{
850-
var options = new TemplateOptions();
851-
var context = new TemplateContext(options)
796+
var options = new TemplateOptions
852797
{
853-
JsonWriterOptions = new JsonWriterOptions
798+
JsonSerializerOptions = new JsonSerializerOptions
854799
{
855-
Indented = true
800+
Converters = { new JsonStringEnumConverter() }
856801
}
857802
};
803+
options.MemberAccessStrategy.Register<Person>();
858804

859-
var input = FluidValue.Create(new { name = "test", value = 123 }, options);
860-
options.MemberAccessStrategy.Register(input.ToObjectValue().GetType());
861-
var result = await MiscFilters.Json(input, new FilterArguments(), context);
862-
863-
// Indented JSON should have newlines
864-
Assert.Contains("\n", result.ToStringValue());
865-
}
866-
867-
[Fact]
868-
public async Task JsonShouldSerializeEnumsAsNumbers()
869-
{
870-
var options = new TemplateOptions();
871-
options.MemberAccessStrategy.Register<TestEnum>();
872-
873-
var input = FluidValue.Create(TestEnum.Value2, options);
805+
var input = FluidValue.Create(new Person { EyesColor = Colors.Red }, options);
874806
var context = new TemplateContext(options);
875807
var result = await MiscFilters.Json(input, new FilterArguments(), context);
876808

877-
// Enum should be serialized as number (1 for Value2)
878-
Assert.Equal("1", result.ToStringValue());
809+
// Enum should be serialized as string ("Red")
810+
Assert.Equal("{\"Firstname\":null,\"Lastname\":null,\"EyesColor\":\"Red\",\"Address\":null}", result.ToStringValue());
879811
}
880812

881813
[Theory]
@@ -1084,12 +1016,5 @@ public DictionaryWithoutIndexableTestObjects(object value) : base(value)
10841016

10851017
}
10861018
}
1087-
1088-
private enum TestEnum
1089-
{
1090-
Value1 = 0,
1091-
Value2 = 1,
1092-
Value3 = 2
1093-
}
10941019
}
10951020
}

Fluid.Tests/TemplateTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public async Task ShouldNotEncodeCaptures(string source, string expected)
121121
public async Task ShouldCustomizeCaptures()
122122
{
123123
_parser.TryParse("{% capture foo %}hello <br /> world{% endcapture %}{{ foo }}", out var template, out var error);
124-
var result = await template.RenderAsync(new TemplateContext { Captured = (identifier, captured, context) => new ValueTask<FluidValue>(new StringValue(captured.ToStringValue().ToUpper(), false)) }, HtmlEncoder.Default);
124+
var result = await template.RenderAsync(new TemplateContext { Captured = (identifier, captured, context) => new StringValue(captured.ToStringValue().ToUpper(), false) }, HtmlEncoder.Default);
125125
Assert.Equal("HELLO <BR /> WORLD", result);
126126
}
127127

Fluid/Ast/IfStatement.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private async ValueTask<Completion> Awaited(
131131
}
132132
else
133133
{
134-
await AwaitedElseBranch(null, new ValueTask<FluidValue>(BooleanValue.False), new ValueTask<Completion>(), writer, encoder, context, startIndex: 0);
134+
await AwaitedElseBranch(null, BooleanValue.False, new ValueTask<Completion>(), writer, encoder, context, startIndex: 0);
135135
}
136136

137137
return Completion.Normal;

Fluid/Ast/LiteralExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public LiteralExpression(FluidValue value)
1313

1414
public override ValueTask<FluidValue> EvaluateAsync(TemplateContext context)
1515
{
16-
return new ValueTask<FluidValue>(Value);
16+
return Value;
1717
}
1818

1919
protected internal override Expression Accept(AstVisitor visitor) => visitor.VisitLiteralExpression(this);

Fluid/Ast/MemberExpression.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public override ValueTask<FluidValue> EvaluateAsync(TemplateContext context)
4444
{
4545
if (context.Model == null)
4646
{
47-
return new ValueTask<FluidValue>(value);
47+
return value;
4848
}
4949

5050
start = 0;
@@ -66,11 +66,11 @@ public override ValueTask<FluidValue> EvaluateAsync(TemplateContext context)
6666
// Stop processing as soon as a member returns nothing
6767
if (value.IsNil())
6868
{
69-
return new ValueTask<FluidValue>(value);
69+
return value;
7070
}
7171
}
7272

73-
return new ValueTask<FluidValue>(value);
73+
return value;
7474
}
7575

7676
private static async ValueTask<FluidValue> Awaited(

0 commit comments

Comments
 (0)