summaryrefslogtreecommitdiffstats
path: root/tests/test_base_table
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_base_table')
-rw-r--r--tests/test_base_table/test_gen_row_lines.py86
-rw-r--r--tests/test_base_table/test_gen_table.py225
-rw-r--r--tests/test_base_table/test_horizontal_border.py98
-rw-r--r--tests/test_base_table/test_table.py196
4 files changed, 605 insertions, 0 deletions
diff --git a/tests/test_base_table/test_gen_row_lines.py b/tests/test_base_table/test_gen_row_lines.py
new file mode 100644
index 0000000..0d0f43c
--- /dev/null
+++ b/tests/test_base_table/test_gen_row_lines.py
@@ -0,0 +1,86 @@
+"""Test method in BaseTable class."""
+
+import pytest
+
+from terminaltables.base_table import BaseTable
+
+
+@pytest.mark.parametrize('style', ['heading', 'footing', 'row'])
+def test_single_line(style):
+ """Test with single-line row.
+
+ :param str style: Passed to method.
+ """
+ row = ['Row One Column One', 'Two', 'Three']
+ table = BaseTable([row])
+ actual = [tuple(i) for i in table.gen_row_lines(row, style, [18, 3, 5], 1)]
+ expected = [
+ ('|', ' Row One Column One ', '|', ' Two ', '|', ' Three ', '|'),
+ ]
+ assert actual == expected
+
+
+@pytest.mark.parametrize('style', ['heading', 'footing', 'row'])
+def test_multi_line(style):
+ """Test with multi-line row.
+
+ :param str style: Passed to method.
+ """
+ row = ['Row One\nColumn One', 'Two', 'Three']
+ table = BaseTable([row])
+ actual = [tuple(i) for i in table.gen_row_lines(row, style, [10, 3, 5], 2)]
+ expected = [
+ ('|', ' Row One ', '|', ' Two ', '|', ' Three ', '|'),
+ ('|', ' Column One ', '|', ' ', '|', ' ', '|'),
+ ]
+ assert actual == expected
+
+
+@pytest.mark.parametrize('style', ['heading', 'footing', 'row'])
+def test_no_padding_no_borders(style):
+ """Test without padding or borders.
+
+ :param str style: Passed to method.
+ """
+ row = ['Row One\nColumn One', 'Two', 'Three']
+ table = BaseTable([row])
+ table.inner_column_border = False
+ table.outer_border = False
+ table.padding_left = 0
+ table.padding_right = 0
+ actual = [tuple(i) for i in table.gen_row_lines(row, style, [10, 3, 5], 2)]
+ expected = [
+ ('Row One ', 'Two', 'Three'),
+ ('Column One', ' ', ' '),
+ ]
+ assert actual == expected
+
+
+@pytest.mark.parametrize('style', ['heading', 'footing', 'row'])
+def test_uneven(style):
+ """Test with row missing cells.
+
+ :param str style: Passed to method.
+ """
+ row = ['Row One Column One']
+ table = BaseTable([row])
+ actual = [tuple(i) for i in table.gen_row_lines(row, style, [18, 3, 5], 1)]
+ expected = [
+ ('|', ' Row One Column One ', '|', ' ', '|', ' ', '|'),
+ ]
+ assert actual == expected
+
+
+@pytest.mark.parametrize('style', ['heading', 'footing', 'row'])
+def test_empty_table(style):
+ """Test empty table.
+
+ :param str style: Passed to method.
+ """
+ row = []
+ table = BaseTable([row])
+ actual = [tuple(i) for i in table.gen_row_lines(row, style, [], 0)]
+ expected = [
+ ('|', '|'),
+ ]
+ assert actual == expected
diff --git a/tests/test_base_table/test_gen_table.py b/tests/test_base_table/test_gen_table.py
new file mode 100644
index 0000000..54d5fe1
--- /dev/null
+++ b/tests/test_base_table/test_gen_table.py
@@ -0,0 +1,225 @@
+"""Test method in BaseTable class."""
+
+import pytest
+
+from terminaltables.base_table import BaseTable
+from terminaltables.build import flatten
+from terminaltables.width_and_alignment import max_dimensions
+
+
+@pytest.mark.parametrize('inner_heading_row_border', [True, False])
+@pytest.mark.parametrize('inner_footing_row_border', [True, False])
+@pytest.mark.parametrize('inner_row_border', [True, False])
+def test_inner_row_borders(inner_heading_row_border, inner_footing_row_border, inner_row_border):
+ """Test heading/footing/row borders.
+
+ :param bool inner_heading_row_border: Passed to table.
+ :param bool inner_footing_row_border: Passed to table.
+ :param bool inner_row_border: Passed to table.
+ """
+ table_data = [
+ ['Name', 'Color', 'Type'],
+ ['Avocado', 'green', 'nut'],
+ ['Tomato', 'red', 'fruit'],
+ ['Lettuce', 'green', 'vegetable'],
+ ]
+ table = BaseTable(table_data)
+ table.inner_heading_row_border = inner_heading_row_border
+ table.inner_footing_row_border = inner_footing_row_border
+ table.inner_row_border = inner_row_border
+ inner_widths, inner_heights, outer_widths = max_dimensions(table_data, table.padding_left, table.padding_right)[:3]
+ actual = flatten(table.gen_table(inner_widths, inner_heights, outer_widths))
+
+ # Determine expected.
+ if inner_row_border:
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '+---------+-------+-----------+\n'
+ '| Avocado | green | nut |\n'
+ '+---------+-------+-----------+\n'
+ '| Tomato | red | fruit |\n'
+ '+---------+-------+-----------+\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+ elif inner_heading_row_border and inner_footing_row_border:
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '+---------+-------+-----------+\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '+---------+-------+-----------+\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+ elif inner_heading_row_border:
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '+---------+-------+-----------+\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+ elif inner_footing_row_border:
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '+---------+-------+-----------+\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+ else:
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+
+ assert actual == expected
+
+
+@pytest.mark.parametrize('outer_border', [True, False])
+def test_outer_borders(outer_border):
+ """Test left/right/top/bottom table borders.
+
+ :param bool outer_border: Passed to table.
+ """
+ table_data = [
+ ['Name', 'Color', 'Type'],
+ ['Avocado', 'green', 'nut'],
+ ['Tomato', 'red', 'fruit'],
+ ['Lettuce', 'green', 'vegetable'],
+ ]
+ table = BaseTable(table_data, 'Example Table')
+ table.outer_border = outer_border
+ inner_widths, inner_heights, outer_widths = max_dimensions(table_data, table.padding_left, table.padding_right)[:3]
+ actual = flatten(table.gen_table(inner_widths, inner_heights, outer_widths))
+
+ # Determine expected.
+ if outer_border:
+ expected = (
+ '+Example Table----+-----------+\n'
+ '| Name | Color | Type |\n'
+ '+---------+-------+-----------+\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+ else:
+ expected = (
+ ' Name | Color | Type \n'
+ '---------+-------+-----------\n'
+ ' Avocado | green | nut \n'
+ ' Tomato | red | fruit \n'
+ ' Lettuce | green | vegetable '
+ )
+
+ assert actual == expected
+
+
+@pytest.mark.parametrize('mode', ['row', 'one', 'blank', 'empty', 'none'])
+@pytest.mark.parametrize('bare', [False, True])
+def test_one_no_rows(mode, bare):
+ """Test with one or no rows.
+
+ :param str mode: Type of table contents to test.
+ :param bool bare: Disable padding/borders.
+ """
+ if mode == 'row':
+ table_data = [
+ ['Avocado', 'green', 'nut'],
+ ]
+ elif mode == 'one':
+ table_data = [
+ ['Avocado'],
+ ]
+ elif mode == 'blank':
+ table_data = [
+ [''],
+ ]
+ elif mode == 'empty':
+ table_data = [
+ [],
+ ]
+ else:
+ table_data = [
+ ]
+ table = BaseTable(table_data)
+ if bare:
+ table.inner_column_border = False
+ table.inner_footing_row_border = False
+ table.inner_heading_row_border = False
+ table.inner_row_border = False
+ table.outer_border = False
+ table.padding_left = 0
+ table.padding_right = 0
+ inner_widths, inner_heights, outer_widths = max_dimensions(table_data, table.padding_left, table.padding_right)[:3]
+ actual = flatten(table.gen_table(inner_widths, inner_heights, outer_widths))
+
+ # Determine expected.
+ if mode == 'row':
+ if bare:
+ expected = (
+ 'Avocadogreennut'
+ )
+ else:
+ expected = (
+ '+---------+-------+-----+\n'
+ '| Avocado | green | nut |\n'
+ '+---------+-------+-----+'
+ )
+ elif mode == 'one':
+ if bare:
+ expected = (
+ 'Avocado'
+ )
+ else:
+ expected = (
+ '+---------+\n'
+ '| Avocado |\n'
+ '+---------+'
+ )
+ elif mode == 'blank': # Remember there's still padding.
+ if bare:
+ expected = (
+ ''
+ )
+ else:
+ expected = (
+ '+--+\n'
+ '| |\n'
+ '+--+'
+ )
+ elif mode == 'empty':
+ if bare:
+ expected = (
+ ''
+ )
+ else:
+ expected = (
+ '++\n'
+ '||\n'
+ '++'
+ )
+ else:
+ if bare:
+ expected = (
+ ''
+ )
+ else:
+ expected = (
+ '++\n'
+ '++'
+ )
+
+ assert actual == expected
diff --git a/tests/test_base_table/test_horizontal_border.py b/tests/test_base_table/test_horizontal_border.py
new file mode 100644
index 0000000..e162261
--- /dev/null
+++ b/tests/test_base_table/test_horizontal_border.py
@@ -0,0 +1,98 @@
+"""Test method in BaseTable class."""
+
+import pytest
+
+from terminaltables.base_table import BaseTable
+from terminaltables.width_and_alignment import max_dimensions
+
+SINGLE_LINE = (
+ ('Name', 'Color', 'Type'),
+ ('Avocado', 'green', 'nut'),
+ ('Tomato', 'red', 'fruit'),
+ ('Lettuce', 'green', 'vegetable'),
+)
+
+
+@pytest.mark.parametrize('inner_column_border', [True, False])
+@pytest.mark.parametrize('style', ['top', 'bottom'])
+def test_top_bottom(inner_column_border, style):
+ """Test top and bottom borders.
+
+ :param bool inner_column_border: Passed to table class.
+ :param str style: Passed to method.
+ """
+ table = BaseTable(SINGLE_LINE, 'Example')
+ table.inner_column_border = inner_column_border
+ outer_widths = max_dimensions(table.table_data, table.padding_left, table.padding_right)[2]
+
+ # Determine expected.
+ if style == 'top' and inner_column_border:
+ expected = '+Example--+-------+-----------+'
+ elif style == 'top':
+ expected = '+Example--------------------+'
+ elif style == 'bottom' and inner_column_border:
+ expected = '+---------+-------+-----------+'
+ else:
+ expected = '+---------------------------+'
+
+ # Test.
+ actual = ''.join(table.horizontal_border(style, outer_widths))
+ assert actual == expected
+
+
+@pytest.mark.parametrize('inner_column_border', [True, False])
+@pytest.mark.parametrize('outer_border', [True, False])
+@pytest.mark.parametrize('style', ['heading', 'footing'])
+def test_heading_footing(inner_column_border, outer_border, style):
+ """Test heading and footing borders.
+
+ :param bool inner_column_border: Passed to table class.
+ :param bool outer_border: Passed to table class.
+ :param str style: Passed to method.
+ """
+ table = BaseTable(SINGLE_LINE)
+ table.inner_column_border = inner_column_border
+ table.outer_border = outer_border
+ outer_widths = max_dimensions(table.table_data, table.padding_left, table.padding_right)[2]
+
+ # Determine expected.
+ if style == 'heading' and outer_border:
+ expected = '+---------+-------+-----------+' if inner_column_border else '+---------------------------+'
+ elif style == 'heading':
+ expected = '---------+-------+-----------' if inner_column_border else '---------------------------'
+ elif style == 'footing' and outer_border:
+ expected = '+---------+-------+-----------+' if inner_column_border else '+---------------------------+'
+ else:
+ expected = '---------+-------+-----------' if inner_column_border else '---------------------------'
+
+ # Test.
+ actual = ''.join(table.horizontal_border(style, outer_widths))
+ assert actual == expected
+
+
+@pytest.mark.parametrize('inner_column_border', [True, False])
+@pytest.mark.parametrize('outer_border', [True, False])
+def test_row(inner_column_border, outer_border):
+ """Test inner borders.
+
+ :param bool inner_column_border: Passed to table class.
+ :param bool outer_border: Passed to table class.
+ """
+ table = BaseTable(SINGLE_LINE)
+ table.inner_column_border = inner_column_border
+ table.outer_border = outer_border
+ outer_widths = max_dimensions(table.table_data, table.padding_left, table.padding_right)[2]
+
+ # Determine expected.
+ if inner_column_border and outer_border:
+ expected = '+---------+-------+-----------+'
+ elif inner_column_border:
+ expected = '---------+-------+-----------'
+ elif outer_border:
+ expected = '+---------------------------+'
+ else:
+ expected = '---------------------------'
+
+ # Test.
+ actual = ''.join(table.horizontal_border('row', outer_widths))
+ assert actual == expected
diff --git a/tests/test_base_table/test_table.py b/tests/test_base_table/test_table.py
new file mode 100644
index 0000000..c5b5a89
--- /dev/null
+++ b/tests/test_base_table/test_table.py
@@ -0,0 +1,196 @@
+# coding: utf-8
+"""Test property in BaseTable class."""
+
+from colorama import Fore
+from colorclass import Color
+from termcolor import colored
+
+from terminaltables.base_table import BaseTable
+
+
+def test_ascii():
+ """Test with ASCII characters."""
+ table_data = [
+ ['Name', 'Color', 'Type'],
+ ['Avocado', 'green', 'nut'],
+ ['Tomato', 'red', 'fruit'],
+ ['Lettuce', 'green', 'vegetable'],
+ ]
+ table = BaseTable(table_data)
+ actual = table.table
+
+ expected = (
+ '+---------+-------+-----------+\n'
+ '| Name | Color | Type |\n'
+ '+---------+-------+-----------+\n'
+ '| Avocado | green | nut |\n'
+ '| Tomato | red | fruit |\n'
+ '| Lettuce | green | vegetable |\n'
+ '+---------+-------+-----------+'
+ )
+
+ assert actual == expected
+
+
+def test_int():
+ """Test with integers instead of strings."""
+ table_data = [
+ [100, 10, 1],
+ [0, 3, 6],
+ [1, 4, 7],
+ [2, 5, 8],
+ ]
+ table = BaseTable(table_data, 1234567890)
+ actual = table.table
+
+ expected = (
+ '+1234567890+---+\n'
+ '| 100 | 10 | 1 |\n'
+ '+-----+----+---+\n'
+ '| 0 | 3 | 6 |\n'
+ '| 1 | 4 | 7 |\n'
+ '| 2 | 5 | 8 |\n'
+ '+-----+----+---+'
+ )
+
+ assert actual == expected
+
+
+def test_float():
+ """Test with floats instead of strings."""
+ table_data = [
+ [1.0, 22.0, 333.0],
+ [0.1, 3.1, 6.1],
+ [1.1, 4.1, 7.1],
+ [2.1, 5.1, 8.1],
+ ]
+ table = BaseTable(table_data, 0.12345678)
+ actual = table.table
+
+ expected = (
+ '+0.12345678--+-------+\n'
+ '| 1.0 | 22.0 | 333.0 |\n'
+ '+-----+------+-------+\n'
+ '| 0.1 | 3.1 | 6.1 |\n'
+ '| 1.1 | 4.1 | 7.1 |\n'
+ '| 2.1 | 5.1 | 8.1 |\n'
+ '+-----+------+-------+'
+ )
+
+ assert actual == expected
+
+
+def test_bool_none():
+ """Test with NoneType/boolean instead of strings."""
+ table_data = [
+ [True, False, None],
+ [True, False, None],
+ [False, None, True],
+ [None, True, False],
+ ]
+ table = BaseTable(table_data, True)
+ actual = table.table
+
+ expected = (
+ '+True---+-------+-------+\n'
+ '| True | False | None |\n'
+ '+-------+-------+-------+\n'
+ '| True | False | None |\n'
+ '| False | None | True |\n'
+ '| None | True | False |\n'
+ '+-------+-------+-------+'
+ )
+
+ assert actual == expected
+
+
+def test_cjk():
+ """Test with CJK characters."""
+ table_data = [
+ ['CJK'],
+ ['蓝色'],
+ ['世界你好'],
+ ]
+ table = BaseTable(table_data)
+ actual = table.table
+
+ expected = (
+ '+----------+\n'
+ '| CJK |\n'
+ '+----------+\n'
+ '| 蓝色 |\n'
+ '| 世界你好 |\n'
+ '+----------+'
+ )
+
+ assert actual == expected
+
+
+def test_rtl():
+ """Test with RTL characters."""
+ table_data = [
+ ['RTL'],
+ ['שלום'],
+ ['معرب'],
+ ]
+ table = BaseTable(table_data)
+ actual = table.table
+
+ expected = (
+ '+------+\n'
+ '| RTL |\n'
+ '+------+\n'
+ '| שלום |\n'
+ '| معرب |\n'
+ '+------+'
+ )
+
+ assert actual == expected
+
+
+def test_rtl_large():
+ """Test large table of RTL characters."""
+ table_data = [
+ ['اكتب', 'اللون', 'اسم'],
+ ['البندق', 'أخضر', 'أفوكادو'],
+ ['ثمرة', 'أحمر', 'بندورة'],
+ ['الخضروات', 'أخضر', 'الخس'],
+ ]
+ table = BaseTable(table_data, 'جوجل المترجم')
+ actual = table.table
+
+ expected = (
+ '+جوجل المترجم------+---------+\n'
+ '| اكتب | اللون | اسم |\n'
+ '+----------+-------+---------+\n'
+ '| البندق | أخضر | أفوكادو |\n'
+ '| ثمرة | أحمر | بندورة |\n'
+ '| الخضروات | أخضر | الخس |\n'
+ '+----------+-------+---------+'
+ )
+
+ assert actual == expected
+
+
+def test_color():
+ """Test with color characters."""
+ table_data = [
+ ['ansi', '\033[31mRed\033[39m', '\033[32mGreen\033[39m', '\033[34mBlue\033[39m'],
+ ['colorclass', Color('{red}Red{/red}'), Color('{green}Green{/green}'), Color('{blue}Blue{/blue}')],
+ ['colorama', Fore.RED + 'Red' + Fore.RESET, Fore.GREEN + 'Green' + Fore.RESET, Fore.BLUE + 'Blue' + Fore.RESET],
+ ['termcolor', colored('Red', 'red'), colored('Green', 'green'), colored('Blue', 'blue')],
+ ]
+ table = BaseTable(table_data)
+ table.inner_heading_row_border = False
+ actual = table.table
+
+ expected = (
+ u'+------------+-----+-------+------+\n'
+ u'| ansi | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
+ u'| colorclass | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
+ u'| colorama | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
+ u'| termcolor | \033[31mRed\033[0m | \033[32mGreen\033[0m | \033[34mBlue\033[0m |\n'
+ u'+------------+-----+-------+------+'
+ )
+
+ assert actual == expected