aboutsummaryrefslogtreecommitdiffstats
path: root/FMark/src/Common/HTMLGen/HTMLGenTester.fs
blob: e7fb31f5423993012b0a6da4f03a500138b20b07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
module HTMLGenTester

open Types
open HTMLGen
open HTMLGenHelpers
open Expecto

let id x = x
let makeExpectoTestList inputTransform outputTransform testFunc name listOfIOPairs =
    let makeOneTest i (inn, out, msg) = testCase (sprintf "HTMLGEN/test number: %d" i) <| fun () ->
        Expect.equal (inn |> inputTransform |> testFunc) (outputTransform out) msg
    listOfIOPairs
    |> List.indexed
    |> List.map (fun (i, triple) -> makeOneTest i triple )
    |> Expecto.Tests.testList name

let catStr strList =
    String.concat "" strList

//////////////////////////////////
// tests
//////////////////////////////////

[<Tests>]
let strInlineElementsTests =
    makeExpectoTestList id id strInlineElements "strInlineElementsTests" [
        (
            [FrmtedString(Strong([FrmtedString(Literal "Go go go!")]))],
            "<strong>Go go go!</strong>", "strong tag"
        );
        (
            [FrmtedString(Emphasis([FrmtedString(Literal "Go go go!")]))],
            "<em>Go go go!</em>", "em tag"
        );
        (
            [FrmtedString(Strike([FrmtedString(Literal "Go go go!")]))],
            "<del>Go go go!</del>", "del tag"
        );
        (
            [Link(Emphasis([FrmtedString(Literal "Go go go!")]), "www.google.co.uk")],
            "<a href=\"www.google.co.uk\"><em>Go go go!</em></a>", "a tag"
        );
        (
            [Picture("404 not found", "www.google.co.uk/img.jpg")],
            "<img src=\"www.google.co.uk/img.jpg\" alt=\"404 not found\">", "picture tag"
        );
    ]

[<Tests>]
let paragraphTests =
    makeExpectoTestList id id strParagraph "paragraph tests" [
        (
            [[FrmtedString(Strong([FrmtedString(Literal "Go go go!")]))]],
            "<p><strong>Go go go!</strong></p>", "strong tag"
        );
        (
            [[FrmtedString(Strong([FrmtedString(Literal "Go go go!")])); Link(Literal "broken link", "brokenURL")]],
            "<p><strong>Go go go!</strong><a href=\"brokenURL\">broken link</a></p>", "strong and link tag"
        );
        (
            [[FrmtedString((Literal "Go go go!")); Link(Literal "broken link", "brokenURL")]; [FrmtedString(Literal "Come!")]],
            "<p>Go go go!<a href=\"brokenURL\">broken link</a>"+NewLineStr+"Come!</p>", "indent test"
        );
    ]

[<Tests>]
let bodyTests =
    makeExpectoTestList id id strBody "body tests" [
        (
            [Paragraph[[FrmtedString(Strong([FrmtedString(Literal "Go go go!")]))]]],
            "<p><strong>Go go go!</strong></p>", "strong tag"
        );
        (
            [Paragraph[[FrmtedString(Strong([FrmtedString(Literal "Go go go!")])); Link(Literal "broken link", "brokenURL")]]],
            "<p><strong>Go go go!</strong><a href=\"brokenURL\">broken link</a></p>", "strong and link tag"
        );
        (
            [CodeBlock("fsharp is cool", FSharp)],
            "<code language=\"fsharp\">fsharp is cool</code>", "codeblock, noninline"
        );
        (
            [Quote([FrmtedString(Literal "fsharp is cool")])],
            "<q>fsharp is cool</q>", "quote"
        );
    ]

[<Tests>]
let bodyTableTests =
    makeExpectoTestList id id strTable "body table tests" [
        (
            [PCells([CellLine([FrmtedString(Literal "head")], true, NoAlign)], true)],
            "<table><thead><tr><th>head</th></tr></thead><tbody></tbody></table>", "one thead only"
        );
        (
            [PCells([CellLine([FrmtedString(Literal "head")], true, Left);CellLine([FrmtedString(Literal "head")], true, Right)], true)],
            "<table><thead><tr><th align=\"left\">head</th><th align=\"right\">head</th></tr></thead><tbody></tbody></table>", "two theads with different align"
        );
    ]

