14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# -*- encoding: utf-8 -*-
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport ttk
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MockTclObj(object):
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    typename = 'test'
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, val):
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.val = val
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __str__(self):
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return unicode(self.val)
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MockStateSpec(object):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    typename = 'StateSpec'
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *args):
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.val = args
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __str__(self):
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return ' '.join(self.val)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass InternalFunctionsTest(unittest.TestCase):
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_format_optdict(self):
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def check_against(fmt_opts, result):
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in range(0, len(fmt_opts), 2):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(result.pop(fmt_opts[i]), fmt_opts[i + 1])
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if result:
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("result still got elements: %s" % result)
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing an empty dict should return an empty object (tuple here)
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(ttk._format_optdict({}))
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check list formatting
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict({'fg': 'blue', 'padding': [1, 2, 3, 4]}),
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-fg': 'blue', '-padding': '1 2 3 4'})
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check tuple formatting (same as list)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict({'test': (1, 2, '', 0)}),
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-test': '1 2 {} 0'})
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check untouched values
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict({'test': {'left': 'as is'}}),
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-test': {'left': 'as is'}})
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check script formatting
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'test': [1, -1, '', '2m', 0], 'test2': 3,
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 'test3': '', 'test4': 'abc def',
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 'test5': '"abc"', 'test6': '{}',
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 'test7': '} -spam {'}, script=True),
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-test': '{1 -1 {} 2m 0}', '-test2': '3',
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             '-test3': '{}', '-test4': '{abc def}',
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             '-test5': '{"abc"}', '-test6': r'\{\}',
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             '-test7': r'\}\ -spam\ \{'})
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        opts = {u'αβγ': True, u'á': False}
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        orig_opts = opts.copy()
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check if giving unicode keys is fine
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(ttk._format_optdict(opts), {u'-αβγ': True, u'-á': False})
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # opts should remain unchanged
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(opts, orig_opts)
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing values with spaces inside a tuple/list
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('one two', 'three')}),
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': '{one two} three'})
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('one\ttwo', 'three')}),
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': '{one\ttwo} three'})
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing empty strings inside a tuple/list
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('', 'one')}),
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': '{} one'})
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing values with braces inside a tuple/list
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('one} {two', 'three')}),
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': r'one\}\ \{two three'})
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing quoted strings inside a tuple/list
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('"one"', 'two')}),
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': '{"one"} two'})
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_against(
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_optdict(
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                {'option': ('{one}', 'two')}),
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-option': r'\{one\} two'})
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ignore an option
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        amount_opts = len(ttk._format_optdict(opts, ignore=(u'á'))) // 2
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(amount_opts, len(opts) - 1)
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ignore non-existing options
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        amount_opts = len(ttk._format_optdict(opts, ignore=(u'á', 'b'))) // 2
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(amount_opts, len(opts) - 1)
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ignore every option
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(ttk._format_optdict(opts, ignore=opts.keys()))
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_format_mapdict(self):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        opts = {'a': [('b', 'c', 'val'), ('d', 'otherval'), ('', 'single')]}
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = ttk._format_mapdict(opts)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(result), len(opts.keys()) * 2)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(result, ('-a', '{b c} val d otherval {} single'))
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_mapdict(opts, script=True),
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('-a', '{{b c} val d otherval {} single}'))
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_mapdict({2: []}), ('-2', ''))
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        opts = {u'üñíćódè': [(u'á', u'vãl')]}
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = ttk._format_mapdict(opts)
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(result, (u'-üñíćódè', u'á vãl'))
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty states
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        valid = {'opt': [('', u'', 'hi')]}
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_mapdict(valid), ('-opt', '{ } hi'))
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # when passing multiple states, they all must be strings
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        invalid = {'opt': [(1, 2, 'valid val')]}
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ttk._format_mapdict, invalid)
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        invalid = {'opt': [([1], '2', 'valid val')]}
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ttk._format_mapdict, invalid)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # but when passing a single state, it can be anything
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        valid = {'opt': [[1, 'value']]}
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_mapdict(valid), ('-opt', '1 value'))
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # special attention to single states which evalute to False
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for stateval in (None, 0, False, '', set()): # just some samples
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            valid = {'opt': [(stateval, 'value')]}
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(ttk._format_mapdict(valid),
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ('-opt', '{} value'))
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # values must be iterable
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        opts = {'a': None}
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ttk._format_mapdict, opts)
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # items in the value must have size >= 2
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, ttk._format_mapdict,
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'a': [('invalid', )]})
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_format_elemcreate(self):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ttk._format_elemcreate(None), (None, ()))
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## Testing type = image
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # image type expects at least an image name, so this should raise
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # IndexError since it tries to access the index 0 of an empty tuple
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, ttk._format_elemcreate, 'image')
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # don't format returned values as a tcl script
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # minimum acceptable for image type
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('image', False, 'test'),
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("test ", ()))
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # specifying a state spec
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('image', False, 'test',
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('', 'a')), ("test {} a", ()))
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # state spec with multiple states
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('image', False, 'test',
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', 'b', 'c')), ("test {a b} c", ()))
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # state spec and options
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = ttk._format_elemcreate('image', False, 'test',
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     ('a', 'b'), a='x', b='y')
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[0], "test a b")
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(res[1]), {"-a", "x", "-b", "y"})
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # format returned values as a tcl script
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # state spec with multiple states and an option with a multivalue
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('image', True, 'test',
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', 'b', 'c', 'd'), x=[2, 3]), ("{test {a b c} d}", "-x {2 3}"))
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## Testing type = vsapi
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # vsapi type expects at least a class name and a part_id, so this
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # should raise an ValueError since it tries to get two elements from
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # an empty tuple
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._format_elemcreate, 'vsapi')
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # don't format returned values as a tcl script
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # minimum acceptable for vsapi
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('vsapi', False, 'a', 'b'),
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("a b ", ()))
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # now with a state spec with multiple states
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('vsapi', False, 'a', 'b',
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', 'b', 'c')), ("a b {a b} c", ()))
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # state spec and option
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('vsapi', False, 'a', 'b',
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', 'b'), opt='x'), ("a b a b", ("-opt", "x")))
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # format returned values as a tcl script
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # state spec with a multivalue and an option
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('vsapi', True, 'a', 'b',
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', 'b', [1, 2]), opt='x'), ("{a b {a b} {1 2}}", "-opt x"))
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Testing type = from
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # from type expects at least a type name
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, ttk._format_elemcreate, 'from')
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('from', False, 'a'),
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', ()))
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('from', False, 'a', 'b'),
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('a', ('b', )))
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_elemcreate('from', True, 'a', 'b'),
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('{a}', 'b'))
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_format_layoutlist(self):
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def sample(indent=0, indent_size=2):
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return ttk._format_layoutlist(
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('a', {'other': [1, 2, 3], 'children':
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                [('b', {'children':
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [('c', {'children':
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        [('d', {'nice': 'opt'})], 'something': (1, 2)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    })]
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                })]
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            })], indent=indent, indent_size=indent_size)[0]
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def sample_expected(indent=0, indent_size=2):
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            spaces = lambda amount=0: ' ' * (amount + indent)
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%sa -other {1 2 3} -children {\n"
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%sb -children {\n"
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%sc -something {1 2} -children {\n"
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%sd -nice opt\n"
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%s}\n"
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%s}\n"
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                "%s}" % (spaces(), spaces(indent_size),
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    spaces(2 * indent_size), spaces(3 * indent_size),
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    spaces(2 * indent_size), spaces(indent_size), spaces()))
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty layout
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._format_layoutlist([])[0], '')
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # smallest (after an empty one) acceptable layout
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        smallest = ttk._format_layoutlist([('a', None)], indent=0)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(smallest,
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_layoutlist([('a', '')], indent=0))
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(smallest[0], 'a')
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # testing indentation levels
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(sample(), sample_expected())
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(4):
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(sample(i), sample_expected(i))
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(sample(i, i), sample_expected(i, i))
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # invalid layout format, different kind of exceptions will be
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # raised
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # plain wrong format
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._format_layoutlist,
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ['bad', 'format'])
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ttk._format_layoutlist, None)
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # _format_layoutlist always expects the second item (in every item)
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to act like a dict (except when the value evalutes to False).
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AttributeError,
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._format_layoutlist, [('a', 'b')])
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # bad children formatting
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._format_layoutlist,
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('name', {'children': {'a': None}})])
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_script_from_settings(self):
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty options
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(ttk._script_from_settings({'name':
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'configure': None, 'map': None, 'element create': None}}))
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty layout
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._script_from_settings({'name': {'layout': None}}),
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "ttk::style layout name {\nnull\n}")
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        configdict = {u'αβγ': True, u'á': False}
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._script_from_settings({'name': {'configure': configdict}}))
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mapdict = {u'üñíćódè': [(u'á', u'vãl')]}
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._script_from_settings({'name': {'map': mapdict}}))
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # invalid image element
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError,
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ttk._script_from_settings, {'name': {'element create': ['image']}})
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # minimal valid image
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(ttk._script_from_settings({'name':
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'element create': ['image', 'name']}}))
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        image = {'thing': {'element create':
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ['image', 'name', ('state1', 'state2', 'val')]}}
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._script_from_settings(image),
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "ttk::style element create thing image {name {state1 state2} val} ")
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        image['thing']['element create'].append({'opt': 30})
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._script_from_settings(image),
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "ttk::style element create thing image {name {state1 state2} val} "
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "-opt 30")
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        image['thing']['element create'][-1]['opt'] = [MockTclObj(3),
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            MockTclObj('2m')]
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._script_from_settings(image),
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "ttk::style element create thing image {name {state1 state2} val} "
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "-opt {3 2m}")
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_dict_from_tcltuple(self):
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fakettuple = ('-a', '{1 2 3}', '-something', 'foo')
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._dict_from_tcltuple(fakettuple, False),
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'-a': '{1 2 3}', '-something': 'foo'})
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._dict_from_tcltuple(fakettuple),
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'a': '{1 2 3}', 'something': 'foo'})
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # passing a tuple with a single item should return an empty dict,
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # since it tries to break the tuple by pairs.
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(ttk._dict_from_tcltuple(('single', )))
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sspec = MockStateSpec('a', 'b')
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._dict_from_tcltuple(('-a', (sspec, 'val'))),
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'a': [('a', 'b', 'val')]})
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._dict_from_tcltuple((MockTclObj('-padding'),
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [MockTclObj('1'), 2, MockTclObj('3m')])),
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'padding': [1, 2, '3m']})
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_list_from_statespec(self):
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def test_it(sspec, value, res_value, states):
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(ttk._list_from_statespec(
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                (sspec, value)), [states + (res_value, )])
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        states_even = tuple('state%d' % i for i in range(6))
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        statespec = MockStateSpec(*states_even)
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_it(statespec, 'val', 'val', states_even)
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_it(statespec, MockTclObj('val'), 'val', states_even)
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        states_odd = tuple('state%d' % i for i in range(5))
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        statespec = MockStateSpec(*states_odd)
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_it(statespec, 'val', 'val', states_odd)
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_it(('a', 'b', 'c'), MockTclObj('val'), 'val', ('a', 'b', 'c'))
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_list_from_layouttuple(self):
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty layout tuple
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(ttk._list_from_layouttuple(()))
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # shortest layout tuple
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._list_from_layouttuple(('name', )),
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('name', {})])
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # not so interesting ltuple
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample_ltuple = ('name', '-option', 'value')
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._list_from_layouttuple(sample_ltuple),
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('name', {'option': 'value'})])
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty children
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._list_from_layouttuple(
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('something', '-children', ())),
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('something', {'children': []})]
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # more interesting ltuple
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ltuple = (
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'name', '-option', 'niceone', '-children', (
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ('otherone', '-children', (
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ('child', )), '-otheropt', 'othervalue'
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                )
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._list_from_layouttuple(ltuple),
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [('name', {'option': 'niceone', 'children':
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                [('otherone', {'otheropt': 'othervalue', 'children':
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [('child', {})]
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                })]
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            })]
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # bad tuples
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._list_from_layouttuple,
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('name', 'no_minus'))
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._list_from_layouttuple,
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('name', 'no_minus', 'value'))
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._list_from_layouttuple,
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('something', '-children')) # no children
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ttk._list_from_layouttuple,
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('something', '-children', 'value')) # invalid children
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_val_or_dict(self):
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def func(opt, val=None):
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if val is None:
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return "test val"
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (opt, val)
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        options = {'test': None}
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._val_or_dict(options, func), "test val")
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        options = {'test': 3}
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk._val_or_dict(options, func), options)
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_convert_stringval(self):
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tests = (
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (0, 0), ('09', 9), ('a', 'a'), (u'áÚ', u'áÚ'), ([], '[]'),
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (None, 'None')
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for orig, expected in tests:
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(ttk._convert_stringval(orig), expected)
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if sys.getdefaultencoding() == 'ascii':
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(UnicodeDecodeError,
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ttk._convert_stringval, 'á')
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TclObjsToPyTest(unittest.TestCase):
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_unicode(self):
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        adict = {'opt': u'välúè'}
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py(adict), {'opt': u'välúè'})
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        adict['opt'] = MockTclObj(adict['opt'])
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py(adict), {'opt': u'välúè'})
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_multivalues(self):
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        adict = {'opt': [1, 2, 3, 4]}
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py(adict), {'opt': [1, 2, 3, 4]})
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        adict['opt'] = [1, 'xm', 3]
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py(adict), {'opt': [1, 'xm', 3]})
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        adict['opt'] = (MockStateSpec('a', 'b'), u'válũè')
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py(adict),
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'opt': [('a', 'b', u'válũè')]})
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py({'x': ['y z']}),
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'x': ['y z']})
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nosplit(self):
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ttk.tclobjs_to_py({'text': 'some text'}),
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            {'text': 'some text'})
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotests_nogui = (InternalFunctionsTest, TclObjsToPyTest)
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from test.test_support import run_unittest
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(*tests_nogui)
459