public static string ProductRequirement(this IUrlHelper urlHelper, ProductRequirement productRequirement)
        {
            var url = $"/requirements/{productRequirement.NumberFullyQualified}";

            if (urlHelper == null)
            {
                return(url);
            }
            return(urlHelper.Content($"~{url}"));
        }
Beispiel #2
0
        public ProductRequirement ParseProductRequirement(string content)
        {
            var yaml = _yamlParser.ParseYaml(content);

            if (yaml.Yaml == null)
            {
                yaml = new YamlParseResult(Newtonsoft.Json.JsonConvert.DeserializeObject("{}"), yaml.Markdown);
            }

            StringBuilder requirement  = new StringBuilder();
            StringBuilder verification = new StringBuilder();
            StringBuilder current      = null;

            using (var stringReader = new StringReader(yaml.Markdown))
            {
                string line;
                while ((line = stringReader.ReadLine()) != null)
                {
                    if (line == "# Requirement")
                    {
                        current = requirement;
                    }
                    else if (line == "# Verification Method")
                    {
                        current = verification;
                    }
                    else
                    {
                        if (current == null)
                        {
                            throw new DocGenException($"Content '{line}' should be within a requirement or verification method");
                        }

                        current.AppendLine(line);
                    }
                }
            }

            var    result = new ProductRequirement();
            string number = yaml.Yaml?.Number;

            if (string.IsNullOrEmpty(number))
            {
                throw new DocGenException("You must provider a number");
            }
            if (!TryParseVersion(number, out Version version))
            {
                throw new DocGenException($"Invalid number format {number}");
            }

            result.Number             = version;
            result.Title              = yaml.Yaml?.Title;
            result.Category           = yaml.Yaml?.Category;
            result.Requirement        = requirement.ToString();
            result.VerificationMethod = verification.ToString();

            result.Requirement        = result.Requirement.TrimEnd(Environment.NewLine.ToCharArray());
            result.VerificationMethod = result.VerificationMethod.TrimEnd(Environment.NewLine.ToCharArray());

            if (string.IsNullOrEmpty(result.Title))
            {
                throw new DocGenException("Title is required");
            }
            if (string.IsNullOrEmpty(result.Category))
            {
                throw new DocGenException("Category is required");
            }
            if (string.IsNullOrEmpty(result.Requirement))
            {
                throw new DocGenException("You must provide requirements");
            }
            if (string.IsNullOrEmpty(result.VerificationMethod))
            {
                throw new DocGenException("You must provide a verification method");
            }

            return(result);
        }
Beispiel #3
0
        private Task <SoftwareSpecification> BuildRequirementsFromDirectorySoftwareSpecification(string directory, ProductRequirement productRequirement)
        {
            var index         = Path.Combine(directory, "index.md");
            var directoryName = Path.GetFileName(directory.TrimEnd(Path.DirectorySeparatorChar));

            if (!File.Exists(index))
            {
                throw new DocGenException($"File 'index.md' doesn't exist for software specification {directoryName}");
            }

            SoftwareSpecification softwareSpecification;

            try
            {
                softwareSpecification = _requirementsParser.ParseSoftwareSpecification(File.ReadAllText(index));
            }
            catch (Exception ex)
            {
                throw new DocGenException($"Error parsing index.md for software specification {directoryName}: {ex.Message}");
            }

            softwareSpecification.ProductRequirement = productRequirement;
            softwareSpecification.Key = directoryName;

            foreach (var dir in Directory.GetDirectories(directory).OrderBy(x => x))
            {
                var childDirName = Path.GetFileName(dir.TrimEnd(Path.DirectorySeparatorChar));

                if (childDirName.Equals("tests", StringComparison.InvariantCultureIgnoreCase))
                {
                    // process tests
                    foreach (var file in Directory.GetFiles(dir, "*.md").OrderBy(x => x))
                    {
                        var testCase = _requirementsParser.ParseTestCase(File.ReadAllText(file));
                        testCase.SoftwareSpecification = softwareSpecification;
                        testCase.Key = Path.GetFileNameWithoutExtension(file);
                        softwareSpecification.TestCases.Add(testCase);
                    }
                }
                else
                {
                    throw new DocGenException($"Invalid directory {childDirName} in software specification {directoryName}");
                }
            }

            AssertUniqueNumbersForTestCases(softwareSpecification.TestCases);

            softwareSpecification.TestCases = softwareSpecification.TestCases.OrderBy(x => x.Number).ToList();

            return(Task.FromResult(softwareSpecification));
        }
 public ProductRequirementViewModel(ProductRequirement requirement, int currentAmount)
     : base(requirement.RequiredProductType)
 {
     Amount        = requirement.Quantity;
     CurrentAmount = currentAmount;
 }