public async Task RecognizesTokensWithAsterisk()
        {
            string     text       = @"
function Get-A*A {
}
Get-A*A
";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            foreach (Token t in scriptFile.ScriptTokens)
            {
                List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(t));
                switch (t.Text)
                {
                case "function":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Keyword == sToken.Type);
                    break;

                case "Get-A*A":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type);
                    break;
                }
            }
        }
        public async Task RecognizeEnum()
        {
            string     text       = @"
enum MyEnum{
    one
    two
    three
}
";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            foreach (Token t in scriptFile.ScriptTokens)
            {
                List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(t));
                switch (t.Text)
                {
                case "enum":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Keyword == sToken.Type);
                    break;

                case "MyEnum":
                case "one":
                case "two":
                case "three":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Property == sToken.Type);
                    break;
                }
            }
        }
        public async Task RecognizesCurlyQuotedString()
        {
            string     text       = "“^[-'a-z]*”";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(scriptFile.ScriptTokens[0]));

            Assert.Single(mappedTokens, sToken => SemanticTokenType.String == sToken.Type);
        }
        public async Task TokenizesFunctionElements()
        {
            string     text       = @"
function Get-Sum {
    param( [int]$a, [int]$b )
    return $a + $b
}
";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            foreach (Token t in scriptFile.ScriptTokens)
            {
                List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(t));
                switch (t.Text)
                {
                case "function":
                case "param":
                case "return":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Keyword == sToken.Type);
                    break;

                case "Get-Sum":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type);
                    break;

                case "$a":
                case "$b":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Variable == sToken.Type);
                    break;

                case "[int]":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Type == sToken.Type);
                    break;

                case "+":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Operator == sToken.Type);
                    break;
                }
            }
        }
        public async Task TokenizesStringExpansion()
        {
            string     text       = "Write-Host \"$(Test-Property Get-Whatever) $(Get-Whatever)\"";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            Token commandToken = scriptFile.ScriptTokens[0];
            List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(commandToken));

            Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type);

            Token stringExpandableToken = scriptFile.ScriptTokens[1];

            mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(stringExpandableToken));
            Assert.Collection(mappedTokens,
                              sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type),
                              sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type),
                              sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type)
                              );
        }
        public async Task RecognizesArrayPropertyInExpandableString()
        {
            string     text       = "\"$(@($Array).Count) OtherText\"";
            ScriptFile scriptFile = new ScriptFile(
                // Use any absolute path. Even if it doesn't exist.
                DocumentUri.FromFileSystemPath(Path.Combine(Path.GetTempPath(), "TestFile.ps1")),
                text,
                Version.Parse("5.0"));

            foreach (Token t in scriptFile.ScriptTokens)
            {
                List <SemanticToken> mappedTokens = new List <SemanticToken>(PsesSemanticTokensHandler.ConvertToSemanticTokens(t));
                switch (t.Text)
                {
                case "$Array":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Variable == sToken.Type);
                    break;

                case "Count":
                    Assert.Single(mappedTokens, sToken => SemanticTokenType.Property == sToken.Type);
                    break;
                }
            }
        }