import calendar
import requests
import string
+import sys
import time
+import unittest
import text
for line in thing.render(80):
print(line.ecma48())
+class MyTestLoader(unittest.TestLoader):
+ def loadTestsFromModule(self, module):
+ suite = super().loadTestsFromModule(module)
+ if module.__name__ == '__main__':
+ suite.addTests(super().loadTestsFromModule(text))
+ return suite
+
def main():
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("--log", help="File to log debug information to.")
+ parser.add_argument("--test", nargs=argparse.REMAINDER,
+ help="Run unit tests.")
parser.set_defaults(action=MainUI)
args = parser.parse_args()
+ if args.test is not None:
+ return unittest.main(argv=[sys.argv[0]] + args.test,
+ testLoader=MyTestLoader())
+
instance = "hachyderm.io" # FIXME
if "://" not in instance:
instance = "https://" + instance
import io
import itertools
import time
+import unittest
import wcwidth
class ColouredString:
return self.s
def __repr__(self):
- return f"ColouredString({self.s!r}, {self.c!r})"
+ if self.c.rstrip(" ") == "":
+ return f"ColouredString({self.s!r})"
+ else:
+ return f"ColouredString({self.s!r}, {self.c!r})"
def __eq__(self, rhs):
rhs = type(self)(rhs)
yield line
line, space = ColouredString(''), ColouredString('')
- if len(line) != 0:
+ if len(line) != 0 or len(self.words) == 0:
yield line
def empty(self):
else:
self.unfinished_word += c
+ def __repr__(self):
+ return f"Paragraph({self.words!r}, unfinished={self.unfinished_word!r})"
+
class HTMLParser(html.parser.HTMLParser):
def __init__(self):
super().__init__()
if tag == "p":
if not self.paras[-1].empty():
self.paras.append(Paragraph())
- self.paras.append(Paragraph())
+ self.paras.append(Paragraph())
return
if tag == "br":
self.paras.pop(0)
while len(self.paras) > 0 and self.paras[-1].empty():
self.paras.pop()
+
+class RenderTests(unittest.TestCase):
+ def testBlank(self):
+ bl = BlankLine()
+ self.assertEqual(list(bl.render(80)), [ColouredString('')])
+
+ def testSeparator(self):
+ sl = SeparatorLine(time.mktime((2023,12,2,13,14,15,-1,-1,-1)))
+ self.assertEqual(list(sl.render(40)), [
+ ColouredString('-----------[Sat Dec 2 13:14:15 2023]--',
+ 'SSSSSSSSSSSSDDDDDDDDDDDDDDDDDDDDDDDDSSS'),
+ ])
+
+ def testFrom(self):
+ fl = FromLine("@a@b.c", "abc abc")
+ self.assertEqual(list(fl.render(80)), [
+ ColouredString('From: abc abc (@a@b.c)',
+ ' FFFFFFFFFFFFFFFF'),
+ ])
+
+ def parse_html(self, html, width=50):
+ pp = HTMLParser()
+ pp.feed(html)
+ pp.done()
+ return list(itertools.chain(*[para.render(width)
+ for para in pp.paras]))
+
+ def testHTML(self):
+ html = "<p>Testing, testing, 1, 2, 3</p>"
+ self.assertEqual(self.parse_html(html), [
+ ColouredString('Testing, testing, 1, 2, 3'),
+ ])
+
+ html = "<p>First para</p><p>Second para</p>"
+ self.assertEqual(self.parse_html(html), [
+ ColouredString('First para'),
+ ColouredString(''),
+ ColouredString('Second para'),
+ ])
+
+ html = "<p>First line<br>Second line</p>"
+ self.assertEqual(self.parse_html(html), [
+ ColouredString('First line'),
+ ColouredString('Second line'),
+ ])
+
+ def testWrap(self):
+ html = ("<p>Pease porridge hot, pease porridge cold, pease porridge "
+ "in the pot, nine days old</p>")
+ self.assertEqual(self.parse_html(html), [
+ ColouredString('Pease porridge hot, pease porridge cold, pease'),
+ ColouredString('porridge in the pot, nine days old'),
+ ])