File: Legacy\CSharpTokenizerCommentTest.cs
Web Access
Project: src\src\Razor\src\Compiler\Microsoft.AspNetCore.Razor.Language\test\Microsoft.AspNetCore.Razor.Language.UnitTests.csproj (Microsoft.AspNetCore.Razor.Language.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Microsoft.AspNetCore.Razor.Language.Syntax.InternalSyntax;
using Xunit;
 
namespace Microsoft.AspNetCore.Razor.Language.Legacy;
 
public class CSharpTokenizerCommentTest : CSharpTokenizerTestBase
{
    private new SyntaxToken IgnoreRemaining => (SyntaxToken)base.IgnoreRemaining;
 
    [Fact]
    public void Next_Ignores_Star_At_EOF_In_RazorComment()
    {
        TestTokenizer(
            "@* Foo * Bar * Baz *",
            SyntaxFactory.Token(SyntaxKind.RazorCommentTransition, "@"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentStar, "*"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentLiteral, " Foo * Bar * Baz *"));
    }
 
    [Fact]
    public void Next_Ignores_Star_Without_Trailing_At()
    {
        TestTokenizer(
            "@* Foo * Bar * Baz *@",
            SyntaxFactory.Token(SyntaxKind.RazorCommentTransition, "@"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentStar, "*"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentLiteral, " Foo * Bar * Baz "),
            SyntaxFactory.Token(SyntaxKind.RazorCommentStar, "*"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentTransition, "@"));
    }
 
    [Fact]
    public void Next_Returns_RazorComment_Token_For_Entire_Razor_Comment()
    {
        TestTokenizer(
            "@* Foo Bar Baz *@",
            SyntaxFactory.Token(SyntaxKind.RazorCommentTransition, "@"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentStar, "*"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentLiteral, " Foo Bar Baz "),
            SyntaxFactory.Token(SyntaxKind.RazorCommentStar, "*"),
            SyntaxFactory.Token(SyntaxKind.RazorCommentTransition, "@"));
    }
 
    [Fact]
    public void Next_Returns_Comment_Token_For_Entire_Single_Line_Comment()
    {
        TestTokenizer("// Foo Bar Baz", SyntaxFactory.Token(SyntaxKind.CSharpComment, "// Foo Bar Baz"));
    }
 
    [Fact]
    public void Single_Line_Comment_Is_Terminated_By_Newline()
    {
        TestTokenizer("""
            // Foo Bar Baz
            a
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, "// Foo Bar Baz"), IgnoreRemaining);
    }
 
    [Fact]
    public void Multi_Line_Comment_In_Single_Line_Comment_Has_No_Effect()
    {
        TestTokenizer("""
            // Foo/*Bar*/ Baz
            a
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, "// Foo/*Bar*/ Baz"), IgnoreRemaining);
    }
 
    [Fact]
    public void Next_Returns_Comment_Token_For_Entire_Multi_Line_Comment()
    {
        TestTokenizer("""
            /* Foo
            Bar
            Baz */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /* Foo
            Bar
            Baz */
            """));
    }
 
    [Fact]
    public void Multi_Line_Comment_Is_Terminated_By_End_Sequence()
    {
        TestTokenizer("""
            /* Foo
            Bar
            Baz */a
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /* Foo
            Bar
            Baz */
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Unterminated_Multi_Line_Comment_Captures_To_EOF()
    {
        TestTokenizer("""
            /* Foo
            Bar
            Baz
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /* Foo
            Bar
            Baz
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Nested_Multi_Line_Comments_Terminated_At_First_End_Sequence()
    {
        TestTokenizer("""
            /* Foo/*
            Bar
            Baz*/ */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /* Foo/*
            Bar
            Baz*/
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Nested_Multi_Line_Comments_Terminated_At_Full_End_Sequence()
    {
        TestTokenizer("""
            /* Foo
            Bar
            Baz* */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /* Foo
            Bar
            Baz* */
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Next_Returns_CSharpComment_Token_For_Single_Line_Documentation_Comment()
    {
        TestTokenizer("/// This is a single line documentation comment", SyntaxFactory.Token(SyntaxKind.CSharpComment, "/// This is a single line documentation comment"));
    }
 
    [Fact]
    public void Single_Line_Documentation_Comment_Is_Terminated_By_And_Owns_Newline()
    {
        TestTokenizer("""
            /// This is a single line documentation comment
            a
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /// This is a single line documentation comment
 
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Single_Line_Documentation_Comment_With_Multiple_Lines()
    {
        TestTokenizer("""
            /// This is a single line documentation comment
            /// with multiple lines
            /// in the comment
 
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /// This is a single line documentation comment
            /// with multiple lines
            /// in the comment
 
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Next_Returns_CSharpComment_Token_For_Multi_Line_Documentation_Comment()
    {
        TestTokenizer("""
            /**
             * This is a
             * multi-line
             * documentation comment
             */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /**
             * This is a
             * multi-line
             * documentation comment
             */
            """));
    }
 
    [Fact]
    public void Multi_Line_Documentation_Comment_Is_Terminated_By_End_Sequence()
    {
        TestTokenizer("""
            /**
             * This is a
             * multi-line
             * documentation comment
             */a
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /**
             * This is a
             * multi-line
             * documentation comment
             */
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Unterminated_Multi_Line_Documentation_Comment_Captures_To_EOF()
    {
        TestTokenizer("""
            /**
             * This is a
             * multi-line
             * documentation comment
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /**
             * This is a
             * multi-line
             * documentation comment
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Nested_Multi_Line_Documentation_Comments_Terminated_At_First_End_Sequence()
    {
        TestTokenizer("""
            /**
             * This is a
             * /*nested*/
             * documentation comment
             */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /**
             * This is a
             * /*nested*/
            """), IgnoreRemaining);
    }
 
    [Fact]
    public void Nested_Multi_Line_Documentation_Comments_Terminated_At_Full_End_Sequence()
    {
        TestTokenizer("""
            /**
             * This is a
             * multi-line
             * documentation comment*
             */
            """, SyntaxFactory.Token(SyntaxKind.CSharpComment, """
            /**
             * This is a
             * multi-line
             * documentation comment*
             */
            """), IgnoreRemaining);
    }
}