diff --git a/Liquid.NET.Tests/Constants/MissingValueTests.cs b/Liquid.NET.Tests/Constants/MissingValueTests.cs index 2008482..8b126e0 100755 --- a/Liquid.NET.Tests/Constants/MissingValueTests.cs +++ b/Liquid.NET.Tests/Constants/MissingValueTests.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Liquid.NET.Constants; using NUnit.Framework; @@ -55,6 +52,8 @@ public void It_Should_Display_An_Error_When_Dereferencing_Empty_Array(String var } + + [Test] public void It_Should_Display_Error_When_Dereferencing_Array_With_Non_Int() { @@ -73,6 +72,26 @@ public void It_Should_Display_Error_When_Dereferencing_Array_With_Non_Int() } + [Test] + public void It_Should_Display_Error_When_Dereferencing_Primitive_With_Index() + { + // Arrange + ITemplateContext ctx = new TemplateContext() + .ErrorWhenValueMissing(); + ctx.DefineLocalVariable("e", LiquidString.Create("Hello")); + + // Act + var template = LiquidTemplate.Create("Result : {{ e.x }}"); + var result = template.LiquidTemplate.Render(ctx); + + Assert.That(result.HasRenderingErrors, Is.True); + var errorMessage = String.Join(",", result.RenderingErrors.Select(x => x.Message)); + // Assert + Assert.That(errorMessage, Is.StringContaining("invalid string index: 'x'")); + + } + + [Test] [TestCase("x")] [TestCase("e[1]")] diff --git a/Liquid.NET.Tests/Filters/LookupFilterTests.cs b/Liquid.NET.Tests/Filters/LookupFilterTests.cs deleted file mode 100755 index c3a7183..0000000 --- a/Liquid.NET.Tests/Filters/LookupFilterTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; - -using Liquid.NET.Constants; -using Liquid.NET.Tests.Filters.Array; - -using NUnit.Framework; - -namespace Liquid.NET.Tests.Filters -{ - [TestFixture] - [Ignore("TO DELETE when replaced with IndexDereferencer")] - public class LookupFilterTests - { - private static String LOOKUP = "lookup"; - - [Test] - [TestCase("3", "false")] - [TestCase("4", "")] - [TestCase("30", "")] - [TestCase("-1", "false")] - [TestCase("-2", "456.0")] - [TestCase("-4", "a string")] - [TestCase("-5", "")] - [TestCase("4", "")] - [TestCase("-30", "")] - public void It_Should_Look_Up_ArrayValues(String index, String expected) - { - // Arrange - TemplateContext ctx = new TemplateContext(); - var liquidCollection = DataFixtures.CreateArrayValue(); - ctx.DefineLocalVariable("myarray", liquidCollection); - String tmpl = "{{ myarray | " + LOOKUP + ": "+index+" }}"; - - // Act - var result = RenderingHelper.RenderTemplate(tmpl, ctx); - - // Assert - //var expected = ValueCaster.RenderAsString(liquidCollection.ArrValue[3]); - Assert.That(result, Is.EqualTo(expected)); - } - - [Test] - [TestCase("mydict.field1", "Property 1")] - [TestCase("mydict | lookup: \"field1\"", "Property 1")] - [TestCase("mydict[\"field1\"]", "Property 1")] - [TestCase("mydict[\"qwefqwefwef\"]", "")] - public void It_Should_Look_Up_DictionaryValues(String liquid, String expected) - { - // Arrange - TemplateContext ctx = new TemplateContext(); - var dictValue = DataFixtures.CreateDictionary(1, "Property 1", "prop2"); - ctx.DefineLocalVariable("mydict", dictValue); - String tmpl = "{{ "+liquid+" }}"; - - // Act - var result = RenderingHelper.RenderTemplate(tmpl, ctx); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - [Test] - [TestCase("{% assign str = \"A String\" %}{{str[0]}}", "A")] - [TestCase("{% assign str = \"A String\" %}{{str[-1]}}", "g")] - [TestCase("{% assign str = \"A String\" %}{{str[-20]}}", "")] - [TestCase("{% assign str = \"\" %}{{str[0]}}", "")] - public void It_Should_Look_Up_StringValues(String input, String expected) - { - - // Act - var result = RenderingHelper.RenderTemplate(input); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - - [Test] - // see: https://github.com/Shopify/liquid/issues/543 - [TestCase("first", "a string")] - [TestCase("last", "false")] - [TestCase("size", "4")] - public void It_Should_Dereference_Properties_Of_Array(String property, String expected) - { - // Arrange - TemplateContext ctx = new TemplateContext(); - var liquidCollection = DataFixtures.CreateArrayValue(); - ctx.DefineLocalVariable("myarray", liquidCollection); - String tmpl = "{{ myarray."+property+" }}"; - - // Act - var result = RenderingHelper.RenderTemplate(tmpl, ctx); - - // Assert - Assert.That(result, Is.EqualTo(expected)); - } - - [Test] - [TestCase("size")] - public void It_Should_Dereference_Properties_Of_Dictionary(String property) - { - // Arrange - TemplateContext ctx = new TemplateContext(); - var dictValue = DataFixtures.CreateDictionary(1, "Property 1", "prop2"); - ctx.DefineLocalVariable("mydict", dictValue); - String tmpl = "{{ mydict." + property + " }}"; - - // Act - var result = RenderingHelper.RenderTemplate(tmpl, ctx); - - // Assert - Assert.That(result, Is.EqualTo(dictValue.DictValue.Count.ToString())); - } - - public ArrayValue CreateArrayOfDicts() - { - // Arrange - IList objlist = new List - { - DataFixtures.CreateDictionary(1, "Value 1 A", "Value 1 B"), - DataFixtures.CreateDictionary(2, "Value 2 A", "Value 2 B"), - DataFixtures.CreateDictionary(3, "Value 3 A", "Value 3 B"), - DataFixtures.CreateDictionary(4, "Value 4 A", "Value 4 B"), - }; - return new ArrayValue(objlist); - - } - } -} diff --git a/Liquid.NET/src/Constants/IndexDereferencer.cs b/Liquid.NET/src/Constants/IndexDereferencer.cs index 2c2feed..e062cdc 100755 --- a/Liquid.NET/src/Constants/IndexDereferencer.cs +++ b/Liquid.NET/src/Constants/IndexDereferencer.cs @@ -147,14 +147,18 @@ private LiquidExpressionResult DoLookup(ITemplateContext ctx, LiquidString str, } else { - var maybeIndexResult = ValueCaster.Cast(indexProperty); - if (maybeIndexResult.IsError || !maybeIndexResult.SuccessResult.HasValue) - { - return LiquidExpressionResult.Error("invalid array index: " + propertyNameString); + //var maybeIndexResult = ValueCaster.Cast(indexProperty); + var numericIndexProperty = indexProperty as LiquidNumeric; + + if (numericIndexProperty == null) + { + return ctx.Options.ErrorWhenValueMissing ? + LiquidExpressionResult.Error("invalid string index: '" + propertyNameString + "'") : + LiquidExpressionResult.Success(new None()); } else { - index = maybeIndexResult.SuccessValue().IntValue; + index = numericIndexProperty.IntValue; } } diff --git a/Liquid.Ruby/tests.liquid b/Liquid.Ruby/tests.liquid index 3b2baa8..ef84f6e 100755 --- a/Liquid.Ruby/tests.liquid +++ b/Liquid.Ruby/tests.liquid @@ -39,48 +39,36 @@ namespace Liquid.NET.Tests.Ruby var template = LiquidTemplate.Create(input); // Act - String result = template.LiquidTemplate.Render(ctx); - + var result = template.LiquidTemplate.Render(ctx); + Assert.That(result.HasParsingErrors, Is.False); + //Assert.That(result.HasRenderingErrors, Is.False); + // Assert - Assert.That(result.Trim(), Is.EqualTo(expected)); + Assert.That(result.Result.Trim(), Is.EqualTo(expected)); } {% if exceptions != empty %}[Test]{% for test in exceptions %} [TestCase(@"{{test.input}}", @"{{test.assigns}}", @"{{test.expected | remove: 'EXCEPTION: '}}")]{% endfor %} public void It_Should_Capture_An_Error(String input, String assigns, String expectedMessage) - { - // Arrange - ITemplateContext ctx = new TemplateContext() - .WithAllFilters() - .WithFileSystem(new TestFileSystem()); - - foreach (var tuple in DictionaryFactory.CreateStringMapFromJson(assigns)) - { - ctx.DefineLocalVariable(tuple.Item1, tuple.Item2); - } - - var template = LiquidTemplate.Create(input); - IList errors = new List(); - //try - //{ - - String result = template.LiquidTemplate.Render(ctx, onRenderingError: errors.Add); - Assert.That(errors.Count, Is.EqualTo(1)); - Assert.That(errors[0].ToString(), Is.StringContaining(expectedMessage)); - - // TODO: Clean this up: - //} - //catch (LiquidParserException ex) - //{ - // Assert - // Assert.That(ex.LiquidErrors[0].ToString(), Is.StringContaining(expectedMessage)); - //} - //catch (LiquidRendererException ex) - //{ - // Assert - // Assert.That(ex.LiquidErrors[0].ToString(), Is.StringContaining(expectedMessage)); - // Assert.That(errors.ToString(), Is.StringContaining(expectedMessage)); - //} + { + // Arrange + ITemplateContext ctx = new TemplateContext() + .WithAllFilters() + .WithFileSystem(new TestFileSystem()); + + foreach (var tuple in DictionaryFactory.CreateStringMapFromJson(assigns)) + { + ctx.DefineLocalVariable(tuple.Item1, tuple.Item2); + } + + var template = LiquidTemplate.Create(input); + IList renderingerrors = new List(); + IList parsingerrors = new List(); + + String result = template.LiquidTemplate.Render(ctx, onRenderingError: renderingerrors.Add, onParsingError: parsingerrors.Add); + Assert.That(parsingerrors.Count, Is.EqualTo(1)); + Assert.That(parsingerrors[0].ToString(), Is.StringContaining(expectedMessage)); + } {% endif %} }