import pyqtgraph as pg from pyqtgraph import functions as fn from pyqtgraph.Qt import QtGui import pytest import warnings def test_registration(): reg = pg.functions.styleRegistry() color = reg.getRegisteredColor('p0') color_copy = QtGui.QColor(color) # make a copy # confirm that a registration was assigned: assert hasattr(color,'registration') # confirm that the registration is not copied: assert not hasattr(color_copy,'registration') def test_specification_formats(): next_reg = None reg = pg.functions.styleRegistry() reg.registered_objects = {} # force-clear registry obj_list = [] # start building a list of test objects assert len(reg.registered_objects) == len(obj_list) # registry should be empty args = ( # Do we expect a registered pen (or 'None'?) for this parameter? ( True, ('p0', 1, 255) ), ( True, ('p1', None, 192) ), ( True, ('p2', 2) ), ( False, ('#00112233') ), ( False, '#012' ), ( False, '#xxx' ), # QColor converts any invalid string to #000000 ( False, 'ยต' ), # QColor converts any invalid string to #000000 ( None, 1e129 ), ( None, ( 1.0, 0.5, 0.2 ) ), ( None, ( 5, 12 ) ), ( None, {'1':2} ) ) for expectation, desc in args: # test pen registration # print( expectation, desc ) with warnings.catch_warnings(): warnings.simplefilter("ignore") # getRegisteredPen raises an expected warning for a test with unknown identifier pen = reg.getRegisteredPen(desc) if expectation is None: # print( desc, pen ) assert pen is None # does not match input patterns elif expectation: # matches input pattern for registered pen if next_reg is None: # initialize, then watch it count up next_reg = pen.registration assert pen.registration == next_reg next_reg += 1 obj_list.append(pen) else: # matches (hex) input pattern for regular QColor assert not hasattr(pen,'registration') del pen args = ( # Do we expect a registered brush (or 'None'?) for this parameter? ( True, ('p0', 255) ), ( True, 'p1'), ( True, ('p2', 0.1) ), ( False, ('#00112233') ), ( False, '#001122' ), ( None, 1e129 ), ( None, ( 1.0, 0.5, 0.2 ) ), ( None, ( 5, 12 ) ) ) for expectation, desc in args: # test brush registration brush = reg.getRegisteredBrush(desc) if expectation is None: assert brush is None elif expectation: assert brush.registration == next_reg next_reg += 1 obj_list.append(brush) else: assert not hasattr(brush,'registration') del brush for expectation, desc in args: # test color registration color = reg.getRegisteredColor(desc) if expectation is None: assert color is None if expectation: assert color.registration == next_reg next_reg += 1 obj_list.append(color) else: assert not hasattr(color,'registration') del color assert len(reg.registered_objects) == len(obj_list) new_colors = ( ('p0', QtGui.QColor('#000001') ), ('p1', QtGui.QColor('#000002') ), ('p2', QtGui.QColor('#000003') ) ) updated_colors = reg.colors().copy() for key, qcol in new_colors: updated_colors[key] = qcol reg.redefinePalette(updated_colors) for idx, obj in enumerate(obj_list): col_idx = idx % 3 # colors 'p0' to 'p2' repeat for pen, brush and color qcol = obj.color() if hasattr(obj,'color') else obj # print(qcol.name(),' -- ', new_colors[col_idx][1].name() ) assert qcol.rgb() == new_colors[col_idx][1].rgb() del obj del qcol # do not keep extra references assert len(reg.registered_objects) == len(obj_list) obj_list = [] # delete all objects print('remaining registered objects:', reg.registered_objects ) assert ( len(reg.registered_objects) == 0 or # All cleared by finalize calls, except that len(reg.registered_objects) == 1 # PySide seems to be left with one surviving reference ) def test_mkColor_edge_case_specifications(): color = fn.mkColor(1e129) assert color.name() == '#ffffff' # large float should be clipped and treated as 0-1 grayscale value assert not hasattr(color,'registration') # large float input should not yield a registered color try: color = fn.mkColor(True) assert False # mkColor(True) is expected to raise an error except TypeError: pass try: color = fn.mkColor(None) assert False # mkColor(True) is expected to raise an error except TypeError: pass