diff --git a/evennia/utils/evform.py b/evennia/utils/evform.py index fd214a3c0e..e7b9151c5d 100644 --- a/evennia/utils/evform.py +++ b/evennia/utils/evform.py @@ -177,7 +177,7 @@ def _to_ansi(obj, regexable=False): return ANSIString(obj, regexable=regexable) -class EvForm(object): +class EvForm: """ This object is instantiated with a text file and parses it for rectangular form fields. It can then be fed a @@ -463,40 +463,3 @@ class EvForm(object): def __str__(self): "Prints the form" return str(ANSIString("\n").join([line for line in self.form])) - - -def _test(): - "test evform. This is used by the unittest system." - form = EvForm("evennia.utils.tests.data.evform_example") - - # add data to each tagged form cell - form.map( - cells={ - "AA": "|gTom the Bouncer", - 2: "|yGriatch", - 3: "A sturdy fellow", - 4: 12, - 5: 10, - 6: 5, - 7: 18, - 8: 10, - 9: 3, - "F": "rev 1", - } - ) - # create the EvTables - tableA = EvTable("HP", "MV", "MP", table=[["**"], ["*****"], ["***"]], border="incols") - tableB = EvTable( - "Skill", - "Value", - "Exp", - table=[ - ["Shooting", "Herbalism", "Smithing"], - [12, 14, 9], - ["550/1200", "990/1400", "205/900"], - ], - border="incols", - ) - # add the tables to the proper ids in the form - form.map(tables={"A": tableA, "B": tableB}) - return str(form) diff --git a/evennia/utils/tests/test_evform.py b/evennia/utils/tests/test_evform.py index ed5a9a8b7f..386d4ee98a 100644 --- a/evennia/utils/tests/test_evform.py +++ b/evennia/utils/tests/test_evform.py @@ -3,60 +3,165 @@ Unit tests for the EvForm text form generator """ from django.test import TestCase -from evennia.utils import evform +from evennia.utils import evform, ansi, evtable class TestEvForm(TestCase): - def test_form(self): - self.maxDiff = None - form1 = evform._test() - form2 = evform._test() + + maxDiff = None + + def _parse_form(self): + "test evform. This is used by the unittest system." + form = evform.EvForm("evennia.utils.tests.data.evform_example") + + # add data to each tagged form cell + form.map( + cells={ + "AA": "|gTom the Bouncer", + 2: "|yGriatch", + 3: "A sturdy fellow", + 4: 12, + 5: 10, + 6: 5, + 7: 18, + 8: 10, + 9: 3, + "F": "rev 1", + } + ) + # create the EvTables + tableA = evtable.EvTable("HP", "MV", "MP", + table=[["**"], ["*****"], ["***"]], + border="incols") + tableB = evtable.EvTable( + "Skill", + "Value", + "Exp", + table=[ + ["Shooting", "Herbalism", "Smithing"], + [12, 14, 9], + ["550/1200", "990/1400", "205/900"], + ], + border="incols", + ) + # add the tables to the proper ids in the form + form.map(tables={"A": tableA, "B": tableB}) + return str(form) + + def _simple_form(self, form): + cellsdict = {1: "Apple", 2: "Banana", 3: "Citrus", 4: "Durian"} + formdict = {"FORMCHAR": 'x', "TABLECHAR": 'c', "FORM": form} + form = evform.EvForm(form=formdict) + form.map(cellsdict) + form = ansi.strip_ansi(str(form)) + # this is necessary since editors/black tend to strip lines spaces + # from the end of lines for the comparison strings. + form = "\n".join(line.rstrip() for line in form.split("\n")) + return form + + def test_form_consistency(self): + """ + Make sure form looks the same every time. + + """ + form1 = self._parse_form() + form2 = self._parse_form() + self.assertEqual(form1, form2) - # self.assertEqual(form1, "") - # '.------------------------------------------------.\n' - # '| |\n' - # '| Name: \x1b[0m\x1b[1m\x1b[32mTom\x1b[1m\x1b[32m \x1b' - # '[1m\x1b[32mthe\x1b[1m\x1b[32m \x1b[0m \x1b[0m ' - # 'Account: \x1b[0m\x1b[1m\x1b[33mGriatch ' - # '\x1b[0m\x1b[0m\x1b[1m\x1b[32m\x1b[1m\x1b[32m\x1b[1m\x1b[32m\x1b[1m\x1b[32m\x1b[0m\x1b[0m ' - # '|\n' - # '| \x1b[0m\x1b[1m\x1b[32mBouncer\x1b[0m \x1b[0m |\n' - # '| |\n' - # ' >----------------------------------------------< \n' - # '| |\n' - # '| Desc: \x1b[0mA sturdy \x1b[0m \x1b[0m' - # ' STR: \x1b[0m12 \x1b[0m\x1b[0m\x1b[0m\x1b[0m' - # ' DEX: \x1b[0m10 \x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| \x1b[0mfellow\x1b[0m \x1b[0m' - # ' INT: \x1b[0m5 \x1b[0m\x1b[0m\x1b[0m\x1b[0m' - # ' STA: \x1b[0m18 \x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| \x1b[0m \x1b[0m' - # ' LUC: \x1b[0m10 \x1b[0m\x1b[0m\x1b[0m' - # ' MAG: \x1b[0m3 \x1b[0m\x1b[0m\x1b[0m |\n' - # '| |\n' - # ' >----------.-----------------------------------< \n' - # '| | |\n' - # '| \x1b[0mHP\x1b[0m|\x1b[0mMV \x1b[0m|\x1b[0mMP\x1b[0m ' - # '| \x1b[0mSkill \x1b[0m|\x1b[0mValue \x1b[0m' - # '|\x1b[0mExp \x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| ~~+~~~+~~ | ~~~~~~~~~~~+~~~~~~~~~~+~~~~~~~~~~~ |\n' - # '| \x1b[0m**\x1b[0m|\x1b[0m***\x1b[0m\x1b[0m|\x1b[0m**\x1b[0m\x1b[0m ' - # '| \x1b[0mShooting \x1b[0m|\x1b[0m12 \x1b[0m' - # '|\x1b[0m550/1200 \x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| \x1b[0m \x1b[0m|\x1b[0m**\x1b[0m \x1b[0m|\x1b[0m*\x1b[0m \x1b[0m ' - # '| \x1b[0mHerbalism \x1b[0m|\x1b[0m14 \x1b[0m' - # '|\x1b[0m990/1400 \x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| \x1b[0m \x1b[0m|\x1b[0m \x1b[0m|\x1b[0m \x1b[0m ' - # '| \x1b[0mSmithing \x1b[0m|\x1b[0m9 \x1b[0m' - # '|\x1b[0m205/900 \x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m\x1b[0m |\n' - # '| | |\n' - # ' -----------`-------------------------------------\n' - # ' Footer: \x1b[0mrev 1 \x1b[0m \n' - # ' info \n' - # ' ') + def test_form_output(self): + """ + Check the result of the form. We strip ansi for readability. + + """ + + form = self._parse_form() + form_noansi = ansi.strip_ansi(form) + # we must strip extra space at the end of output simply + # because editors tend to strip it when creating + # the comparison string ... + form_noansi = "\n".join(line.rstrip() for line in form_noansi.split("\n")) + + self.assertNotEqual(form, form_noansi) + expected = """ +.------------------------------------------------. +| | +| Name: Tom the Account: Griatch | +| Bouncer | +| | + >----------------------------------------------< +| | +| Desc: A sturdy STR: 12 DEX: 10 | +| fellow INT: 5 STA: 18 | +| LUC: 10 MAG: 3 | +| | + >----------.-----------------------------------< +| | | +| HP|MV |MP | Skill |Value |Exp | +| ~~+~~~+~~ | ~~~~~~~~~~~+~~~~~~~~~~+~~~~~~~~~~~ | +| **|***|** | Shooting |12 |550/1200 | +| |** |* | Herbalism |14 |990/1400 | +| | | | Smithing |9 |205/900 | +| | | + -----------`------------------------------------- + Footer: rev 1 + info +""".lstrip() + self.assertEqual(expected, form_noansi) def test_ansi_escape(self): # note that in a msg() call, the result would be the correct |-----, # in a print, ansi only gets called once, so ||----- is the result self.assertEqual(str(evform.EvForm(form={"FORM": "\n||-----"})), "||-----") + + def test_stacked_form(self): + """ + Test simple stacked form. + + """ + form = """ +xxxx1xxxx +xxxx2xxxx +xxxx3xxxx +xxxx4xxxx + """ + expected = """ +Apple +Banana +Citrus +Durian +""".lstrip() + result = self._simple_form(form) + self.assertEqual(expected, result) + + def test_side_by_side_two_column(self): + """ + Side-by-side 2-column form (bug #2205) + + """ + form = """ +xxxx1xxxx xxxx2xxxx +xxxx3xxxx xxxx4xxxx + """ + expected = """ +Apple Banana +Citrus Durian +""".lstrip() + result = self._simple_form(form) + self.assertEqual(expected, result) + + def test_side_by_side_three_column(self): + """ + Side-by-side 3-column form (bug #2205) + + """ + form = """ +xxxx1xxxx xxxx2xxxx xxxx3xxxx +xxxx4xxxx + """ + expected = """ +Apple Banana Citrus +Durian +""".lstrip() + result = self._simple_form(form) + self.assertEqual(expected, result)