123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- {
- This file is part of the Free Component Library (FCL)
- Copyright (c) 2025 by Michael Van Canneyt
- Markdown HTML renderer tests
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit UTest.Markdown.HTMLRender;
- {$mode ObjFPC}{$H+}
- interface
- uses
- Classes, SysUtils, fpcunit, testregistry,
- MarkDown.Elements,
- MarkDown.HtmlRender;
- type
- { TTestHTMLRender }
- TTestHTMLRender = Class(TTestCase)
- private
- FHTMLRenderer : TMarkDownHTMLRenderer;
- FDocument: TMarkDownDocument;
- Public
- Procedure SetUp; override;
- Procedure TearDown; override;
- function CreateTextBlock(aParent: TMarkdownBlock; const aText,aTextNode: string; aNodeStyle : TNodeStyles=[]): TMarkDownTextBlock;
- function CreateParagraphBlock(const aTextNode: string): TMarkdownBlock;
- function CreateQuotedBlock(const aTextNode: string): TMarkdownBlock;
- function CreateHeadingBlock(const aTextNode: string; aLevel : integer): TMarkdownBlock;
- function CreateListBlock(aOrdered : boolean; const aListItemText : string): TMarkDownListBlock;
- function CreateListItemBlock(aParent: TMarkDownContainerBlock; const aText: string): TMarkDownListItemBlock;
- function AppendTextNode(aBlock: TMarkDownTextBlock; const aText: string; aNodeStyle : TNodeStyles) : TMarkDownTextNode;
- procedure TestRender(const aHTML : string);
- Property Renderer : TMarkDownHTMLRenderer Read FHTMLRenderer;
- Property Document : TMarkDownDocument Read FDocument;
- Published
- procedure TestHookup;
- procedure TestEmpty;
- procedure TestEmptyNoEnvelope;
- procedure TestEmptyTitle;
- procedure TestEmptyHead;
- procedure TestTextBlockEmpty;
- procedure TestTextBlockText;
- procedure TestTextBlockTextStrong;
- procedure TestTextBlockTextEmph;
- procedure TestTextBlockTextDelete;
- procedure TestTextBlockTextStrongEmph;
- procedure TestTextBlockTextStrongEmphSplit1;
- procedure TestTextBlockTextStrongEmphSplit2;
- procedure TestPragraphBlockEmpty;
- procedure TestPragraphBlockText;
- procedure TestQuotedBlockEmpty;
- procedure TestQuotedBlockText;
- procedure TestHeadingBlockEmpty;
- procedure TestHeadingBlockText;
- procedure TestHeadingBlockTextLevel2;
- procedure TestUnorderedListEmpty;
- procedure TestUnorderedListOneItem;
- end;
- implementation
- { TTestHTMLRender }
- procedure TTestHTMLRender.SetUp;
- begin
- FHTMLRenderer:=TMarkDownHTMLRenderer.Create(Nil);
- FDocument:=TMarkDownDocument.Create(Nil,1);
- end;
- procedure TTestHTMLRender.TearDown;
- begin
- FreeAndNil(FDocument);
- FreeAndNil(FHTMLRenderer);
- end;
- function TTestHTMLRender.CreateTextBlock(aParent: TMarkdownBlock; const aText, aTextNode: string; aNodeStyle: TNodeStyles): TMarkDownTextBlock;
- begin
- Result:=TMarkDownTextBlock.Create(aParent,1,aText);
- if aTextNode<>'' then
- AppendTextNode(Result,aTextNode,aNodeStyle);
- end;
- function TTestHTMLRender.CreateParagraphBlock(const aTextNode: string): TMarkdownBlock;
- begin
- Result:=TMarkDownParagraphBlock.Create(FDocument,1);
- if aTextNode<>'' then
- CreateTextBlock(Result,aTextNode,aTextNode);
- end;
- function TTestHTMLRender.CreateQuotedBlock(const aTextNode: string): TMarkdownBlock;
- begin
- Result:=TMarkDownQuoteBlock.Create(FDocument,1);
- if aTextNode<>'' then
- CreateTextBlock(Result,aTextNode,aTextNode);
- end;
- function TTestHTMLRender.CreateHeadingBlock(const aTextNode: string; aLevel: integer): TMarkdownBlock;
- begin
- Result:=TMarkDownHeadingBlock.Create(FDocument,1,aLevel);
- if aTextNode<>'' then
- CreateTextBlock(Result,aTextNode,aTextNode);
- end;
- function TTestHTMLRender.CreateListItemBlock(aParent: TMarkDownContainerBlock; const aText: string): TMarkDownListItemBlock;
- var
- lPar : TMarkDownParagraphBlock;
- begin
- Result:=TMarkDownListItemBlock.Create(aParent,1);
- lPar:=TMarkDownParagraphBlock.Create(Result,1);
- CreateTextBlock(lPar,'',aText);
- end;
- function TTestHTMLRender.CreateListBlock(aOrdered: boolean; const aListItemText: string): TMarkDownListBlock;
- begin
- Result:=TMarkDownListBlock.Create(FDocument,1);
- Result.ordered:=aOrdered;
- if aListItemText<>'' then
- CreateListItemBlock(Result,aListItemText);
- end;
- function TTestHTMLRender.AppendTextNode(aBlock: TMarkDownTextBlock; const aText: string; aNodeStyle: TNodeStyles): TMarkDownTextNode;
- var
- p : TPosition;
- t : TMarkdownTextNode;
- begin
- if aBlock.Nodes=Nil then
- aBlock.Nodes:=TMarkDownTextNodeList.Create(True);
- p.col:=Length(aBlock.Text);
- p.line:=1;
- t:=TMarkDownTextNode.Create(p,nkText);
- t.addText(aText);
- t.active:=False;
- T.Styles:=aNodeStyle;
- aBlock.Nodes.Add(t);
- Result:=T;
- end;
- procedure TTestHTMLRender.TestRender(const aHTML: string);
- var
- L : TStrings;
- begin
- L:=TstringList.Create;
- try
- L.SkipLastLineBreak:=True;
- Renderer.RenderDocument(FDocument,L);
- assertEquals('Correct html: ',aHTML,L.Text);
- finally
- L.Free;
- end;
- end;
- procedure TTestHTMLRender.TestHookup;
- begin
- AssertNotNull('Have renderer',FHTMLRenderer);
- AssertNotNull('Have document',FDocument);
- AssertEquals('Have empty document',0,FDocument.blocks.Count);
- end;
- procedure TTestHTMLRender.TestEmpty;
- begin
- Renderer.Options:=[hoEnvelope];
- TestRender('<!DOCTYPE html>'+sLineBreak+'<html>'+sLineBreak+'<body>'+sLineBreak+'</body>'+sLineBreak+'</html>');
- end;
- procedure TTestHTMLRender.TestEmptyNoEnvelope;
- begin
- Renderer.Options:=[];
- TestRender('');
- end;
- procedure TTestHTMLRender.TestEmptyTitle;
- begin
- Renderer.Options:=[hoEnvelope,hoHead];
- Renderer.Title:='a';
- TestRender('<!DOCTYPE html>'+sLineBreak+'<html>'+sLineBreak
- +'<head>'+sLineBreak+'<title>a</title>'+sLineBreak+'</head>'+sLineBreak
- +'<body>'+sLineBreak+'</body>'+sLineBreak+'</html>');
- end;
- procedure TTestHTMLRender.TestEmptyHead;
- begin
- Renderer.Options:=[hoEnvelope,hoHead];
- Renderer.Head.Add('<meta charset="UTF8">');
- TestRender('<!DOCTYPE html>'+sLineBreak+'<html>'+sLineBreak
- +'<head>'+sLineBreak+'<meta charset="UTF8">'+sLineBreak+'</head>'+sLineBreak
- +'<body>'+sLineBreak+'</body>'+sLineBreak+'</html>');
- end;
- procedure TTestHTMLRender.TestTextBlockEmpty;
- begin
- CreateTextBlock(Document,'a','');
- TestRender('');
- end;
- procedure TTestHTMLRender.TestTextBlockText;
- begin
- CreateTextBlock(Document,'a','a');
- TestRender('a');
- end;
- procedure TTestHTMLRender.TestTextBlockTextStrong;
- begin
- CreateTextBlock(Document,'a','a',[nsStrong]);
- TestRender('<b>a</b>');
- end;
- procedure TTestHTMLRender.TestTextBlockTextEmph;
- begin
- CreateTextBlock(Document,'a','a',[nsEmph]);
- TestRender('<i>a</i>');
- end;
- procedure TTestHTMLRender.TestTextBlockTextDelete;
- begin
- CreateTextBlock(Document,'a','a',[nsDelete]);
- TestRender('<del>a</del>');
- end;
- procedure TTestHTMLRender.TestTextBlockTextStrongEmph;
- begin
- CreateTextBlock(Document,'a','a',[nsStrong,nsEmph]);
- TestRender('<b><i>a</i></b>');
- end;
- procedure TTestHTMLRender.TestTextBlockTextStrongEmphSplit1;
- var
- lBlock : TMarkDownTextBlock;
- begin
- lBlock:=CreateTextBlock(Document,'a','a ',[nsStrong]);
- AppendTextNode(lBlock,'b',[nsStrong,nsemph]);
- TestRender('<b>a <i>b</i></b>');
- end;
- procedure TTestHTMLRender.TestTextBlockTextStrongEmphSplit2;
- var
- lBlock : TMarkDownTextBlock;
- begin
- lBlock:=CreateTextBlock(Document,'a','a',[nsEmph,nsStrong]);
- AppendTextNode(lBlock,' b',[nsStrong]);
- TestRender('<b><i>a</i> b</b>');
- end;
- procedure TTestHTMLRender.TestPragraphBlockEmpty;
- begin
- CreateParagraphBlock('');
- TestRender('<p></p>');
- end;
- procedure TTestHTMLRender.TestPragraphBlockText;
- begin
- CreateParagraphBlock('a');
- TestRender('<p>a</p>');
- end;
- procedure TTestHTMLRender.TestQuotedBlockEmpty;
- begin
- CreateQuotedBlock('');
- TestRender('<blockquote>'+sLineBreak+'</blockquote>');
- end;
- procedure TTestHTMLRender.TestQuotedBlockText;
- begin
- CreateQuotedBlock('a');
- TestRender('<blockquote>'+sLineBreak+'a</blockquote>');
- end;
- procedure TTestHTMLRender.TestHeadingBlockEmpty;
- begin
- CreateHeadingBlock('',1);
- TestRender('<h1></h1>');
- end;
- procedure TTestHTMLRender.TestHeadingBlockText;
- begin
- CreateHeadingBlock('a',1);
- TestRender('<h1>a</h1>');
- end;
- procedure TTestHTMLRender.TestHeadingBlockTextLevel2;
- begin
- CreateHeadingBlock('a',2);
- TestRender('<h2>a</h2>');
- end;
- procedure TTestHTMLRender.TestUnorderedListEmpty;
- begin
- CreateListBlock(false,'');
- TestRender('<ul>'+sLineBreak+'</ul>');
- end;
- procedure TTestHTMLRender.TestUnorderedListOneItem;
- begin
- CreateListBlock(false,'a');
- TestRender('<ul>'+sLineBreak+'<li>a</li>'+sLineBreak+'</ul>');
- end;
- initialization
- Registertest(TTestHTMLRender);
- end.
|