File: test_list.py

package info (click to toggle)
setools 4.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,600 kB
  • sloc: python: 24,485; makefile: 14
file content (294 lines) | stat: -rw-r--r-- 12,758 bytes parent folder | download | duplicates (2)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# SPDX-License-Identifier: GPL-2.0-only
from typing import Dict, Final, List, Union

from PyQt6 import QtCore, QtWidgets
import pytest
from pytestqt.qtbot import QtBot

from setoolsgui.widgets.criteria.list import (EQUAL_DEFAULT_CHECKED, ListWidget,
                                              SUBSET_DEFAULT_CHECKED)
from setoolsgui.widgets.models.table import StringList


@pytest.fixture
def model() -> StringList:
    """Pytest fixture to set up the model."""
    return StringList(data=["item1", "item2", "item3"])


@pytest.fixture
def widget(model: StringList, mock_query, request: pytest.FixtureRequest,
           qtbot: QtBot) -> ListWidget:
    """Pytest fixture to set up the widget."""
    marker = request.node.get_closest_marker("obj_args")
    kwargs = marker.kwargs if marker else {}
    w = ListWidget(request.node.name, mock_query, "name", model, **kwargs)
    model.setParent(w)
    qtbot.addWidget(w)
    w.show()
    return w


@pytest.mark.obj_args(enable_equal=True, enable_subset=True)
def test_base_settings(widget: ListWidget) -> None:
    """Test base properties of widget."""
    assert widget.clear_criteria.toolTip()
    assert widget.clear_criteria.whatsThis()
    assert widget.invert_criteria.toolTip()
    assert widget.invert_criteria.whatsThis()
    assert widget.criteria.objectName() == "name"
    assert widget.criteria.selectionMode() == \
        QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection
    assert widget.criteria_equal.objectName() == "name_equal"
    assert widget.criteria_subset.objectName() == "name_subset"


