You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
5.6 KiB
165 lines
5.6 KiB
import pytest |
|
from unittest.mock import MagicMock, patch |
|
from TermTk.TTkCore.constant import TTkK |
|
from TermTk.TTkCore.string import TTkString |
|
from TermTk.TTkWidgets.TTkModelView.treewidget import TTkTreeWidget |
|
from TermTk.TTkWidgets.TTkModelView.treewidgetitem import TTkTreeWidgetItem |
|
|
|
|
|
class TestTTkTreeWidgetEmpty: |
|
"""Test TTkTreeWidget with empty tree to catch crashes""" |
|
|
|
def test_empty_tree_creation(self): |
|
"""Test creating an empty tree widget""" |
|
tree = TTkTreeWidget() |
|
assert tree is not None |
|
assert tree._rootItem is not None |
|
|
|
def test_empty_tree_view_area_size(self): |
|
"""Test viewFullAreaSize with empty tree""" |
|
tree = TTkTreeWidget() |
|
w, h = tree.viewFullAreaSize() |
|
assert w == 0 |
|
assert h == 1 # Header row |
|
|
|
def test_empty_tree_clear(self): |
|
"""Test clear on empty tree""" |
|
tree = TTkTreeWidget() |
|
tree.clear() # Should not crash |
|
assert tree._rootItem.size() == 0 |
|
|
|
def test_empty_tree_paint_event(self): |
|
"""Test paintEvent with empty tree""" |
|
tree = TTkTreeWidget() |
|
canvas = MagicMock() |
|
tree.paintEvent(canvas) # Should not crash |
|
|
|
def test_empty_tree_selected_items(self): |
|
"""Test selectedItems with empty tree""" |
|
tree = TTkTreeWidget() |
|
selected = tree.selectedItems() |
|
assert selected == [] |
|
|
|
def test_empty_tree_mouse_press(self): |
|
"""Test mouse press on empty tree""" |
|
tree = TTkTreeWidget() |
|
evt = MagicMock() |
|
evt.x = 5 |
|
evt.y = 5 |
|
evt.mod = 0 |
|
tree.mousePressEvent(evt) # Should not crash |
|
|
|
def test_empty_tree_resize_column(self): |
|
"""Test resizeColumnToContents with empty tree""" |
|
tree = TTkTreeWidget(header=[TTkString("Col1")]) |
|
tree.resizeColumnToContents(0) # Should not crash |
|
|
|
|
|
class TestTTkTreeWidgetBasic: |
|
"""Test basic TTkTreeWidget functionality""" |
|
|
|
def test_tree_with_header(self): |
|
"""Test tree creation with headers""" |
|
tree = TTkTreeWidget(header=[TTkString("A"), TTkString("B")]) |
|
assert len(tree._header) == 2 |
|
assert len(tree._columnsPos) == 2 |
|
|
|
def test_add_top_level_item(self): |
|
"""Test adding a top-level item""" |
|
tree = TTkTreeWidget() |
|
item = TTkTreeWidgetItem(["Item 1"]) |
|
tree.addTopLevelItem(item) |
|
assert tree._rootItem.size() == 1 |
|
assert tree.topLevelItem(0) == item |
|
|
|
def test_add_multiple_top_level_items(self): |
|
"""Test adding multiple top-level items""" |
|
tree = TTkTreeWidget() |
|
items = [TTkTreeWidgetItem([f"Item {i}"]) for i in range(3)] |
|
tree.addTopLevelItems(items) |
|
assert tree._rootItem.size() == 3 |
|
|
|
def test_take_top_level_item(self): |
|
"""Test removing top-level item""" |
|
tree = TTkTreeWidget() |
|
item = TTkTreeWidgetItem(["Item 1"]) |
|
tree.addTopLevelItem(item) |
|
taken = tree.takeTopLevelItem(0) |
|
assert taken == item |
|
assert tree._rootItem.size() == 0 |
|
|
|
def test_index_of_top_level_item(self): |
|
"""Test finding index of top-level item""" |
|
tree = TTkTreeWidget() |
|
items = [TTkTreeWidgetItem([f"Item {i}"]) for i in range(3)] |
|
tree.addTopLevelItems(items) |
|
assert tree.indexOfTopLevelItem(items[1]) == 1 |
|
|
|
def test_invisible_root_item(self): |
|
"""Test getting invisible root item""" |
|
tree = TTkTreeWidget() |
|
root = tree.invisibleRootItem() |
|
assert root == tree._rootItem |
|
|
|
|
|
class TestTTkTreeWidgetSelection: |
|
"""Test selection modes""" |
|
|
|
def test_single_selection_mode(self): |
|
"""Test single selection mode""" |
|
tree = TTkTreeWidget(selectionMode=TTkK.SelectionMode.SingleSelection) |
|
assert tree.selectionMode() == TTkK.SelectionMode.SingleSelection |
|
|
|
def test_multi_selection_mode(self): |
|
"""Test multi selection mode""" |
|
tree = TTkTreeWidget(selectionMode=TTkK.SelectionMode.MultiSelection) |
|
assert tree.selectionMode() == TTkK.SelectionMode.MultiSelection |
|
|
|
def test_set_selection_mode(self): |
|
"""Test changing selection mode""" |
|
tree = TTkTreeWidget() |
|
tree.setSelectionMode(TTkK.SelectionMode.MultiSelection) |
|
assert tree.selectionMode() == TTkK.SelectionMode.MultiSelection |
|
|
|
|
|
class TestTTkTreeWidgetSorting: |
|
"""Test sorting functionality""" |
|
|
|
def test_sorting_enabled_default(self): |
|
"""Test sorting is enabled by default""" |
|
tree = TTkTreeWidget() |
|
assert tree.isSortingEnabled() is True |
|
|
|
def test_set_sorting_enabled(self): |
|
"""Test enabling/disabling sorting""" |
|
tree = TTkTreeWidget(sortingEnabled=False) |
|
assert tree.isSortingEnabled() is False |
|
tree.setSortingEnabled(True) |
|
assert tree.isSortingEnabled() is True |
|
|
|
def test_sort_column(self): |
|
"""Test sort column getter""" |
|
tree = TTkTreeWidget() |
|
assert tree.sortColumn() == -1 |
|
|
|
def test_sort_items_when_disabled(self): |
|
"""Test sorting when disabled does nothing""" |
|
tree = TTkTreeWidget(sortingEnabled=False) |
|
tree.sortItems(0, TTkK.AscendingOrder) |
|
assert tree._sortColumn == -1 |
|
|
|
|
|
class TestTTkTreeWidgetColumns: |
|
"""Test column operations""" |
|
|
|
def test_column_width(self): |
|
"""Test getting column width""" |
|
tree = TTkTreeWidget(header=[TTkString("A"), TTkString("B")]) |
|
width = tree.columnWidth(0) |
|
assert width == 20 # Default width |
|
|
|
def test_set_column_width(self): |
|
"""Test setting column width""" |
|
tree = TTkTreeWidget(header=[TTkString("A"), TTkString("B")]) |
|
tree.setColumnWidth(0, 30) |
|
assert tree.columnWidth(0) == 30 + 1 # separator |