[<Tests>]
let listTests =
    makeExpectoTestList id id strList "list tests" [
        (
            {ListType=OL 1;ListItem=[StringItem[FrmtedString(Literal "first")]];Depth=1},
            "<ol start=\"1\"><li>first</li></ol>", "ol, 1 li"
        );
        (
            {ListType=OL 10;ListItem=[StringItem[FrmtedString(Literal "first")]];Depth=1},
            "<ol start=\"10\"><li>first</li></ol>", "ol, 1 li, startNo with 10"
        );
        (
            {ListType=UL;ListItem=[StringItem[FrmtedString(Literal "first")]];Depth=1},
            "<ul><li>first</li></ul>", "ul, 1 li"
        );
        (
            {ListType=UL;ListItem=
            [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")] ];Depth=1},
            "<ul><li>first</li><li>second</li></ul>", "ul, 2 li"
        );
        (
            {ListType=UL;ListItem=
            [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")];
                NestedList{ListType=OL 1;ListItem=
                [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")] ];Depth=2} ];
            Depth=1},
            "<ul><li>first</li><li>second</li><ol start=\"1\"><li>first</li><li>second</li></ol></ul>", "ol inside ul"
        );
    ]

[<Tests>]
let headerTests =
    makeExpectoTestList id id strHeader "header tests" [
        (
            ({HeaderName=[FrmtedString(Literal "header")]; Level=1; RefID="header1"}),
            "<h1 id=\"header1\">header</h1>", "h1"
        );
        (
            ({HeaderName=[FrmtedString(Literal "header")]; Level=2; RefID="header2"}),
            "<h2 id=\"header2\">header</h2>", "h2"
        );
    ]

[<Tests>]
let footnoteTests =
    makeExpectoTestList id id strRef "footnote tests" [
        (
            (string 3, [FrmtedString (Literal "footer3")]),
            "<p id=\"3\">[3] footer3</p>", "footer 3"
        );
        (
            ("abcd",[FrmtedString (Literal "footer3")]),
            "<p id=\"abcd\">[abcd] footer3</p>", "footer string"
        );
    ]

[<Tests>]
let ``HTML head generation test``=
    makeExpectoTestList id id genHead "HTML head generation test" [
        (
            "tiny title",
            "<head><meta name=\"viewport\" content=\"width=device-width\"><title>tiny title</title></head>",
            "simple header"
        );
    ]

[<Tests>]
let TOCTests =
    // RefID does not matter in hdLst because it exsits in HeaderName as a Link
    let hLst1 = [{HeaderName=[FrmtedString(Literal "header1")]; Level=1; RefID="header1"}
                     ;{HeaderName=[FrmtedString(Literal "header2")]; Level=1; RefID="header1"}
                     ;{HeaderName=[FrmtedString(Literal "header3")]; Level=1; RefID="header1"}
                     ]
    let hLst2 = hLst1@[{HeaderName=[FrmtedString(Literal "header4")]; Level=2; RefID="header1"}]

    let hLst3 =       [{HeaderName=[FrmtedString(Literal "header1")]; Level=1; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header2")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header3")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header4")]; Level=3; RefID="header1"}]
    let hLst4 =       [{HeaderName=[FrmtedString(Literal "header1")]; Level=1; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header2")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header3")]; Level=3; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header4")]; Level=1; RefID="header1"}]

    let hLst5 =       [{HeaderName=[FrmtedString(Literal "header1")]; Level=1; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header2")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header3")]; Level=3; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header4")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header5")]; Level=1; RefID="header1"}]

    let hLst6 =       [{HeaderName=[FrmtedString(Literal "header1")]; Level=1; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header2")]; Level=2; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header3")]; Level=3; RefID="header1"}
                      ;{HeaderName=[FrmtedString(Literal "header4")]; Level=3; RefID="header1"}]

    makeExpectoTestList id (Shared.removeChars ["\t";"\n";"\r"]) strToC "Table of contents test" [
        // tabs to make better formats
        // spaces needs to be preserved, e.g. ol start="1"
        (
            {HeaderLst=hLst1},
            "<ol start=\"1\">
				<li>header1</li>
				<li>header2</li>
				<li>header3</li>
			</ol>",
            "Simple TOC test, all same level"
        );
        (
            {HeaderLst=hLst2},
            "<ol start=\"1\">
				<li>header1</li>
				<li>header2</li>
				<li>header3</li>
				<ol start=\"1\">
					<li>header4</li>
				</ol>
			</ol>",
            "Simple TOC test, one header2"
        );
        (
            {HeaderLst=hLst3},
            "<ol start=\"1\">
				<li>header1</li>
				<ol start=\"1\">
					<li>header2</li>
					<li>header3</li>
					<ol start=\"1\">
						<li>header4</li>
					</ol>
				</ol>
			</ol>",
            "Harder TOC test, two header 2s and a header 3"
        );
        (
            {HeaderLst=hLst4},
            "<ol start=\"1\">
				<li>header1</li>
				<ol start=\"1\">
					<li>header2</li>
					<ol start=\"1\">
						<li>header3</li>
					</ol>
				</ol>
				<li>header4</li>
			</ol>",
            "Deep then shallow TOC"
        );
        (
            {HeaderLst=hLst5},
            "<ol start=\"1\">
				<li>header1</li>
				<ol start=\"1\">
					<li>header2</li>
					<ol start=\"1\">
						<li>header3</li>
					</ol>
					<li>header4</li>
				</ol>
				<li>header5</li>
			</ol>",
            "Pyramid test"
        );
        (
            {HeaderLst=hLst6},
                "<ol start=\"1\">
					<li>header1</li>
					<ol start=\"1\">
						<li>header2</li>
						<ol start=\"1\">
							<li>header3</li>
							<li>header4</li>
						</ol>
					</ol>
				</ol>",
                "Two level 3 headers test"
            );
    ]