@pytest.mark.obj_args(enable_equal=False, enable_subset=False)
def test_equal_subset_disabled_layout(widget: ListWidget) -> None:
    """Test layout for no equal and subset options."""
    assert widget.top_layout.itemAtPosition(0, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(0, 1).widget() == widget.clear_criteria
    assert widget.top_layout.itemAtPosition(0, 2).widget() == widget.criteria_any
    assert widget.top_layout.itemAtPosition(1, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(1, 1).widget() == widget.invert_criteria
    assert not widget.top_layout.itemAtPosition(1, 2)
    assert widget.top_layout.itemAtPosition(2, 0).widget() == widget.criteria
    assert not widget.top_layout.itemAtPosition(2, 1)
    assert not widget.top_layout.itemAtPosition(2, 2)


@pytest.mark.obj_args(enable_equal=True, enable_subset=False)
def test_equal_enabled_subset_disabled_layout(widget: ListWidget) -> None:
    """Test layout for equal enabled and subset disabled options."""
    assert widget.top_layout.itemAtPosition(0, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(0, 1).widget() == widget.clear_criteria
    assert widget.top_layout.itemAtPosition(0, 2).widget() == widget.criteria_any
    assert widget.top_layout.itemAtPosition(1, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(1, 1).widget() == widget.invert_criteria
    assert widget.top_layout.itemAtPosition(1, 2).widget() == widget.criteria_equal
    assert widget.top_layout.itemAtPosition(2, 0).widget() == widget.criteria
    assert not widget.top_layout.itemAtPosition(2, 1)
    assert not widget.top_layout.itemAtPosition(2, 2)


@pytest.mark.obj_args(enable_equal=False, enable_subset=True)
def test_equal_disabled_subset_enabled_layout(widget: ListWidget) -> None:
    """Test layout for equal disabled and subset enabled options."""
    assert widget.top_layout.itemAtPosition(0, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(0, 1).widget() == widget.clear_criteria
    assert widget.top_layout.itemAtPosition(0, 2).widget() == widget.criteria_any
    assert widget.top_layout.itemAtPosition(1, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(1, 1).widget() == widget.invert_criteria
    assert not widget.top_layout.itemAtPosition(1, 2)
    assert widget.top_layout.itemAtPosition(2, 0).widget() == widget.criteria
    assert not widget.top_layout.itemAtPosition(2, 1)
    assert widget.top_layout.itemAtPosition(2, 2).widget() == widget.criteria_subset


@pytest.mark.obj_args(enable_equal=True, enable_subset=True)
def test_equal_subset_enabled_layout(widget: ListWidget) -> None:
    """Test layout for equal and subset enabled options."""
    assert widget.top_layout.itemAtPosition(0, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(0, 1).widget() == widget.clear_criteria
    assert widget.top_layout.itemAtPosition(0, 2).widget() == widget.criteria_any
    assert widget.top_layout.itemAtPosition(1, 0).widget() == widget.criteria
    assert widget.top_layout.itemAtPosition(1, 1).widget() == widget.invert_criteria
    assert widget.top_layout.itemAtPosition(1, 2).widget() == widget.criteria_equal
    assert widget.top_layout.itemAtPosition(2, 0).widget() == widget.criteria
    assert not widget.top_layout.itemAtPosition(2, 1)
    assert widget.top_layout.itemAtPosition(2, 2).widget() == widget.criteria_subset


def test_set_selection(widget: ListWidget, model: StringList) -> None:
    """Test setting a selection."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria.set_selection(test_selection)
    assert list(widget.criteria.selection()) == test_selection
    assert widget.query.name == test_selection
    assert not widget.has_errors


def test_invert_selection(widget: ListWidget, qtbot: QtBot, model: StringList) -> None:
    """Test inverting a selection."""
    inverted_selection = [model.item_list[1]]
    widget.criteria.set_selection([model.item_list[0], model.item_list[2]])
    qtbot.mouseClick(widget.invert_criteria, QtCore.Qt.MouseButton.LeftButton)
    assert list(widget.criteria.selection()) == inverted_selection
    assert widget.query.name == inverted_selection
    assert not widget.has_errors


def test_clear_selection(widget: ListWidget, qtbot: QtBot, model: StringList) -> None:
    """Test clearing a selection."""
    widget.criteria.set_selection([model.item_list[0], model.item_list[2]])
    assert list(widget.criteria.selection())
    qtbot.mouseClick(widget.clear_criteria, QtCore.Qt.MouseButton.LeftButton)
    assert not list(widget.criteria.selection())
    assert not widget.query.name
    assert not widget.has_errors


@pytest.mark.obj_args(enable_equal=True, enable_subset=False)
def test_equal_toggling(widget: ListWidget) -> None:
    """Test equal match toggling is reflected in the query."""
    # test radio button toggling based on the initial state
    if EQUAL_DEFAULT_CHECKED:
        widget.criteria_any.setChecked(True)
        assert widget.query.name_equal is False
        widget.criteria_equal.setChecked(True)
        assert widget.query.name_equal is True
    else:
        widget.criteria_equal.setChecked(True)
        assert widget.query.name_equal is True
        widget.criteria_any.setChecked(True)
        assert widget.query.name_equal is False


@pytest.mark.obj_args(enable_equal=False, enable_subset=True)
def test_subset_toggling(widget: ListWidget) -> None:
    """Test subset match toggling is reflected in the query."""
    # test radio button toggling based on the initial state
    if SUBSET_DEFAULT_CHECKED:
        widget.criteria_any.setChecked(True)
        assert widget.query.name_subset is False
        widget.criteria_subset.setChecked(True)
        assert widget.query.name_subset is True
    else:
        widget.criteria_subset.setChecked(True)
        assert widget.query.name_subset is True
        widget.criteria_any.setChecked(True)
        assert widget.query.name_subset is False


@pytest.mark.obj_args(enable_equal=False, enable_subset=False)
def test_equal_subset_disabled_save(widget: ListWidget, model: StringList) -> None:
    """Test save settings with no options."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria.set_selection(test_selection)

    expected_settings: Final = {
        "name": test_selection
    }
    settings: Dict[str, List[str]] = {}
    widget.save(settings)
    assert settings == expected_settings


@pytest.mark.obj_args(enable_equal=True, enable_subset=False)
def test_equal_enabled_subset_disabled_save(widget: ListWidget, model: StringList) -> None:
    """Test save settings with equal enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_equal.setChecked(not EQUAL_DEFAULT_CHECKED)
    widget.criteria.set_selection(test_selection)

    expected_settings: Final = {
        "name": test_selection,
        "name_equal": (not EQUAL_DEFAULT_CHECKED)
    }
    settings: Dict[str, Union[List[str], bool]] = {}
    widget.save(settings)
    assert settings == expected_settings


@pytest.mark.obj_args(enable_equal=False, enable_subset=True)
def test_equal_disabled_subset_enabled_save(widget: ListWidget, model: StringList) -> None:
    """Test save settings with subset enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_subset.setChecked(not SUBSET_DEFAULT_CHECKED)
    widget.criteria.set_selection(test_selection)

    expected_settings: Final = {
        "name": test_selection,
        "name_subset": (not SUBSET_DEFAULT_CHECKED)
    }
    settings: Dict[str, Union[List[str], bool]] = {}
    widget.save(settings)
    assert settings == expected_settings


@pytest.mark.obj_args(enable_equal=True, enable_subset=True)
def test_equal_subset_enabled_save(widget: ListWidget, model: StringList) -> None:
    """Test save settings with equal and subset enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_subset.setChecked(True)
    widget.criteria.set_selection(test_selection)

    expected_settings: Final = {
        "name": test_selection,
        "name_equal": False,
        "name_subset": True
    }
    settings: Dict[str, Union[List[str], bool]] = {}
    widget.save(settings)
    assert settings == expected_settings


@pytest.mark.obj_args(enable_equal=False, enable_subset=False)
def test_equal_subset_disabled_load(widget: ListWidget, model: StringList) -> None:
    """Test load settings with no options."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria.set_selection(test_selection)

    settings: Final = {
        "name": test_selection
    }
    widget.load(settings)
    assert list(widget.criteria.selection()) == test_selection
    assert widget.query.name == test_selection


@pytest.mark.obj_args(enable_equal=True, enable_subset=False)
def test_equal_enabled_subset_disabled_load(widget: ListWidget, model: StringList) -> None:
    """Test load settings with equal enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_equal.setChecked(not EQUAL_DEFAULT_CHECKED)
    widget.criteria.set_selection(test_selection)

    settings: Final = {
        "name": test_selection,
        "name_equal": True
    }
    widget.load(settings)
    assert list(widget.criteria.selection()) == test_selection
    assert widget.query.name == test_selection
    assert widget.criteria_equal.isChecked() is True
    assert widget.query.name_equal is True


@pytest.mark.obj_args(enable_equal=False, enable_subset=True)
def test_equal_disabled_subset_enabled_load(widget: ListWidget, model: StringList) -> None:
    """Test load settings with subset enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_subset.setChecked(not SUBSET_DEFAULT_CHECKED)
    widget.criteria.set_selection(test_selection)

    settings: Final = {
        "name": test_selection,
        "name_subset": True
    }
    widget.load(settings)
    assert list(widget.criteria.selection()) == test_selection
    assert widget.criteria_subset.isChecked() is True
    assert widget.query.name == test_selection
    assert widget.query.name_subset is True


@pytest.mark.obj_args(enable_equal=True, enable_subset=True)
def test_equal_subset_enabled_load(widget: ListWidget, model: StringList) -> None:
    """Test load settings with equal and subset enabled."""
    test_selection = [model.item_list[0], model.item_list[2]]
    widget.criteria_subset.setChecked(True)
    widget.criteria.set_selection(test_selection)

    settings: Final = {
        "name": test_selection,
        "name_equal": False,
        "name_subset": True
    }
    widget.load(settings)
    assert list(widget.criteria.selection()) == test_selection
    assert widget.criteria_equal.isChecked() is False
    assert widget.criteria_subset.isChecked() is True
    assert widget.query.name == test_selection
    assert widget.query.name_equal is False
    assert widget.query.name_subset is True