1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#------------------------------------------------------------------------------
#
# Copyright (c) 2012, Enthought, Inc.
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in enthought/LICENSE.txt and may be redistributed only
# under the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Author: Pietro Berkes
# Date: Jan 2012
#
#------------------------------------------------------------------------------
"""
Test case for bug (wx, Mac OS X)
Editing the text part of a spin control box and pressing the OK button
without de-focusing raises an AttributeError
Traceback (most recent call last):
File "ETS/traitsui/traitsui/wx/range_editor.py", line 783, in update_object
self.value = self.control.GetValue()
AttributeError: 'NoneType' object has no attribute 'GetValue'
"""
from traits.has_traits import HasTraits
from traits.trait_types import Int
from traitsui.item import Item
from traitsui.view import View
from traitsui.editors.range_editor import RangeEditor
from traitsui.tests._tools import *
class NumberWithSpinnerEditor(HasTraits):
"""Dialog containing a RangeEditor in 'spinner' mode for an Int.
"""
number = Int
traits_view = View(
Item(label="Enter 4, then press OK without defocusing"),
Item('number', editor=RangeEditor(low=3, high=8, mode='spinner')),
buttons = ['OK']
)
@skip_if_not_wx
def test_wx_spin_control_editing_should_not_crash():
# Bug: when editing the text part of a spin control box, pressing
# the OK button raises an AttributeError on Mac OS X
try:
with store_exceptions_on_all_threads():
num = NumberWithSpinnerEditor()
ui = num.edit_traits()
# the following is equivalent to clicking in the text control of the
# range editor, enter a number, and clicking ok without defocusing
# SpinCtrl object
spin = ui.control.FindWindowByName('wxSpinCtrl')
spin.SetFocusFromKbd()
# on Windows, a wxSpinCtrl does not have children, and we cannot do
# the more fine-grained testing below
if len(spin.GetChildren()) == 0:
spin.SetValueString('4')
else:
# TextCtrl object of the spin control
spintxt = spin.FindWindowByName('text')
spintxt.SetValue('4')
# press the OK button and close the dialog
press_ok_button(ui)
except AttributeError:
# if all went well, we should not be here
assert False, "AttributeError raised"
@skip_if_not_wx
def test_wx_spin_control_editing_does_not_update():
# Bug: when editing the text part of a spin control box, pressing
# the OK button does not update the value of the HasTraits class
# on Mac OS X
with store_exceptions_on_all_threads():
num = NumberWithSpinnerEditor()
ui = num.edit_traits()
# the following is equivalent to clicking in the text control of the
# range editor, enter a number, and clicking ok without defocusing
# SpinCtrl object
spin = ui.control.FindWindowByName('wxSpinCtrl')
spin.SetFocusFromKbd()
# on Windows, a wxSpinCtrl does not have children, and we cannot do
# the more fine-grained testing below
if len(spin.GetChildren()) == 0:
spin.SetValueString('4')
else:
# TextCtrl object of the spin control
spintxt = spin.FindWindowByName('text')
spintxt.SetValue('4')
# press the OK button and close the dialog
press_ok_button(ui)
# if all went well, the number traits has been updated and its value is 4
assert num.number == 4
@skip_if_not_qt4
def test_qt_spin_control_editing():
# Behavior: when editing the text part of a spin control box, pressing
# the OK button updates the value of the HasTraits class
from pyface import qt
with store_exceptions_on_all_threads():
num = NumberWithSpinnerEditor()
ui = num.edit_traits()
# the following is equivalent to clicking in the text control of the
# range editor, enter a number, and clicking ok without defocusing
# text element inside the spin control
lineedit = ui.control.findChild(qt.QtGui.QLineEdit)
lineedit.setFocus()
lineedit.setText('4')
# press the OK button and close the dialog
press_ok_button(ui)
# if all went well, the number traits has been updated and its value is 4
assert num.number == 4
if __name__ == '__main__':
# Executing the file opens the dialog for manual testing
num = NumberWithSpinnerEditor()
num.configure_traits()
print num.number
|