File: CSharpSyntaxFactsServiceTests.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 Microsoft.CodeAnalysis.CSharp.LanguageService;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.CSharp.UnitTests;
 
public sealed class CSharpSyntaxFactsServiceTests
{
    private static bool IsQueryKeyword(string markup)
    {
        MarkupTestFile.GetPosition(markup, out var code, out int position);
        var tree = SyntaxFactory.ParseSyntaxTree(code);
        var token = tree.GetRoot().FindToken(position);
        var service = CSharpSyntaxFacts.Instance;
 
        return service.IsQueryKeyword(token);
    }
 
    private static string WrapInMethod(string methodBody)
    {
        return $$"""
            class C
            {
                void M() 
                {
                    {{methodBody}}
                }
            }
            """;
    }
 
    [Fact]
    public void IsQueryKeyword_From()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var result = $$from var1 in collection1
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_In()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var result = from var1 $$in collection1
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Where()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var customerOrders = from cust in customers
                                 $$where cust.CustomerID = 1
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Select()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var customerOrders = from cust in customers
                                 from ord in orders
                                 where cust.CustomerID == ord.CustomerID
                                 $$select cust.CompanyName, ord.OrderDate
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupBy_Group()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var customersByCountry = from cust in customers
                                     $$group cust by cust.Country
                                     into g
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupBy_By()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var customersByCountry = from cust in customers
                                     group cust $$by cust.Country
                                     into g
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Into()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var customersByCountry = from cust in customers
                                     group cust by cust.Country
                                     $$into g
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupJoin_Join()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        $$join pet in pets on person equals pet.Owner into gj
                        select new { OwnerName = person.FirstName, Pets = gj };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupJoin_In()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet $$in pets on person equals pet.Owner into gj
                        select new { OwnerName = person.FirstName, Pets = gj };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupJoin_On()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet in pets $$on person equals pet.Owner into gj
                        select new { OwnerName = person.FirstName, Pets = gj };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupJoin_Equals()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet in pets on person $$equals pet.Owner into gj
                        select new { OwnerName = person.FirstName, Pets = gj };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_GroupJoin_Into()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet in pets on person equals pet.Owner $$into gj
                        select new { OwnerName = person.FirstName, Pets = gj };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Join_Join()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        $$join pet in pets on person equals pet.Owner
                        select new { OwnerName = person.FirstName, PetName = pet.Name };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Join_In()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet $$in pets on person equals pet.Owner
                        select new { OwnerName = person.FirstName, PetName = pet.Name };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Join_On()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet in pets $$on person equals pet.Owner
                        select new { OwnerName = person.FirstName, PetName = pet.Name };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Join_Equals()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var query = from person in people
                        join pet in pets on person $$equals pet.Owner
                        select new { OwnerName = person.FirstName, PetName = pet.Name };
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Let()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var discountedProducts = from prod in products
                                     $$let discount = prod.UnitPrice * 0.1
                                     where discount >= 50
                                     select new { prod.ProductName, prod.UnitPrice, Discount }
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_OrderBy_OrderBy()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var titlesDescendingPrice = from book in books
                                        $$orderby book.Price descending, book.Title ascending, book.Author
                                        select new { book.Title, book.Price }
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_OrderBy_Descending()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var titlesDescendingPrice = from book in books
                                        orderby book.Price $$descending, book.Title ascending, book.Author
                                        select new { book.Title, book.Price }
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_OrderBy_Ascending()
    {
        Assert.True(IsQueryKeyword(WrapInMethod("""
            var titlesDescendingPrice = from book in books
                                        orderby book.Price descending, book.Title $$ascending, book.Author
                                        select new { book.Title, book.Price }
            """)));
    }
 
    [Fact]
    public void IsQueryKeyword_Not_ForEach_In()
    {
        Assert.False(IsQueryKeyword(WrapInMethod("""
            foreach (var i $$in new int[0])
            {
            }
            """)));
    }
}