File: Formatting\Indentation\SmartIndenterTests.cs
Web Access
Project: src\src\EditorFeatures\CSharpTest\Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.EditorFeatures.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 Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Editor.UnitTests;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Microsoft.CodeAnalysis.Formatting.Rules;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
using IndentStyle = Microsoft.CodeAnalysis.Formatting.FormattingOptions2.IndentStyle;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Formatting.Indentation;
 
[Trait(Traits.Feature, Traits.Features.SmartIndent)]
public partial class SmartIndenterTests : CSharpFormatterTestsBase
{
    private static readonly TestComposition s_compositionWithTestFormattingRules = EditorTestCompositions.EditorFeatures
        .AddParts(typeof(TestFormattingRuleFactoryServiceFactory));
 
    public SmartIndenterTests(ITestOutputHelper output) : base(output) { }
 
    [WpfFact]
    public void EmptyFile()
    {
        AssertSmartIndent(
            code: string.Empty,
            indentationLine: 0,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void NoPreviousLine()
    {
        var code = @"#region Test
 
#warning 0
#undef SYMBOL
#define SYMBOL
#if false
#elif true
#else
#endif
#pragma warning disable 99999
#goo
 
#endregion
 
";
        AssertSmartIndent(
            code,
            indentationLine: 13,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void EndOfFileInactive()
    {
        var code = @"
    // Line 1
#if false
#endif
 
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void EndOfFileInactive2()
    {
        var code = @"
    // Line 1
#if false
#endif
// Line 2
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void Comments()
    {
        var code = @"using System;
 
class Class
{
    // Comments
    /// Xml Comments
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void TestExplicitNoneIndentStyle()
    {
        var code = @"using System;
 
class Class
{
    // Comments
    /// Xml Comments
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 0,
            indentStyle: IndentStyle.None);
    }
 
    [WpfFact]
    public void UsingDirective()
    {
        var code = @"using System;
 
";
        AssertSmartIndent(
            code,
            indentationLine: 1,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void DottedName()
    {
        var code = @"using System.
 
";
        AssertSmartIndent(
            code,
            indentationLine: 1,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void Namespace()
    {
        var code = @"using System;
 
namespace NS
 
";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
 
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void NamespaceDottedName()
    {
        var code = @"using System;
 
namespace NS.
 
";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void NamespaceBody()
    {
        var code = @"using System;
 
namespace NS
{
 
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void FileScopedNamespace()
    {
        var code = @"using System;
 
namespace NS;
 
 
";
        AssertSmartIndent(
            code,
            indentationLine: 1,
            expectedIndentation: 0);
 
        AssertSmartIndent(
            code,
            indentationLine: 2,
            expectedIndentation: 0);
 
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void Class()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void ClassBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void Method()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void MethodBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void Property()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static string Name
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void PropertyGetBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        private string name;
        public string Names
        {
            get
 
";
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void PropertySetBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        private static string name;
        public static string Names
        {
            set
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void Statement()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            int i = 10;
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void FieldInitializer()
    {
        var code = @"class C
{
    int i = 2;
";
 
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void FieldInitializerWithNamespace()
    {
        var code = @"namespace NS
{
    class C
    {
        C c = new C();
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void MethodCall()
    {
        var code = @"class c
{
    void Method()
    {
        M(
            a: 1, 
            b: 1);
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void Switch()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            switch (10)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void SwitchBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            switch (10)
            {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void SwitchCase()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            switch (10)
            {
                case 10 :
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 11,
            expectedIndentation: 20);
    }
 
    [WpfFact]
    public void ExtendedPropertyPattern()
    {
        var code = @"
class C
{
    void M()
    {
        _ = this is
        {
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void ExtendedPropertyPattern_WithPattern()
    {
        var code = @"
class C
{
    void M()
    {
        _ = this is
        {
 
            A.B: 1,
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void Block()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            switch (10)
            {
                case 10 :
                    {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 12,
            expectedIndentation: 24);
    }
 
    [WpfFact]
    public void MultilineStatement1()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            int i = 10 +
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void MultilineStatement2()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        void Method()
        {
            int i = 10 +
                    20 +
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 20);
    }
 
    // Bug number 902477
    [WpfFact]
    public void Comments2()
    {
        var code = @"class Class
{
    void Method()
    {
        if (true) // Test
 
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void AfterCompletedBlock()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        foreach(var a in x) {}
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void AfterCompletedBlockNestedInOtherBlock()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        foreach(var a in x) {{}
 
        }
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void AfterTopLevelAttribute()
    {
        var code = @"class Program
{
    [Attr]
 
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537802")]
    public void EmbeddedStatement()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            Console.WriteLine(1);
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 8);
    }
 
    [WpfTheory(Skip = "https://github.com/dotnet/roslyn/issues/50063")]
    [WorkItem("https://github.com/dotnet/roslyn/issues/50063")]
    [InlineData("do")]
    [InlineData("for (;;)")]
    [InlineData("if (true)")]
    [InlineData("void localFunction()")]
    [InlineData("static void localFunction()")]
    public void EmbeddedStatement2(string statement)
    {
        var code = $@"class Program
{{
    static void Main(string[] args)
    {{
{statement}
 
    }}
}}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537883")]
    public void EnterAfterComment()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        int a; // enter
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538121")]
    public void NestedBlock1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        {
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    args = null;
 
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement2()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    { }
 
    }
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement3()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    { return; }
 
    }
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement4()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    args = null;
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement5()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    { }
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement6()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    { return; }
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement7()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    return;
                else
                    return;
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void NestedEmbeddedStatement8()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        if (true)
            if (true)
                if (true)
                    return;
                else
                    return;
 
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void Label1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
    Label:
        Console.WriteLine(1);
 
    }
}
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void Label2()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
    Label: Console.WriteLine(1);
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void Label3()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        switch(args.GetType())
        {
            case 1:
                Console.WriteLine(1);
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void Label4()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        switch(args.GetType())
        {
            case 1: Console.WriteLine(1);
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void Label5()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        switch(args.GetType())
        {
            case 1:
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void Label6()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
    Label:
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void QueryExpression1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 20);
    }
 
    [WpfFact]
    public void QueryExpression2()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in b
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void QueryExpression3()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in b.
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void QueryExpression4()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in b where c > 10
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void QueryExpression5()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in
                    from b in G
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 20);
    }
 
    [WpfFact]
    public void QueryExpression6()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var a = from c in
                    from b in G
                    select b
 
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 20);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538779")]
    public void QueryExpression7()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var q = from string s in args
 
                where s == null
                select s;
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538779")]
    public void QueryExpression8()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var q = from string s in args.
                              b.c.
 
                where s == null
                select s;
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 30);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538780")]
    public void QueryExpression9()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var q = from string s in args
                where s == null
 
                select s;
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538780")]
    public void QueryExpression10()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var q = from string s in args
                where s == null
                        == 1
 
                select s;
    }
}
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 24);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538333")]
    public void Statement1()
    {
        var code = @"class Program
{
    void Test() { }
 
}";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538933")]
    public void EndOfFile1()
    {
        var code = @"class Program
{
    void Test() 
    {
        int i;
 
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539059")]
    public void VerbatimString()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = @""Goo
 
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 0);
    }
 
    [WpfFact]
    public void RawString1()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = """"""
 
            """""";
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void RawString2()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = """"""
            Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void RawString3()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = """"""
        Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void RawString4()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = """"""
                Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void RawString5()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = """"""
                Goo
 
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void RawString6()
    {
        var code = @"var goo = """"""
 
    """""";
";
 
        AssertSmartIndent(
            code,
            indentationLine: 1,
            expectedIndentation: 4);
        AssertSmartIndent(
            code,
            indentationLine: 0,
            expectedIndentation: 0);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/66368")]
    public void UnterminatedRawString1()
    {
        var code = """""""
            var x = """"""
                1
                2
                3
                4
                5
                """;
 
            """"""";
 
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/66368")]
    public void UnterminatedInterpolatedRawString1()
    {
        var code = """""""
            var x = $""""""
                1
                2
                3
                4
                5
                """;
 
            """"""";
 
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact]
    public void InterpolatedRawString1()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
 
            """""";
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void InterpolatedRawString2()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
            Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void InterpolatedRawString3()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
        Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void InterpolatedRawString4()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
                Goo
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void InterpolatedRawString5()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
                Goo
 
 
            """"""
 
";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void InterpolatedRawString6()
    {
        var code = @"var goo = $""""""
 
    """""";
";
 
        AssertSmartIndent(
            code,
            indentationLine: 1,
            expectedIndentation: 4);
        AssertSmartIndent(
            code,
            indentationLine: 0,
            expectedIndentation: 0);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void InterpolatedRawString7()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
                Goo{nameof(goo)}
 
 
            """"""
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 16);
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/60946")]
    public void InterpolatedRawString8()
    {
        var code = @"class Program
{
    void Test() 
    {
        var goo = $""""""
                Goo{
nameof(goo)}
 
 
            """"""
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539892")]
    public void Bug5994()
    {
        var code = @"using System;
using System.Collections.Generic;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        var studentQuery =
            from student in students
               group student by (avg == 0 ? 0 : avg / 10) into g
 
            ;
    }
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 11,
            expectedIndentation: 15);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539990")]
    public void Bug6124()
    {
        var code = @"class Program
{
    void Main()
    {
        var commandLine = string.Format(
            "",
            0,
            42,
            string.Format("",
                0,
                0),
 
            0);
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 11,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539990")]
    public void Bug6124_1()
    {
        var code = @"class Program
{
    void Main()
    {
        var commandLine = string.Format(
            "",
            0,
            42,
            string.Format("",
                0,
                0
 
),
            0);
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 11,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void AfterIfWithSingleStatementInTopLevelMethod_Bug7291_1()
    {
        var code = @"int fact(int x)
{
    if (x < 1)
        return 1;
 
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 4,
            options: TestOptions.Script);
    }
 
    [WpfFact]
    public void AfterIfWithSingleStatementInTopLevelMethod_Bug7291_2()
    {
        var code = @"int fact(int x)
{
    if (x < 1)
        return 1;
 
}
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 4,
            options: TestOptions.Script);
    }
 
    [WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/540634")]
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544268")]
    public void FirstArgumentInArgumentList()
    {
        var code = @"class Program
{
    public Program(
        string a,
        int b,
        bool c)
        : this(
            a,
            new Program(
 
                "",
                3,
                true),
            b,
            c)
    {
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void ForLoop()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        for (;      
        ;) { }
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void CallBaseCtor()
    {
        var code = @"class Program
{
    public Program() :           
    base() { }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void MultipleDeclarations()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        int i,
        j = 42;
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void CloseBracket()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var i = new int[1]
        ;
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void SwitchLabel()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        switch (args[0])
        {
            case ""goo"":
 
            case ""bar"":
                break;
        }
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void TypeParameters()
    {
        var code = @"class Program
{
    static void Goo<T1,                 
T2>() { }
}";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542428")]
    public void TypeArguments()
    {
        var code = @"class Program
{
        static void Goo<T1, T2>(T1 t1, T2 t2) { }
 
        static void Main(string[] args)
        {
            Goo<int, 
            int>(4, 2);
        }
}";
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542983")]
    public void ConstructorInitializer1()
    {
        var code = @"public class Asset
{
    public Asset() : this(
 
";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542983")]
    public void ConstructorInitializer2()
    {
        var code = @"public class Asset
{
    public Asset()
        : this(
 
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 14);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542983")]
    public void ConstructorInitializer3()
    {
        var code = @"public class Asset
{
    public Asset() :
        this(
 
";
        AssertSmartIndent(
            code,
            indentationLine: 4,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543131")]
    public void LockStatement1()
    {
        var code = @"using System;
class Program
{
    static object lockObj = new object();
    static int Main()
    {
        int sum = 0;
        lock (lockObj)
            try
            { sum = 0; }
 
        return sum;
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543533")]
    public void ConstructorInitializer()
    {
        var code = @"public class Asset
{
    public Asset() :
 
";
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/952803")]
    public void ArrayInitializer()
    {
        var code = @"using System.Collections.ObjectModel;
 
class Program
{
    static void Main(string[] args)
    {
        new ReadOnlyCollection<int>(new int[]
        {
 
        });
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543563")]
    public void LambdaEmbededInExpression()
    {
        var code = @"using System;
using System.Collections.Generic;
using System.Linq;
 
class Program
{
    static void Main(string[] args)
    {
        using (var var = new GooClass(() =>
        {
 
        }))
        {
            var var2 = var;
        }
    }
}
 
class GooClass : IDisposable
{
    public GooClass(Action a)
    {
    }
 
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543563")]
    public void LambdaEmbededInExpression_1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        using (var var = new GooClass(() =>
 
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543563")]
    public void LambdaEmbededInExpression_3()
    {
        var code = @"using System;
 
class Program
{
    static void Main(string[] args)
    {
        using (var var = new GooClass(() =>
        {
 
        }))
        {
            var var2 = var;
        }
    }
}
 
class GooClass : IDisposable
{
    public GooClass(Action a)
    {
    }
 
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543563")]
    public void LambdaEmbededInExpression_2()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        using (var var = new GooClass(
            () =>
 
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543563")]
    public void LambdaEmbededInExpression_4()
    {
        var code = @"using System;
class Class
{
    public void Method()
    {
        OtherMethod(() =>
        {
            var aaa = new object(); if (aaa != null)
            {
                var bbb = new object();
 
            }
        });
    }
    private void OtherMethod(Action action) { }
}";
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void LambdaDefaultParameter_EnterAfterParamList()
    {
        var code = @"class Program
{
    public void Main()
    {
        var lam = (int x = 7) =>
        
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void LambdaDefaultParameter_EnterAfterEquals()
    {
        var code = @"class Program
{
    public void Main()
    {
        var lam = (int x =
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void LambdaDefaultParameter_EnterBeforeEquals()
    {
        var code = @"class Program
{
    public void Main()
    {
        var lam = (int x
                    = 10,
                    int y
                    = 20) => x + y;
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 20);
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 20);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530074")]
    public void EnterInArgumentList1()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        Main(args,
 
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530074")]
    public void EnterInArgumentList2()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        Main(args,
)
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/806266")]
    public void EnterInArgumentList3()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var s = string.Format(1,
 
    }
}";
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem(9216, "DevDiv_Projects/Roslyn")]
    public void FollowPreviousLineInMultilineStatements()
    {
        var code = @"class Program
{
    static void Main(string[] args)
    {
        var accessibleConstructors = normalType.InstanceConstructors
                                       .Where(c => c.IsAccessibleWithin(within))
                                       .Where(s => s.IsEditorBrowsable(document.ShouldHideAdvancedMembers(), semanticModel.Compilation))
.Sort(symbolDisplayService, invocationExpression.GetLocation(), semanticModel);
    }
}";
        AssertSmartIndent(code, indentationLine: 7, expectedIndentation: 39);
    }
 
    [WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/648068")]
    [WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/674611")]
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AtBeginningOfSpanInNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|
$$Console.WriteLine();|]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 4);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AtEndOfSpanInNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|Console.WriteLine();
$$|]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 4);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void InMiddleOfSpanAtStartOfNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|Console.Wri
$$teLine();|]|}
#line default
#line hidden
    }
}";
 
        // Again, it doesn't matter where Console _is_ in this case -we format based on
        // where we think it _should_ be.  So the position is one indent level past the base
        // for the nugget (where we think the statement should be), plus one more since it is
        // a continuation
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 8);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void InMiddleOfSpanInsideOfNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|
              Console.Wri
$$teLine();|]|}
#line default
#line hidden
    }
}";
 
        // Again, it doesn't matter where Console _is_ in this case -we format based on
        // where we think it _should_ be.  So the position is one indent level past the base
        // for the nugget (where we think the statement should be), plus one more since it is
        // a continuation
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 8);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterStatementInNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|
              Console.WriteLine();
$$
            |]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 4);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterStatementOnFirstLineOfNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|Console.WriteLine();
$$
|]|}
#line default
#line hidden
    }
}";
 
        // TODO: Fix this to indent relative to the previous statement,
        // instead of relative to the containing scope.  I.e. Format like:
        //     <%Console.WriteLine();
        //       Console.WriteLine(); %>
        // instead of
        //     <%Console.WriteLine();
        //         Console.WriteLine(); %>
        // C# had the desired behavior in Dev12, where VB had the same behavior
        // as Roslyn has.  The Roslyn formatting engine currently always formats
        // each statement independently, so let's not change that just for Venus
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 4);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void InQueryOnFistLineOfNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|var q = from
$$
|]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 8);
    }
 
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void InQueryInNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|
              var q = from
$$
|]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(
            markup, BaseIndentationOfNugget + 8);
    }
 
    [WorkItem(9216, "DevDiv_Projects/Roslyn")]
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void InsideBracesInNugget()
    {
        var markup = @"class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
                    {|S1:[|if (true)
        {
$$
        }|]|}
#line default
#line hidden
    }
}";
        AssertSmartIndentInProjection(markup, BaseIndentationOfNugget + 8);
    }
 
    [WorkItem(9216, "DevDiv_Projects/Roslyn")]
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterEmbeddedStatementOnFirstLineOfNugget()
    {
        var markup = @"class Program
        {
            static void Main(string[] args)
            {
        #line ""Goo.aspx"", 27
                            {|S1:[|if (true)
                {
                }
                $$
|]|}
        #line default
        #line hidden
            }
        }";
 
        // In this case, we align the next statement with the "if" (though we _don't_
        // align the braces with it :S)
        AssertSmartIndentInProjection(markup,
            expectedIndentation: BaseIndentationOfNugget + 2);
    }
 
    [WorkItem(9216, "DevDiv_Projects/Roslyn")]
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterEmbeddedStatementInNugget()
    {
        var markup = @"class Program
        {
            static void Main(string[] args)
            {
        #line ""Goo.aspx"", 27
                            {|S1:[|
            if (true)
            {
            }
$$
|]|}
        #line default
        #line hidden
            }
        }";
 
        // In this case we align with the "if", - the base indentation we pass in doesn't matter.
        AssertSmartIndentInProjection(markup,
            expectedIndentation: BaseIndentationOfNugget + 4);
    }
 
    // this is the special case where the smart indenter 
    // aligns with the base or base + 4th position.
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterSwitchStatementAtEndOfNugget()
    {
        var markup = @"
class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|switch (10)
            {
                case 10:
$$
            }|]|}
#line default
#line hidden
    }
}";
 
        // It's yuck that I saw differences depending on where the end of the nugget is
        // but I did, so lets add a test.
        AssertSmartIndentInProjection(markup,
            expectedIndentation: BaseIndentationOfNugget + 12);
    }
 
    // this is the special case where the smart indenter 
    // aligns with the base or base + 4th position.
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void AfterSwitchStatementInNugget()
    {
        var markup = @"
class Program
{
    static void Main(string[] args)
    {
#line ""Goo.aspx"", 27
            {|S1:[|switch (10)
            {
                case 10:
$$
            }
|]|}
#line default
#line hidden
    }
}";
 
        AssertSmartIndentInProjection(markup,
            expectedIndentation: BaseIndentationOfNugget + 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529876"), Trait(Traits.Feature, Traits.Features.SmartIndent), Trait(Traits.Feature, Traits.Features.Venus)]
    public void InEmptyNugget()
    {
        var markup = @"class Program
        {
            static void Main(string[] args)
            {
        #line ""Goo.aspx"", 27
            {|S1:[|
$$|]|}
        #line default
        #line hidden
            }
        }";
 
        AssertSmartIndentInProjection(markup,
            expectedIndentation: BaseIndentationOfNugget + 4);
    }
 
    [WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1190278")]
    [WpfFact, Trait(Traits.Feature, Traits.Features.Venus)]
    public void GetNextTokenForFormattingSpanCalculationIncludesZeroWidthToken_CS()
    {
        var markup = @"//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
 
namespace ASP {
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using System.Web.WebPages.Html;
using WebMatrix.Data;
using WebMatrix.WebData;
using Microsoft.Web.WebPages.OAuth;
using DotNetOpenAuth.AspNet;
 
public class _Page_Default_cshtml : System.Web.WebPages.WebPage {
#line hidden
public _Page_Default_cshtml() {
}
protected System.Web.HttpApplication ApplicationInstance {
get {
return ((System.Web.HttpApplication)(Context.ApplicationInstance));
}
}
public override void Execute() {
 
#line 1 ""C:\Users\basoundr\Documents\Visual Studio 2015\WebSites\WebSite6\Default.cshtml""
 
    {|S1:[|public class LanguagePreference
        {
 
        }
 
if (!File.Exists(physicalPath))
{
    Context.Response.SetStatus(HttpStatusCode.NotFound);
    return;
}
$$
    string[] languages = Context.Request.UserLanguages;
 
if(languages == null || languages.Length == 0)
{
 
    Response.Redirect()
    }
 
|]|}
#line default
#line hidden
}
}
}";
 
        AssertSmartIndentInProjection(markup,
            expectedIndentation: 24);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530948"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void CommaSeparatedListEnumMembers()
    {
        var code = @"enum MyEnum
{
    e1,
 
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 3,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530796"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void RelativeIndentationForBracesInExpression()
    {
        var code = @"class C
{
    void M(C c)
    {
        M(new C()
        {
 
        });
    }
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/584599"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void SwitchSection()
    {
        var code = @"class C
{
    void Method()
    {
        switch (i)
        {
 
            case 1:
 
            case 2:
 
                int i2 = 10;
 
            case 4:
 
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 16);
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
 
        AssertSmartIndent(
            code,
            indentationLine: 12,
            expectedIndentation: 16);
 
        AssertSmartIndent(
            code,
            indentationLine: 14,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/584599"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void SwitchSection2()
    {
        var code = @"class C
{
    void Method()
    {
        switch (i)
        {
            // test
 
            case 1:
                // test
 
            case 2:
                // test
 
                int i2 = 10;
            // test
 
            case 4:
            // test
 
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
 
        AssertSmartIndent(
            code,
            indentationLine: 13,
            expectedIndentation: 16);
 
        AssertSmartIndent(
            code,
            indentationLine: 16,
            expectedIndentation: 12);
 
        AssertSmartIndent(
            code,
            indentationLine: 19,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/584599"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void CommentAtTheEndOfLine()
    {
        var code = @"using System;
 
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(); /* this is a comment */
                             // that I would like to keep
 
 
        // properly indented
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 29);
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/912735"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void CommentAtTheEndOfLineWithExecutableAfterCaret()
    {
        var code = @"using System;
 
class Program
{
    static void Main(string[] args)
    {
        // A
        // B
 
 
        return;
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 8);
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/912735"), Trait(Traits.Feature, Traits.Features.SmartIndent)]
    public void CommentAtTheEndOfLineInsideInitializer()
    {
        var code = @"using System;
using System.Collections.Generic;
 
class Program
{
    static void Main(string[] args)
    {
        var s = new List<string>
                        {
                            """",
                                    """",/*sdfsdfsdfsdf*/
                                       // dfsdfsdfsdfsdf
 
 
                        };
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 12,
            expectedIndentation: 39);
 
        AssertSmartIndent(
            code,
            indentationLine: 13,
            expectedIndentation: 36);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/5495")]
    public void AfterBadQueryContinuationWithSelectOrGroupClause()
    {
        var code = @"using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication1
{
    class AutomapperConfig
    {
        public static IEnumerable<string> ConfigureMappings(string name)
        {
            List<User> anEntireSlewOfItems = new List<User>();
            List<UserViewModel> viewModels = new List<UserViewModel>();
 
            var items = (from m in anEntireSlewOfItems into man
 
             join at in viewModels on m.id equals at.id
             join c in viewModels on m.name equals c.name
             join ct in viewModels on m.phonenumber equals ct.phonenumber
             where m.id == 1 &&
                 m.name == name
             select new { M = true, I = at, AT = at }).ToList();
            //Mapper.CreateMap<User, UserViewModel>()
            //    .ForMember(t => t.)
        }
    }
 
    class User
    {
        public int id { get; set; }
        public string name { get; set; }
        public int phonenumber { get; set; }
    }
 
    class UserViewModel
    {
        public int id { get; set; }
        public string name { get; set; }
        public int phonenumber { get; set; }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 13,
            expectedIndentation: 25);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/5495")]
    public void AfterPartialFromClause()
    {
        var code = @"
using System.Linq;
 
class C
{
    void M()
    {
        var q = from x
 
    }
}
";
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/5635")]
    public void ConstructorInitializerMissingBaseOrThisKeyword()
    {
        var code = @"
class C
{
     C(string s)
         :
 
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 5,
            expectedIndentation: 8);
    }
 
    [WpfFact]
    public void CreateIndentOperationForBrokenBracketedArgumentList()
    {
        var code = @"
class Program
{
    static void M()
    {
        string (userInput == ""Y"")
 
    }
}
";
 
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void PatternPropertyIndentFirst()
    {
        var code = @"
class C
{
    void M(object o)
    {
        var y = o is Point
        {
 
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void PatternPropertyIndentSecond()
    {
        var code = @"
class C
{
    void M(object o)
    {
        var y = o is Point
        {
            X is 4,
 
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void PatternPropertyIndentNestedFirst()
    {
        var code = @"
class C
{
    void M(object o)
    {
        var y = o is Point
        {
            X is Widget 
            {
 
            },
 
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 9,
            expectedIndentation: 16);
    }
 
    [WpfFact]
    public void PatternPropertyIndentNestedSecond()
    {
        var code = @"
class C
{
    void M(object o)
    {
        var y = o is Point
        {
            X is Widget 
            {
                Y is 42,
 
            },
        }
    }
}";
 
        AssertSmartIndent(
            code,
            indentationLine: 10,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/33253")]
    public void EnterAfterFluentSequences_1()
    {
        var code = @"public class Test
{
    public void Test()
    {
        new List<DateTime>()
            .Where(d => d.Kind == DateTimeKind.Local ||
                        d.Kind == DateTimeKind.Utc)
 
            .ToArray();
    }
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/33253")]
    public void EnterAfterFluentSequences_2()
    {
        var code = @"public class Test
{
    public void Test()
    {
        new List<DateTime>()
                .Where(d => d.Kind == DateTimeKind.Local ||
                            d.Kind == DateTimeKind.Utc)
 
                .ToArray();
    }
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 7,
            expectedIndentation: 16);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/33253")]
    public void EnterAfterFluentSequences_3()
    {
        var code = @"public class Test
{
    public void Test()
    {
        new List<DateTime>().Where(d => d.Kind == DateTimeKind.Local ||
                                        d.Kind == DateTimeKind.Utc)
 
                            .ToArray();
    }
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 6,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/33253")]
    public void EnterAfterFluentSequences_4()
    {
        var code = @"public class Test
{
    public void Test()
    {
        new List<DateTime>().Where(d => d.Kind == DateTimeKind.Local || d.Kind == DateTimeKind.Utc)
 
            .ToArray();
    }
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 5,
            expectedIndentation: 12);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/28752")]
    public void EnterAfterBlankLineAfterCommentedOutCode1()
    {
        var code = @"class Test
{
    public void Test()
    {
        // comment
 
 
    }
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 5,
            expectedIndentation: 8);
 
        AssertSmartIndent(
            code: code,
            indentationLine: 6,
            expectedIndentation: 8);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/28752")]
    public void EnterAfterBlankLineAfterCommentedOutCode2()
    {
        var code = @"
class T
{
    // comment
 
 
 
    // comment
    int i = 1;
}";
 
        AssertSmartIndent(
            code: code,
            indentationLine: 4,
            expectedIndentation: 4);
 
        AssertSmartIndent(
            code: code,
            indentationLine: 5,
            expectedIndentation: 4);
 
        AssertSmartIndent(
            code: code,
            indentationLine: 6,
            expectedIndentation: 4);
    }
 
    [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/38819")]
    public void IndentationOfReturnInFileWithTabs1()
    {
        var code = @"
public class Example
{
	public void Test(object session)
	{
		if (session == null)
return;
	}
}";
        // Ensure the test code doesn't get switched to spaces
        Assert.Contains("\t\tif (session == null)", code);
        AssertSmartIndent(
            code,
            indentationLine: 6,
            expectedIndentation: 12,
            useTabs: true,
            options: null,
            indentStyle: IndentStyle.Smart);
    }
 
    [WpfFact]
    public void Operator()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator +(Class x, Class y)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void CastOperator()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static explicit operator Class(int x)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void OperatorBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator +(Class x, Class y)
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void CastOperatorBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static explicit operator Class(int x)
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void CheckedOperator()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator checked +(Class x, Class y)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12,
            options: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp12));
    }
 
    [WpfFact]
    public void ExplicitCastCheckedOperator()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static explicit operator checked Class(int x)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12,
            options: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp12));
    }
 
    [WpfFact]
    public void CheckedOperatorBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator checked +(Class x, Class y)
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12,
            options: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp12));
    }
 
    [WpfFact]
    public void ExplicitCastCheckedOperatorBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static explicit operator checked Class(int x)
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12,
            options: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp12));
    }
 
    [WpfFact]
    public void UnsignedRightShift()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator >>>(Class x, Class y)
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 7,
            expectedIndentation: 12);
    }
 
    [WpfFact]
    public void UnsignedRightShiftBody()
    {
        var code = @"using System;
 
namespace NS
{
    class Class
    {
        public static Class operator >>>(Class x, Class y)
        {
 
";
 
        AssertSmartIndent(
            code,
            indentationLine: 8,
            expectedIndentation: 12);
    }
 
    private static void AssertSmartIndentInProjection(
        string markup,
        int expectedIndentation,
        CSharpParseOptions options = null,
        IndentStyle indentStyle = IndentStyle.Smart)
    {
        AssertSmartIndentInProjection(markup, expectedIndentation, useTabs: false, options, indentStyle);
        AssertSmartIndentInProjection(markup.Replace("    ", "\t"), expectedIndentation, useTabs: true, options, indentStyle);
    }
 
    private static void AssertSmartIndentInProjection(
        string markup,
        int expectedIndentation,
        bool useTabs,
        CSharpParseOptions options,
        IndentStyle indentStyle)
    {
        var optionsSet = options != null
                ? new[] { options }
                : new[] { TestOptions.Regular, TestOptions.Script };
 
        foreach (var option in optionsSet)
        {
            using var workspace = EditorTestWorkspace.CreateCSharp(markup, parseOptions: option, composition: s_compositionWithTestFormattingRules);
 
            var subjectDocument = workspace.Documents.Single();
 
            var projectedDocument =
                workspace.CreateProjectionBufferDocument(HtmlMarkup, workspace.Documents);
 
            var provider = (TestFormattingRuleFactoryServiceFactory.Factory)workspace.Services.GetService<IHostDependentFormattingRuleFactoryService>();
            provider.BaseIndentation = BaseIndentationOfNugget;
            provider.TextSpan = subjectDocument.SelectedSpans.Single();
 
            var editorOptionsService = workspace.GetService<EditorOptionsService>();
 
            var indentationLine = projectedDocument.GetTextBuffer().CurrentSnapshot.GetLineFromPosition(projectedDocument.CursorPosition.Value);
            var textView = projectedDocument.GetTextView();
            var buffer = subjectDocument.GetTextBuffer();
            var point = textView.BufferGraph.MapDownToBuffer(indentationLine.Start, PointTrackingMode.Negative, buffer, PositionAffinity.Predecessor);
 
            var editorOptions = editorOptionsService.Factory.GetOptions(buffer);
            editorOptions.SetOptionValue(DefaultOptions.IndentStyleId, indentStyle.ToEditorIndentStyle());
            editorOptions.SetOptionValue(DefaultOptions.ConvertTabsToSpacesOptionId, !useTabs);
 
            TestIndentation(
                point.Value,
                expectedIndentation,
                textView,
                subjectDocument,
                editorOptionsService);
        }
    }
 
    private void AssertSmartIndent(
        string code,
        int indentationLine,
        int? expectedIndentation,
        CSharpParseOptions options = null,
        IndentStyle indentStyle = IndentStyle.Smart)
    {
        AssertSmartIndent(code, indentationLine, expectedIndentation, useTabs: false, options, indentStyle);
        AssertSmartIndent(code.Replace("    ", "\t"), indentationLine, expectedIndentation, useTabs: true, options, indentStyle);
    }
 
    private void AssertSmartIndent(
        string code,
        int indentationLine,
        int? expectedIndentation,
        bool useTabs,
        CSharpParseOptions options,
        IndentStyle indentStyle)
    {
        var optionsSet = options != null
            ? new[] { options }
            : new[] { TestOptions.Regular, TestOptions.Script };
 
        foreach (var option in optionsSet)
        {
            using var workspace = EditorTestWorkspace.CreateCSharp(code, parseOptions: option);
 
            TestIndentation(workspace, indentationLine, expectedIndentation, indentStyle, useTabs);
        }
    }
 
    private void AssertSmartIndent(
        string code,
        int? expectedIndentation,
        CSharpParseOptions options = null,
        IndentStyle indentStyle = IndentStyle.Smart)
    {
        AssertSmartIndent(code, expectedIndentation, useTabs: false, options, indentStyle);
        AssertSmartIndent(code.Replace("    ", "\t"), expectedIndentation, useTabs: true, options, indentStyle);
    }
 
    private void AssertSmartIndent(
        string code,
        int? expectedIndentation,
        bool useTabs,
        CSharpParseOptions options,
        IndentStyle indentStyle)
    {
        var optionsSet = options != null
            ? new[] { options }
            : new[] { TestOptions.Regular, TestOptions.Script };
 
        foreach (var option in optionsSet)
        {
            using var workspace = EditorTestWorkspace.CreateCSharp(code, parseOptions: option);
 
            var wpfTextView = workspace.Documents.First().GetTextView();
            var line = wpfTextView.TextBuffer.CurrentSnapshot.GetLineFromPosition(wpfTextView.Caret.Position.BufferPosition).LineNumber;
            TestIndentation(workspace, line, expectedIndentation, indentStyle, useTabs);
        }
    }
}