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); } }