コード例 #1
0
 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);
     }
 }
コード例 #2
0
        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
            });
        }