192 lines
6.6 KiB
Python
Executable File
192 lines
6.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
#******************************************************************************
|
||
# Copyright (C) 2018 Thomas "Cakeisalie5" Touhey <thomas@touhey.fr>
|
||
# This file is part of the textoutpc project, which is MIT-licensed.
|
||
#******************************************************************************
|
||
""" Unit tests for the Python version of textout.
|
||
Uses the builtin `unittest` module.
|
||
"""
|
||
|
||
import unittest
|
||
import textoutpc
|
||
|
||
# Define the tests.
|
||
|
||
__test_cases = {
|
||
# Basic text.
|
||
'': '',
|
||
'lol': '<p>lol</p>',
|
||
'<script>alert(1);</script>': \
|
||
'<p><script>alert(1);</script></p>',
|
||
|
||
# Other tests. (?)
|
||
'[a][c][/a]': '<p>[a][c][/a]</p>',
|
||
'[a][a]': '<p>[a][a]</p>',
|
||
"[<>]><[/<>]": "<p>[<>]><[/<>]</p>",
|
||
|
||
# Autolinking.
|
||
'(http://www.example.org/some-[damn-url]-(youknow))': \
|
||
'<p>(<a href="http://www.example.org/some-[damn-url]-(youknow)">' \
|
||
'http://www.example.org/some-[damn-url]-(youknow)</a>)</p>',
|
||
'https://thomas.touhey.fr/, tu vois ?': \
|
||
'<p><a href="https://thomas.touhey.fr/">https://thomas.touhey.fr/' \
|
||
'</a>, tu vois ?</p>',
|
||
|
||
# Basic text styling.
|
||
'[u][b][a][i][/b]': "<p><u><b>[a]<i></i></b></u></p>",
|
||
'[u][b]a[/]mdr': '<p><u><b>a</b>mdr</u></p>',
|
||
|
||
# Blocks, alignment.
|
||
'[left]': '',
|
||
'[left]lol[/]hi': '<div class="align-left"><p>lol</p></div><p>hi</p>',
|
||
'a[justify]b': '<p>a</p><div class="align-justify"><p>b</p></div>',
|
||
'a[i][justify]b': '<p>a</p>' \
|
||
'<div class="align-justify"><p><i>b</i></p></div>',
|
||
'a[i]k[center]b': '<p>a<i>k</i></p>' \
|
||
'<div class="align-center"><p><i>b</i></p></div>',
|
||
'a[i]k[center][b]b[justify]c[/center]d[/]wouhou': \
|
||
'<p>a<i>k</i></p>' \
|
||
'<div class="align-center"><p><i><b>b</b></i></p></div>' \
|
||
'<div class="align-justify"><p><i><b>c</b></i></p></div>' \
|
||
'<p><i>d</i>wouhou</p>',
|
||
|
||
# Show tag for super preprocessing blocks.
|
||
'[quote][show][justify]hehe': \
|
||
'<div class="citation"><p><div class="align-justify">' \
|
||
'<p>hehe</p></div></p></div>',
|
||
|
||
# Titles.
|
||
'lolk[title]smth': '<p>lolk</p>' '<h4>smth</h4>',
|
||
'[subtitle]<>': '<h5><></h5>',
|
||
|
||
# Fonts.
|
||
'[arial]test': '<p><span style="font-family: arial">test</span></p>',
|
||
'[font=mono]stereo': \
|
||
'<p><span style="font-family: monospace">stereo</span></p>',
|
||
'[haettenschweiler]': '',
|
||
'[font=hello]yea': '<p>[font=hello]yea</p>',
|
||
|
||
# Color.
|
||
'yea[color=blue]dabadee': \
|
||
'<p>yea<span style="color: #0000FF">dabadee</span></p>',
|
||
'[color=#12345F]a': '<p><span style="color: #12345F">a</span></p>',
|
||
'[color=#123]a': '<p><span style="color: #112233">a</span></p>',
|
||
'[color=123]a': '<p><span style="color: #010203">a</span></p>',
|
||
'[color=chucknorris]a': '<p><span style="color: #C00000">a</span></p>',
|
||
'[color=rgb(1, 22,242)]a': '<p><span style="color: #0116F2">a</span></p>',
|
||
'[color= rgb (1,22, 242 , 50.0% )]a': '<p><span style="color: #0116F2; ' \
|
||
'color: rgba(1, 22, 242, 0.5)">a</span></p>',
|
||
'[color=rgba(1,22,242,0.500)]a': '<p><span style="color: #0116F2; ' \
|
||
'color: rgba(1, 22, 242, 0.5)">a</span></p>',
|
||
'[color=hsl(0, 1,50.0%)]r': '<p><span style="color: #FF0000">r</span></p>',
|
||
# TODO: hls, hwb
|
||
|
||
# Links.
|
||
'[url]': '<p>[url]</p>',
|
||
'[url=https://thomas.touhey.fr/]mon profil est le meilleur[/url]':
|
||
'<p><a href="https://thomas.touhey.fr/">mon profil est le meilleur' \
|
||
'</a></p>',
|
||
'[url=https://thomas.touhey.fr/]': \
|
||
'<p><a href="https://thomas.touhey.fr/">https://thomas.touhey.fr/' \
|
||
'</a></p>',
|
||
'[url=http://hey.org/lol[]>"a]': '<p><a href="http://hey.org/lol[]>' \
|
||
'"a">' \
|
||
'http://hey.org/lol[]>"a</a></p>',
|
||
'[url]javascript:alert(1)[/url]': '<p>[url]javascript:alert(1)[/url]</p>',
|
||
'[url]<script>alert(1);</script>[/url]': \
|
||
'<p>[url]<script>alert(1);</script>[/url]</p>',
|
||
|
||
'[profil]cake[/profil]': \
|
||
'<p><a href="https://www.planet-casio.com/Fr/compte/voir_profil.php' \
|
||
'?membre=cake">cake</a></p>',
|
||
'[profile]ekac': \
|
||
'<p><a href="https://www.planet-casio.com/Fr/compte/voir_profil.php' \
|
||
'?membre=ekac">ekac</a></p>',
|
||
|
||
# Quotes.
|
||
'[quote]': '',
|
||
'[quote]a': \
|
||
'<div class="citation"><p>a</p></div>',
|
||
'[quote=Test 1 :)]lel[/quote]': \
|
||
'<div class="citation"><p><b>Test 1 ' \
|
||
'<img src="/images/smileys/smile.gif"> a écrit :</b></p><br />' \
|
||
'lel</p></div>',
|
||
|
||
# Spoilers.
|
||
'[spoiler]': '',
|
||
'[spoiler=Hello|world> :D]Close this, quick![/spoiler]': \
|
||
'<div class="spoiler"><div class="title on" ' \
|
||
'onclick="toggleSpoiler(this.parentNode, ' "'open'" ');">Hello' \
|
||
'</div><div class="title off" ' \
|
||
'onclick="toggleSpoiler(this.parentNode, ' "'close'" ');">world' \
|
||
'> <img src="/images/smileys/grin.gif"></div><div class="off">' \
|
||
'Close this, quick!</div></div>',
|
||
|
||
# Code.
|
||
'[code]': '',
|
||
"`[code]`": '<p><span style="font-family: monospace;">[code]</span></p>',
|
||
|
||
'[inlinecode]': '',
|
||
"[inlinecode]`[/inlinecode]": \
|
||
'<p><span style="font-family: monospace;">`</span></p>',
|
||
|
||
"[b]a[noeval]b[/b]c[/noeval]d": "<p><b>ab[/b]cd</b></p>",
|
||
"a[noeval]b[noeval]c[/noeval]d[/noeval]e": "<p>ab[noeval]c[/noeval]de</p>",
|
||
"[noeval]``[/noeval]": "<p>``</p>",
|
||
'[noeval]<>[/noeval]': '<p><></p>',
|
||
|
||
# Pictures.
|
||
'[img]': '<p>[img]</p>',
|
||
'[img]"incroyable<>"[/img]': \
|
||
'<p>[img]"incroyable<>"[/img]</p>',
|
||
|
||
# Videos.
|
||
'[video]"><script>alert(1)</script>[/video]': \
|
||
'<p>[video]"><script>alert(1)</script>' \
|
||
'[/video]</p>',
|
||
'[video]<script>alert(document.cookie)</script>[/video]': \
|
||
'<p>[video]<script>alert(document.cookie)</script>' \
|
||
'[/video]</p>',
|
||
'[video]https://www.youtube.com/watch?v=6odDOOyUawY[/video]': \
|
||
'<div class="video-wrapper video-medium"><iframe ' \
|
||
'src="https://www.youtube.com/embed/6odDOOyUawY" ' \
|
||
'frameborder="0" allowfullscreen></iframe></div>',
|
||
'[video]https://www.youtube.com/watch?v=<script>alert(1)</script>': \
|
||
'<p><a href="https://www.youtube.com/watch?v=<script>alert(1)' \
|
||
'</script>">' \
|
||
'https://www.youtube.com/watch?v=<script>alert(1)' \
|
||
'</script></a></p>',
|
||
|
||
# Progress bars.
|
||
'[progress=lol]mdr[/progress]': '<p>[progress=lol]mdr[/progress]</p>',
|
||
|
||
# Text rotation obfuscation.
|
||
'[rot13]obawbhe[/rot13]': '<p>bonjour</p>',
|
||
}
|
||
|
||
# Define the tests wrapper, and define the classes.
|
||
|
||
_cnt = 0
|
||
_len = len(str(len(__test_cases)))
|
||
_templ = """\
|
||
def test_html{n:0>{l}}(self):
|
||
self.assertEqual({r}, textoutpc.tohtml({i}))
|
||
"""
|
||
|
||
def _wrap_test(inp, res):
|
||
global _cnt
|
||
|
||
_cnt += 1
|
||
return _templ.format(n = _cnt, l = _len, i = repr(inp), r = repr(res))
|
||
|
||
exec("class TextoutHTMLTest(unittest.TestCase):\n maxDiff = None\n" + \
|
||
'\n'.join(map(lambda args: _wrap_test(*args), __test_cases.items())),
|
||
globals())
|
||
|
||
# If run as main script, run the test function.
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main()
|
||
|
||
# End of file.
|