summaryrefslogtreecommitdiffstats
path: root/contrib/python/prettytable/py3/tests/test_sorting.py
blob: 172e634745005edb344270f1e6b9bf84b30c65ca (plain) (blame)
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()