public void UpdateDebianChangelogWorks()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"),
                                                           Path.Combine(Path.GetTempPath(), "changelog")))
            {
                var mdFile        = tempFiles.FirstFile;
                var changeLogFile = tempFiles.SecondFile;
                File.WriteAllLines(mdFile, new[] { "## 2.3.10: 4/Sep/2014", "* with some random content", "* does some things" });
                File.WriteAllLines(changeLogFile, new[]
                {
                    "myfavoriteapp (2.1.0~alpha1) unstable; urgency=low", "", "  * Initial Release for Linux.", "",
                    " -- Stephen McConnel <*****@*****.**>  Fri, 12 Jul 2013 14:57:59 -0500", ""
                });
                testMarkdown.MarkdownFile        = mdFile;
                testMarkdown.VersionNumber       = "2.3.11";
                testMarkdown.ProductName         = "myfavoriteapp";
                testMarkdown.ChangelogAuthorInfo = "Steve McConnel <*****@*****.**>";
                testMarkdown.DebianChangelog     = changeLogFile;
                Assert.That(testMarkdown.UpdateDebianChangelog(), Is.True);
                var newContents = File.ReadAllLines(changeLogFile);
                Assert.AreEqual(newContents.Length, 13, "New changelog entry was not the expected length");
                Assert.That(newContents[0], Is.StringStarting("myfavoriteapp (2.3.11) unstable; urgency=low"));
                //Make sure that the author line matches debian standards for time offset and spacing around author name
                Assert.That(newContents[5], Is.StringMatching(" -- " + testMarkdown.ChangelogAuthorInfo + "  .*[+-]\\d\\d\\d\\d"));
            }
        }
        public void HtmlWithReleaseNotesElementWithContentsIsChanged()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (
                var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.md"),
                                                           Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.htm")))
            {
                var markdownFile = filesForTest.FirstFile;
                var htmlFile     = filesForTest.SecondFile;
                File.WriteAllLines(markdownFile,
                                   new[]
                                   { "## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things" });
                File.WriteAllLines(htmlFile,
                                   new[]
                {
                    "<html>", "<body>", "<div class='releasenotes'>", "<span class='note'/>", "</div>",
                    "</body>", "</html>"
                });
                testMarkdown.MarkdownFile = markdownFile;
                testMarkdown.HtmlFile     = htmlFile;
                Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
                AssertThatXmlIn.File(htmlFile).HasNoMatchForXpath("//span[@class='note']");
                AssertThatXmlIn.File(htmlFile).HasSpecifiedNumberOfMatchesForXpath("//*[@class='releasenotes']", 1);
            }
        }
        public void SimpleMdResultsInSimpleHtml()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (
                var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.md"),
                                                           Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.htm")))
            {
                File.WriteAllLines(filesForTest.FirstFile,
                                   new[]
                                   { "## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things" });
                testMarkdown.MarkdownFile = filesForTest.FirstFile;
                testMarkdown.HtmlFile     = filesForTest.SecondFile;
                Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
            }
        }
        public void StampMarkdownDoesNothingWhenTold()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"), null))
            {
                var devVersionLine = "## DEV_VERSION_NUMBER: DEV_RELEASE_DATE";
                File.WriteAllLines(tempFiles.FirstFile,
                                   new[] { devVersionLine, "*with some random content", "*does some things" });
                testMarkdown.MarkdownFile      = tempFiles.FirstFile;
                testMarkdown.VersionNumber     = "2.3.10";
                testMarkdown.StampMarkdownFile = false;
                Assert.That(testMarkdown.StampMarkdownFileWithVersion(), Is.True);
                var newContents = File.ReadAllLines(tempFiles.FirstFile);
                Assert.That(newContents.Length == 3);
                Assert.That(newContents[0], Is.StringMatching(devVersionLine));
            }
        }
        public void StampMarkdownWorks()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"), null))
            {
                File.WriteAllLines(tempFiles.FirstFile,
                                   new[] { "## DEV_VERSION_NUMBER: DEV_RELEASE_DATE", "*with some random content", "*does some things" });
                testMarkdown.MarkdownFile      = tempFiles.FirstFile;
                testMarkdown.VersionNumber     = "2.3.10";
                testMarkdown.StampMarkdownFile = true;
                var day = string.Format("{0:dd/MMM/yyyy}", DateTime.Now);
                Assert.That(testMarkdown.StampMarkdownFileWithVersion(), Is.True);
                var newContents = File.ReadAllLines(tempFiles.FirstFile);
                Assert.That(newContents.Length == 3);
                Assert.That(newContents[0], Is.StringMatching("## 2.3.10 " + day));
            }
        }
        public void UpdateDebianChangelogAllMdListItemsWork()
        {
            var testingTask = new GenerateReleaseArtifacts();

            using (var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"),
                                                           Path.Combine(Path.GetTempPath(), "changelog")))
            {
                var markdownFile = tempFiles.FirstFile;
                File.WriteAllLines(markdownFile, new[]
                {
                    "## 3.0.97 Beta",
                    "- Update French UI Translation",
                    "+ When importing, Bloom no longer",
                    "  1. makes images transparent when importing.",
                    "  4. compresses images transparent when importing.",
                    "  9. saves copyright/license back to the original files",
                    "    * extra indented list",
                    "* Fix insertion of unwanted space before bolded, underlined, and italicized portions of words",
                });
                var debianChangelog = tempFiles.SecondFile;
                File.WriteAllLines(debianChangelog, new[]
                {
                    "Bloom (3.0.82 Beta) unstable; urgency=low", "", "  * Older release", "",
                    " -- Stephen McConnel <*****@*****.**>  Fri, 12 Jul 2014 14:57:59 -0500", ""
                });
                testingTask.MarkdownFile        = markdownFile;
                testingTask.VersionNumber       = "3.0.97 Beta";
                testingTask.ProductName         = "myfavoriteapp";
                testingTask.ChangelogAuthorInfo = "John Hatton <*****@*****.**>";
                testingTask.DebianChangelog     = debianChangelog;
                Assert.That(testingTask.UpdateDebianChangelog(), Is.True);
                var newContents = File.ReadAllLines(debianChangelog);
                Assert.That(newContents[0], Is.StringContaining("3.0.97 Beta"));
                Assert.That(newContents[2], Is.StringStarting("  *"));
                Assert.That(newContents[3], Is.StringStarting("  *"));
                Assert.That(newContents[4], Is.StringStarting("    *"));
                Assert.That(newContents[5], Is.StringStarting("    *"));
                Assert.That(newContents[6], Is.StringStarting("    *"));
                Assert.That(newContents[7], Is.StringStarting("    *"));                 // The 3rd (and further) level indentation isn't currently supported
                Assert.That(newContents[8], Is.StringStarting("  *"));
            }
        }
        public void HtmlWithNoReleaseNotesElementIsCompletelyReplaced()
        {
            var testMarkdown = new GenerateReleaseArtifacts();

            using (
                var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.md"),
                                                           Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".Test.htm")))
            {
                var markdownFile = filesForTest.FirstFile;
                var htmlFile     = filesForTest.SecondFile;
                File.WriteAllLines(markdownFile,
                                   new[]
                                   { "## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things" });
                File.WriteAllLines(htmlFile,
                                   new[] { "<html>", "<body>", "<div class='notmarkdown'/>", "</body>", "</html>" });
                testMarkdown.MarkdownFile = markdownFile;
                testMarkdown.HtmlFile     = htmlFile;
                Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
                AssertThatXmlIn.File(htmlFile).HasNoMatchForXpath("//div[@notmarkdown]");
            }
        }
		public void SimpleMdResultsInSimpleHtml()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(
				var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.md"),
					Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.htm")))
			{
				File.WriteAllLines(filesForTest.FirstFile,
					new[]
					{"## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things"});
				testMarkdown.MarkdownFile = filesForTest.FirstFile;
				testMarkdown.HtmlFile = filesForTest.SecondFile;
				Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
			}
		}
		public void UpdateDebianChangelogAllMdListItemsWork()
		{
			var testingTask = new GenerateReleaseArtifacts();
			using(var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"),
				Path.Combine(Path.GetTempPath(), "changelog")))
			{
				var markdownFile = tempFiles.FirstFile;
				File.WriteAllLines(markdownFile, new[]
				{
					"## 3.0.97 Beta",
					"- Update French UI Translation",
					"+ When importing, Bloom no longer",
					"  1. makes images transparent when importing.",
					"  4. compresses images transparent when importing.",
					"  9. saves copyright/license back to the original files",
					"    * extra indented list",
					"* Fix insertion of unwanted space before bolded, underlined, and italicized portions of words",
				});
				var debianChangelog = tempFiles.SecondFile;
				File.WriteAllLines(debianChangelog, new[]
				{
					"Bloom (3.0.82 Beta) unstable; urgency=low", "", "  * Older release", "",
					" -- Stephen McConnel <*****@*****.**>  Fri, 12 Jul 2014 14:57:59 -0500", ""
				});
				testingTask.MarkdownFile = markdownFile;
				testingTask.VersionNumber = "3.0.97 Beta";
				testingTask.ProductName = "myfavoriteapp";
				testingTask.ChangelogAuthorInfo = "John Hatton <*****@*****.**>";
				testingTask.DebianChangelog = debianChangelog;
				Assert.That(testingTask.UpdateDebianChangelog(), Is.True);
				var newContents = File.ReadAllLines(debianChangelog);
				Assert.That(newContents[0], Is.StringContaining("3.0.97 Beta"));
				Assert.That(newContents[2], Is.StringStarting("  *"));
				Assert.That(newContents[3], Is.StringStarting("  *"));
				Assert.That(newContents[4], Is.StringStarting("    *"));
				Assert.That(newContents[5], Is.StringStarting("    *"));
				Assert.That(newContents[6], Is.StringStarting("    *"));
				Assert.That(newContents[7], Is.StringStarting("    *")); // The 3rd (and further) level indentation isn't currently supported
				Assert.That(newContents[8], Is.StringStarting("  *"));
			}
		}
		public void UpdateDebianChangelogWorks()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"),
				Path.Combine(Path.GetTempPath(), "changelog")))
			{
				var mdFile = tempFiles.FirstFile;
				var changeLogFile = tempFiles.SecondFile;
				File.WriteAllLines(mdFile, new[] {"## 2.3.10: 4/Sep/2014", "* with some random content", "* does some things"});
				File.WriteAllLines(changeLogFile, new[]
				{
					"myfavoriteapp (2.1.0~alpha1) unstable; urgency=low", "", "  * Initial Release for Linux.", "",
					" -- Stephen McConnel <*****@*****.**>  Fri, 12 Jul 2013 14:57:59 -0500", ""
				});
				testMarkdown.MarkdownFile = mdFile;
				testMarkdown.VersionNumber = "2.3.11";
				testMarkdown.ProductName = "myfavoriteapp";
				testMarkdown.ChangelogAuthorInfo = "Steve McConnel <*****@*****.**>";
				testMarkdown.DebianChangelog = changeLogFile;
				Assert.That(testMarkdown.UpdateDebianChangelog(), Is.True);
				var newContents = File.ReadAllLines(changeLogFile);
				Assert.AreEqual(newContents.Length, 13, "New changelog entry was not the expected length");
				Assert.That(newContents[0], Is.StringStarting("myfavoriteapp (2.3.11) unstable; urgency=low"));
				//Make sure that the author line matches debian standards for time offset and spacing around author name
				Assert.That(newContents[5], Is.StringMatching(" -- " + testMarkdown.ChangelogAuthorInfo + "  .*[+-]\\d\\d\\d\\d"));
			}
		}
		public void StampMarkdownDoesNothingWhenTold()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"), null))
			{
				var devVersionLine = "## DEV_VERSION_NUMBER: DEV_RELEASE_DATE";
				File.WriteAllLines(tempFiles.FirstFile,
					new[] {devVersionLine, "*with some random content", "*does some things"});
				testMarkdown.MarkdownFile = tempFiles.FirstFile;
				testMarkdown.VersionNumber = "2.3.10";
				testMarkdown.StampMarkdownFile = false;
				Assert.That(testMarkdown.StampMarkdownFileWithVersion(), Is.True);
				var newContents = File.ReadAllLines(tempFiles.FirstFile);
				Assert.That(newContents.Length == 3);
				Assert.That(newContents[0], Is.StringMatching(devVersionLine));
			}
		}
		public void StampMarkdownWorks()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(var tempFiles = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), "Test.md"), null))
			{
				File.WriteAllLines(tempFiles.FirstFile,
					new[] {"## DEV_VERSION_NUMBER: DEV_RELEASE_DATE", "*with some random content", "*does some things"});
				testMarkdown.MarkdownFile = tempFiles.FirstFile;
				testMarkdown.VersionNumber = "2.3.10";
				testMarkdown.StampMarkdownFile = true;
				var day = string.Format("{0:dd/MMM/yyyy}", DateTime.Now);
				Assert.That(testMarkdown.StampMarkdownFileWithVersion(), Is.True);
				var newContents = File.ReadAllLines(tempFiles.FirstFile);
				Assert.That(newContents.Length == 3);
				Assert.That(newContents[0], Is.StringMatching("## 2.3.10 " + day));
			}
		}
		public void HtmlWithReleaseNotesElementWithContentsIsChanged()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(
				var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.md"),
					Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.htm")))
			{
				var markdownFile = filesForTest.FirstFile;
				var htmlFile = filesForTest.SecondFile;
				File.WriteAllLines(markdownFile,
					new[]
					{"## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things"});
				File.WriteAllLines(htmlFile,
					new[]
					{
						"<html>", "<body>", "<div class='releasenotes'>", "<span class='note'/>", "</div>",
						"</body>", "</html>"
					});
				testMarkdown.MarkdownFile = markdownFile;
				testMarkdown.HtmlFile = htmlFile;
				Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
				AssertThatXmlIn.File(htmlFile).HasNoMatchForXpath("//span[@class='note']");
				AssertThatXmlIn.File(htmlFile).HasSpecifiedNumberOfMatchesForXpath("//*[@class='releasenotes']", 1);
			}
		}
		public void HtmlWithNoReleaseNotesElementIsCompletelyReplaced()
		{
			var testMarkdown = new GenerateReleaseArtifacts();
			using(
				var filesForTest = new TwoTempFilesForTest(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.md"),
					Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()+".Test.htm")))
			{
				var markdownFile = filesForTest.FirstFile;
				var htmlFile = filesForTest.SecondFile;
				File.WriteAllLines(markdownFile,
					new[]
					{"## 2.3.9", "* with some random content", "* does some things", "## 2.3.7", "* more", "## 2.2.2", "* things"});
				File.WriteAllLines(htmlFile,
					new[] {"<html>", "<body>", "<div class='notmarkdown'/>", "</body>", "</html>"});
				testMarkdown.MarkdownFile = markdownFile;
				testMarkdown.HtmlFile = htmlFile;
				Assert.That(testMarkdown.CreateHtmFromMarkdownFile(), Is.True);
				AssertThatXmlIn.File(htmlFile).HasNoMatchForXpath("//div[@notmarkdown]");
			}
		}