mirror of
https://github.com/pyapp-kit/superqt.git
synced 2025-09-05 17:20:27 +02:00
* add support for flag enum * fix flag selection * more edge cases * remove obsolete test and add explanation
231 lines
5.1 KiB
Python
231 lines
5.1 KiB
Python
import sys
|
|
from enum import Enum, Flag, IntEnum, IntFlag
|
|
|
|
import pytest
|
|
|
|
from superqt.combobox import QEnumComboBox
|
|
from superqt.combobox._enum_combobox import NONE_STRING
|
|
|
|
|
|
class Enum1(Enum):
|
|
a = 1
|
|
b = 2
|
|
c = 3
|
|
|
|
ALIAS = a
|
|
|
|
|
|
class Enum2(Enum):
|
|
d = 1
|
|
e = 2
|
|
f = 3
|
|
g = 4
|
|
|
|
|
|
class Enum3(Enum):
|
|
a = 1
|
|
b = 2
|
|
c = 3
|
|
|
|
def __str__(self):
|
|
return self.name + "1"
|
|
|
|
|
|
class Enum4(Enum):
|
|
a_1 = 1
|
|
b_2 = 2
|
|
c_3 = 3
|
|
|
|
|
|
class IntEnum1(IntEnum):
|
|
a = 1
|
|
b = 2
|
|
c = 5
|
|
|
|
|
|
class IntFlag1(IntFlag):
|
|
a = 1
|
|
b = 2
|
|
c = 4
|
|
|
|
|
|
class Flag1(Flag):
|
|
a = 1
|
|
b = 2
|
|
c = 4
|
|
|
|
|
|
class IntFlag2(IntFlag):
|
|
a = 1
|
|
b = 2
|
|
c = 3
|
|
|
|
|
|
class Flag2(IntFlag):
|
|
a = 1
|
|
b = 2
|
|
c = 5
|
|
|
|
|
|
class FlagOrNum(IntFlag):
|
|
a = 3
|
|
b = 5
|
|
c = 8
|
|
|
|
|
|
def test_simple_create(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum1)
|
|
qtbot.addWidget(enum)
|
|
assert enum.count() == 3
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a", "b", "c"]
|
|
|
|
|
|
def test_simple_create2(qtbot):
|
|
enum = QEnumComboBox()
|
|
qtbot.addWidget(enum)
|
|
assert enum.count() == 0
|
|
enum.setEnumClass(Enum1)
|
|
assert enum.count() == 3
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a", "b", "c"]
|
|
|
|
|
|
def test_replace(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum1)
|
|
qtbot.addWidget(enum)
|
|
assert enum.count() == 3
|
|
assert enum.enumClass() == Enum1
|
|
assert isinstance(enum.currentEnum(), Enum1)
|
|
enum.setEnumClass(Enum2)
|
|
assert enum.enumClass() == Enum2
|
|
assert isinstance(enum.currentEnum(), Enum2)
|
|
assert enum.count() == 4
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["d", "e", "f", "g"]
|
|
|
|
|
|
def test_str_replace(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum3)
|
|
qtbot.addWidget(enum)
|
|
assert enum.count() == 3
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a1", "b1", "c1"]
|
|
|
|
|
|
def test_underscore_replace(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum4)
|
|
qtbot.addWidget(enum)
|
|
assert enum.count() == 3
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a 1", "b 2", "c 3"]
|
|
|
|
|
|
def test_change_value(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum1)
|
|
qtbot.addWidget(enum)
|
|
assert enum.currentEnum() == Enum1.a
|
|
with qtbot.waitSignal(
|
|
enum.currentEnumChanged, check_params_cb=lambda x: isinstance(x, Enum)
|
|
):
|
|
enum.setCurrentEnum(Enum1.c)
|
|
assert enum.currentEnum() == Enum1.c
|
|
|
|
|
|
def test_no_enum(qtbot):
|
|
enum = QEnumComboBox()
|
|
assert enum.enumClass() is None
|
|
qtbot.addWidget(enum)
|
|
assert enum.currentEnum() is None
|
|
|
|
|
|
def test_prohibited_methods(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum1)
|
|
qtbot.addWidget(enum)
|
|
with pytest.raises(RuntimeError):
|
|
enum.addItem("aaa")
|
|
with pytest.raises(RuntimeError):
|
|
enum.addItems(["aaa", "bbb"])
|
|
with pytest.raises(RuntimeError):
|
|
enum.insertItem(0, "aaa")
|
|
with pytest.raises(RuntimeError):
|
|
enum.insertItems(0, ["aaa", "bbb"])
|
|
assert enum.count() == 3
|
|
|
|
|
|
def test_optional(qtbot):
|
|
enum = QEnumComboBox(enum_class=Enum1, allow_none=True)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == [
|
|
NONE_STRING,
|
|
"a",
|
|
"b",
|
|
"c",
|
|
]
|
|
assert enum.currentText() == NONE_STRING
|
|
assert enum.currentEnum() is None
|
|
enum.setCurrentEnum(Enum1.a)
|
|
assert enum.currentText() == "a"
|
|
assert enum.currentEnum() == Enum1.a
|
|
assert enum.enumClass() is Enum1
|
|
enum.setCurrentEnum(None)
|
|
assert enum.currentText() == NONE_STRING
|
|
assert enum.currentEnum() is None
|
|
|
|
|
|
def test_simple_create_int_enum(qtbot):
|
|
enum = QEnumComboBox(enum_class=IntEnum1)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a", "b", "c"]
|
|
|
|
|
|
@pytest.mark.parametrize("enum_class", [IntFlag1, Flag1])
|
|
def test_enum_flag_create(qtbot, enum_class):
|
|
enum = QEnumComboBox(enum_class=enum_class)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == [
|
|
"a",
|
|
"b",
|
|
"c",
|
|
"a|b",
|
|
"a|c",
|
|
"b|c",
|
|
"a|b|c",
|
|
]
|
|
enum.setCurrentText("a|b")
|
|
assert enum.currentEnum() == enum_class.a | enum_class.b
|
|
|
|
|
|
def test_enum_flag_create_collision(qtbot):
|
|
enum = QEnumComboBox(enum_class=IntFlag2)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a", "b", "c"]
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.version_info >= (3, 11), reason="different representation in 3.11"
|
|
)
|
|
def test_enum_flag_create_collision_evaluated_to_seven(qtbot):
|
|
enum = QEnumComboBox(enum_class=FlagOrNum)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == [
|
|
"a",
|
|
"b",
|
|
"c",
|
|
"a|b",
|
|
"a|c",
|
|
"b|c",
|
|
"a|b|c",
|
|
]
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
sys.version_info < (3, 11), reason="StrEnum is introduced in python 3.11"
|
|
)
|
|
def test_create_str_enum(qtbot):
|
|
from enum import StrEnum
|
|
|
|
class StrEnum1(StrEnum):
|
|
a = "a"
|
|
b = "b"
|
|
c = "c"
|
|
|
|
enum = QEnumComboBox(enum_class=StrEnum1)
|
|
qtbot.addWidget(enum)
|
|
assert [enum.itemText(i) for i in range(enum.count())] == ["a", "b", "c"]
|