1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
from __future__ import annotations
from test_prettytable import CITY_DATA, CITY_DATA_HEADER
from prettytable import PrettyTable, RowType
class TestSorting:
def test_sort_by_different_per_columns(self, city_data: PrettyTable) -> None:
city_data.sortby = city_data.field_names[0]
old = city_data.get_string()
for field in city_data.field_names[1:]:
city_data.sortby = field
new = city_data.get_string()
assert new != old
def test_reverse_sort(self, city_data: PrettyTable) -> None:
for field in city_data.field_names:
city_data.sortby = field
city_data.reversesort = False
forward = city_data.get_string()
city_data.reversesort = True
backward = city_data.get_string()
forward_lines = forward.split("\n")[2:] # Discard header lines
backward_lines = backward.split("\n")[2:]
backward_lines.reverse()
assert forward_lines == backward_lines
def test_sort_key(self, city_data: PrettyTable) -> None:
# Test sorting by length of city name
def key(vals: RowType) -> list[int]:
vals[0] = len(vals[0])
return vals
city_data.sortby = "City name"
city_data.sort_key = key
assert (
city_data.get_string().strip()
== """
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Perth | 5386 | 1554769 | 869.4 |
| Darwin | 112 | 120900 | 1714.7 |
| Hobart | 1357 | 205556 | 619.5 |
| Sydney | 2058 | 4336374 | 1214.8 |
| Adelaide | 1295 | 1158259 | 600.5 |
| Brisbane | 5905 | 1857594 | 1146.4 |
| Melbourne | 1566 | 3806092 | 646.9 |
+-----------+------+------------+-----------------+
""".strip()
)
def test_sort_key_at_class_declaration(self) -> None:
# Test sorting by length of city name
def key(vals: RowType) -> list[int]:
vals[0] = len(vals[0])
return vals
table = PrettyTable(
field_names=CITY_DATA_HEADER,
sortby="City name",
sort_key=key,
)
assert table.sort_key == key
for row in CITY_DATA:
table.add_row(row)
assert (
"""+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Perth | 5386 | 1554769 | 869.4 |
| Darwin | 112 | 120900 | 1714.7 |
| Hobart | 1357 | 205556 | 619.5 |
| Sydney | 2058 | 4336374 | 1214.8 |
| Adelaide | 1295 | 1158259 | 600.5 |
| Brisbane | 5905 | 1857594 | 1146.4 |
| Melbourne | 1566 | 3806092 | 646.9 |
+-----------+------+------------+-----------------+"""
== table.get_string().strip()
)
def test_sort_slice(self) -> None:
"""Make sure sorting and slicing interact in the expected way"""
table = PrettyTable(["Foo"])
for i in range(20, 0, -1):
table.add_row([i])
new_style = table.get_string(sortby="Foo", end=10)
assert "10" in new_style
assert "20" not in new_style
oldstyle = table.get_string(sortby="Foo", end=10, oldsortslice=True)
assert "10" not in oldstyle
assert "20" in oldstyle
def test_sortby_at_class_declaration(self) -> None:
"""
Fix #354 where initialization of a table with sortby fails
"""
table = PrettyTable(
field_names=CITY_DATA_HEADER,
sortby="Area",
)
assert table.sortby == "Area"
for row in CITY_DATA:
table.add_row(row)
assert (
"""+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Darwin | 112 | 120900 | 1714.7 |
| Adelaide | 1295 | 1158259 | 600.5 |
| Hobart | 1357 | 205556 | 619.5 |
| Melbourne | 1566 | 3806092 | 646.9 |
| Sydney | 2058 | 4336374 | 1214.8 |
| Perth | 5386 | 1554769 | 869.4 |
| Brisbane | 5905 | 1857594 | 1146.4 |
+-----------+------+------------+-----------------+"""
== table.get_string().strip()
)
|