17db96d56Sopenharmony_ciimport unittest
27db96d56Sopenharmony_ciimport tkinter
37db96d56Sopenharmony_cifrom tkinter import TclError
47db96d56Sopenharmony_ciimport os
57db96d56Sopenharmony_cifrom test.support import requires
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cifrom tkinter.test.support import (requires_tcl,
87db96d56Sopenharmony_ci                                  get_tk_patchlevel, widget_eq,
97db96d56Sopenharmony_ci                                  AbstractDefaultRootTest)
107db96d56Sopenharmony_cifrom tkinter.test.widget_tests import (
117db96d56Sopenharmony_ci    add_standard_options,
127db96d56Sopenharmony_ci    AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests,
137db96d56Sopenharmony_ci    setUpModule)
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cirequires('gui')
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_cidef float_round(x):
197db96d56Sopenharmony_ci    return float(round(x))
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciclass AbstractToplevelTest(AbstractWidgetTest, PixelSizeTests):
237db96d56Sopenharmony_ci    _conv_pad_pixels = False
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci    def test_configure_class(self):
267db96d56Sopenharmony_ci        widget = self.create()
277db96d56Sopenharmony_ci        self.assertEqual(widget['class'],
287db96d56Sopenharmony_ci                         widget.__class__.__name__.title())
297db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'class', 'Foo',
307db96d56Sopenharmony_ci                errmsg="can't modify -class option after widget is created")
317db96d56Sopenharmony_ci        widget2 = self.create(class_='Foo')
327db96d56Sopenharmony_ci        self.assertEqual(widget2['class'], 'Foo')
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci    def test_configure_colormap(self):
357db96d56Sopenharmony_ci        widget = self.create()
367db96d56Sopenharmony_ci        self.assertEqual(widget['colormap'], '')
377db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'colormap', 'new',
387db96d56Sopenharmony_ci                errmsg="can't modify -colormap option after widget is created")
397db96d56Sopenharmony_ci        widget2 = self.create(colormap='new')
407db96d56Sopenharmony_ci        self.assertEqual(widget2['colormap'], 'new')
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    def test_configure_container(self):
437db96d56Sopenharmony_ci        widget = self.create()
447db96d56Sopenharmony_ci        self.assertEqual(widget['container'], 0 if self.wantobjects else '0')
457db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'container', 1,
467db96d56Sopenharmony_ci                errmsg="can't modify -container option after widget is created")
477db96d56Sopenharmony_ci        widget2 = self.create(container=True)
487db96d56Sopenharmony_ci        self.assertEqual(widget2['container'], 1 if self.wantobjects else '1')
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    def test_configure_visual(self):
517db96d56Sopenharmony_ci        widget = self.create()
527db96d56Sopenharmony_ci        self.assertEqual(widget['visual'], '')
537db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'visual', 'default',
547db96d56Sopenharmony_ci                errmsg="can't modify -visual option after widget is created")
557db96d56Sopenharmony_ci        widget2 = self.create(visual='default')
567db96d56Sopenharmony_ci        self.assertEqual(widget2['visual'], 'default')
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
607db96d56Sopenharmony_ciclass ToplevelTest(AbstractToplevelTest, unittest.TestCase):
617db96d56Sopenharmony_ci    OPTIONS = (
627db96d56Sopenharmony_ci        'background', 'borderwidth',
637db96d56Sopenharmony_ci        'class', 'colormap', 'container', 'cursor', 'height',
647db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
657db96d56Sopenharmony_ci        'menu', 'padx', 'pady', 'relief', 'screen',
667db96d56Sopenharmony_ci        'takefocus', 'use', 'visual', 'width',
677db96d56Sopenharmony_ci    )
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    def create(self, **kwargs):
707db96d56Sopenharmony_ci        return tkinter.Toplevel(self.root, **kwargs)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def test_configure_menu(self):
737db96d56Sopenharmony_ci        widget = self.create()
747db96d56Sopenharmony_ci        menu = tkinter.Menu(self.root)
757db96d56Sopenharmony_ci        self.checkParam(widget, 'menu', menu, eq=widget_eq)
767db96d56Sopenharmony_ci        self.checkParam(widget, 'menu', '')
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    def test_configure_screen(self):
797db96d56Sopenharmony_ci        widget = self.create()
807db96d56Sopenharmony_ci        if widget._windowingsystem != 'x11':
817db96d56Sopenharmony_ci            self.skipTest('Not using Tk for X11')
827db96d56Sopenharmony_ci        self.assertEqual(widget['screen'], '')
837db96d56Sopenharmony_ci        try:
847db96d56Sopenharmony_ci            display = os.environ['DISPLAY']
857db96d56Sopenharmony_ci        except KeyError:
867db96d56Sopenharmony_ci            self.skipTest('No $DISPLAY set.')
877db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'screen', display,
887db96d56Sopenharmony_ci                errmsg="can't modify -screen option after widget is created")
897db96d56Sopenharmony_ci        widget2 = self.create(screen=display)
907db96d56Sopenharmony_ci        self.assertEqual(widget2['screen'], display)
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    def test_configure_use(self):
937db96d56Sopenharmony_ci        widget = self.create()
947db96d56Sopenharmony_ci        self.assertEqual(widget['use'], '')
957db96d56Sopenharmony_ci        parent = self.create(container=True)
967db96d56Sopenharmony_ci        wid = hex(parent.winfo_id())
977db96d56Sopenharmony_ci        with self.subTest(wid=wid):
987db96d56Sopenharmony_ci            widget2 = self.create(use=wid)
997db96d56Sopenharmony_ci            self.assertEqual(widget2['use'], wid)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
1037db96d56Sopenharmony_ciclass FrameTest(AbstractToplevelTest, unittest.TestCase):
1047db96d56Sopenharmony_ci    OPTIONS = (
1057db96d56Sopenharmony_ci        'background', 'borderwidth',
1067db96d56Sopenharmony_ci        'class', 'colormap', 'container', 'cursor', 'height',
1077db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
1087db96d56Sopenharmony_ci        'padx', 'pady', 'relief', 'takefocus', 'visual', 'width',
1097db96d56Sopenharmony_ci    )
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci    def create(self, **kwargs):
1127db96d56Sopenharmony_ci        return tkinter.Frame(self.root, **kwargs)
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
1167db96d56Sopenharmony_ciclass LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
1177db96d56Sopenharmony_ci    OPTIONS = (
1187db96d56Sopenharmony_ci        'background', 'borderwidth',
1197db96d56Sopenharmony_ci        'class', 'colormap', 'container', 'cursor',
1207db96d56Sopenharmony_ci        'font', 'foreground', 'height',
1217db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
1227db96d56Sopenharmony_ci        'labelanchor', 'labelwidget', 'padx', 'pady', 'relief',
1237db96d56Sopenharmony_ci        'takefocus', 'text', 'visual', 'width',
1247db96d56Sopenharmony_ci    )
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci    def create(self, **kwargs):
1277db96d56Sopenharmony_ci        return tkinter.LabelFrame(self.root, **kwargs)
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci    def test_configure_labelanchor(self):
1307db96d56Sopenharmony_ci        widget = self.create()
1317db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'labelanchor',
1327db96d56Sopenharmony_ci                            'e', 'en', 'es', 'n', 'ne', 'nw',
1337db96d56Sopenharmony_ci                            's', 'se', 'sw', 'w', 'wn', 'ws')
1347db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'labelanchor', 'center')
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    def test_configure_labelwidget(self):
1377db96d56Sopenharmony_ci        widget = self.create()
1387db96d56Sopenharmony_ci        label = tkinter.Label(self.root, text='Mupp', name='foo')
1397db96d56Sopenharmony_ci        self.checkParam(widget, 'labelwidget', label, expected='.foo')
1407db96d56Sopenharmony_ci        label.destroy()
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ciclass AbstractLabelTest(AbstractWidgetTest, IntegerSizeTests):
1447db96d56Sopenharmony_ci    _conv_pixels = False
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    def test_configure_highlightthickness(self):
1477db96d56Sopenharmony_ci        widget = self.create()
1487db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'highlightthickness',
1497db96d56Sopenharmony_ci                              0, 1.3, 2.6, 6, -2, '10p')
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
1537db96d56Sopenharmony_ciclass LabelTest(AbstractLabelTest, unittest.TestCase):
1547db96d56Sopenharmony_ci    OPTIONS = (
1557db96d56Sopenharmony_ci        'activebackground', 'activeforeground', 'anchor',
1567db96d56Sopenharmony_ci        'background', 'bitmap', 'borderwidth', 'compound', 'cursor',
1577db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground', 'height',
1587db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
1597db96d56Sopenharmony_ci        'image', 'justify', 'padx', 'pady', 'relief', 'state',
1607db96d56Sopenharmony_ci        'takefocus', 'text', 'textvariable',
1617db96d56Sopenharmony_ci        'underline', 'width', 'wraplength',
1627db96d56Sopenharmony_ci    )
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    def create(self, **kwargs):
1657db96d56Sopenharmony_ci        return tkinter.Label(self.root, **kwargs)
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
1697db96d56Sopenharmony_ciclass ButtonTest(AbstractLabelTest, unittest.TestCase):
1707db96d56Sopenharmony_ci    OPTIONS = (
1717db96d56Sopenharmony_ci        'activebackground', 'activeforeground', 'anchor',
1727db96d56Sopenharmony_ci        'background', 'bitmap', 'borderwidth',
1737db96d56Sopenharmony_ci        'command', 'compound', 'cursor', 'default',
1747db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground', 'height',
1757db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
1767db96d56Sopenharmony_ci        'image', 'justify', 'overrelief', 'padx', 'pady', 'relief',
1777db96d56Sopenharmony_ci        'repeatdelay', 'repeatinterval',
1787db96d56Sopenharmony_ci        'state', 'takefocus', 'text', 'textvariable',
1797db96d56Sopenharmony_ci        'underline', 'width', 'wraplength')
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci    def create(self, **kwargs):
1827db96d56Sopenharmony_ci        return tkinter.Button(self.root, **kwargs)
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    def test_configure_default(self):
1857db96d56Sopenharmony_ci        widget = self.create()
1867db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'default', 'active', 'disabled', 'normal')
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
1907db96d56Sopenharmony_ciclass CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
1917db96d56Sopenharmony_ci    OPTIONS = (
1927db96d56Sopenharmony_ci        'activebackground', 'activeforeground', 'anchor',
1937db96d56Sopenharmony_ci        'background', 'bitmap', 'borderwidth',
1947db96d56Sopenharmony_ci        'command', 'compound', 'cursor',
1957db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground', 'height',
1967db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
1977db96d56Sopenharmony_ci        'image', 'indicatoron', 'justify',
1987db96d56Sopenharmony_ci        'offrelief', 'offvalue', 'onvalue', 'overrelief',
1997db96d56Sopenharmony_ci        'padx', 'pady', 'relief', 'selectcolor', 'selectimage', 'state',
2007db96d56Sopenharmony_ci        'takefocus', 'text', 'textvariable',
2017db96d56Sopenharmony_ci        'tristateimage', 'tristatevalue',
2027db96d56Sopenharmony_ci        'underline', 'variable', 'width', 'wraplength',
2037db96d56Sopenharmony_ci    )
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci    def create(self, **kwargs):
2067db96d56Sopenharmony_ci        return tkinter.Checkbutton(self.root, **kwargs)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    def test_configure_offvalue(self):
2107db96d56Sopenharmony_ci        widget = self.create()
2117db96d56Sopenharmony_ci        self.checkParams(widget, 'offvalue', 1, 2.3, '', 'any string')
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci    def test_configure_onvalue(self):
2147db96d56Sopenharmony_ci        widget = self.create()
2157db96d56Sopenharmony_ci        self.checkParams(widget, 'onvalue', 1, 2.3, '', 'any string')
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci    def test_unique_variables(self):
2187db96d56Sopenharmony_ci        frames = []
2197db96d56Sopenharmony_ci        buttons = []
2207db96d56Sopenharmony_ci        for i in range(2):
2217db96d56Sopenharmony_ci            f = tkinter.Frame(self.root)
2227db96d56Sopenharmony_ci            f.pack()
2237db96d56Sopenharmony_ci            frames.append(f)
2247db96d56Sopenharmony_ci            for j in 'AB':
2257db96d56Sopenharmony_ci                b = tkinter.Checkbutton(f, text=j)
2267db96d56Sopenharmony_ci                b.pack()
2277db96d56Sopenharmony_ci                buttons.append(b)
2287db96d56Sopenharmony_ci        variables = [str(b['variable']) for b in buttons]
2297db96d56Sopenharmony_ci        self.assertEqual(len(set(variables)), 4, variables)
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    def test_same_name(self):
2327db96d56Sopenharmony_ci        f1 = tkinter.Frame(self.root)
2337db96d56Sopenharmony_ci        f2 = tkinter.Frame(self.root)
2347db96d56Sopenharmony_ci        b1 = tkinter.Checkbutton(f1, name='test', text='Test1')
2357db96d56Sopenharmony_ci        b2 = tkinter.Checkbutton(f2, name='test', text='Test2')
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci        v = tkinter.IntVar(self.root, name='test')
2387db96d56Sopenharmony_ci        b1.select()
2397db96d56Sopenharmony_ci        self.assertEqual(v.get(), 1)
2407db96d56Sopenharmony_ci        b2.deselect()
2417db96d56Sopenharmony_ci        self.assertEqual(v.get(), 0)
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
2457db96d56Sopenharmony_ciclass RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
2467db96d56Sopenharmony_ci    OPTIONS = (
2477db96d56Sopenharmony_ci        'activebackground', 'activeforeground', 'anchor',
2487db96d56Sopenharmony_ci        'background', 'bitmap', 'borderwidth',
2497db96d56Sopenharmony_ci        'command', 'compound', 'cursor',
2507db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground', 'height',
2517db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
2527db96d56Sopenharmony_ci        'image', 'indicatoron', 'justify', 'offrelief', 'overrelief',
2537db96d56Sopenharmony_ci        'padx', 'pady', 'relief', 'selectcolor', 'selectimage', 'state',
2547db96d56Sopenharmony_ci        'takefocus', 'text', 'textvariable',
2557db96d56Sopenharmony_ci        'tristateimage', 'tristatevalue',
2567db96d56Sopenharmony_ci        'underline', 'value', 'variable', 'width', 'wraplength',
2577db96d56Sopenharmony_ci    )
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci    def create(self, **kwargs):
2607db96d56Sopenharmony_ci        return tkinter.Radiobutton(self.root, **kwargs)
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci    def test_configure_value(self):
2637db96d56Sopenharmony_ci        widget = self.create()
2647db96d56Sopenharmony_ci        self.checkParams(widget, 'value', 1, 2.3, '', 'any string')
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
2687db96d56Sopenharmony_ciclass MenubuttonTest(AbstractLabelTest, unittest.TestCase):
2697db96d56Sopenharmony_ci    OPTIONS = (
2707db96d56Sopenharmony_ci        'activebackground', 'activeforeground', 'anchor',
2717db96d56Sopenharmony_ci        'background', 'bitmap', 'borderwidth',
2727db96d56Sopenharmony_ci        'compound', 'cursor', 'direction',
2737db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground', 'height',
2747db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
2757db96d56Sopenharmony_ci        'image', 'indicatoron', 'justify', 'menu',
2767db96d56Sopenharmony_ci        'padx', 'pady', 'relief', 'state',
2777db96d56Sopenharmony_ci        'takefocus', 'text', 'textvariable',
2787db96d56Sopenharmony_ci        'underline', 'width', 'wraplength',
2797db96d56Sopenharmony_ci    )
2807db96d56Sopenharmony_ci    _conv_pixels = round
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci    def create(self, **kwargs):
2837db96d56Sopenharmony_ci        return tkinter.Menubutton(self.root, **kwargs)
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci    def test_configure_direction(self):
2867db96d56Sopenharmony_ci        widget = self.create()
2877db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'direction',
2887db96d56Sopenharmony_ci                'above', 'below', 'flush', 'left', 'right')
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    def test_configure_height(self):
2917db96d56Sopenharmony_ci        widget = self.create()
2927db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str)
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci    test_configure_highlightthickness = \
2957db96d56Sopenharmony_ci        StandardOptionsTests.test_configure_highlightthickness
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ci    def test_configure_image(self):
2987db96d56Sopenharmony_ci        widget = self.create()
2997db96d56Sopenharmony_ci        image = tkinter.PhotoImage(master=self.root, name='image1')
3007db96d56Sopenharmony_ci        self.checkParam(widget, 'image', image, conv=str)
3017db96d56Sopenharmony_ci        errmsg = 'image "spam" doesn\'t exist'
3027db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError) as cm:
3037db96d56Sopenharmony_ci            widget['image'] = 'spam'
3047db96d56Sopenharmony_ci        if errmsg is not None:
3057db96d56Sopenharmony_ci            self.assertEqual(str(cm.exception), errmsg)
3067db96d56Sopenharmony_ci        with self.assertRaises(tkinter.TclError) as cm:
3077db96d56Sopenharmony_ci            widget.configure({'image': 'spam'})
3087db96d56Sopenharmony_ci        if errmsg is not None:
3097db96d56Sopenharmony_ci            self.assertEqual(str(cm.exception), errmsg)
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    def test_configure_menu(self):
3127db96d56Sopenharmony_ci        widget = self.create()
3137db96d56Sopenharmony_ci        menu = tkinter.Menu(widget, name='menu')
3147db96d56Sopenharmony_ci        self.checkParam(widget, 'menu', menu, eq=widget_eq)
3157db96d56Sopenharmony_ci        menu.destroy()
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci    def test_configure_padx(self):
3187db96d56Sopenharmony_ci        widget = self.create()
3197db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m')
3207db96d56Sopenharmony_ci        self.checkParam(widget, 'padx', -2, expected=0)
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci    def test_configure_pady(self):
3237db96d56Sopenharmony_ci        widget = self.create()
3247db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m')
3257db96d56Sopenharmony_ci        self.checkParam(widget, 'pady', -2, expected=0)
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci    def test_configure_width(self):
3287db96d56Sopenharmony_ci        widget = self.create()
3297db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str)
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ciclass OptionMenuTest(MenubuttonTest, unittest.TestCase):
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci    def create(self, default='b', values=('a', 'b', 'c'), **kwargs):
3357db96d56Sopenharmony_ci        return tkinter.OptionMenu(self.root, None, default, *values, **kwargs)
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci    def test_bad_kwarg(self):
3387db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, r"^unknown option -image$"):
3397db96d56Sopenharmony_ci            tkinter.OptionMenu(self.root, None, 'b', image='')
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci@add_standard_options(IntegerSizeTests, StandardOptionsTests)
3437db96d56Sopenharmony_ciclass EntryTest(AbstractWidgetTest, unittest.TestCase):
3447db96d56Sopenharmony_ci    OPTIONS = (
3457db96d56Sopenharmony_ci        'background', 'borderwidth', 'cursor',
3467db96d56Sopenharmony_ci        'disabledbackground', 'disabledforeground',
3477db96d56Sopenharmony_ci        'exportselection', 'font', 'foreground',
3487db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
3497db96d56Sopenharmony_ci        'insertbackground', 'insertborderwidth',
3507db96d56Sopenharmony_ci        'insertofftime', 'insertontime', 'insertwidth',
3517db96d56Sopenharmony_ci        'invalidcommand', 'justify', 'readonlybackground', 'relief',
3527db96d56Sopenharmony_ci        'selectbackground', 'selectborderwidth', 'selectforeground',
3537db96d56Sopenharmony_ci        'show', 'state', 'takefocus', 'textvariable',
3547db96d56Sopenharmony_ci        'validate', 'validatecommand', 'width', 'xscrollcommand',
3557db96d56Sopenharmony_ci    )
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci    def create(self, **kwargs):
3587db96d56Sopenharmony_ci        return tkinter.Entry(self.root, **kwargs)
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci    def test_configure_disabledbackground(self):
3617db96d56Sopenharmony_ci        widget = self.create()
3627db96d56Sopenharmony_ci        self.checkColorParam(widget, 'disabledbackground')
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci    def test_configure_insertborderwidth(self):
3657db96d56Sopenharmony_ci        widget = self.create(insertwidth=100)
3667db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'insertborderwidth',
3677db96d56Sopenharmony_ci                              0, 1.3, 2.6, 6, -2, '10p')
3687db96d56Sopenharmony_ci        # insertborderwidth is bounded above by a half of insertwidth.
3697db96d56Sopenharmony_ci        self.checkParam(widget, 'insertborderwidth', 60, expected=100//2)
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci    def test_configure_insertwidth(self):
3727db96d56Sopenharmony_ci        widget = self.create()
3737db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'insertwidth', 1.3, 3.6, '10p')
3747db96d56Sopenharmony_ci        self.checkParam(widget, 'insertwidth', 0.1, expected=2)
3757db96d56Sopenharmony_ci        self.checkParam(widget, 'insertwidth', -2, expected=2)
3767db96d56Sopenharmony_ci        self.checkParam(widget, 'insertwidth', 0.9, expected=1)
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci    def test_configure_invalidcommand(self):
3797db96d56Sopenharmony_ci        widget = self.create()
3807db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'invalidcommand')
3817db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'invcmd')
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    def test_configure_readonlybackground(self):
3847db96d56Sopenharmony_ci        widget = self.create()
3857db96d56Sopenharmony_ci        self.checkColorParam(widget, 'readonlybackground')
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci    def test_configure_show(self):
3887db96d56Sopenharmony_ci        widget = self.create()
3897db96d56Sopenharmony_ci        self.checkParam(widget, 'show', '*')
3907db96d56Sopenharmony_ci        self.checkParam(widget, 'show', '')
3917db96d56Sopenharmony_ci        self.checkParam(widget, 'show', ' ')
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci    def test_configure_state(self):
3947db96d56Sopenharmony_ci        widget = self.create()
3957db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'state',
3967db96d56Sopenharmony_ci                            'disabled', 'normal', 'readonly')
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci    def test_configure_validate(self):
3997db96d56Sopenharmony_ci        widget = self.create()
4007db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'validate',
4017db96d56Sopenharmony_ci                'all', 'key', 'focus', 'focusin', 'focusout', 'none')
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci    def test_configure_validatecommand(self):
4047db96d56Sopenharmony_ci        widget = self.create()
4057db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'validatecommand')
4067db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'vcmd')
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci    def test_selection_methods(self):
4097db96d56Sopenharmony_ci        widget = self.create()
4107db96d56Sopenharmony_ci        widget.insert(0, '12345')
4117db96d56Sopenharmony_ci        self.assertFalse(widget.selection_present())
4127db96d56Sopenharmony_ci        widget.selection_range(0, 'end')
4137db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '12345')
4147db96d56Sopenharmony_ci        self.assertTrue(widget.selection_present())
4157db96d56Sopenharmony_ci        widget.selection_from(1)
4167db96d56Sopenharmony_ci        widget.selection_to(2)
4177db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '2')
4187db96d56Sopenharmony_ci        widget.selection_range(3, 4)
4197db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '4')
4207db96d56Sopenharmony_ci        widget.selection_clear()
4217db96d56Sopenharmony_ci        self.assertFalse(widget.selection_present())
4227db96d56Sopenharmony_ci        widget.selection_range(0, 'end')
4237db96d56Sopenharmony_ci        widget.selection_adjust(4)
4247db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '1234')
4257db96d56Sopenharmony_ci        widget.selection_adjust(1)
4267db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '234')
4277db96d56Sopenharmony_ci        widget.selection_adjust(5)
4287db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '2345')
4297db96d56Sopenharmony_ci        widget.selection_adjust(0)
4307db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '12345')
4317db96d56Sopenharmony_ci        widget.selection_adjust(0)
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
4357db96d56Sopenharmony_ciclass SpinboxTest(EntryTest, unittest.TestCase):
4367db96d56Sopenharmony_ci    OPTIONS = (
4377db96d56Sopenharmony_ci        'activebackground', 'background', 'borderwidth',
4387db96d56Sopenharmony_ci        'buttonbackground', 'buttoncursor', 'buttondownrelief', 'buttonuprelief',
4397db96d56Sopenharmony_ci        'command', 'cursor', 'disabledbackground', 'disabledforeground',
4407db96d56Sopenharmony_ci        'exportselection', 'font', 'foreground', 'format', 'from',
4417db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
4427db96d56Sopenharmony_ci        'increment',
4437db96d56Sopenharmony_ci        'insertbackground', 'insertborderwidth',
4447db96d56Sopenharmony_ci        'insertofftime', 'insertontime', 'insertwidth',
4457db96d56Sopenharmony_ci        'invalidcommand', 'justify', 'relief', 'readonlybackground',
4467db96d56Sopenharmony_ci        'repeatdelay', 'repeatinterval',
4477db96d56Sopenharmony_ci        'selectbackground', 'selectborderwidth', 'selectforeground',
4487db96d56Sopenharmony_ci        'state', 'takefocus', 'textvariable', 'to',
4497db96d56Sopenharmony_ci        'validate', 'validatecommand', 'values',
4507db96d56Sopenharmony_ci        'width', 'wrap', 'xscrollcommand',
4517db96d56Sopenharmony_ci    )
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci    def create(self, **kwargs):
4547db96d56Sopenharmony_ci        return tkinter.Spinbox(self.root, **kwargs)
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci    test_configure_show = None
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ci    def test_configure_buttonbackground(self):
4597db96d56Sopenharmony_ci        widget = self.create()
4607db96d56Sopenharmony_ci        self.checkColorParam(widget, 'buttonbackground')
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci    def test_configure_buttoncursor(self):
4637db96d56Sopenharmony_ci        widget = self.create()
4647db96d56Sopenharmony_ci        self.checkCursorParam(widget, 'buttoncursor')
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    def test_configure_buttondownrelief(self):
4677db96d56Sopenharmony_ci        widget = self.create()
4687db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'buttondownrelief')
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci    def test_configure_buttonuprelief(self):
4717db96d56Sopenharmony_ci        widget = self.create()
4727db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'buttonuprelief')
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci    def test_configure_format(self):
4757db96d56Sopenharmony_ci        widget = self.create()
4767db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%2f')
4777db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%2.2f')
4787db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%.2f')
4797db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%2.f')
4807db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'format', '%2e-1f')
4817db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'format', '2.2')
4827db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'format', '%2.-2f')
4837db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%-2.02f')
4847db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '% 2.02f')
4857db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '% -2.200f')
4867db96d56Sopenharmony_ci        self.checkParam(widget, 'format', '%09.200f')
4877db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'format', '%d')
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci    def test_configure_from(self):
4907db96d56Sopenharmony_ci        widget = self.create()
4917db96d56Sopenharmony_ci        self.checkParam(widget, 'to', 100.0)
4927db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'from', -10, 10.2, 11.7)
4937db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'from', 200,
4947db96d56Sopenharmony_ci                errmsg='-to value must be greater than -from value')
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci    def test_configure_increment(self):
4977db96d56Sopenharmony_ci        widget = self.create()
4987db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'increment', -1, 1, 10.2, 12.8, 0)
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci    def test_configure_to(self):
5017db96d56Sopenharmony_ci        widget = self.create()
5027db96d56Sopenharmony_ci        self.checkParam(widget, 'from', -100.0)
5037db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'to', -10, 10.2, 11.7)
5047db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'to', -200,
5057db96d56Sopenharmony_ci                errmsg='-to value must be greater than -from value')
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci    def test_configure_values(self):
5087db96d56Sopenharmony_ci        # XXX
5097db96d56Sopenharmony_ci        widget = self.create()
5107db96d56Sopenharmony_ci        self.assertEqual(widget['values'], '')
5117db96d56Sopenharmony_ci        self.checkParam(widget, 'values', 'mon tue wed thur')
5127db96d56Sopenharmony_ci        self.checkParam(widget, 'values', ('mon', 'tue', 'wed', 'thur'),
5137db96d56Sopenharmony_ci                        expected='mon tue wed thur')
5147db96d56Sopenharmony_ci        self.checkParam(widget, 'values', (42, 3.14, '', 'any string'),
5157db96d56Sopenharmony_ci                        expected='42 3.14 {} {any string}')
5167db96d56Sopenharmony_ci        self.checkParam(widget, 'values', '')
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci    def test_configure_wrap(self):
5197db96d56Sopenharmony_ci        widget = self.create()
5207db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'wrap')
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci    def test_bbox(self):
5237db96d56Sopenharmony_ci        widget = self.create()
5247db96d56Sopenharmony_ci        self.assertIsBoundingBox(widget.bbox(0))
5257db96d56Sopenharmony_ci        self.assertRaises(tkinter.TclError, widget.bbox, 'noindex')
5267db96d56Sopenharmony_ci        self.assertRaises(tkinter.TclError, widget.bbox, None)
5277db96d56Sopenharmony_ci        self.assertRaises(TypeError, widget.bbox)
5287db96d56Sopenharmony_ci        self.assertRaises(TypeError, widget.bbox, 0, 1)
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci    def test_selection_methods(self):
5317db96d56Sopenharmony_ci        widget = self.create()
5327db96d56Sopenharmony_ci        widget.insert(0, '12345')
5337db96d56Sopenharmony_ci        self.assertFalse(widget.selection_present())
5347db96d56Sopenharmony_ci        widget.selection_range(0, 'end')
5357db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '12345')
5367db96d56Sopenharmony_ci        self.assertTrue(widget.selection_present())
5377db96d56Sopenharmony_ci        widget.selection_from(1)
5387db96d56Sopenharmony_ci        widget.selection_to(2)
5397db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '2')
5407db96d56Sopenharmony_ci        widget.selection_range(3, 4)
5417db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '4')
5427db96d56Sopenharmony_ci        widget.selection_clear()
5437db96d56Sopenharmony_ci        self.assertFalse(widget.selection_present())
5447db96d56Sopenharmony_ci        widget.selection_range(0, 'end')
5457db96d56Sopenharmony_ci        widget.selection_adjust(4)
5467db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '1234')
5477db96d56Sopenharmony_ci        widget.selection_adjust(1)
5487db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '234')
5497db96d56Sopenharmony_ci        widget.selection_adjust(5)
5507db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '2345')
5517db96d56Sopenharmony_ci        widget.selection_adjust(0)
5527db96d56Sopenharmony_ci        self.assertEqual(widget.selection_get(), '12345')
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci    def test_selection_element(self):
5557db96d56Sopenharmony_ci        widget = self.create()
5567db96d56Sopenharmony_ci        self.assertEqual(widget.selection_element(), "none")
5577db96d56Sopenharmony_ci        widget.selection_element("buttonup")
5587db96d56Sopenharmony_ci        self.assertEqual(widget.selection_element(), "buttonup")
5597db96d56Sopenharmony_ci        widget.selection_element("buttondown")
5607db96d56Sopenharmony_ci        self.assertEqual(widget.selection_element(), "buttondown")
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
5647db96d56Sopenharmony_ciclass TextTest(AbstractWidgetTest, unittest.TestCase):
5657db96d56Sopenharmony_ci    OPTIONS = (
5667db96d56Sopenharmony_ci        'autoseparators', 'background', 'blockcursor', 'borderwidth',
5677db96d56Sopenharmony_ci        'cursor', 'endline', 'exportselection',
5687db96d56Sopenharmony_ci        'font', 'foreground', 'height',
5697db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
5707db96d56Sopenharmony_ci        'inactiveselectbackground', 'insertbackground', 'insertborderwidth',
5717db96d56Sopenharmony_ci        'insertofftime', 'insertontime', 'insertunfocussed', 'insertwidth',
5727db96d56Sopenharmony_ci        'maxundo', 'padx', 'pady', 'relief',
5737db96d56Sopenharmony_ci        'selectbackground', 'selectborderwidth', 'selectforeground',
5747db96d56Sopenharmony_ci        'setgrid', 'spacing1', 'spacing2', 'spacing3', 'startline', 'state',
5757db96d56Sopenharmony_ci        'tabs', 'tabstyle', 'takefocus', 'undo', 'width', 'wrap',
5767db96d56Sopenharmony_ci        'xscrollcommand', 'yscrollcommand',
5777db96d56Sopenharmony_ci    )
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci    def create(self, **kwargs):
5807db96d56Sopenharmony_ci        return tkinter.Text(self.root, **kwargs)
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ci    def test_configure_autoseparators(self):
5837db96d56Sopenharmony_ci        widget = self.create()
5847db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'autoseparators')
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci    def test_configure_blockcursor(self):
5877db96d56Sopenharmony_ci        widget = self.create()
5887db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'blockcursor')
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ci    def test_configure_endline(self):
5917db96d56Sopenharmony_ci        widget = self.create()
5927db96d56Sopenharmony_ci        text = '\n'.join('Line %d' for i in range(100))
5937db96d56Sopenharmony_ci        widget.insert('end', text)
5947db96d56Sopenharmony_ci        self.checkParam(widget, 'endline', 200, expected='')
5957db96d56Sopenharmony_ci        self.checkParam(widget, 'endline', -10, expected='')
5967db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'endline', 'spam',
5977db96d56Sopenharmony_ci                errmsg='expected integer but got "spam"')
5987db96d56Sopenharmony_ci        self.checkParam(widget, 'endline', 50)
5997db96d56Sopenharmony_ci        self.checkParam(widget, 'startline', 15)
6007db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'endline', 10,
6017db96d56Sopenharmony_ci                errmsg='-startline must be less than or equal to -endline')
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci    def test_configure_height(self):
6047db96d56Sopenharmony_ci        widget = self.create()
6057db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, '3c')
6067db96d56Sopenharmony_ci        self.checkParam(widget, 'height', -100, expected=1)
6077db96d56Sopenharmony_ci        self.checkParam(widget, 'height', 0, expected=1)
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci    def test_configure_maxundo(self):
6107db96d56Sopenharmony_ci        widget = self.create()
6117db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'maxundo', 0, 5, -1)
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci    def test_configure_inactiveselectbackground(self):
6147db96d56Sopenharmony_ci        widget = self.create()
6157db96d56Sopenharmony_ci        self.checkColorParam(widget, 'inactiveselectbackground')
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci    @requires_tcl(8, 6)
6187db96d56Sopenharmony_ci    def test_configure_insertunfocussed(self):
6197db96d56Sopenharmony_ci        widget = self.create()
6207db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'insertunfocussed',
6217db96d56Sopenharmony_ci                            'hollow', 'none', 'solid')
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci    def test_configure_selectborderwidth(self):
6247db96d56Sopenharmony_ci        widget = self.create()
6257db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'selectborderwidth',
6267db96d56Sopenharmony_ci                              1.3, 2.6, -2, '10p', conv=False)
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci    def test_configure_spacing1(self):
6297db96d56Sopenharmony_ci        widget = self.create()
6307db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'spacing1', 20, 21.4, 22.6, '0.5c')
6317db96d56Sopenharmony_ci        self.checkParam(widget, 'spacing1', -5, expected=0)
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci    def test_configure_spacing2(self):
6347db96d56Sopenharmony_ci        widget = self.create()
6357db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'spacing2', 5, 6.4, 7.6, '0.1c')
6367db96d56Sopenharmony_ci        self.checkParam(widget, 'spacing2', -1, expected=0)
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci    def test_configure_spacing3(self):
6397db96d56Sopenharmony_ci        widget = self.create()
6407db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'spacing3', 20, 21.4, 22.6, '0.5c')
6417db96d56Sopenharmony_ci        self.checkParam(widget, 'spacing3', -10, expected=0)
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci    def test_configure_startline(self):
6447db96d56Sopenharmony_ci        widget = self.create()
6457db96d56Sopenharmony_ci        text = '\n'.join('Line %d' for i in range(100))
6467db96d56Sopenharmony_ci        widget.insert('end', text)
6477db96d56Sopenharmony_ci        self.checkParam(widget, 'startline', 200, expected='')
6487db96d56Sopenharmony_ci        self.checkParam(widget, 'startline', -10, expected='')
6497db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'startline', 'spam',
6507db96d56Sopenharmony_ci                errmsg='expected integer but got "spam"')
6517db96d56Sopenharmony_ci        self.checkParam(widget, 'startline', 10)
6527db96d56Sopenharmony_ci        self.checkParam(widget, 'endline', 50)
6537db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'startline', 70,
6547db96d56Sopenharmony_ci                errmsg='-startline must be less than or equal to -endline')
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci    def test_configure_state(self):
6577db96d56Sopenharmony_ci        widget = self.create()
6587db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'state', 'disabled', 'normal')
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ci    def test_configure_tabs(self):
6617db96d56Sopenharmony_ci        widget = self.create()
6627db96d56Sopenharmony_ci        self.checkParam(widget, 'tabs', (10.2, 20.7, '1i', '2i'))
6637db96d56Sopenharmony_ci        self.checkParam(widget, 'tabs', '10.2 20.7 1i 2i',
6647db96d56Sopenharmony_ci                        expected=('10.2', '20.7', '1i', '2i'))
6657db96d56Sopenharmony_ci        self.checkParam(widget, 'tabs', '2c left 4c 6c center',
6667db96d56Sopenharmony_ci                        expected=('2c', 'left', '4c', '6c', 'center'))
6677db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'tabs', 'spam',
6687db96d56Sopenharmony_ci                               errmsg='bad screen distance "spam"')
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci    def test_configure_tabstyle(self):
6717db96d56Sopenharmony_ci        widget = self.create()
6727db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'tabstyle', 'tabular', 'wordprocessor')
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci    def test_configure_undo(self):
6757db96d56Sopenharmony_ci        widget = self.create()
6767db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'undo')
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci    def test_configure_width(self):
6797db96d56Sopenharmony_ci        widget = self.create()
6807db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'width', 402)
6817db96d56Sopenharmony_ci        self.checkParam(widget, 'width', -402, expected=1)
6827db96d56Sopenharmony_ci        self.checkParam(widget, 'width', 0, expected=1)
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci    def test_configure_wrap(self):
6857db96d56Sopenharmony_ci        widget = self.create()
6867db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'wrap', 'char', 'none', 'word')
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci    def test_bbox(self):
6897db96d56Sopenharmony_ci        widget = self.create()
6907db96d56Sopenharmony_ci        self.assertIsBoundingBox(widget.bbox('1.1'))
6917db96d56Sopenharmony_ci        self.assertIsNone(widget.bbox('end'))
6927db96d56Sopenharmony_ci        self.assertRaises(tkinter.TclError, widget.bbox, 'noindex')
6937db96d56Sopenharmony_ci        self.assertRaises(tkinter.TclError, widget.bbox, None)
6947db96d56Sopenharmony_ci        self.assertRaises(TypeError, widget.bbox)
6957db96d56Sopenharmony_ci        self.assertRaises(TypeError, widget.bbox, '1.1', 'end')
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci@add_standard_options(PixelSizeTests, StandardOptionsTests)
6997db96d56Sopenharmony_ciclass CanvasTest(AbstractWidgetTest, unittest.TestCase):
7007db96d56Sopenharmony_ci    OPTIONS = (
7017db96d56Sopenharmony_ci        'background', 'borderwidth',
7027db96d56Sopenharmony_ci        'closeenough', 'confine', 'cursor', 'height',
7037db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
7047db96d56Sopenharmony_ci        'insertbackground', 'insertborderwidth',
7057db96d56Sopenharmony_ci        'insertofftime', 'insertontime', 'insertwidth',
7067db96d56Sopenharmony_ci        'offset', 'relief', 'scrollregion',
7077db96d56Sopenharmony_ci        'selectbackground', 'selectborderwidth', 'selectforeground',
7087db96d56Sopenharmony_ci        'state', 'takefocus',
7097db96d56Sopenharmony_ci        'xscrollcommand', 'xscrollincrement',
7107db96d56Sopenharmony_ci        'yscrollcommand', 'yscrollincrement', 'width',
7117db96d56Sopenharmony_ci    )
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci    _conv_pixels = round
7147db96d56Sopenharmony_ci    _stringify = True
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci    def create(self, **kwargs):
7177db96d56Sopenharmony_ci        return tkinter.Canvas(self.root, **kwargs)
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci    def test_configure_closeenough(self):
7207db96d56Sopenharmony_ci        widget = self.create()
7217db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'closeenough', 24, 2.4, 3.6, -3,
7227db96d56Sopenharmony_ci                             conv=float)
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci    def test_configure_confine(self):
7257db96d56Sopenharmony_ci        widget = self.create()
7267db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'confine')
7277db96d56Sopenharmony_ci
7287db96d56Sopenharmony_ci    def test_configure_offset(self):
7297db96d56Sopenharmony_ci        widget = self.create()
7307db96d56Sopenharmony_ci        self.assertEqual(widget['offset'], '0,0')
7317db96d56Sopenharmony_ci        self.checkParams(widget, 'offset',
7327db96d56Sopenharmony_ci                'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'center')
7337db96d56Sopenharmony_ci        self.checkParam(widget, 'offset', '10,20')
7347db96d56Sopenharmony_ci        self.checkParam(widget, 'offset', '#5,6')
7357db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'offset', 'spam')
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ci    def test_configure_scrollregion(self):
7387db96d56Sopenharmony_ci        widget = self.create()
7397db96d56Sopenharmony_ci        self.checkParam(widget, 'scrollregion', '0 0 200 150')
7407db96d56Sopenharmony_ci        self.checkParam(widget, 'scrollregion', (0, 0, 200, 150),
7417db96d56Sopenharmony_ci                        expected='0 0 200 150')
7427db96d56Sopenharmony_ci        self.checkParam(widget, 'scrollregion', '')
7437db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'scrollregion', 'spam',
7447db96d56Sopenharmony_ci                               errmsg='bad scrollRegion "spam"')
7457db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'scrollregion', (0, 0, 200, 'spam'))
7467db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'scrollregion', (0, 0, 200))
7477db96d56Sopenharmony_ci        self.checkInvalidParam(widget, 'scrollregion', (0, 0, 200, 150, 0))
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci    def test_configure_state(self):
7507db96d56Sopenharmony_ci        widget = self.create()
7517db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'state', 'disabled', 'normal',
7527db96d56Sopenharmony_ci                errmsg='bad state value "{}": must be normal or disabled')
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci    def test_configure_xscrollincrement(self):
7557db96d56Sopenharmony_ci        widget = self.create()
7567db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'xscrollincrement',
7577db96d56Sopenharmony_ci                              40, 0, 41.2, 43.6, -40, '0.5i')
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ci    def test_configure_yscrollincrement(self):
7607db96d56Sopenharmony_ci        widget = self.create()
7617db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'yscrollincrement',
7627db96d56Sopenharmony_ci                              10, 0, 11.2, 13.6, -10, '0.1i')
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci    def _test_option_joinstyle(self, c, factory):
7657db96d56Sopenharmony_ci        for joinstyle in 'bevel', 'miter', 'round':
7667db96d56Sopenharmony_ci            i = factory(joinstyle=joinstyle)
7677db96d56Sopenharmony_ci            self.assertEqual(c.itemcget(i, 'joinstyle'), joinstyle)
7687db96d56Sopenharmony_ci        self.assertRaises(TclError, factory, joinstyle='spam')
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci    def _test_option_smooth(self, c, factory):
7717db96d56Sopenharmony_ci        for smooth in 1, True, '1', 'true', 'yes', 'on':
7727db96d56Sopenharmony_ci            i = factory(smooth=smooth)
7737db96d56Sopenharmony_ci            self.assertEqual(c.itemcget(i, 'smooth'), 'true')
7747db96d56Sopenharmony_ci        for smooth in 0, False, '0', 'false', 'no', 'off':
7757db96d56Sopenharmony_ci            i = factory(smooth=smooth)
7767db96d56Sopenharmony_ci            self.assertEqual(c.itemcget(i, 'smooth'), '0')
7777db96d56Sopenharmony_ci        i = factory(smooth=True, splinestep=30)
7787db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i, 'smooth'), 'true')
7797db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i, 'splinestep'), '30')
7807db96d56Sopenharmony_ci        i = factory(smooth='raw', splinestep=30)
7817db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i, 'smooth'), 'raw')
7827db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i, 'splinestep'), '30')
7837db96d56Sopenharmony_ci        self.assertRaises(TclError, factory, smooth='spam')
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci    def test_create_rectangle(self):
7867db96d56Sopenharmony_ci        c = self.create()
7877db96d56Sopenharmony_ci        i1 = c.create_rectangle(20, 30, 60, 10)
7887db96d56Sopenharmony_ci        self.assertEqual(c.coords(i1), [20.0, 10.0, 60.0, 30.0])
7897db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i1), (19, 9, 61, 31))
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci        i2 = c.create_rectangle([21, 31, 61, 11])
7927db96d56Sopenharmony_ci        self.assertEqual(c.coords(i2), [21.0, 11.0, 61.0, 31.0])
7937db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i2), (20, 10, 62, 32))
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ci        i3 = c.create_rectangle((22, 32), (62, 12))
7967db96d56Sopenharmony_ci        self.assertEqual(c.coords(i3), [22.0, 12.0, 62.0, 32.0])
7977db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i3), (21, 11, 63, 33))
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ci        i4 = c.create_rectangle([(23, 33), (63, 13)])
8007db96d56Sopenharmony_ci        self.assertEqual(c.coords(i4), [23.0, 13.0, 63.0, 33.0])
8017db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i4), (22, 12, 64, 34))
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, 20, 30, 60)
8047db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, [20, 30, 60])
8057db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, 20, 30, 40, 50, 60, 10)
8067db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, [20, 30, 40, 50, 60, 10])
8077db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, 20, 30)
8087db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_rectangle, [20, 30])
8097db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_rectangle)
8107db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_rectangle, [])
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci    def test_create_line(self):
8137db96d56Sopenharmony_ci        c = self.create()
8147db96d56Sopenharmony_ci        i1 = c.create_line(20, 30, 40, 50, 60, 10)
8157db96d56Sopenharmony_ci        self.assertEqual(c.coords(i1), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0])
8167db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i1), (18, 8, 62, 52))
8177db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'arrow'), 'none')
8187db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'arrowshape'), '8 10 3')
8197db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'capstyle'), 'butt')
8207db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'joinstyle'), 'round')
8217db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'smooth'), '0')
8227db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'splinestep'), '12')
8237db96d56Sopenharmony_ci
8247db96d56Sopenharmony_ci        i2 = c.create_line([21, 31, 41, 51, 61, 11])
8257db96d56Sopenharmony_ci        self.assertEqual(c.coords(i2), [21.0, 31.0, 41.0, 51.0, 61.0, 11.0])
8267db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i2), (19, 9, 63, 53))
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci        i3 = c.create_line((22, 32), (42, 52), (62, 12))
8297db96d56Sopenharmony_ci        self.assertEqual(c.coords(i3), [22.0, 32.0, 42.0, 52.0, 62.0, 12.0])
8307db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i3), (20, 10, 64, 54))
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ci        i4 = c.create_line([(23, 33), (43, 53), (63, 13)])
8337db96d56Sopenharmony_ci        self.assertEqual(c.coords(i4), [23.0, 33.0, 43.0, 53.0, 63.0, 13.0])
8347db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i4), (21, 11, 65, 55))
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, 20, 30, 60)
8377db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, [20, 30, 60])
8387db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, 20, 30)
8397db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, [20, 30])
8407db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_line)
8417db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_line, [])
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci        for arrow in 'none', 'first', 'last', 'both':
8447db96d56Sopenharmony_ci            i = c.create_line(20, 30, 60, 10, arrow=arrow)
8457db96d56Sopenharmony_ci            self.assertEqual(c.itemcget(i, 'arrow'), arrow)
8467db96d56Sopenharmony_ci        i = c.create_line(20, 30, 60, 10, arrow='first', arrowshape=[10, 15, 5])
8477db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i, 'arrowshape'), '10 15 5')
8487db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, 20, 30, 60, 10, arrow='spam')
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci        for capstyle in 'butt', 'projecting', 'round':
8517db96d56Sopenharmony_ci            i = c.create_line(20, 30, 60, 10, capstyle=capstyle)
8527db96d56Sopenharmony_ci            self.assertEqual(c.itemcget(i, 'capstyle'), capstyle)
8537db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_line, 20, 30, 60, 10, capstyle='spam')
8547db96d56Sopenharmony_ci
8557db96d56Sopenharmony_ci        self._test_option_joinstyle(c,
8567db96d56Sopenharmony_ci                lambda **kwargs: c.create_line(20, 30, 40, 50, 60, 10, **kwargs))
8577db96d56Sopenharmony_ci        self._test_option_smooth(c,
8587db96d56Sopenharmony_ci                lambda **kwargs: c.create_line(20, 30, 60, 10, **kwargs))
8597db96d56Sopenharmony_ci
8607db96d56Sopenharmony_ci    def test_create_polygon(self):
8617db96d56Sopenharmony_ci        c = self.create()
8627db96d56Sopenharmony_ci        i1 = c.create_polygon(20, 30, 40, 50, 60, 10)
8637db96d56Sopenharmony_ci        self.assertEqual(c.coords(i1), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0])
8647db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i1), (19, 9, 61, 51))
8657db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'joinstyle'), 'round')
8667db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'smooth'), '0')
8677db96d56Sopenharmony_ci        self.assertEqual(c.itemcget(i1, 'splinestep'), '12')
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci        i2 = c.create_polygon([21, 31, 41, 51, 61, 11])
8707db96d56Sopenharmony_ci        self.assertEqual(c.coords(i2), [21.0, 31.0, 41.0, 51.0, 61.0, 11.0])
8717db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i2), (20, 10, 62, 52))
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci        i3 = c.create_polygon((22, 32), (42, 52), (62, 12))
8747db96d56Sopenharmony_ci        self.assertEqual(c.coords(i3), [22.0, 32.0, 42.0, 52.0, 62.0, 12.0])
8757db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i3), (21, 11, 63, 53))
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci        i4 = c.create_polygon([(23, 33), (43, 53), (63, 13)])
8787db96d56Sopenharmony_ci        self.assertEqual(c.coords(i4), [23.0, 33.0, 43.0, 53.0, 63.0, 13.0])
8797db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i4), (22, 12, 64, 54))
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_polygon, 20, 30, 60)
8827db96d56Sopenharmony_ci        self.assertRaises(TclError, c.create_polygon, [20, 30, 60])
8837db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_polygon)
8847db96d56Sopenharmony_ci        self.assertRaises(IndexError, c.create_polygon, [])
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci        self._test_option_joinstyle(c,
8877db96d56Sopenharmony_ci                lambda **kwargs: c.create_polygon(20, 30, 40, 50, 60, 10, **kwargs))
8887db96d56Sopenharmony_ci        self._test_option_smooth(c,
8897db96d56Sopenharmony_ci                lambda **kwargs: c.create_polygon(20, 30, 40, 50, 60, 10, **kwargs))
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci    def test_coords(self):
8927db96d56Sopenharmony_ci        c = self.create()
8937db96d56Sopenharmony_ci        i = c.create_line(20, 30, 40, 50, 60, 10, tags='x')
8947db96d56Sopenharmony_ci        self.assertEqual(c.coords(i), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0])
8957db96d56Sopenharmony_ci        self.assertEqual(c.coords('x'), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0])
8967db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i), (18, 8, 62, 52))
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci        c.coords(i, 50, 60, 70, 80, 90, 40)
8997db96d56Sopenharmony_ci        self.assertEqual(c.coords(i), [50.0, 60.0, 70.0, 80.0, 90.0, 40.0])
9007db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i), (48, 38, 92, 82))
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        c.coords(i, [21, 31, 41, 51, 61, 11])
9037db96d56Sopenharmony_ci        self.assertEqual(c.coords(i), [21.0, 31.0, 41.0, 51.0, 61.0, 11.0])
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci        c.coords(i, 20, 30, 60, 10)
9067db96d56Sopenharmony_ci        self.assertEqual(c.coords(i), [20.0, 30.0, 60.0, 10.0])
9077db96d56Sopenharmony_ci        self.assertEqual(c.bbox(i), (18, 8, 62, 32))
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ci        self.assertRaises(TclError, c.coords, i, 20, 30, 60)
9107db96d56Sopenharmony_ci        self.assertRaises(TclError, c.coords, i, [20, 30, 60])
9117db96d56Sopenharmony_ci        self.assertRaises(TclError, c.coords, i, 20, 30)
9127db96d56Sopenharmony_ci        self.assertRaises(TclError, c.coords, i, [20, 30])
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ci        c.coords(i, '20', '30c', '60i', '10p')
9157db96d56Sopenharmony_ci        coords = c.coords(i)
9167db96d56Sopenharmony_ci        self.assertIsInstance(coords, list)
9177db96d56Sopenharmony_ci        self.assertEqual(len(coords), 4)
9187db96d56Sopenharmony_ci        self.assertEqual(coords[0], 20)
9197db96d56Sopenharmony_ci        for i in range(4):
9207db96d56Sopenharmony_ci            self.assertIsInstance(coords[i], float)
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci    @requires_tcl(8, 6)
9237db96d56Sopenharmony_ci    def test_moveto(self):
9247db96d56Sopenharmony_ci        widget = self.create()
9257db96d56Sopenharmony_ci        i1 = widget.create_rectangle(1, 1, 20, 20, tags='group')
9267db96d56Sopenharmony_ci        i2 = widget.create_rectangle(30, 30, 50, 70, tags='group')
9277db96d56Sopenharmony_ci        x1, y1, _, _ = widget.bbox(i1)
9287db96d56Sopenharmony_ci        x2, y2, _, _ = widget.bbox(i2)
9297db96d56Sopenharmony_ci        widget.moveto('group', 200, 100)
9307db96d56Sopenharmony_ci        x1_2, y1_2, _, _ = widget.bbox(i1)
9317db96d56Sopenharmony_ci        x2_2, y2_2, _, _ = widget.bbox(i2)
9327db96d56Sopenharmony_ci        self.assertEqual(x1_2, 200)
9337db96d56Sopenharmony_ci        self.assertEqual(y1_2, 100)
9347db96d56Sopenharmony_ci        self.assertEqual(x2 - x1, x2_2 - x1_2)
9357db96d56Sopenharmony_ci        self.assertEqual(y2 - y1, y2_2 - y1_2)
9367db96d56Sopenharmony_ci        widget.tag_lower(i2, i1)
9377db96d56Sopenharmony_ci        widget.moveto('group', y=50)
9387db96d56Sopenharmony_ci        x1_3, y1_3, _, _ = widget.bbox(i1)
9397db96d56Sopenharmony_ci        x2_3, y2_3, _, _ = widget.bbox(i2)
9407db96d56Sopenharmony_ci        self.assertEqual(y2_3, 50)
9417db96d56Sopenharmony_ci        self.assertEqual(x2_3, x2_2)
9427db96d56Sopenharmony_ci        self.assertEqual(x2_2 - x1_2, x2_3 - x1_3)
9437db96d56Sopenharmony_ci        self.assertEqual(y2_2 - y1_2, y2_3 - y1_3)
9447db96d56Sopenharmony_ci
9457db96d56Sopenharmony_ci
9467db96d56Sopenharmony_ci@add_standard_options(IntegerSizeTests, StandardOptionsTests)
9477db96d56Sopenharmony_ciclass ListboxTest(AbstractWidgetTest, unittest.TestCase):
9487db96d56Sopenharmony_ci    OPTIONS = (
9497db96d56Sopenharmony_ci        'activestyle', 'background', 'borderwidth', 'cursor',
9507db96d56Sopenharmony_ci        'disabledforeground', 'exportselection',
9517db96d56Sopenharmony_ci        'font', 'foreground', 'height',
9527db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
9537db96d56Sopenharmony_ci        'justify', 'listvariable', 'relief',
9547db96d56Sopenharmony_ci        'selectbackground', 'selectborderwidth', 'selectforeground',
9557db96d56Sopenharmony_ci        'selectmode', 'setgrid', 'state',
9567db96d56Sopenharmony_ci        'takefocus', 'width', 'xscrollcommand', 'yscrollcommand',
9577db96d56Sopenharmony_ci    )
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci    def create(self, **kwargs):
9607db96d56Sopenharmony_ci        return tkinter.Listbox(self.root, **kwargs)
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci    def test_configure_activestyle(self):
9637db96d56Sopenharmony_ci        widget = self.create()
9647db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'activestyle',
9657db96d56Sopenharmony_ci                            'dotbox', 'none', 'underline')
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci    test_configure_justify = requires_tcl(8, 6, 5)(StandardOptionsTests.test_configure_justify)
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci    def test_configure_listvariable(self):
9707db96d56Sopenharmony_ci        widget = self.create()
9717db96d56Sopenharmony_ci        var = tkinter.DoubleVar(self.root)
9727db96d56Sopenharmony_ci        self.checkVariableParam(widget, 'listvariable', var)
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci    def test_configure_selectmode(self):
9757db96d56Sopenharmony_ci        widget = self.create()
9767db96d56Sopenharmony_ci        self.checkParam(widget, 'selectmode', 'single')
9777db96d56Sopenharmony_ci        self.checkParam(widget, 'selectmode', 'browse')
9787db96d56Sopenharmony_ci        self.checkParam(widget, 'selectmode', 'multiple')
9797db96d56Sopenharmony_ci        self.checkParam(widget, 'selectmode', 'extended')
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci    def test_configure_state(self):
9827db96d56Sopenharmony_ci        widget = self.create()
9837db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'state', 'disabled', 'normal')
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci    def test_itemconfigure(self):
9867db96d56Sopenharmony_ci        widget = self.create()
9877db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, 'item number "0" out of range'):
9887db96d56Sopenharmony_ci            widget.itemconfigure(0)
9897db96d56Sopenharmony_ci        colors = 'red orange yellow green blue white violet'.split()
9907db96d56Sopenharmony_ci        widget.insert('end', *colors)
9917db96d56Sopenharmony_ci        for i, color in enumerate(colors):
9927db96d56Sopenharmony_ci            widget.itemconfigure(i, background=color)
9937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9947db96d56Sopenharmony_ci            widget.itemconfigure()
9957db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, 'bad listbox index "red"'):
9967db96d56Sopenharmony_ci            widget.itemconfigure('red')
9977db96d56Sopenharmony_ci        self.assertEqual(widget.itemconfigure(0, 'background'),
9987db96d56Sopenharmony_ci                         ('background', 'background', 'Background', '', 'red'))
9997db96d56Sopenharmony_ci        self.assertEqual(widget.itemconfigure('end', 'background'),
10007db96d56Sopenharmony_ci                         ('background', 'background', 'Background', '', 'violet'))
10017db96d56Sopenharmony_ci        self.assertEqual(widget.itemconfigure('@0,0', 'background'),
10027db96d56Sopenharmony_ci                         ('background', 'background', 'Background', '', 'red'))
10037db96d56Sopenharmony_ci
10047db96d56Sopenharmony_ci        d = widget.itemconfigure(0)
10057db96d56Sopenharmony_ci        self.assertIsInstance(d, dict)
10067db96d56Sopenharmony_ci        for k, v in d.items():
10077db96d56Sopenharmony_ci            self.assertIn(len(v), (2, 5))
10087db96d56Sopenharmony_ci            if len(v) == 5:
10097db96d56Sopenharmony_ci                self.assertEqual(v, widget.itemconfigure(0, k))
10107db96d56Sopenharmony_ci                self.assertEqual(v[4], widget.itemcget(0, k))
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci    def check_itemconfigure(self, name, value):
10137db96d56Sopenharmony_ci        widget = self.create()
10147db96d56Sopenharmony_ci        widget.insert('end', 'a', 'b', 'c', 'd')
10157db96d56Sopenharmony_ci        widget.itemconfigure(0, **{name: value})
10167db96d56Sopenharmony_ci        self.assertEqual(widget.itemconfigure(0, name)[4], value)
10177db96d56Sopenharmony_ci        self.assertEqual(widget.itemcget(0, name), value)
10187db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, 'unknown color name "spam"'):
10197db96d56Sopenharmony_ci            widget.itemconfigure(0, **{name: 'spam'})
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci    def test_itemconfigure_background(self):
10227db96d56Sopenharmony_ci        self.check_itemconfigure('background', '#ff0000')
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci    def test_itemconfigure_bg(self):
10257db96d56Sopenharmony_ci        self.check_itemconfigure('bg', '#ff0000')
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci    def test_itemconfigure_fg(self):
10287db96d56Sopenharmony_ci        self.check_itemconfigure('fg', '#110022')
10297db96d56Sopenharmony_ci
10307db96d56Sopenharmony_ci    def test_itemconfigure_foreground(self):
10317db96d56Sopenharmony_ci        self.check_itemconfigure('foreground', '#110022')
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci    def test_itemconfigure_selectbackground(self):
10347db96d56Sopenharmony_ci        self.check_itemconfigure('selectbackground', '#110022')
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci    def test_itemconfigure_selectforeground(self):
10377db96d56Sopenharmony_ci        self.check_itemconfigure('selectforeground', '#654321')
10387db96d56Sopenharmony_ci
10397db96d56Sopenharmony_ci    def test_box(self):
10407db96d56Sopenharmony_ci        lb = self.create()
10417db96d56Sopenharmony_ci        lb.insert(0, *('el%d' % i for i in range(8)))
10427db96d56Sopenharmony_ci        lb.pack()
10437db96d56Sopenharmony_ci        self.assertIsBoundingBox(lb.bbox(0))
10447db96d56Sopenharmony_ci        self.assertIsNone(lb.bbox(-1))
10457db96d56Sopenharmony_ci        self.assertIsNone(lb.bbox(10))
10467db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.bbox, 'noindex')
10477db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.bbox, None)
10487db96d56Sopenharmony_ci        self.assertRaises(TypeError, lb.bbox)
10497db96d56Sopenharmony_ci        self.assertRaises(TypeError, lb.bbox, 0, 1)
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci    def test_curselection(self):
10527db96d56Sopenharmony_ci        lb = self.create()
10537db96d56Sopenharmony_ci        lb.insert(0, *('el%d' % i for i in range(8)))
10547db96d56Sopenharmony_ci        lb.selection_clear(0, tkinter.END)
10557db96d56Sopenharmony_ci        lb.selection_set(2, 4)
10567db96d56Sopenharmony_ci        lb.selection_set(6)
10577db96d56Sopenharmony_ci        self.assertEqual(lb.curselection(), (2, 3, 4, 6))
10587db96d56Sopenharmony_ci        self.assertRaises(TypeError, lb.curselection, 0)
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ci    def test_get(self):
10617db96d56Sopenharmony_ci        lb = self.create()
10627db96d56Sopenharmony_ci        lb.insert(0, *('el%d' % i for i in range(8)))
10637db96d56Sopenharmony_ci        self.assertEqual(lb.get(0), 'el0')
10647db96d56Sopenharmony_ci        self.assertEqual(lb.get(3), 'el3')
10657db96d56Sopenharmony_ci        self.assertEqual(lb.get('end'), 'el7')
10667db96d56Sopenharmony_ci        self.assertEqual(lb.get(8), '')
10677db96d56Sopenharmony_ci        self.assertEqual(lb.get(-1), '')
10687db96d56Sopenharmony_ci        self.assertEqual(lb.get(3, 5), ('el3', 'el4', 'el5'))
10697db96d56Sopenharmony_ci        self.assertEqual(lb.get(5, 'end'), ('el5', 'el6', 'el7'))
10707db96d56Sopenharmony_ci        self.assertEqual(lb.get(5, 0), ())
10717db96d56Sopenharmony_ci        self.assertEqual(lb.get(0, 0), ('el0',))
10727db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.get, 'noindex')
10737db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.get, None)
10747db96d56Sopenharmony_ci        self.assertRaises(TypeError, lb.get)
10757db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.get, 'end', 'noindex')
10767db96d56Sopenharmony_ci        self.assertRaises(TypeError, lb.get, 1, 2, 3)
10777db96d56Sopenharmony_ci        self.assertRaises(TclError, lb.get, 2.4)
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci@add_standard_options(PixelSizeTests, StandardOptionsTests)
10817db96d56Sopenharmony_ciclass ScaleTest(AbstractWidgetTest, unittest.TestCase):
10827db96d56Sopenharmony_ci    OPTIONS = (
10837db96d56Sopenharmony_ci        'activebackground', 'background', 'bigincrement', 'borderwidth',
10847db96d56Sopenharmony_ci        'command', 'cursor', 'digits', 'font', 'foreground', 'from',
10857db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
10867db96d56Sopenharmony_ci        'label', 'length', 'orient', 'relief',
10877db96d56Sopenharmony_ci        'repeatdelay', 'repeatinterval',
10887db96d56Sopenharmony_ci        'resolution', 'showvalue', 'sliderlength', 'sliderrelief', 'state',
10897db96d56Sopenharmony_ci        'takefocus', 'tickinterval', 'to', 'troughcolor', 'variable', 'width',
10907db96d56Sopenharmony_ci    )
10917db96d56Sopenharmony_ci    default_orient = 'vertical'
10927db96d56Sopenharmony_ci
10937db96d56Sopenharmony_ci    def create(self, **kwargs):
10947db96d56Sopenharmony_ci        return tkinter.Scale(self.root, **kwargs)
10957db96d56Sopenharmony_ci
10967db96d56Sopenharmony_ci    def test_configure_bigincrement(self):
10977db96d56Sopenharmony_ci        widget = self.create()
10987db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'bigincrement', 12.4, 23.6, -5)
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci    def test_configure_digits(self):
11017db96d56Sopenharmony_ci        widget = self.create()
11027db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'digits', 5, 0)
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci    def test_configure_from(self):
11057db96d56Sopenharmony_ci        widget = self.create()
11067db96d56Sopenharmony_ci        conv = float if get_tk_patchlevel() >= (8, 6, 10) else float_round
11077db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=conv)
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci    def test_configure_label(self):
11107db96d56Sopenharmony_ci        widget = self.create()
11117db96d56Sopenharmony_ci        self.checkParam(widget, 'label', 'any string')
11127db96d56Sopenharmony_ci        self.checkParam(widget, 'label', '')
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci    def test_configure_length(self):
11157db96d56Sopenharmony_ci        widget = self.create()
11167db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'length', 130, 131.2, 135.6, '5i')
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci    def test_configure_resolution(self):
11197db96d56Sopenharmony_ci        widget = self.create()
11207db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'resolution', 4.2, 0, 6.7, -2)
11217db96d56Sopenharmony_ci
11227db96d56Sopenharmony_ci    def test_configure_showvalue(self):
11237db96d56Sopenharmony_ci        widget = self.create()
11247db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'showvalue')
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci    def test_configure_sliderlength(self):
11277db96d56Sopenharmony_ci        widget = self.create()
11287db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'sliderlength',
11297db96d56Sopenharmony_ci                              10, 11.2, 15.6, -3, '3m')
11307db96d56Sopenharmony_ci
11317db96d56Sopenharmony_ci    def test_configure_sliderrelief(self):
11327db96d56Sopenharmony_ci        widget = self.create()
11337db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'sliderrelief')
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci    def test_configure_tickinterval(self):
11367db96d56Sopenharmony_ci        widget = self.create()
11377db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'tickinterval', 1, 4.3, 7.6, 0,
11387db96d56Sopenharmony_ci                             conv=float_round)
11397db96d56Sopenharmony_ci        self.checkParam(widget, 'tickinterval', -2, expected=2,
11407db96d56Sopenharmony_ci                        conv=float_round)
11417db96d56Sopenharmony_ci
11427db96d56Sopenharmony_ci    def test_configure_to(self):
11437db96d56Sopenharmony_ci        widget = self.create()
11447db96d56Sopenharmony_ci        self.checkFloatParam(widget, 'to', 300, 14.9, 15.1, -10,
11457db96d56Sopenharmony_ci                             conv=float_round)
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci@add_standard_options(PixelSizeTests, StandardOptionsTests)
11497db96d56Sopenharmony_ciclass ScrollbarTest(AbstractWidgetTest, unittest.TestCase):
11507db96d56Sopenharmony_ci    OPTIONS = (
11517db96d56Sopenharmony_ci        'activebackground', 'activerelief',
11527db96d56Sopenharmony_ci        'background', 'borderwidth',
11537db96d56Sopenharmony_ci        'command', 'cursor', 'elementborderwidth',
11547db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
11557db96d56Sopenharmony_ci        'jump', 'orient', 'relief',
11567db96d56Sopenharmony_ci        'repeatdelay', 'repeatinterval',
11577db96d56Sopenharmony_ci        'takefocus', 'troughcolor', 'width',
11587db96d56Sopenharmony_ci    )
11597db96d56Sopenharmony_ci    _conv_pixels = round
11607db96d56Sopenharmony_ci    _stringify = True
11617db96d56Sopenharmony_ci    default_orient = 'vertical'
11627db96d56Sopenharmony_ci
11637db96d56Sopenharmony_ci    def create(self, **kwargs):
11647db96d56Sopenharmony_ci        return tkinter.Scrollbar(self.root, **kwargs)
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_ci    def test_configure_activerelief(self):
11677db96d56Sopenharmony_ci        widget = self.create()
11687db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'activerelief')
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ci    def test_configure_elementborderwidth(self):
11717db96d56Sopenharmony_ci        widget = self.create()
11727db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, -2, '1m')
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci    def test_configure_orient(self):
11757db96d56Sopenharmony_ci        widget = self.create()
11767db96d56Sopenharmony_ci        self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal',
11777db96d56Sopenharmony_ci                errmsg='bad orientation "{}": must be vertical or horizontal')
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci    def test_activate(self):
11807db96d56Sopenharmony_ci        sb = self.create()
11817db96d56Sopenharmony_ci        for e in ('arrow1', 'slider', 'arrow2'):
11827db96d56Sopenharmony_ci            sb.activate(e)
11837db96d56Sopenharmony_ci            self.assertEqual(sb.activate(), e)
11847db96d56Sopenharmony_ci        sb.activate('')
11857db96d56Sopenharmony_ci        self.assertIsNone(sb.activate())
11867db96d56Sopenharmony_ci        self.assertRaises(TypeError, sb.activate, 'arrow1', 'arrow2')
11877db96d56Sopenharmony_ci
11887db96d56Sopenharmony_ci    def test_set(self):
11897db96d56Sopenharmony_ci        sb = self.create()
11907db96d56Sopenharmony_ci        sb.set(0.2, 0.4)
11917db96d56Sopenharmony_ci        self.assertEqual(sb.get(), (0.2, 0.4))
11927db96d56Sopenharmony_ci        self.assertRaises(TclError, sb.set, 'abc', 'def')
11937db96d56Sopenharmony_ci        self.assertRaises(TclError, sb.set, 0.6, 'def')
11947db96d56Sopenharmony_ci        self.assertRaises(TclError, sb.set, 0.6, None)
11957db96d56Sopenharmony_ci        self.assertRaises(TypeError, sb.set, 0.6)
11967db96d56Sopenharmony_ci        self.assertRaises(TypeError, sb.set, 0.6, 0.7, 0.8)
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
12007db96d56Sopenharmony_ciclass PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
12017db96d56Sopenharmony_ci    OPTIONS = (
12027db96d56Sopenharmony_ci        'background', 'borderwidth', 'cursor',
12037db96d56Sopenharmony_ci        'handlepad', 'handlesize', 'height',
12047db96d56Sopenharmony_ci        'opaqueresize', 'orient',
12057db96d56Sopenharmony_ci        'proxybackground', 'proxyborderwidth', 'proxyrelief',
12067db96d56Sopenharmony_ci        'relief',
12077db96d56Sopenharmony_ci        'sashcursor', 'sashpad', 'sashrelief', 'sashwidth',
12087db96d56Sopenharmony_ci        'showhandle', 'width',
12097db96d56Sopenharmony_ci    )
12107db96d56Sopenharmony_ci    default_orient = 'horizontal'
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ci    def create(self, **kwargs):
12137db96d56Sopenharmony_ci        return tkinter.PanedWindow(self.root, **kwargs)
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci    def test_configure_handlepad(self):
12167db96d56Sopenharmony_ci        widget = self.create()
12177db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'handlepad', 5, 6.4, 7.6, -3, '1m')
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci    def test_configure_handlesize(self):
12207db96d56Sopenharmony_ci        widget = self.create()
12217db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'handlesize', 8, 9.4, 10.6, -3, '2m',
12227db96d56Sopenharmony_ci                              conv=False)
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci    def test_configure_height(self):
12257db96d56Sopenharmony_ci        widget = self.create()
12267db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, -100, 0, '1i',
12277db96d56Sopenharmony_ci                              conv=False)
12287db96d56Sopenharmony_ci
12297db96d56Sopenharmony_ci    def test_configure_opaqueresize(self):
12307db96d56Sopenharmony_ci        widget = self.create()
12317db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'opaqueresize')
12327db96d56Sopenharmony_ci
12337db96d56Sopenharmony_ci    @requires_tcl(8, 6, 5)
12347db96d56Sopenharmony_ci    def test_configure_proxybackground(self):
12357db96d56Sopenharmony_ci        widget = self.create()
12367db96d56Sopenharmony_ci        self.checkColorParam(widget, 'proxybackground')
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ci    @requires_tcl(8, 6, 5)
12397db96d56Sopenharmony_ci    def test_configure_proxyborderwidth(self):
12407db96d56Sopenharmony_ci        widget = self.create()
12417db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'proxyborderwidth',
12427db96d56Sopenharmony_ci                              0, 1.3, 2.9, 6, -2, '10p',
12437db96d56Sopenharmony_ci                              conv=False)
12447db96d56Sopenharmony_ci
12457db96d56Sopenharmony_ci    @requires_tcl(8, 6, 5)
12467db96d56Sopenharmony_ci    def test_configure_proxyrelief(self):
12477db96d56Sopenharmony_ci        widget = self.create()
12487db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'proxyrelief')
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci    def test_configure_sashcursor(self):
12517db96d56Sopenharmony_ci        widget = self.create()
12527db96d56Sopenharmony_ci        self.checkCursorParam(widget, 'sashcursor')
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci    def test_configure_sashpad(self):
12557db96d56Sopenharmony_ci        widget = self.create()
12567db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'sashpad', 8, 1.3, 2.6, -2, '2m')
12577db96d56Sopenharmony_ci
12587db96d56Sopenharmony_ci    def test_configure_sashrelief(self):
12597db96d56Sopenharmony_ci        widget = self.create()
12607db96d56Sopenharmony_ci        self.checkReliefParam(widget, 'sashrelief')
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ci    def test_configure_sashwidth(self):
12637db96d56Sopenharmony_ci        widget = self.create()
12647db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'sashwidth', 10, 11.1, 15.6, -3, '1m',
12657db96d56Sopenharmony_ci                              conv=False)
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci    def test_configure_showhandle(self):
12687db96d56Sopenharmony_ci        widget = self.create()
12697db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'showhandle')
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci    def test_configure_width(self):
12727db96d56Sopenharmony_ci        widget = self.create()
12737db96d56Sopenharmony_ci        self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, -402, 0, '5i',
12747db96d56Sopenharmony_ci                              conv=False)
12757db96d56Sopenharmony_ci
12767db96d56Sopenharmony_ci    def create2(self):
12777db96d56Sopenharmony_ci        p = self.create()
12787db96d56Sopenharmony_ci        b = tkinter.Button(p)
12797db96d56Sopenharmony_ci        c = tkinter.Button(p)
12807db96d56Sopenharmony_ci        p.add(b)
12817db96d56Sopenharmony_ci        p.add(c)
12827db96d56Sopenharmony_ci        return p, b, c
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci    def test_paneconfigure(self):
12857db96d56Sopenharmony_ci        p, b, c = self.create2()
12867db96d56Sopenharmony_ci        self.assertRaises(TypeError, p.paneconfigure)
12877db96d56Sopenharmony_ci        d = p.paneconfigure(b)
12887db96d56Sopenharmony_ci        self.assertIsInstance(d, dict)
12897db96d56Sopenharmony_ci        for k, v in d.items():
12907db96d56Sopenharmony_ci            self.assertEqual(len(v), 5)
12917db96d56Sopenharmony_ci            self.assertEqual(v, p.paneconfigure(b, k))
12927db96d56Sopenharmony_ci            self.assertEqual(v[4], p.panecget(b, k))
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ci    def check_paneconfigure(self, p, b, name, value, expected):
12957db96d56Sopenharmony_ci        if not self.wantobjects:
12967db96d56Sopenharmony_ci            expected = str(expected)
12977db96d56Sopenharmony_ci        p.paneconfigure(b, **{name: value})
12987db96d56Sopenharmony_ci        self.assertEqual(p.paneconfigure(b, name)[4], expected)
12997db96d56Sopenharmony_ci        self.assertEqual(p.panecget(b, name), expected)
13007db96d56Sopenharmony_ci
13017db96d56Sopenharmony_ci    def check_paneconfigure_bad(self, p, b, name, msg):
13027db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, msg):
13037db96d56Sopenharmony_ci            p.paneconfigure(b, **{name: 'badValue'})
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_ci    def test_paneconfigure_after(self):
13067db96d56Sopenharmony_ci        p, b, c = self.create2()
13077db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'after', c, str(c))
13087db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'after',
13097db96d56Sopenharmony_ci                                     'bad window path name "badValue"')
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci    def test_paneconfigure_before(self):
13127db96d56Sopenharmony_ci        p, b, c = self.create2()
13137db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'before', c, str(c))
13147db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'before',
13157db96d56Sopenharmony_ci                                     'bad window path name "badValue"')
13167db96d56Sopenharmony_ci
13177db96d56Sopenharmony_ci    def test_paneconfigure_height(self):
13187db96d56Sopenharmony_ci        p, b, c = self.create2()
13197db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'height', 10, 10)
13207db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'height',
13217db96d56Sopenharmony_ci                                     'bad screen distance "badValue"')
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci    def test_paneconfigure_hide(self):
13247db96d56Sopenharmony_ci        p, b, c = self.create2()
13257db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'hide', False, 0)
13267db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'hide',
13277db96d56Sopenharmony_ci                                     'expected boolean value but got "badValue"')
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci    def test_paneconfigure_minsize(self):
13307db96d56Sopenharmony_ci        p, b, c = self.create2()
13317db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'minsize', 10, 10)
13327db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'minsize',
13337db96d56Sopenharmony_ci                                     'bad screen distance "badValue"')
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci    def test_paneconfigure_padx(self):
13367db96d56Sopenharmony_ci        p, b, c = self.create2()
13377db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'padx', 1.3, 1)
13387db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'padx',
13397db96d56Sopenharmony_ci                                     'bad screen distance "badValue"')
13407db96d56Sopenharmony_ci
13417db96d56Sopenharmony_ci    def test_paneconfigure_pady(self):
13427db96d56Sopenharmony_ci        p, b, c = self.create2()
13437db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'pady', 1.3, 1)
13447db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'pady',
13457db96d56Sopenharmony_ci                                     'bad screen distance "badValue"')
13467db96d56Sopenharmony_ci
13477db96d56Sopenharmony_ci    def test_paneconfigure_sticky(self):
13487db96d56Sopenharmony_ci        p, b, c = self.create2()
13497db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'sticky', 'nsew', 'nesw')
13507db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'sticky',
13517db96d56Sopenharmony_ci                                     'bad stickyness value "badValue": must '
13527db96d56Sopenharmony_ci                                     'be a string containing zero or more of '
13537db96d56Sopenharmony_ci                                     'n, e, s, and w')
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_ci    def test_paneconfigure_stretch(self):
13567db96d56Sopenharmony_ci        p, b, c = self.create2()
13577db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'stretch', 'alw', 'always')
13587db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'stretch',
13597db96d56Sopenharmony_ci                                     'bad stretch "badValue": must be '
13607db96d56Sopenharmony_ci                                     'always, first, last, middle, or never')
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci    def test_paneconfigure_width(self):
13637db96d56Sopenharmony_ci        p, b, c = self.create2()
13647db96d56Sopenharmony_ci        self.check_paneconfigure(p, b, 'width', 10, 10)
13657db96d56Sopenharmony_ci        self.check_paneconfigure_bad(p, b, 'width',
13667db96d56Sopenharmony_ci                                     'bad screen distance "badValue"')
13677db96d56Sopenharmony_ci
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci@add_standard_options(StandardOptionsTests)
13707db96d56Sopenharmony_ciclass MenuTest(AbstractWidgetTest, unittest.TestCase):
13717db96d56Sopenharmony_ci    OPTIONS = (
13727db96d56Sopenharmony_ci        'activebackground', 'activeborderwidth', 'activeforeground',
13737db96d56Sopenharmony_ci        'background', 'borderwidth', 'cursor',
13747db96d56Sopenharmony_ci        'disabledforeground', 'font', 'foreground',
13757db96d56Sopenharmony_ci        'postcommand', 'relief', 'selectcolor', 'takefocus',
13767db96d56Sopenharmony_ci        'tearoff', 'tearoffcommand', 'title', 'type',
13777db96d56Sopenharmony_ci    )
13787db96d56Sopenharmony_ci    _conv_pixels = False
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ci    def create(self, **kwargs):
13817db96d56Sopenharmony_ci        return tkinter.Menu(self.root, **kwargs)
13827db96d56Sopenharmony_ci
13837db96d56Sopenharmony_ci    def test_indexcommand_none(self):
13847db96d56Sopenharmony_ci        widget = self.create()
13857db96d56Sopenharmony_ci        i = widget.index('none')
13867db96d56Sopenharmony_ci        self.assertIsNone(i)
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci    def test_configure_postcommand(self):
13897db96d56Sopenharmony_ci        widget = self.create()
13907db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'postcommand')
13917db96d56Sopenharmony_ci
13927db96d56Sopenharmony_ci    def test_configure_tearoff(self):
13937db96d56Sopenharmony_ci        widget = self.create()
13947db96d56Sopenharmony_ci        self.checkBooleanParam(widget, 'tearoff')
13957db96d56Sopenharmony_ci
13967db96d56Sopenharmony_ci    def test_configure_tearoffcommand(self):
13977db96d56Sopenharmony_ci        widget = self.create()
13987db96d56Sopenharmony_ci        self.checkCommandParam(widget, 'tearoffcommand')
13997db96d56Sopenharmony_ci
14007db96d56Sopenharmony_ci    def test_configure_title(self):
14017db96d56Sopenharmony_ci        widget = self.create()
14027db96d56Sopenharmony_ci        self.checkParam(widget, 'title', 'any string')
14037db96d56Sopenharmony_ci
14047db96d56Sopenharmony_ci    def test_configure_type(self):
14057db96d56Sopenharmony_ci        widget = self.create()
14067db96d56Sopenharmony_ci        opts = ('normal, tearoff, or menubar'
14077db96d56Sopenharmony_ci                if widget.info_patchlevel() < (8, 7) else
14087db96d56Sopenharmony_ci                'menubar, normal, or tearoff')
14097db96d56Sopenharmony_ci        self.checkEnumParam(
14107db96d56Sopenharmony_ci            widget, 'type',
14117db96d56Sopenharmony_ci            'normal', 'tearoff', 'menubar',
14127db96d56Sopenharmony_ci            errmsg='bad type "{}": must be ' + opts,
14137db96d56Sopenharmony_ci            )
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ci    def test_entryconfigure(self):
14167db96d56Sopenharmony_ci        m1 = self.create()
14177db96d56Sopenharmony_ci        m1.add_command(label='test')
14187db96d56Sopenharmony_ci        self.assertRaises(TypeError, m1.entryconfigure)
14197db96d56Sopenharmony_ci        with self.assertRaisesRegex(TclError, 'bad menu entry index "foo"'):
14207db96d56Sopenharmony_ci            m1.entryconfigure('foo')
14217db96d56Sopenharmony_ci        d = m1.entryconfigure(1)
14227db96d56Sopenharmony_ci        self.assertIsInstance(d, dict)
14237db96d56Sopenharmony_ci        for k, v in d.items():
14247db96d56Sopenharmony_ci            self.assertIsInstance(k, str)
14257db96d56Sopenharmony_ci            self.assertIsInstance(v, tuple)
14267db96d56Sopenharmony_ci            self.assertEqual(len(v), 5)
14277db96d56Sopenharmony_ci            self.assertEqual(v[0], k)
14287db96d56Sopenharmony_ci            self.assertEqual(m1.entrycget(1, k), v[4])
14297db96d56Sopenharmony_ci        m1.destroy()
14307db96d56Sopenharmony_ci
14317db96d56Sopenharmony_ci    def test_entryconfigure_label(self):
14327db96d56Sopenharmony_ci        m1 = self.create()
14337db96d56Sopenharmony_ci        m1.add_command(label='test')
14347db96d56Sopenharmony_ci        self.assertEqual(m1.entrycget(1, 'label'), 'test')
14357db96d56Sopenharmony_ci        m1.entryconfigure(1, label='changed')
14367db96d56Sopenharmony_ci        self.assertEqual(m1.entrycget(1, 'label'), 'changed')
14377db96d56Sopenharmony_ci
14387db96d56Sopenharmony_ci    def test_entryconfigure_variable(self):
14397db96d56Sopenharmony_ci        m1 = self.create()
14407db96d56Sopenharmony_ci        v1 = tkinter.BooleanVar(self.root)
14417db96d56Sopenharmony_ci        v2 = tkinter.BooleanVar(self.root)
14427db96d56Sopenharmony_ci        m1.add_checkbutton(variable=v1, onvalue=True, offvalue=False,
14437db96d56Sopenharmony_ci                           label='Nonsense')
14447db96d56Sopenharmony_ci        self.assertEqual(str(m1.entrycget(1, 'variable')), str(v1))
14457db96d56Sopenharmony_ci        m1.entryconfigure(1, variable=v2)
14467db96d56Sopenharmony_ci        self.assertEqual(str(m1.entrycget(1, 'variable')), str(v2))
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci@add_standard_options(PixelSizeTests, StandardOptionsTests)
14507db96d56Sopenharmony_ciclass MessageTest(AbstractWidgetTest, unittest.TestCase):
14517db96d56Sopenharmony_ci    OPTIONS = (
14527db96d56Sopenharmony_ci        'anchor', 'aspect', 'background', 'borderwidth',
14537db96d56Sopenharmony_ci        'cursor', 'font', 'foreground',
14547db96d56Sopenharmony_ci        'highlightbackground', 'highlightcolor', 'highlightthickness',
14557db96d56Sopenharmony_ci        'justify', 'padx', 'pady', 'relief',
14567db96d56Sopenharmony_ci        'takefocus', 'text', 'textvariable', 'width',
14577db96d56Sopenharmony_ci    )
14587db96d56Sopenharmony_ci    _conv_pad_pixels = False
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ci    def create(self, **kwargs):
14617db96d56Sopenharmony_ci        return tkinter.Message(self.root, **kwargs)
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ci    def test_configure_aspect(self):
14647db96d56Sopenharmony_ci        widget = self.create()
14657db96d56Sopenharmony_ci        self.checkIntegerParam(widget, 'aspect', 250, 0, -300)
14667db96d56Sopenharmony_ci
14677db96d56Sopenharmony_ci
14687db96d56Sopenharmony_ciclass DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_ci    def test_frame(self):
14717db96d56Sopenharmony_ci        self._test_widget(tkinter.Frame)
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ci    def test_label(self):
14747db96d56Sopenharmony_ci        self._test_widget(tkinter.Label)
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_citests_gui = (
14787db96d56Sopenharmony_ci        ButtonTest, CanvasTest, CheckbuttonTest, EntryTest,
14797db96d56Sopenharmony_ci        FrameTest, LabelFrameTest,LabelTest, ListboxTest,
14807db96d56Sopenharmony_ci        MenubuttonTest, MenuTest, MessageTest, OptionMenuTest,
14817db96d56Sopenharmony_ci        PanedWindowTest, RadiobuttonTest, ScaleTest, ScrollbarTest,
14827db96d56Sopenharmony_ci        SpinboxTest, TextTest, ToplevelTest, DefaultRootTest,
14837db96d56Sopenharmony_ci)
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ciif __name__ == '__main__':
14867db96d56Sopenharmony_ci    unittest.main()
1487