public void Create_CreateFlexiSectionHeadingBlock() { // Arrange const int dummyColumn = 12; const int dummyLineIndex = 5; var dummyLine = new StringSlice("dummyLine", 4, 8); BlockProcessor dummyBlockProcessor = MarkdigTypesFactory.CreateBlockProcessor(); dummyBlockProcessor.Line = dummyLine; dummyBlockProcessor.LineIndex = dummyLineIndex; dummyBlockProcessor.Column = dummyColumn; Mock <BlockParser> dummyBlockParser = _mockRepository.Create <BlockParser>(); Mock <IFlexiSectionBlockOptions> dummyFlexiSectionBlockOptions = _mockRepository.Create <IFlexiSectionBlockOptions>(); Mock <FlexiSectionHeadingBlockFactory> mockTestSubject = CreateMockFlexiSectionHeadingBlockFactory(); mockTestSubject.CallBase = true; mockTestSubject.Setup(t => t.SetupIDGenerationAndReferenceLinking(It.IsAny <FlexiSectionHeadingBlock>(), dummyFlexiSectionBlockOptions.Object, dummyBlockProcessor)); // Act FlexiSectionHeadingBlock result = mockTestSubject.Object.Create(dummyBlockProcessor, dummyFlexiSectionBlockOptions.Object, dummyBlockParser.Object); // Assert _mockRepository.VerifyAll(); Assert.Equal(dummyColumn, result.Column); Assert.Equal(dummyLine.Start, result.Span.Start); Assert.Equal(dummyLine.End, result.Span.End); Assert.Equal(dummyLineIndex, result.Line); Assert.Equal(dummyLine.ToString(), result.Lines.ToString()); }
public void Create_CreatesFlexiSectionBlockAndUpdatesOpenFlexiSectionBlocks() { // Arrange var dummyLine = new StringSlice("dummyLine", 4, 8); const int dummyColumn = 4; const string dummyBlockName = "dummyBlockName"; const string dummyResolvedBlockName = "dummyResolvedBlockName"; const SectioningContentElement dummyElement = SectioningContentElement.Aside; const string dummyLinkIcon = "dummyLinkIcon"; const FlexiSectionBlockRenderingMode dummyRenderingMode = FlexiSectionBlockRenderingMode.Classic; const int dummyLevel = 5; var dummyAttributes = new ReadOnlyDictionary <string, string>(new Dictionary <string, string>()); Mock <IFlexiSectionBlockOptions> dummyFlexiSectionBlockOptions = _mockRepository.Create <IFlexiSectionBlockOptions>(); dummyFlexiSectionBlockOptions.Setup(f => f.BlockName).Returns(dummyBlockName); dummyFlexiSectionBlockOptions.Setup(f => f.Element).Returns(dummyElement); dummyFlexiSectionBlockOptions.Setup(f => f.RenderingMode).Returns(dummyRenderingMode); dummyFlexiSectionBlockOptions.Setup(f => f.LinkIcon).Returns(dummyLinkIcon); dummyFlexiSectionBlockOptions.Setup(f => f.Attributes).Returns(dummyAttributes); Mock <BlockParser> dummyBlockParser = _mockRepository.Create <BlockParser>(); BlockProcessor dummyBlockProcessor = MarkdigTypesFactory.CreateBlockProcessor(); dummyBlockProcessor.Column = dummyColumn; dummyBlockProcessor.Line = dummyLine; var dummyFlexiSectionHeadingBlock = new FlexiSectionHeadingBlock(null); Mock <IFlexiSectionHeadingBlockFactory> mockFlexiSectionHeadingBlockFactory = _mockRepository.Create <IFlexiSectionHeadingBlockFactory>(); mockFlexiSectionHeadingBlockFactory. Setup(f => f.Create(dummyBlockProcessor, dummyFlexiSectionBlockOptions.Object, dummyBlockParser.Object)). Returns(dummyFlexiSectionHeadingBlock); Mock <IOptionsService <IFlexiSectionBlockOptions, IFlexiSectionBlocksExtensionOptions> > mockOptionsService = _mockRepository.Create <IOptionsService <IFlexiSectionBlockOptions, IFlexiSectionBlocksExtensionOptions> >(); mockOptionsService.Setup(o => o.CreateOptions(dummyBlockProcessor)).Returns((dummyFlexiSectionBlockOptions.Object, null)); Mock <FlexiSectionBlockFactory> mockTestSubject = CreateMockFlexiSectionBlockFactory(mockOptionsService.Object, mockFlexiSectionHeadingBlockFactory.Object); mockTestSubject.CallBase = true; mockTestSubject.Setup(t => t.ValidateLevel(dummyLevel)); mockTestSubject.Setup(t => t.ResolveBlockName(dummyBlockName)).Returns(dummyResolvedBlockName); mockTestSubject.Setup(t => t.ValidateElement(dummyElement)); mockTestSubject.Setup(t => t.ValidateRenderingMode(dummyRenderingMode)); mockTestSubject.Setup(t => t.UpdateOpenFlexiSectionBlocks(dummyBlockProcessor, It.IsAny <FlexiSectionBlock>())); // Act FlexiSectionBlock result = mockTestSubject.Object.Create(dummyLevel, dummyBlockProcessor, dummyBlockParser.Object); // Assert _mockRepository.VerifyAll(); Assert.Equal(dummyResolvedBlockName, result.BlockName); Assert.Equal(dummyElement, result.Element); Assert.Equal(dummyLinkIcon, result.LinkIcon); Assert.Equal(dummyRenderingMode, result.RenderingMode); Assert.Equal(dummyLevel, result.Level); Assert.Same(dummyAttributes, result.Attributes); Assert.Same(dummyBlockParser.Object, result.Parser); Assert.Equal(dummyColumn, result.Column); Assert.Equal(dummyLine.Start, result.Span.Start); Assert.Equal(dummyLine.End, result.Span.End); Assert.Single(result); Assert.Same(dummyFlexiSectionHeadingBlock, result[0]); }
public void WriteStandard_RendersStandardFlexiSectionBlock(FlexiSectionBlock dummyFlexiSectionBlock, FlexiSectionHeadingBlock dummyFlexiSectionHeadingBlock, string expectedResult) { // Arrange dummyFlexiSectionBlock.Add(dummyFlexiSectionHeadingBlock); var dummyStringWriter = new StringWriter(); var dummyHtmlRenderer = new HtmlRenderer(dummyStringWriter); // Note that markdig changes dummyStringWriter.NewLine to '\n' FlexiSectionBlockRenderer testSubject = CreateFlexiSectionBlockRenderer(); // Act testSubject.Write(dummyHtmlRenderer, dummyFlexiSectionBlock); string result = dummyStringWriter.ToString(); // Assert Assert.Equal(expectedResult, result, ignoreLineEndingDifferences: true); }
public void WriteClassic_RendersClassicFlexiSectionBlock() { // Arrange const int dummyLevel = 6; const string dummyHeadingText = "dummyHeadingText"; var dummyHeadingContainerInline = new ContainerInline(); dummyHeadingContainerInline.AppendChild(new LiteralInline(dummyHeadingText)); FlexiSectionHeadingBlock dummyFlexiSectionHeadingBlock = CreateFlexiSectionHeadingBlock(); dummyFlexiSectionHeadingBlock.Inline = dummyHeadingContainerInline; const string dummyChildText = "dummyChildText"; var dummyChildContainerInline = new ContainerInline(); dummyChildContainerInline.AppendChild(new LiteralInline(dummyChildText)); var dummyChildBlock = new ParagraphBlock() { Inline = dummyChildContainerInline }; var dummyStringWriter = new StringWriter(); var dummyHtmlRenderer = new HtmlRenderer(dummyStringWriter); FlexiSectionBlockRenderer testSubject = CreateFlexiSectionBlockRenderer(); FlexiSectionBlock flexiSectionBlock = CreateFlexiSectionBlock(level: dummyLevel); flexiSectionBlock.Add(dummyFlexiSectionHeadingBlock); flexiSectionBlock.Add(dummyChildBlock); // Act testSubject.WriteClassic(dummyHtmlRenderer, flexiSectionBlock); // Assert string result = dummyStringWriter.ToString(); Assert.Equal($@"<h{dummyLevel}>{dummyHeadingText}</h{dummyLevel}> <p>{dummyChildText}</p> ", result, ignoreLineEndingDifferences: true); }
public void SetupIDGenerationAndReferenceLinking_AddsFlexiSectionHeadingBlockToReferenceLinkableFlexiSectionHeadingBlocksIfGenerateIDAndReferenceLinkableAreTrue() { // Arrange BlockProcessor dummyBlockProcessor = MarkdigTypesFactory.CreateBlockProcessor(); FlexiSectionHeadingBlock dummyFlexiSectionHeadingBlock = CreateFlexiSectionHeadingBlock(); Mock <IFlexiSectionBlockOptions> mockFlexiSectionBlockOptions = _mockRepository.Create <IFlexiSectionBlockOptions>(); mockFlexiSectionBlockOptions.Setup(f => f.GenerateID).Returns(true); mockFlexiSectionBlockOptions.Setup(f => f.ReferenceLinkable).Returns(true); var dummyReferenceLinkableFlexiSectionHeadingBlocks = new List <FlexiSectionHeadingBlock>(); Mock <FlexiSectionHeadingBlockFactory> mockTestSubject = CreateMockFlexiSectionHeadingBlockFactory(); mockTestSubject.CallBase = true; mockTestSubject.Setup(t => t.GetOrCreateReferenceLinkableFlexiSectionHeadingBlocks(dummyBlockProcessor.Document)).Returns(dummyReferenceLinkableFlexiSectionHeadingBlocks); // Act mockTestSubject.Object.SetupIDGenerationAndReferenceLinking(dummyFlexiSectionHeadingBlock, mockFlexiSectionBlockOptions.Object, dummyBlockProcessor); // Assert _mockRepository.VerifyAll(); Assert.Single(dummyReferenceLinkableFlexiSectionHeadingBlocks); Assert.Same(dummyFlexiSectionHeadingBlock, dummyReferenceLinkableFlexiSectionHeadingBlocks[0]); }
public static IEnumerable <object[]> WriteStandard_RendersStandardFlexiSectionBlock_Data() { const string dummyBlockName = "dummyBlockName"; const string dummyLinkIcon = "<dummyLinkIcon></dummyLinkIcon>"; const string dummyLinkIconWithClass = "<dummyLinkIcon class=\"__link-icon\"></dummyLinkIcon>"; const string dummyAttributeKey1 = "dummyAttributeKey1"; const string dummyAttributeValue1 = "dummyAttributeValue1"; const string dummyAttributeKey2 = "dummyAttributeKey2"; const string dummyAttributeValue2 = "dummyAttributeValue2"; const string dummyClass = "dummyClass"; const string dummyID = "dummyID"; const string dummyGeneratedID = "dummyGeneratedID"; const SectioningContentElement dummyElement = SectioningContentElement.Aside; const int dummyLevel = 2; const string dummyHeadingContent = "dummyHeadingContent"; var dummyHeadingContainerInline = new ContainerInline(); dummyHeadingContainerInline.AppendChild(new LiteralInline(dummyHeadingContent)); FlexiSectionHeadingBlock dummyFlexiSectionHeadingBlockWithContent = CreateFlexiSectionHeadingBlock(); dummyFlexiSectionHeadingBlockWithContent.Inline = dummyHeadingContainerInline; return(new object[][] { // BlockName is assigned as a class of the root element and all default classes are prepended with it new object[] { CreateFlexiSectionBlock(dummyBlockName, level: dummyLevel), CreateFlexiSectionHeadingBlock(), $@"<section class=""{dummyBlockName} {dummyBlockName}_level_2 {dummyBlockName}_no-link-icon""> <header class=""{dummyBlockName}__header""> <h2 class=""{dummyBlockName}__heading""></h2> <button class=""{dummyBlockName}__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // If LinkIcon is valid HTML, it is rendered with a default class and a _has-link-icon class is rendered new object[] { CreateFlexiSectionBlock(linkIcon: dummyLinkIcon, level: dummyLevel), CreateFlexiSectionHeadingBlock(), $@"<section class="" _level_2 _has-link-icon""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> {dummyLinkIconWithClass} </button> </header> </section> " }, // If LinkIcon is null, whitespace or an empty string, no copy icon is rendered and a _no-link-icon class is rendered (null case verified by other tests) new object[] { CreateFlexiSectionBlock(linkIcon: " ", level: dummyLevel), CreateFlexiSectionHeadingBlock(), @"<section class="" _level_2 _no-link-icon""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, new object[] { CreateFlexiSectionBlock(linkIcon: string.Empty, level: dummyLevel), CreateFlexiSectionHeadingBlock(), @"<section class="" _level_2 _no-link-icon""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // If an ID is generated, it is written new object[] { CreateFlexiSectionBlock(level: dummyLevel), CreateFlexiSectionHeadingBlock(generatedID: dummyGeneratedID), $@"<section class="" _level_2 _no-link-icon"" id=""{dummyGeneratedID}""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // If attributes specified, they're written new object[] { CreateFlexiSectionBlock(level: dummyLevel, attributes: new ReadOnlyDictionary <string, string>(new Dictionary <string, string> { { dummyAttributeKey1, dummyAttributeValue1 }, { dummyAttributeKey2, dummyAttributeValue2 } })), CreateFlexiSectionHeadingBlock(), $@"<section class="" _level_2 _no-link-icon"" {dummyAttributeKey1}=""{dummyAttributeValue1}"" {dummyAttributeKey2}=""{dummyAttributeValue2}""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // Class attribute value is appended to default classes new object[] { CreateFlexiSectionBlock(level: dummyLevel, attributes: new ReadOnlyDictionary <string, string>(new Dictionary <string, string> { { "class", dummyClass } })), CreateFlexiSectionHeadingBlock(), $@"<section class="" _level_2 _no-link-icon {dummyClass}""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // Generated ID takes precedence over any ID in attributes new object[] { CreateFlexiSectionBlock(level: dummyLevel, attributes: new ReadOnlyDictionary <string, string>(new Dictionary <string, string> { { "id", dummyID } })), CreateFlexiSectionHeadingBlock(generatedID: dummyGeneratedID), $@"<section class="" _level_2 _no-link-icon"" id=""{dummyGeneratedID}""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " }, // Specified sectioning content element is rendered new object[] { CreateFlexiSectionBlock(element: dummyElement, level: dummyLevel), CreateFlexiSectionHeadingBlock(), $@"<{dummyElement.ToString().ToLower()} class="" _level_2 _no-link-icon""> <header class=""__header""> <h2 class=""__heading""></h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </{dummyElement.ToString().ToLower()}> " }, // Header content is rendered new object[] { CreateFlexiSectionBlock(level: dummyLevel), dummyFlexiSectionHeadingBlockWithContent, $@"<section class="" _level_2 _no-link-icon""> <header class=""__header""> <h2 class=""__heading"">{dummyHeadingContent}</h2> <button class=""__link-button"" aria-label=""Copy link""> </button> </header> </section> " } }); }