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])
{
}")));
    }
}