public async Task CaseProcessFirstWhen()
        {
            var e = new CaseStatement(
                B,
                new ElseStatement(new List <Statement> {
                new TextStatement(new StringSegment("y"))
            }),
                new[] {
                new WhenStatement(new List <Expression> {
                    A, C
                }, TEXT("1")),
                new WhenStatement(new List <Expression> {
                    B, C
                }, TEXT("2")),
                new WhenStatement(new List <Expression> {
                    C
                }, TEXT("3"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("2", sw.ToString());
        }
        public async Task CaseProcessElseWhenNoMatch()
        {
            var e = new CaseStatement(
                A,
                new ElseStatement(new[] { new TextStatement("y") }),
                new[] {
                new WhenStatement(new [] { B, C }, TEXT("x"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("y", sw.ToString());
        }
        public async Task CaseCanProcessWhenMatchMultiple()
        {
            var e = new CaseStatement(
                A,
                null,
                new[] {
                new WhenStatement(new [] { A, B, C }, TEXT("x"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("x", sw.ToString());
        }
        public async Task CaseProcessNoMatchWhen()
        {
            var e = new CaseStatement(
                A,
                null,
                new[] {
                new WhenStatement(new [] { B }, TEXT("2")),
                new WhenStatement(new [] { C }, TEXT("3"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("", sw.ToString());
        }
        public async Task CaseDoesntProcessWhenNoMatch()
        {
            var e = new CaseStatement(
                A,
                null,
                new[] {
                new WhenStatement(new List <Expression> {
                    B, C, D
                }, TEXT("x"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("", sw.ToString());
        }
        public async Task CaseDoesntProcessElseWhenMatch()
        {
            var e = new CaseStatement(
                A,
                new ElseStatement(new List <Statement> {
                new TextStatement(new StringSegment("y"))
            }),
                new[] {
                new WhenStatement(new List <Expression> {
                    A
                }, TEXT("x"))
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("x", sw.ToString());
        }
        public async Task CaseProcessesMultipleStatements()
        {
            var e = new CaseStatement(
                A,
                null,
                new[] {
                new WhenStatement(new List <Expression> {
                    A
                },
                                  new List <Statement> {
                    new TextStatement(new StringSegment("x")), new TextStatement(new StringSegment("y"))
                })
            }
                );

            var sw = new StringWriter();
            await e.WriteToAsync(sw, HtmlEncoder.Default, new TemplateContext());

            Assert.Equal("xy", sw.ToString());
        }
        public async Task CaseEvaluateMember()
        {
            var e = new CaseStatement(
                new MemberExpression(
                    new IdentifierSegment("val")
                    ),
                null,
                new[] {
                new WhenStatement(new List <Expression> {
                    A
                }, TEXT("x"))
            }
                );

            var sw      = new StringWriter();
            var context = new TemplateContext();

            context.SetValue("val", "a");

            await e.WriteToAsync(sw, HtmlEncoder.Default, context);

            Assert.Equal("x", sw.ToString());
        }