[<Tests>]
let fullBodyTests =
    makeExpectoTestList id catStr strBody "full body tests" [
        (
            [
                Header({HeaderName=[FrmtedString(Literal "header")]; Level=1; RefID="header1"});
                List{ListType=UL;ListItem=
                    [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")];
                        NestedList{ListType=OL 1;ListItem=
                        [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")] ];
                        Depth=2} ];
                    Depth=1};
                Table[PCells([CellLine([FrmtedString(Literal "head")], true, Left);CellLine([FrmtedString(Literal "head")], true, Right)], true)];
                Paragraph[[FrmtedString((Literal "Go go go!")); Link(Literal "broken link", "brokenURL")]; [FrmtedString(Literal "Come!")]]
            ],
            ["<h1 id=\"header1\">header</h1>";
            "<ul><li>first</li><li>second</li><ol start=\"1\"><li>first</li><li>second</li></ol></ul>";
            "<table><thead><tr><th align=\"left\">head</th><th align=\"right\">head</th></tr></thead><tbody></tbody></table>";
            "<p>Go go go!<a href=\"brokenURL\">broken link</a>";NewLineStr;"Come!</p>"]
            , "the bodyshop"
        );
    ]

[<Tests>]
let reallyBigTest =
    makeExpectoTestList id catStr genHTML "inherited big test" [
        ("big HTML test",
            [Paragraph [[FrmtedString (Literal "text1#text2")]];
                Header ({HeaderName = [FrmtedString (Literal "Header1")]; Level = 1; RefID="Header10"});
                Paragraph [[InlineFootnote (Literal "Footer1","footnote-1"); FrmtedString (Literal "text4")]];
                Paragraph [[InlineCitation(Literal "(Wang, 2017)","footnote-Eric"); FrmtedString (Literal "text6")]];
                Footnote (1,[FrmtedString (Literal "footer1")]);
                Citation (
                    "footnote-Eric",Literal "(Wang, 2017)",
                    [FrmtedString (Literal "Eric Wang. "); FrmtedString (Literal "2017. ");
                    FrmtedString (Literal "\"Not a real website.\" ");
                    FrmtedString (Literal "Accessed March 4, 2018. ");
                    Link (Literal "www.example.com/website","www.example.com/website")]
                )
            ]),
            ["<!DOCTYPE html><head><meta name=\"viewport\" content=\"width=device-width\"><title>big HTML test</title></head>";
            "<body>";
            "<p>text1#text2</p>";
            "<h1 id=\"Header10\">Header1</h1>";
            "<p><sup><a href=\"#footnote-1\">Footer1</a></sup>text4</p>";
            "<p><a href=\"#footnote-Eric\">(Wang, 2017)</a>text6</p>";
            "<p id=\"1\">[1] footer1</p>";
            "<p id=\"footnote-Eric\">[footnote-Eric] Eric Wang. 2017. \"Not a real website.\" Accessed March 4, 2018. <a href=\"www.example.com/website\">www.example.com/website</a></p>";
            "<script type=\"text/javascript\" async src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML\"></script>";
            "</body>"],
            "wow very big"
    ]



[<Tests>]
let ``global simple test`` =
    makeExpectoTestList id catStr genHTML "top level genHTML test" [
        ("FMarkToHtml first release",
            [
                Header({HeaderName=[FrmtedString(Literal "header")]; Level=1; RefID="header1"});
                List{ListType=UL;ListItem=
                    [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")];
                        NestedList{ListType=OL 1;ListItem=
                        [StringItem[FrmtedString(Literal "first")]; StringItem[FrmtedString(Literal "second")] ];
                        Depth=2} ];
                    Depth=1};
                Table[PCells([CellLine([FrmtedString(Literal "head")], true, Left);CellLine([FrmtedString(Literal "head")], true, Right)], true)];
                Paragraph[[FrmtedString((Literal "Go go go!")); Link(Literal "broken link", "brokenURL")]; [FrmtedString(Literal "Come!")]]
            ]),
        ["<!DOCTYPE html><head><meta name=\"viewport\" content=\"width=device-width\">";
        "<title>FMarkToHtml first release</title>";
        "</head>";
        "<body><h1 id=\"header1\">header</h1><ul><li>first</li><li>second</li><ol start=\"1\"><li>first</li><li>second</li></ol></ul><table><thead><tr><th align=\"left\">head</th><th align=\"right\">head</th></tr></thead><tbody></tbody></table><p>Go go go!<a href=\"brokenURL\">broken link</a>";
        NewLineStr;"Come!</p>";
        "<script type=\"text/javascript\" async src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML\"></script>";
        "</body>"] ,
         "all in one"
    ]