source: titan/mediathek/localhoster/lib/python2.7/lib-tk/test/widget_tests.py @ 40114

Last change on this file since 40114 was 40094, checked in by obi, 7 years ago

tithek add yoztube-dl support

File size: 19.2 KB
Line 
1# Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py
2
3import unittest
4import sys
5import Tkinter as tkinter
6from ttk import Scale
7from test_ttk.support import (AbstractTkTest, tcl_version, requires_tcl,
8                              get_tk_patchlevel, pixels_conv, tcl_obj_eq)
9import test.test_support
10
11
12noconv = noconv_meth = False
13if get_tk_patchlevel() < (8, 5, 11):
14    noconv = str
15noconv_meth = noconv and staticmethod(noconv)
16
17def int_round(x):
18    return int(round(x))
19
20pixels_round = int_round
21if get_tk_patchlevel()[:3] == (8, 5, 11):
22    # Issue #19085: Workaround a bug in Tk
23    # http://core.tcl.tk/tk/info/3497848
24    pixels_round = int
25
26
27_sentinel = object()
28
29class AbstractWidgetTest(AbstractTkTest):
30    _conv_pixels = staticmethod(pixels_round)
31    _conv_pad_pixels = None
32    _stringify = False
33
34    @property
35    def scaling(self):
36        try:
37            return self._scaling
38        except AttributeError:
39            self._scaling = float(self.root.call('tk', 'scaling'))
40            return self._scaling
41
42    def _str(self, value):
43        if not self._stringify and self.wantobjects and tcl_version >= (8, 6):
44            return value
45        if isinstance(value, tuple):
46            return ' '.join(map(self._str, value))
47        return str(value)
48
49    def assertEqual2(self, actual, expected, msg=None, eq=object.__eq__):
50        if eq(actual, expected):
51            return
52        self.assertEqual(actual, expected, msg)
53
54    def checkParam(self, widget, name, value, expected=_sentinel,
55                   conv=False, eq=None):
56        widget[name] = value
57        if expected is _sentinel:
58            expected = value
59        if conv:
60            expected = conv(expected)
61        if self._stringify or not self.wantobjects:
62            if isinstance(expected, tuple):
63                expected = tkinter._join(expected)
64            else:
65                expected = str(expected)
66        if eq is None:
67            eq = tcl_obj_eq
68        self.assertEqual2(widget[name], expected, eq=eq)
69        self.assertEqual2(widget.cget(name), expected, eq=eq)
70        # XXX
71        if not isinstance(widget, Scale):
72            t = widget.configure(name)
73            self.assertEqual(len(t), 5)
74            self.assertEqual2(t[4], expected, eq=eq)
75
76    def checkInvalidParam(self, widget, name, value, errmsg=None,
77                          keep_orig=True):
78        orig = widget[name]
79        if errmsg is not None:
80            errmsg = errmsg.format(value)
81        with self.assertRaises(tkinter.TclError) as cm:
82            widget[name] = value
83        if errmsg is not None:
84            self.assertEqual(str(cm.exception), errmsg)
85        if keep_orig:
86            self.assertEqual(widget[name], orig)
87        else:
88            widget[name] = orig
89        with self.assertRaises(tkinter.TclError) as cm:
90            widget.configure({name: value})
91        if errmsg is not None:
92            self.assertEqual(str(cm.exception), errmsg)
93        if keep_orig:
94            self.assertEqual(widget[name], orig)
95        else:
96            widget[name] = orig
97
98    def checkParams(self, widget, name, *values, **kwargs):
99        for value in values:
100            self.checkParam(widget, name, value, **kwargs)
101
102    def checkIntegerParam(self, widget, name, *values, **kwargs):
103        self.checkParams(widget, name, *values, **kwargs)
104        self.checkInvalidParam(widget, name, '',
105                errmsg='expected integer but got ""')
106        self.checkInvalidParam(widget, name, '10p',
107                errmsg='expected integer but got "10p"')
108        self.checkInvalidParam(widget, name, 3.2,
109                errmsg='expected integer but got "3.2"')
110
111    def checkFloatParam(self, widget, name, *values, **kwargs):
112        if 'conv' in kwargs:
113            conv = kwargs.pop('conv')
114        else:
115            conv = float
116        for value in values:
117            self.checkParam(widget, name, value, conv=conv, **kwargs)
118        self.checkInvalidParam(widget, name, '',
119                errmsg='expected floating-point number but got ""')
120        self.checkInvalidParam(widget, name, 'spam',
121                errmsg='expected floating-point number but got "spam"')
122
123    def checkBooleanParam(self, widget, name):
124        for value in (False, 0, 'false', 'no', 'off'):
125            self.checkParam(widget, name, value, expected=0)
126        for value in (True, 1, 'true', 'yes', 'on'):
127            self.checkParam(widget, name, value, expected=1)
128        self.checkInvalidParam(widget, name, '',
129                errmsg='expected boolean value but got ""')
130        self.checkInvalidParam(widget, name, 'spam',
131                errmsg='expected boolean value but got "spam"')
132
133    def checkColorParam(self, widget, name, allow_empty=None, **kwargs):
134        self.checkParams(widget, name,
135                         '#ff0000', '#00ff00', '#0000ff', '#123456',
136                         'red', 'green', 'blue', 'white', 'black', 'grey',
137                         **kwargs)
138        self.checkInvalidParam(widget, name, 'spam',
139                errmsg='unknown color name "spam"')
140
141    def checkCursorParam(self, widget, name, **kwargs):
142        self.checkParams(widget, name, 'arrow', 'watch', 'cross', '',**kwargs)
143        if tcl_version >= (8, 5):
144            self.checkParam(widget, name, 'none')
145        self.checkInvalidParam(widget, name, 'spam',
146                errmsg='bad cursor spec "spam"')
147
148    def checkCommandParam(self, widget, name):
149        def command(*args):
150            pass
151        widget[name] = command
152        self.assertTrue(widget[name])
153        self.checkParams(widget, name, '')
154
155    def checkEnumParam(self, widget, name, *values, **kwargs):
156        if 'errmsg' in kwargs:
157            errmsg = kwargs.pop('errmsg')
158        else:
159            errmsg = None
160        self.checkParams(widget, name, *values, **kwargs)
161        if errmsg is None:
162            errmsg2 = ' %s "{}": must be %s%s or %s' % (
163                    name,
164                    ', '.join(values[:-1]),
165                    ',' if len(values) > 2 else '',
166                    values[-1])
167            self.checkInvalidParam(widget, name, '',
168                                   errmsg='ambiguous' + errmsg2)
169            errmsg = 'bad' + errmsg2
170        self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
171
172    def checkPixelsParam(self, widget, name, *values, **kwargs):
173        if 'conv' in kwargs:
174            conv = kwargs.pop('conv')
175        else:
176            conv = None
177        if conv is None:
178            conv = self._conv_pixels
179        if 'keep_orig' in kwargs:
180            keep_orig = kwargs.pop('keep_orig')
181        else:
182            keep_orig = True
183        for value in values:
184            expected = _sentinel
185            conv1 = conv
186            if isinstance(value, str):
187                if conv1 and conv1 is not str:
188                    expected = pixels_conv(value) * self.scaling
189                    conv1 = int_round
190            self.checkParam(widget, name, value, expected=expected,
191                            conv=conv1, **kwargs)
192        self.checkInvalidParam(widget, name, '6x',
193                errmsg='bad screen distance "6x"', keep_orig=keep_orig)
194        self.checkInvalidParam(widget, name, 'spam',
195                errmsg='bad screen distance "spam"', keep_orig=keep_orig)
196
197    def checkReliefParam(self, widget, name):
198        self.checkParams(widget, name,
199                         'flat', 'groove', 'raised', 'ridge', 'solid', 'sunken')
200        errmsg='bad relief "spam": must be '\
201               'flat, groove, raised, ridge, solid, or sunken'
202        if tcl_version < (8, 6):
203            errmsg = None
204        self.checkInvalidParam(widget, name, 'spam',
205                errmsg=errmsg)
206
207    def checkImageParam(self, widget, name):
208        image = tkinter.PhotoImage(master=self.root, name='image1')
209        self.checkParam(widget, name, image, conv=str)
210        self.checkInvalidParam(widget, name, 'spam',
211                errmsg='image "spam" doesn\'t exist')
212        widget[name] = ''
213
214    def checkVariableParam(self, widget, name, var):
215        self.checkParam(widget, name, var, conv=str)
216
217    def assertIsBoundingBox(self, bbox):
218        self.assertIsNotNone(bbox)
219        self.assertIsInstance(bbox, tuple)
220        if len(bbox) != 4:
221            self.fail('Invalid bounding box: %r' % (bbox,))
222        for item in bbox:
223            if not isinstance(item, int):
224                self.fail('Invalid bounding box: %r' % (bbox,))
225                break
226
227
228class StandardOptionsTests(object):
229    STANDARD_OPTIONS = (
230        'activebackground', 'activeborderwidth', 'activeforeground', 'anchor',
231        'background', 'bitmap', 'borderwidth', 'compound', 'cursor',
232        'disabledforeground', 'exportselection', 'font', 'foreground',
233        'highlightbackground', 'highlightcolor', 'highlightthickness',
234        'image', 'insertbackground', 'insertborderwidth',
235        'insertofftime', 'insertontime', 'insertwidth',
236        'jump', 'justify', 'orient', 'padx', 'pady', 'relief',
237        'repeatdelay', 'repeatinterval',
238        'selectbackground', 'selectborderwidth', 'selectforeground',
239        'setgrid', 'takefocus', 'text', 'textvariable', 'troughcolor',
240        'underline', 'wraplength', 'xscrollcommand', 'yscrollcommand',
241    )
242
243    def test_activebackground(self):
244        widget = self.create()
245        self.checkColorParam(widget, 'activebackground')
246
247    def test_activeborderwidth(self):
248        widget = self.create()
249        self.checkPixelsParam(widget, 'activeborderwidth',
250                              0, 1.3, 2.9, 6, -2, '10p')
251
252    def test_activeforeground(self):
253        widget = self.create()
254        self.checkColorParam(widget, 'activeforeground')
255
256    def test_anchor(self):
257        widget = self.create()
258        self.checkEnumParam(widget, 'anchor',
259                'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'center')
260
261    def test_background(self):
262        widget = self.create()
263        self.checkColorParam(widget, 'background')
264        if 'bg' in self.OPTIONS:
265            self.checkColorParam(widget, 'bg')
266
267    def test_bitmap(self):
268        widget = self.create()
269        self.checkParam(widget, 'bitmap', 'questhead')
270        self.checkParam(widget, 'bitmap', 'gray50')
271        filename = test.test_support.findfile('python.xbm', subdir='imghdrdata')
272        self.checkParam(widget, 'bitmap', '@' + filename)
273        # Cocoa Tk widgets don't detect invalid -bitmap values
274        # See https://core.tcl.tk/tk/info/31cd33dbf0
275        if not ('aqua' in self.root.tk.call('tk', 'windowingsystem') and
276                'AppKit' in self.root.winfo_server()):
277            self.checkInvalidParam(widget, 'bitmap', 'spam',
278                    errmsg='bitmap "spam" not defined')
279
280    def test_borderwidth(self):
281        widget = self.create()
282        self.checkPixelsParam(widget, 'borderwidth',
283                              0, 1.3, 2.6, 6, -2, '10p')
284        if 'bd' in self.OPTIONS:
285            self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, -2, '10p')
286
287    def test_compound(self):
288        widget = self.create()
289        self.checkEnumParam(widget, 'compound',
290                'bottom', 'center', 'left', 'none', 'right', 'top')
291
292    def test_cursor(self):
293        widget = self.create()
294        self.checkCursorParam(widget, 'cursor')
295
296    def test_disabledforeground(self):
297        widget = self.create()
298        self.checkColorParam(widget, 'disabledforeground')
299
300    def test_exportselection(self):
301        widget = self.create()
302        self.checkBooleanParam(widget, 'exportselection')
303
304    def test_font(self):
305        widget = self.create()
306        self.checkParam(widget, 'font',
307                        '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*')
308        self.checkInvalidParam(widget, 'font', '',
309                               errmsg='font "" doesn\'t exist')
310
311    def test_foreground(self):
312        widget = self.create()
313        self.checkColorParam(widget, 'foreground')
314        if 'fg' in self.OPTIONS:
315            self.checkColorParam(widget, 'fg')
316
317    def test_highlightbackground(self):
318        widget = self.create()
319        self.checkColorParam(widget, 'highlightbackground')
320
321    def test_highlightcolor(self):
322        widget = self.create()
323        self.checkColorParam(widget, 'highlightcolor')
324
325    def test_highlightthickness(self):
326        widget = self.create()
327        self.checkPixelsParam(widget, 'highlightthickness',
328                              0, 1.3, 2.6, 6, '10p')
329        self.checkParam(widget, 'highlightthickness', -2, expected=0,
330                        conv=self._conv_pixels)
331
332    @unittest.skipIf(sys.platform == 'darwin',
333                     'crashes with Cocoa Tk (issue19733)')
334    def test_image(self):
335        widget = self.create()
336        self.checkImageParam(widget, 'image')
337
338    def test_insertbackground(self):
339        widget = self.create()
340        self.checkColorParam(widget, 'insertbackground')
341
342    def test_insertborderwidth(self):
343        widget = self.create()
344        self.checkPixelsParam(widget, 'insertborderwidth',
345                              0, 1.3, 2.6, 6, -2, '10p')
346
347    def test_insertofftime(self):
348        widget = self.create()
349        self.checkIntegerParam(widget, 'insertofftime', 100)
350
351    def test_insertontime(self):
352        widget = self.create()
353        self.checkIntegerParam(widget, 'insertontime', 100)
354
355    def test_insertwidth(self):
356        widget = self.create()
357        self.checkPixelsParam(widget, 'insertwidth', 1.3, 2.6, -2, '10p')
358
359    def test_jump(self):
360        widget = self.create()
361        self.checkBooleanParam(widget, 'jump')
362
363    def test_justify(self):
364        widget = self.create()
365        self.checkEnumParam(widget, 'justify', 'left', 'right', 'center',
366                errmsg='bad justification "{}": must be '
367                       'left, right, or center')
368        self.checkInvalidParam(widget, 'justify', '',
369                errmsg='ambiguous justification "": must be '
370                       'left, right, or center')
371
372    def test_orient(self):
373        widget = self.create()
374        self.assertEqual(str(widget['orient']), self.default_orient)
375        self.checkEnumParam(widget, 'orient', 'horizontal', 'vertical')
376
377    def test_padx(self):
378        widget = self.create()
379        self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, -2, '12m',
380                              conv=self._conv_pad_pixels)
381
382    def test_pady(self):
383        widget = self.create()
384        self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, -2, '12m',
385                              conv=self._conv_pad_pixels)
386
387    def test_relief(self):
388        widget = self.create()
389        self.checkReliefParam(widget, 'relief')
390
391    def test_repeatdelay(self):
392        widget = self.create()
393        self.checkIntegerParam(widget, 'repeatdelay', -500, 500)
394
395    def test_repeatinterval(self):
396        widget = self.create()
397        self.checkIntegerParam(widget, 'repeatinterval', -500, 500)
398
399    def test_selectbackground(self):
400        widget = self.create()
401        self.checkColorParam(widget, 'selectbackground')
402
403    def test_selectborderwidth(self):
404        widget = self.create()
405        self.checkPixelsParam(widget, 'selectborderwidth', 1.3, 2.6, -2, '10p')
406
407    def test_selectforeground(self):
408        widget = self.create()
409        self.checkColorParam(widget, 'selectforeground')
410
411    def test_setgrid(self):
412        widget = self.create()
413        self.checkBooleanParam(widget, 'setgrid')
414
415    def test_state(self):
416        widget = self.create()
417        self.checkEnumParam(widget, 'state', 'active', 'disabled', 'normal')
418
419    def test_takefocus(self):
420        widget = self.create()
421        self.checkParams(widget, 'takefocus', '0', '1', '')
422
423    def test_text(self):
424        widget = self.create()
425        self.checkParams(widget, 'text', '', 'any string')
426
427    def test_textvariable(self):
428        widget = self.create()
429        var = tkinter.StringVar(self.root)
430        self.checkVariableParam(widget, 'textvariable', var)
431
432    def test_troughcolor(self):
433        widget = self.create()
434        self.checkColorParam(widget, 'troughcolor')
435
436    def test_underline(self):
437        widget = self.create()
438        self.checkIntegerParam(widget, 'underline', 0, 1, 10)
439
440    def test_wraplength(self):
441        widget = self.create()
442        self.checkPixelsParam(widget, 'wraplength', 100)
443
444    def test_xscrollcommand(self):
445        widget = self.create()
446        self.checkCommandParam(widget, 'xscrollcommand')
447
448    def test_yscrollcommand(self):
449        widget = self.create()
450        self.checkCommandParam(widget, 'yscrollcommand')
451
452    # non-standard but common options
453
454    def test_command(self):
455        widget = self.create()
456        self.checkCommandParam(widget, 'command')
457
458    def test_indicatoron(self):
459        widget = self.create()
460        self.checkBooleanParam(widget, 'indicatoron')
461
462    def test_offrelief(self):
463        widget = self.create()
464        self.checkReliefParam(widget, 'offrelief')
465
466    def test_overrelief(self):
467        widget = self.create()
468        self.checkReliefParam(widget, 'overrelief')
469
470    def test_selectcolor(self):
471        widget = self.create()
472        self.checkColorParam(widget, 'selectcolor')
473
474    def test_selectimage(self):
475        widget = self.create()
476        self.checkImageParam(widget, 'selectimage')
477
478    @requires_tcl(8, 5)
479    def test_tristateimage(self):
480        widget = self.create()
481        self.checkImageParam(widget, 'tristateimage')
482
483    @requires_tcl(8, 5)
484    def test_tristatevalue(self):
485        widget = self.create()
486        self.checkParam(widget, 'tristatevalue', 'unknowable')
487
488    def test_variable(self):
489        widget = self.create()
490        var = tkinter.DoubleVar(self.root)
491        self.checkVariableParam(widget, 'variable', var)
492
493
494class IntegerSizeTests(object):
495    def test_height(self):
496        widget = self.create()
497        self.checkIntegerParam(widget, 'height', 100, -100, 0)
498
499    def test_width(self):
500        widget = self.create()
501        self.checkIntegerParam(widget, 'width', 402, -402, 0)
502
503
504class PixelSizeTests(object):
505    def test_height(self):
506        widget = self.create()
507        self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, -100, 0, '3c')
508
509    def test_width(self):
510        widget = self.create()
511        self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, -402, 0, '5i')
512
513
514def add_standard_options(*source_classes):
515    # This decorator adds test_xxx methods from source classes for every xxx
516    # option in the OPTIONS class attribute if they are not defined explicitly.
517    def decorator(cls):
518        for option in cls.OPTIONS:
519            methodname = 'test_' + option
520            if not hasattr(cls, methodname):
521                for source_class in source_classes:
522                    if hasattr(source_class, methodname):
523                        setattr(cls, methodname,
524                                getattr(source_class, methodname).im_func)
525                        break
526                else:
527                    def test(self, option=option):
528                        widget = self.create()
529                        widget[option]
530                        raise AssertionError('Option "%s" is not tested in %s' %
531                                             (option, cls.__name__))
532                    test.__name__ = methodname
533                    setattr(cls, methodname, test)
534        return cls
535    return decorator
536
537def setUpModule():
538    if test.test_support.verbose:
539        tcl = tkinter.Tcl()
540        print 'patchlevel =', tcl.call('info', 'patchlevel')
Note: See TracBrowser for help on using the repository browser.