File: Formatting\FormattingElasticTriviaTests.cs
Web Access
Project: src\src\Workspaces\CSharpTest\Microsoft.CodeAnalysis.CSharp.Workspaces.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.Workspaces.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CSharp.Formatting;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.CSharp.UnitTests.Formatting
{
    using static CSharpSyntaxTokens;
    using static SyntaxFactory;
 
    [Trait(Traits.Feature, Traits.Features.Formatting)]
    public class FormattingEngineElasticTriviaTests : CSharpFormattingTestBase
    {
        [Fact(Skip = "530167")]
        public void FormatElasticTrivia()
        {
            var expected = @"extern alias A1;
 
#line 99
 
[assembly: My]
 
class My : System.Attribute
{
}
 
class A
{
}
 
[My]
class B
{
}";
            var compilation = CompilationUnit(
                externs: [ExternAliasDirective("A1")],
                usings: default,
                attributeLists: [AttributeList(
                                    Token(
                                        [Trivia(
                                            LineDirectiveTrivia(
                                                Literal("99", 99), false))],
                                        SyntaxKind.OpenBracketToken,
                                        TriviaList()),
                                    AttributeTargetSpecifier(
                                        Identifier("assembly")),
                                    [Attribute(
                                        ParseName("My"))],
                                    Token(
                                        SyntaxKind.CloseBracketToken))],
                members:
                [
                    ClassDeclaration(
                        default,
                        modifiers: [],
                        Identifier("My"),
                        null,
                        BaseList([SimpleBaseType(ParseTypeName("System.Attribute"))]),
                        default,
                        default),
                    ClassDeclaration("A"),
                    ClassDeclaration(
                        attributeLists: [
                            AttributeList([
                                    Attribute(
                                        ParseName("My"))])],
                        modifiers: [],
                        identifier: Identifier("B"),
                        typeParameterList: null,
                        baseList: null,
                        constraintClauses: default,
                        members: default)
                ]);
 
            Assert.NotNull(compilation);
 
            using var workspace = new AdhocWorkspace();
            var newCompilation = Formatter.Format(compilation, workspace.Services.SolutionServices, CSharpSyntaxFormattingOptions.Default, CancellationToken.None);
            Assert.Equal(expected, newCompilation.ToFullString());
        }
 
        [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/1947")]
        public void ElasticLineBreaksBetweenMembers()
        {
            var text = @"
public class C
{
    public string f1;
 
    // example comment
    public string f2;
}
 
public class SomeAttribute : System.Attribute { }
";
 
            var workspace = new AdhocWorkspace();
            var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);
            var root = ParseCompilationUnit(text);
            var decl = generator.GetDeclaration(root.DescendantNodes().OfType<VariableDeclaratorSyntax>().First(vd => vd.Identifier.Text == "f2"));
            var newDecl = generator.AddAttributes(decl, generator.Attribute("Some")).WithAdditionalAnnotations(Formatter.Annotation);
            var newRoot = root.ReplaceNode(decl, newDecl);
            var options = CSharpSyntaxFormattingOptions.Default;
 
            var expected = @"
public class C
{
    public string f1;
 
    // example comment
    [Some]
    public string f2;
}
 
public class SomeAttribute : System.Attribute { }
";
 
            var formatted = Formatter.Format(newRoot, workspace.Services.SolutionServices, options, CancellationToken.None).ToFullString();
            Assert.Equal(expected, formatted);
 
            var elasticOnlyFormatted = Formatter.Format(newRoot, SyntaxAnnotation.ElasticAnnotation, workspace.Services.SolutionServices, options, CancellationToken.None).ToFullString();
            Assert.Equal(expected, elasticOnlyFormatted);
 
            var annotationFormatted = Formatter.Format(newRoot, Formatter.Annotation, workspace.Services.SolutionServices, options, CancellationToken.None).ToFullString();
            Assert.Equal(expected, annotationFormatted);
        }
 
        [Fact, WorkItem("https://roslyn.codeplex.com/workitem/408")]
        public void FormatElasticTriviaBetweenPropertiesWithoutAccessors()
        {
            var expected = @"class PropertyTest
{
    string MyProperty => ""42"";
 
    string MyProperty => ""42"";
}";
            var property = PropertyDeclaration(
                attributeLists: default,
                modifiers: [],
                type: PredefinedType(
                    Token(
                        SyntaxKind.StringKeyword)),
                explicitInterfaceSpecifier: null,
                identifier: Identifier("MyProperty"),
                accessorList: null,
                expressionBody:
                    ArrowExpressionClause(
                        LiteralExpression(
                            SyntaxKind.StringLiteralExpression,
                            Literal("42"))),
                initializer: null,
                semicolonToken: SemicolonToken);
 
            var compilation = CompilationUnit(
                externs: default,
                usings: default,
                attributeLists: default,
                members: List(
                new MemberDeclarationSyntax[]
                {
                    ClassDeclaration(
                        attributeLists: default,
                        modifiers: [],
                        identifier: Identifier("PropertyTest"),
                        typeParameterList: null,
                        baseList: null,
                        constraintClauses: default,
                        members: [property, property])
                }));
 
            Assert.NotNull(compilation);
 
            using var workspace = new AdhocWorkspace();
            var newCompilation = Formatter.Format(compilation, workspace.Services.SolutionServices, CSharpSyntaxFormattingOptions.Default, CancellationToken.None);
            Assert.Equal(expected, newCompilation.ToFullString());
        }
    }
}