public void ResultShouldContainAtLeastServiceMessage(Table data)
        {
            var ctx      = ScenarioContext.Current.GetTestContext();
            var messages = new TeamCityServiceMessageParser().Parse(ctx.TestSession.Output).ToList();

            var map = new Dictionary <TableRow, IServiceMessage>();

            foreach (var row in data.Rows)
            {
                foreach (var message in messages)
                {
                    if (VerifyServiceMessage(row, message))
                    {
                        map.Add(row, message);
                    }
                }
            }

            var missingRows = data.Rows.Except(map.Keys).ToList();

            if (missingRows.Any())
            {
                var details = string.Join("\n", missingRows.Select(i => CreateErrorMessage(i)));
                Assert.Fail($"See {ctx}\n{details}");
            }
        }
        public void ResultShouldContainNumberServiceMessage(int expectedNumberOfServiceMessages)
        {
            var ctx            = ScenarioContext.Current.GetTestContext();
            var actualMessages = new TeamCityServiceMessageParser().Parse(ctx.TestSession.Output).ToList();

            Assert.AreEqual(expectedNumberOfServiceMessages, actualMessages.Count);
        }
        public void ResultShouldContainCorrectStructureAndSequence()
        {
            var ctx      = ScenarioContext.Current.GetTestContext();
            var messages = new TeamCityServiceMessageParser().Parse(ctx.TestSession.Output).ToList();
            var rootFlow = new Flow(string.Empty);

            foreach (var serviceMessage in messages)
            {
                rootFlow.ProcessMessage(new Message(serviceMessage));
            }
        }
        public void ResultShouldContainServiceMessage(Table data)
        {
            var ctx      = ScenarioContext.Current.GetTestContext();
            var messages = new TeamCityServiceMessageParser().Parse(ctx.TestSession.Output).ToList();

            Assert.AreEqual(data.RowCount, messages.Count, $"{ctx}\nExpected number of service messages is {data.RowCount} but actual is {messages.Count}");

            var invalidMessages = (
                from item in data.Rows.Zip(messages, (row, message) => new { row, message })
                where !VerifyServiceMessage(item.row, item.message)
                select item).ToList();

            if (invalidMessages.Any())
            {
                var details = string.Join("\n", invalidMessages.Select(i => CreateErrorMessage(i.row, i.message)));
                Assert.Fail($"See {ctx}\n{details}");
            }
        }
        public void ResultShouldContainCorrectStructureAndSequence()
        {
            var ctx       = ScenarioContext.Current.GetTestContext();
            var messages  = new TeamCityServiceMessageParser().Parse(ctx.TestSession.Output).ToList();
            var rootFlows = new List <Flow>();

            foreach (var serviceMessage in messages)
            {
                var message = new Message(serviceMessage);
                var flow    = rootFlows.SingleOrDefault(i => i.FlowId == message.CurrentFlowId);
                if (flow == null)
                {
                    flow = new Flow(message.FlowIdAttr);
                    rootFlows.Add(flow);
                }

                flow.ProcessMessage(message);

                if (flow.IsFinished)
                {
                    rootFlows.Remove(flow);
                }
            }
        }