Beispiel #1
0
        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());
        }
Beispiel #2
0
        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);
        }
Beispiel #5
0
        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>
"
                }
            });
        }