6 changed files with 188 additions and 17 deletions
@ -0,0 +1,165 @@
|
||||
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 |
||||
Loading…
Reference in new issue