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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
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_get_string(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_sort_slice(self) -> None:
"""Make sure sorting and slicing interact in the expected way"""
# Arrange
table_new = PrettyTable(["Foo"])
table_old = PrettyTable(["Foo"], oldsortslice=True)
for i in range(20, 0, -1):
table_new.add_row([i])
table_old.add_row([i])
# Act
new_style = table_new.get_string(sortby="Foo", end=10)
old_style = table_old.get_string(sortby="Foo", end=10)
# Assert
assert "10" in new_style
assert "20" not in new_style
assert "10" not in old_style
assert "20" in old_style
def test_sort_slice_setter(self) -> None:
# Arrange
table_new = PrettyTable(["Foo"])
table_old = PrettyTable(["Foo"])
table_old.oldsortslice = True
for i in range(20, 0, -1):
table_new.add_row([i])
table_old.add_row([i])
# Act
new_style = table_new.get_string(sortby="Foo", end=10)
old_style = table_old.get_string(sortby="Foo", end=10)
# Assert
assert "10" in new_style
assert "20" not in new_style
assert "10" not in old_style
assert "20" in old_style
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()
|