private void RunNextTestGroup() { if (m_testGroups.Count > 0) { var groupTestsRunner = new SA_GroupTestRunner(m_testGroups[0]); groupTestsRunner.OnGroupTestStarted += (groupTitle) => { OnGroupTestStarted.Invoke(groupTitle); }; groupTestsRunner.OnTestStarted += (testTitle) => { OnTestStarted.Invoke(testTitle); }; groupTestsRunner.OnTestFinished += (testResult) => { OnTestResult.Invoke(testResult); }; m_testGroups.RemoveAt(0); groupTestsRunner.Execute(RunNextTestGroup); } }
public async Task <TestSession> ParseAsync(Stream stream, bool copyStreamContentToResult = false, CancellationToken token = new CancellationToken()) { var streamContentCopy = new MemoryStream(); var streamWriter = new StreamWriter(streamContentCopy, Encoding.UTF8); var streamReader = new StreamReader(stream, Encoding.UTF8); string yamlContent = String.Empty; bool parsingYaml = false; var testPlan = new TestPlan(); var results = new List <TestLine>(); uint tapVersion = 0; var sessionDiagnosticMessages = new List <string>(); string bailoutMessage = String.Empty; bool bailedOut = false; token.ThrowIfCancellationRequested(); var taskString = streamReader.ReadLineAsync(); await taskString; var line = taskString.Result; while (line != null) { token.ThrowIfCancellationRequested(); if (copyStreamContentToResult) { streamWriter.WriteLine(line); } var parseResult = ParseLine(line, parsingYaml); switch (parseResult) { case ParseResult.TestResult: var result = ParseTestResult(line, (uint)results.Count + 1); results.Add(result); try { OnTestResult?.Invoke(result); } catch (Exception e) { SendError(e); } break; case ParseResult.Error: if (!string.IsNullOrEmpty(line)) { var e = new TAPParserException($"TAP syntax error. Unrecognized line \"{line}\"."); SendError(e); } break; case ParseResult.Version: var v = ParseTAPVersion(line); try { OnVersion?.Invoke(v); } catch (Exception e) { SendError(e); } tapVersion = v; break; case ParseResult.YamlStart: parsingYaml = true; yamlContent = ""; break; case ParseResult.YamlEnd: parsingYaml = false; using (TextReader tr = new StringReader(yamlContent)) { dynamic yaml = m_deserializer.Deserialize(tr); var testLine = results.Last(); testLine.YAML = yaml; try { OnYaml?.Invoke(testLine, yaml); } catch (Exception e) { SendError(e); } } break; case ParseResult.YamlContent: yamlContent += line + "\n"; break; case ParseResult.TestPlan: var tp = ParseTestPlan(line); try { OnTestPlan?.Invoke(tp); } catch (Exception e) { SendError(e); } testPlan = tp; break; case ParseResult.Diagnostic: string diagnostic = s_diagnostics.Match(line).Groups["diagnostic"].Value.Trim(); if (results.Any()) { var testLine = results.Last(); testLine.DiagnosticMessages.Add(diagnostic); try { OnTestResultDiagnostic?.Invoke(testLine, diagnostic); } catch (Exception e) { SendError(e); } } else { sessionDiagnosticMessages.Add(diagnostic); try { OnDiagnostic?.Invoke(diagnostic); } catch (Exception e) { SendError(e); } } break; case ParseResult.BailOut: var message = s_bailout.Match(line).Groups["message"].Value.Trim(); bailedOut = true; try { OnBailout?.Invoke(message); } catch (Exception e) { SendError(e); } bailoutMessage = message; break; default: throw new ArgumentOutOfRangeException(); } taskString = streamReader.ReadLineAsync(); await taskString; line = taskString.Result; } int testCount = (int)testPlan.LastTestIndex - (int)testPlan.FirstTestIndex + 1; if (results.Count < testCount) { for (int i = results.Count + 1; i <= testCount; i++) { token.ThrowIfCancellationRequested(); var testLine = new TestLine { Description = "", Directive = "", Index = (uint)i, Status = TestResult.NotOk, }; results.Add(testLine); try { OnTestResult?.Invoke(testLine); } catch (Exception e) { SendError(e); } } } streamWriter.Flush(); streamContentCopy.Position = 0; return(new TestSession { TAPVersion = tapVersion, TestPlan = testPlan, Tests = results, DiagnosticMessages = sessionDiagnosticMessages, BailOutMessage = bailoutMessage, BailedOut = bailedOut, TAPContent = streamContentCopy }); }