from enum import Enum import pytest from superqt.combobox import QEnumComboBox from superqt.combobox._enum_combobox import NONE_STRING class Enum1(Enum): a = 1 b = 2 c = 3 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 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