Skip to content

Commit 65a1cbc

Browse files
committed
Merge pull request #52 from mikebridge/deref_primitive
An error can be generated when using an index with a primitive value and ErrorWhenMissing is on
2 parents 849ad17 + a0743a3 commit 65a1cbc

File tree

4 files changed

+55
-174
lines changed

4 files changed

+55
-174
lines changed

Liquid.NET.Tests/Constants/MissingValueTests.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
63
using Liquid.NET.Constants;
74
using NUnit.Framework;
85

@@ -55,6 +52,8 @@ public void It_Should_Display_An_Error_When_Dereferencing_Empty_Array(String var
5552

5653
}
5754

55+
56+
5857
[Test]
5958
public void It_Should_Display_Error_When_Dereferencing_Array_With_Non_Int()
6059
{
@@ -73,6 +72,26 @@ public void It_Should_Display_Error_When_Dereferencing_Array_With_Non_Int()
7372

7473
}
7574

75+
[Test]
76+
public void It_Should_Display_Error_When_Dereferencing_Primitive_With_Index()
77+
{
78+
// Arrange
79+
ITemplateContext ctx = new TemplateContext()
80+
.ErrorWhenValueMissing();
81+
ctx.DefineLocalVariable("e", LiquidString.Create("Hello"));
82+
83+
// Act
84+
var template = LiquidTemplate.Create("Result : {{ e.x }}");
85+
var result = template.LiquidTemplate.Render(ctx);
86+
87+
Assert.That(result.HasRenderingErrors, Is.True);
88+
var errorMessage = String.Join(",", result.RenderingErrors.Select(x => x.Message));
89+
// Assert
90+
Assert.That(errorMessage, Is.StringContaining("invalid string index: 'x'"));
91+
92+
}
93+
94+
7695
[Test]
7796
[TestCase("x")]
7897
[TestCase("e[1]")]

Liquid.NET.Tests/Filters/LookupFilterTests.cs

Lines changed: 0 additions & 130 deletions
This file was deleted.

Liquid.NET/src/Constants/IndexDereferencer.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,18 @@ private LiquidExpressionResult DoLookup(ITemplateContext ctx, LiquidString str,
147147
}
148148
else
149149
{
150-
var maybeIndexResult = ValueCaster.Cast<ILiquidValue, LiquidNumeric>(indexProperty);
151-
if (maybeIndexResult.IsError || !maybeIndexResult.SuccessResult.HasValue)
152-
{
153-
return LiquidExpressionResult.Error("invalid array index: " + propertyNameString);
150+
//var maybeIndexResult = ValueCaster.Cast<ILiquidValue, LiquidNumeric>(indexProperty);
151+
var numericIndexProperty = indexProperty as LiquidNumeric;
152+
153+
if (numericIndexProperty == null)
154+
{
155+
return ctx.Options.ErrorWhenValueMissing ?
156+
LiquidExpressionResult.Error("invalid string index: '" + propertyNameString + "'") :
157+
LiquidExpressionResult.Success(new None<ILiquidValue>());
154158
}
155159
else
156160
{
157-
index = maybeIndexResult.SuccessValue<LiquidNumeric>().IntValue;
161+
index = numericIndexProperty.IntValue;
158162
}
159163
}
160164

Liquid.Ruby/tests.liquid

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,48 +39,36 @@ namespace Liquid.NET.Tests.Ruby
3939
var template = LiquidTemplate.Create(input);
4040

4141
// Act
42-
String result = template.LiquidTemplate.Render(ctx);
43-
42+
var result = template.LiquidTemplate.Render(ctx);
43+
Assert.That(result.HasParsingErrors, Is.False);
44+
//Assert.That(result.HasRenderingErrors, Is.False);
45+
4446
// Assert
45-
Assert.That(result.Trim(), Is.EqualTo(expected));
47+
Assert.That(result.Result.Trim(), Is.EqualTo(expected));
4648
}
4749

4850
{% if exceptions != empty %}[Test]{% for test in exceptions %}
4951
[TestCase(@"{{test.input}}", @"{{test.assigns}}", @"{{test.expected | remove: 'EXCEPTION: '}}")]{% endfor %}
5052
public void It_Should_Capture_An_Error(String input, String assigns, String expectedMessage)
51-
{
52-
// Arrange
53-
ITemplateContext ctx = new TemplateContext()
54-
.WithAllFilters()
55-
.WithFileSystem(new TestFileSystem());
56-
57-
foreach (var tuple in DictionaryFactory.CreateStringMapFromJson(assigns))
58-
{
59-
ctx.DefineLocalVariable(tuple.Item1, tuple.Item2);
60-
}
61-
62-
var template = LiquidTemplate.Create(input);
63-
IList<LiquidError> errors = new List<LiquidError>();
64-
//try
65-
//{
66-
67-
String result = template.LiquidTemplate.Render(ctx, onRenderingError: errors.Add);
68-
Assert.That(errors.Count, Is.EqualTo(1));
69-
Assert.That(errors[0].ToString(), Is.StringContaining(expectedMessage));
70-
71-
// TODO: Clean this up:
72-
//}
73-
//catch (LiquidParserException ex)
74-
//{
75-
// Assert
76-
// Assert.That(ex.LiquidErrors[0].ToString(), Is.StringContaining(expectedMessage));
77-
//}
78-
//catch (LiquidRendererException ex)
79-
//{
80-
// Assert
81-
// Assert.That(ex.LiquidErrors[0].ToString(), Is.StringContaining(expectedMessage));
82-
// Assert.That(errors.ToString(), Is.StringContaining(expectedMessage));
83-
//}
53+
{
54+
// Arrange
55+
ITemplateContext ctx = new TemplateContext()
56+
.WithAllFilters()
57+
.WithFileSystem(new TestFileSystem());
58+
59+
foreach (var tuple in DictionaryFactory.CreateStringMapFromJson(assigns))
60+
{
61+
ctx.DefineLocalVariable(tuple.Item1, tuple.Item2);
62+
}
63+
64+
var template = LiquidTemplate.Create(input);
65+
IList<LiquidError> renderingerrors = new List<LiquidError>();
66+
IList<LiquidError> parsingerrors = new List<LiquidError>();
67+
68+
String result = template.LiquidTemplate.Render(ctx, onRenderingError: renderingerrors.Add, onParsingError: parsingerrors.Add);
69+
Assert.That(parsingerrors.Count, Is.EqualTo(1));
70+
Assert.That(parsingerrors[0].ToString(), Is.StringContaining(expectedMessage));
71+
8472
}
8573
{% endif %}
8674
}

0 commit comments

Comments
 (0)