using Xunit; using Xunit.Abstractions; namespace TinyCC.E2ETests; public class E2ETests : IAsyncLifetime { private readonly ITestOutputHelper _output; private readonly E2ETestRunner _runner; public E2ETests(ITestOutputHelper output) { _output = output; _runner = new E2ETestRunner(); } public Task InitializeAsync() => Task.CompletedTask; public Task DisposeAsync() { _runner.Cleanup(); return Task.CompletedTask; } [Theory] [MemberData(nameof(GetBasicTestCases))] public async Task BasicFeature_ShouldCompileAndRun(TestCase testCase) { // Act var result = await _runner.RunTestAsync(testCase); // Assert _output.WriteLine($"测试: {testCase.Name}"); _output.WriteLine($"源代码:\n{testCase.SourceCode}"); _output.WriteLine($"结果: {(result.Passed ? "通过" : "失败")}"); if (!result.Passed) { _output.WriteLine($"错误: {result.ErrorMessage}"); _output.WriteLine($"实际退出码: {result.ActualExitCode}"); if (result.ActualOutput != null) { _output.WriteLine($"实际输出: {result.ActualOutput}"); } } Assert.True(result.Passed, result.ErrorMessage); } public static TheoryData GetBasicTestCases() { var data = new TheoryData(); foreach (var testCase in TestCases.GetBasicTests()) { data.Add(testCase); } return data; } }