using CodePlay.Core.Parsers;
using CodePlay.Core.Common;
using Xunit;
namespace CodePlay.Tests.Parsers;
public class CSharpParserTests
{
private readonly CSharpParser _parser;
public CSharpParserTests()
{
_parser = new CSharpParser();
}
[Fact]
public void SupportedLanguage_ShouldReturn_CSharp()
{
Assert.Equal(LanguageType.CSharp, _parser.SupportedLanguage);
}
[Fact]
public async Task ParseAsync_SimpleClass_ShouldParseSuccessfully()
{
var sourceCode = @"
namespace TestApp
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void SayHello()
{
Console.WriteLine(""Hello"");
}
}
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
Assert.Equal(LanguageType.CSharp, result.Language);
Assert.NotNull(result.Root);
}
[Fact]
public async Task ParseAsync_WithComments_ShouldExtractComments()
{
var sourceCode = @"
// This is a single-line comment
/* This is a
multi-line comment */
public class Test
{
///
/// This is XML documentation
///
public void Method() { }
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
Assert.NotEmpty(result.Comments);
Assert.NotEmpty(result.Documentation);
}
[Fact]
public async Task ParseAsync_WithGenerics_ShouldParseGenerics()
{
var sourceCode = @"
public class GenericClass where T : class
{
public List Items { get; set; }
public T GetItem(int index)
{
return Items[index];
}
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
Assert.Equal(LanguageType.CSharp, result.Language);
}
[Fact]
public async Task ParseAsync_WithLambda_ShouldParseLambda()
{
var sourceCode = @"
public class LambdaTest
{
public void TestMethod()
{
var numbers = new List { 1, 2, 3 };
var even = numbers.Where(n => n % 2 == 0);
}
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
}
[Fact]
public async Task ParseAsync_WithAsyncMethod_ShouldParseAsync()
{
var sourceCode = @"
public class AsyncTest
{
public async Task GetDataAsync()
{
await Task.Delay(100);
return ""data"";
}
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
}
[Fact]
public async Task ParseAsync_EmptyCode_ShouldParseSuccessfully()
{
var sourceCode = string.Empty;
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
Assert.Equal(LanguageType.CSharp, result.Language);
}
[Fact]
public async Task ParseAsync_InvalidSyntax_ShouldHandleGracefully()
{
var sourceCode = @"
public class InvalidClass
{
public void InvalidMethod(
{
// Missing closing parenthesis
}
}";
var result = await _parser.ParseAsync(sourceCode);
Assert.NotNull(result);
}
}