예제 #1
0
        private Examples HandleTags(Examples example, SpecFlowDocument doc)
        {
            if (example.Tags == null)
            {
                return(example);
            }

            var unhandled = example.Tags.ToList();

            var header = new ExamplesHeader(example.TableHeader.Cells.Select(c => c.Value));

            var rows = new List <TableRow>();

            foreach (var generator in container.GetGenerators())
            {
                foreach (var tag in example.Tags)
                {
                    var name = tag.SanitiseTag();
                    if (!generator.Handles(name))
                    {
                        continue;
                    }

                    unhandled.Remove(tag);

                    var generated = generator.GetRows(name, doc.SourceFilePath, header)
                                    .Select(r => r.ToTableRow(doc))
                                    .ToList();

                    if (!generated.Any())
                    {
                        throw new SemanticParserException($"Generator '{name}' returned no examples", tag.Location);
                    }

                    rows.AddRange(generated);
                }
            }

            return(!rows.Any()
                ? example
                : example.Clone(tags: unhandled, body: example.TableBody.Concat(RowSorter.MaybeSortRows(example.TableHeader, rows))));
        }