summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_table_creator.py180
1 files changed, 135 insertions, 45 deletions
diff --git a/tests/test_table_creator.py b/tests/test_table_creator.py
index ed53efa6..0d2edfb2 100644
--- a/tests/test_table_creator.py
+++ b/tests/test_table_creator.py
@@ -70,14 +70,14 @@ def test_column_alignment():
header = tc.generate_row()
assert header == ('Col 1 Three \n'
' Col 2 line \n'
- ' Col 3 header \n')
+ ' Col 3 header ')
# Create a data row
row_data = ["Val 1", "Val 2", "Val 3", "Three\nline\ndata"]
row = tc.generate_row(row_data=row_data)
assert row == ('Val 1 Three \n'
' Val 2 line \n'
- ' Val 3 data \n')
+ ' Val 3 data ')
def test_wrap_text():
@@ -93,13 +93,13 @@ def test_wrap_text():
'that will \n'
'wrap \n'
'Not wrap \n'
- ' 1 2 3 \n')
+ ' 1 2 3 ')
# Test preserving a multiple space sequence across a line break
row_data = ['First last one']
row = tc.generate_row(row_data=row_data)
assert row == ('First \n'
- ' last one \n')
+ ' last one ')
def test_wrap_text_max_lines():
@@ -110,31 +110,31 @@ def test_wrap_text_max_lines():
row_data = ['First line last line']
row = tc.generate_row(row_data=row_data)
assert row == ('First line\n'
- 'last line \n')
+ 'last line ')
# Test having to truncate the last word because it's too long for the final line
row_data = ['First line last lineextratext']
row = tc.generate_row(row_data=row_data)
assert row == ('First line\n'
- 'last line…\n')
+ 'last line…')
# Test having to truncate the last word because it fits the final line but there is more text not being included
row_data = ['First line thistxtfit extra']
row = tc.generate_row(row_data=row_data)
assert row == ('First line\n'
- 'thistxtfi…\n')
+ 'thistxtfi…')
# Test having to truncate the last word because it fits the final line but there are more lines not being included
row_data = ['First line thistxtfit\nextra']
row = tc.generate_row(row_data=row_data)
assert row == ('First line\n'
- 'thistxtfi…\n')
+ 'thistxtfi…')
# Test having space left on the final line and adding an ellipsis because there are more lines not being included
row_data = ['First line last line\nextra line']
row = tc.generate_row(row_data=row_data)
assert row == ('First line\n'
- 'last line…\n')
+ 'last line…')
def test_wrap_long_word():
@@ -148,7 +148,7 @@ def test_wrap_long_word():
# Test header row
header = tc.generate_row()
assert header == ('LongColumn \n'
- 'Name Col 2 \n')
+ 'Name Col 2 ')
# Test data row
row_data = list()
@@ -162,7 +162,7 @@ def test_wrap_long_word():
row = tc.generate_row(row_data=row_data)
expected = (ansi.RESET_ALL + ansi.fg.green + "LongerThan" + ansi.RESET_ALL + " Word \n"
+ ansi.RESET_ALL + ansi.fg.green + "10" + ansi.fg.reset + ansi.RESET_ALL + ' ' + ansi.RESET_ALL + ' LongerThan\n'
- ' 10 \n')
+ ' 10 ')
assert row == expected
@@ -192,7 +192,7 @@ def test_wrap_long_word_max_data_lines():
row = tc.generate_row(row_data=row_data)
assert row == ('LongerThan LongerThan LongerThan A LongerT…\n'
- '10FitsLast 10FitsLas… 10RunsOve… \n')
+ '10FitsLast 10FitsLas… 10RunsOve… ')
def test_wrap_long_char_wider_than_max_width():
@@ -203,7 +203,7 @@ def test_wrap_long_char_wider_than_max_width():
column_1 = Column("Col 1", width=1)
tc = TableCreator([column_1])
row = tc.generate_row(row_data=['深'])
- assert row == '…\n'
+ assert row == '…'
def test_generate_row_exceptions():
@@ -237,12 +237,12 @@ def test_tabs():
row = tc.generate_row(fill_char='\t', pre_line='\t',
inter_cell='\t', post_line='\t')
- assert row == ' Col 1 Col 2 \n'
+ assert row == ' Col 1 Col 2 '
-def test_simple_table():
- column_1 = Column("Col 1", width=15)
- column_2 = Column("Col 2", width=15)
+def test_simple_table_creation():
+ column_1 = Column("Col 1", width=16)
+ column_2 = Column("Col 2", width=16)
row_data = list()
row_data.append(["Col 1 Row 1", "Col 2 Row 1"])
@@ -252,46 +252,76 @@ def test_simple_table():
st = SimpleTable([column_1, column_2])
table = st.generate_table(row_data)
- assert table == ('Col 1 Col 2 \n'
- '--------------------------------\n'
- 'Col 1 Row 1 Col 2 Row 1 \n'
+ assert table == ('Col 1 Col 2 \n'
+ '----------------------------------\n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
'\n'
- 'Col 1 Row 2 Col 2 Row 2 \n')
+ 'Col 1 Row 2 Col 2 Row 2 ')
# Custom divider
st = SimpleTable([column_1, column_2], divider_char='─')
table = st.generate_table(row_data)
- assert table == ('Col 1 Col 2 \n'
- '────────────────────────────────\n'
- 'Col 1 Row 1 Col 2 Row 1 \n'
+ assert table == ('Col 1 Col 2 \n'
+ '──────────────────────────────────\n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
'\n'
- 'Col 1 Row 2 Col 2 Row 2 \n')
+ 'Col 1 Row 2 Col 2 Row 2 ')
# No divider
st = SimpleTable([column_1, column_2], divider_char=None)
table = st.generate_table(row_data)
- assert table == ('Col 1 Col 2 \n'
- 'Col 1 Row 1 Col 2 Row 1 \n'
+ assert table == ('Col 1 Col 2 \n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
'\n'
- 'Col 1 Row 2 Col 2 Row 2 \n')
+ 'Col 1 Row 2 Col 2 Row 2 ')
# No row spacing
st = SimpleTable([column_1, column_2])
table = st.generate_table(row_data, row_spacing=0)
- assert table == ('Col 1 Col 2 \n'
- '--------------------------------\n'
- 'Col 1 Row 1 Col 2 Row 1 \n'
- 'Col 1 Row 2 Col 2 Row 2 \n')
+ assert table == ('Col 1 Col 2 \n'
+ '----------------------------------\n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
+ 'Col 1 Row 2 Col 2 Row 2 ')
# No header
st = SimpleTable([column_1, column_2])
table = st.generate_table(row_data, include_header=False)
- assert table == ('Col 1 Row 1 Col 2 Row 1 \n'
+ assert table == ('Col 1 Row 1 Col 2 Row 1 \n'
+ '\n'
+ 'Col 1 Row 2 Col 2 Row 2 ')
+
+ # Wide custom divider (divider needs no padding)
+ st = SimpleTable([column_1, column_2], divider_char='深')
+ table = st.generate_table(row_data)
+
+ assert table == ('Col 1 Col 2 \n'
+ '深深深深深深深深深深深深深深深深深\n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
'\n'
- 'Col 1 Row 2 Col 2 Row 2 \n')
+ 'Col 1 Row 2 Col 2 Row 2 ')
+
+ # Wide custom divider (divider needs padding)
+ column_2 = Column("Col 2", width=17)
+ st = SimpleTable([column_1, column_2], divider_char='深')
+ table = st.generate_table(row_data)
+
+ assert table == ('Col 1 Col 2 \n'
+ '深深深深深深深深深深深深深深深深深 \n'
+ 'Col 1 Row 1 Col 2 Row 1 \n'
+ '\n'
+ 'Col 1 Row 2 Col 2 Row 2 ')
+
+ # Invalid divider character
+ with pytest.raises(TypeError) as excinfo:
+ SimpleTable([column_1, column_2], divider_char='too long')
+ assert "Divider character must be exactly one character long" in str(excinfo.value)
+
+ with pytest.raises(ValueError) as excinfo:
+ SimpleTable([column_1, column_2], divider_char='\n')
+ assert "Divider character is an unprintable character" in str(excinfo.value)
# Invalid row spacing
st = SimpleTable([column_1, column_2])
@@ -300,7 +330,29 @@ def test_simple_table():
assert "Row spacing cannot be less than 0" in str(excinfo.value)
-def test_bordered_table():
+def test_simple_table_width():
+ # Base width
+ for num_cols in range(1, 10):
+ assert SimpleTable.base_width(num_cols) == (num_cols - 1) * 2
+
+ # Invalid num_cols value
+ with pytest.raises(ValueError) as excinfo:
+ SimpleTable.base_width(0)
+ assert "Column count cannot be less than 1" in str(excinfo.value)
+
+ # Total width
+ column_1 = Column("Col 1", width=16)
+ column_2 = Column("Col 2", width=16)
+
+ row_data = list()
+ row_data.append(["Col 1 Row 1", "Col 2 Row 1"])
+ row_data.append(["Col 1 Row 2", "Col 2 Row 2"])
+
+ st = SimpleTable([column_1, column_2])
+ assert st.total_width() == 34
+
+
+def test_bordered_table_creation():
column_1 = Column("Col 1", width=15)
column_2 = Column("Col 2", width=15)
@@ -317,7 +369,7 @@ def test_bordered_table():
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'╟─────────────────┼─────────────────╢\n'
'║ Col 1 Row 2 │ Col 2 Row 2 ║\n'
- '╚═════════════════╧═════════════════╝\n')
+ '╚═════════════════╧═════════════════╝')
# No column borders
bt = BorderedTable([column_1, column_2], column_borders=False)
@@ -328,7 +380,7 @@ def test_bordered_table():
'║ Col 1 Row 1 Col 2 Row 1 ║\n'
'╟──────────────────────────────────╢\n'
'║ Col 1 Row 2 Col 2 Row 2 ║\n'
- '╚══════════════════════════════════╝\n')
+ '╚══════════════════════════════════╝')
# No header
bt = BorderedTable([column_1, column_2])
@@ -337,7 +389,7 @@ def test_bordered_table():
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'╟─────────────────┼─────────────────╢\n'
'║ Col 1 Row 2 │ Col 2 Row 2 ║\n'
- '╚═════════════════╧═════════════════╝\n')
+ '╚═════════════════╧═════════════════╝')
# Non-default padding
bt = BorderedTable([column_1, column_2], padding=2)
@@ -348,7 +400,7 @@ def test_bordered_table():
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'╟───────────────────┼───────────────────╢\n'
'║ Col 1 Row 2 │ Col 2 Row 2 ║\n'
- '╚═══════════════════╧═══════════════════╝\n')
+ '╚═══════════════════╧═══════════════════╝')
# Invalid padding
with pytest.raises(ValueError) as excinfo:
@@ -356,7 +408,45 @@ def test_bordered_table():
assert "Padding cannot be less than 0" in str(excinfo.value)
-def test_alternating_table():
+def test_bordered_table_width():
+ # Default behavior (column_borders=True, padding=1)
+ assert BorderedTable.base_width(1) == 4
+ assert BorderedTable.base_width(2) == 7
+ assert BorderedTable.base_width(3) == 10
+
+ # No column borders
+ assert BorderedTable.base_width(1, column_borders=False) == 4
+ assert BorderedTable.base_width(2, column_borders=False) == 6
+ assert BorderedTable.base_width(3, column_borders=False) == 8
+
+ # No padding
+ assert BorderedTable.base_width(1, padding=0) == 2
+ assert BorderedTable.base_width(2, padding=0) == 3
+ assert BorderedTable.base_width(3, padding=0) == 4
+
+ # Extra padding
+ assert BorderedTable.base_width(1, padding=3) == 8
+ assert BorderedTable.base_width(2, padding=3) == 15
+ assert BorderedTable.base_width(3, padding=3) == 22
+
+ # Invalid num_cols value
+ with pytest.raises(ValueError) as excinfo:
+ BorderedTable.base_width(0)
+ assert "Column count cannot be less than 1" in str(excinfo.value)
+
+ # Total width
+ column_1 = Column("Col 1", width=15)
+ column_2 = Column("Col 2", width=15)
+
+ row_data = list()
+ row_data.append(["Col 1 Row 1", "Col 2 Row 1"])
+ row_data.append(["Col 1 Row 2", "Col 2 Row 2"])
+
+ bt = BorderedTable([column_1, column_2])
+ assert bt.total_width() == 37
+
+
+def test_alternating_table_creation():
column_1 = Column("Col 1", width=15)
column_2 = Column("Col 2", width=15)
@@ -372,7 +462,7 @@ def test_alternating_table():
'╠═════════════════╪═════════════════╣\n'
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'\x1b[100m║ \x1b[49m\x1b[0m\x1b[100mCol 1 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m │ \x1b[49m\x1b[0m\x1b[100mCol 2 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m ║\x1b[49m\n'
- '╚═════════════════╧═════════════════╝\n')
+ '╚═════════════════╧═════════════════╝')
# Other bg colors
at = AlternatingTable([column_1, column_2], bg_odd=ansi.bg.bright_blue, bg_even=ansi.bg.green)
@@ -382,7 +472,7 @@ def test_alternating_table():
'╠═════════════════╪═════════════════╣\n'
'\x1b[104m║ \x1b[49m\x1b[0m\x1b[104mCol 1 Row 1\x1b[49m\x1b[0m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[0m\x1b[104m │ \x1b[49m\x1b[0m\x1b[104mCol 2 Row 1\x1b[49m\x1b[0m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[104m \x1b[49m\x1b[0m\x1b[104m ║\x1b[49m\n'
'\x1b[42m║ \x1b[49m\x1b[0m\x1b[42mCol 1 Row 2\x1b[49m\x1b[0m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[0m\x1b[42m │ \x1b[49m\x1b[0m\x1b[42mCol 2 Row 2\x1b[49m\x1b[0m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[42m \x1b[49m\x1b[0m\x1b[42m ║\x1b[49m\n'
- '╚═════════════════╧═════════════════╝\n')
+ '╚═════════════════╧═════════════════╝')
# No column borders
at = AlternatingTable([column_1, column_2], column_borders=False)
@@ -392,7 +482,7 @@ def test_alternating_table():
'╠══════════════════════════════════╣\n'
'║ Col 1 Row 1 Col 2 Row 1 ║\n'
'\x1b[100m║ \x1b[49m\x1b[0m\x1b[100mCol 1 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[0m\x1b[100mCol 2 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m ║\x1b[49m\n'
- '╚══════════════════════════════════╝\n')
+ '╚══════════════════════════════════╝')
# No header
at = AlternatingTable([column_1, column_2])
@@ -400,7 +490,7 @@ def test_alternating_table():
assert table == ('╔═════════════════╤═════════════════╗\n'
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'\x1b[100m║ \x1b[49m\x1b[0m\x1b[100mCol 1 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m │ \x1b[49m\x1b[0m\x1b[100mCol 2 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m ║\x1b[49m\n'
- '╚═════════════════╧═════════════════╝\n')
+ '╚═════════════════╧═════════════════╝')
# Non-default padding
at = AlternatingTable([column_1, column_2], padding=2)
@@ -410,7 +500,7 @@ def test_alternating_table():
'╠═══════════════════╪═══════════════════╣\n'
'║ Col 1 Row 1 │ Col 2 Row 1 ║\n'
'\x1b[100m║ \x1b[49m\x1b[0m\x1b[100mCol 1 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m │ \x1b[49m\x1b[0m\x1b[100mCol 2 Row 2\x1b[49m\x1b[0m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[100m \x1b[49m\x1b[0m\x1b[100m ║\x1b[49m\n'
- '╚═══════════════════╧═══════════════════╝\n')
+ '╚═══════════════════╧═══════════════════╝')
# Invalid padding
with pytest.raises(ValueError) as excinfo: