public async Task ForEvaluatesMemberOptionsOffsetOnly() { var context = new TemplateContext() .SetValue("offset", 3) ; var e = new ForStatement( new List <Statement> { CreateMemberStatement("i") }, "i", new RangeExpression( new LiteralExpression(NumberValue.Create(1)), new LiteralExpression(NumberValue.Create(5)) ), null, new MemberExpression(new IdentifierSegment("offset")), true ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("54", sw.ToString()); }
public async Task ShouldUseCurrentContext() { var e = new ForStatement( new List <Statement> { new AssignStatement("z", new LiteralExpression(NumberValue.Create(1))) }, "i", new RangeExpression( new LiteralExpression(NumberValue.Create(1)), new LiteralExpression(NumberValue.Create(3)) ), null, null, false ); var t = new TemplateContext(); t.SetValue("z", 0); Assert.Equal(0, t.GetValue("z").ToNumberValue()); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, t); Assert.Equal(1, t.GetValue("z").ToNumberValue()); }
public async Task ForShouldProvideHelperVariables() { var e = new ForStatement( new List <Statement> { CreateMemberStatement("forloop.length"), CreateMemberStatement("forloop.index"), CreateMemberStatement("forloop.index0"), CreateMemberStatement("forloop.rindex"), CreateMemberStatement("forloop.rindex0"), CreateMemberStatement("forloop.first"), CreateMemberStatement("forloop.last") }, "i", new MemberExpression( new IdentifierSegment("items") ), null, null, false ); var sw = new StringWriter(); var context = new TemplateContext(); context.SetValue("items", new[] { 1, 2, 3 }); await e.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("31023truefalse32112falsefalse33201falsetrue", sw.ToString()); }
public async Task ForShouldBeNestable() { var nested = new ForStatement( new List <Statement> { CreateMemberStatement("forloop.index") }, "j", new MemberExpression( new IdentifierSegment("items") ), null, null, false ); var outer = new ForStatement( new List <Statement> { CreateMemberStatement("forloop.index"), nested }, "i", new MemberExpression( new IdentifierSegment("items") ), null, null, false ); var sw = new StringWriter(); var context = new TemplateContext(); context.SetValue("items", new[] { 1, 2, 3 }); await outer.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("112321233123", sw.ToString()); }
public async Task NegativeLimitShouldStripFromEnd() { var context = new TemplateContext() .SetValue("limit", -3) ; var e = new ForStatement( new List <Statement> { CreateMemberStatement("i") }, "i", new RangeExpression( new LiteralExpression(NumberValue.Create(1)), new LiteralExpression(NumberValue.Create(9)) ), new MemberExpression(new IdentifierSegment("limit")), offset: null, false ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("123456", sw.ToString()); }
public async Task ShouldLoopRange() { var e = new ForStatement( new[] { new TextStatement("x") }, "i", new RangeExpression( new LiteralExpression(new NumberValue(1)), new LiteralExpression(new NumberValue(3)) ), null, null, false ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext()); Assert.Equal("xxx", sw.ToString()); }
public async Task ZeroBasedLoopRangeShouldNotHasExtraStep() { var e = new ForStatement( new List <Statement> { new TextStatement("x") }, "i", new RangeExpression( new LiteralExpression(NumberValue.Create(0)), new LiteralExpression(NumberValue.Create(1)) ), null, null, false ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext()); Assert.Equal("xx", sw.ToString()); }
public async Task InvalidRangeShouldNotRenderLoop() { var e = new ForStatement( new List <Statement> { new TextSpanStatement("x") }, "i", new RangeExpression( new LiteralExpression(NumberValue.Create(-10)), new LiteralExpression(NumberValue.Create(-20)) ), null, null, false ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext()); Assert.Equal("", sw.ToString()); }
public async Task ShouldLoopArrays() { var e = new ForStatement( new[] { new TextStatement("x") }, "i", new MemberExpression( new IdentifierSegment("items") ), null, null, false ); var sw = new StringWriter(); var context = new TemplateContext(); context.SetValue("items", new[] { 1, 2, 3 }); await e.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("xxx", sw.ToString()); }
public async Task ForEvaluatesOptions() { var e = new ForStatement( new[] { CreateMemberStatement("i") }, "i", new RangeExpression( new LiteralExpression(new NumberValue(1)), new LiteralExpression(new NumberValue(5)) ), new LiteralExpression(new NumberValue(3)), new LiteralExpression(new NumberValue(2)), true ); var sw = new StringWriter(); await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext()); Assert.Equal("543", sw.ToString()); }
public async Task ShouldNotExecuteElseOnNonEmptyArray() { var e = new ForStatement( new List <Statement> { new TextSpanStatement("x") }, "i", new MemberExpression( new IdentifierSegment("items") ), null, null, false, new ElseStatement(new List <Statement> { new TextSpanStatement("y") }) ); var sw = new StringWriter(); var context = new TemplateContext(); context.SetValue("items", new int[] { 1, 2, 3 }); await e.WriteToAsync(sw, HtmlEncoder.Default, context); Assert.Equal("xxx", sw.ToString()); }