1# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
2# All rights reserved.
3#
4# This software is provided without warranty under the terms of the BSD
5# license included in LICENSE.txt and may be redistributed only under
6# the conditions described in the aforementioned license. The license
7# is also available online at http://www.enthought.com/licenses/BSD.txt
8#
9# Thanks for using Enthought open source!
10
11import unittest
12
13from traits.api import AbstractViewElement, HasTraits, Int, TraitError
14from traits.testing.optional_dependencies import requires_traitsui
15
16
17@requires_traitsui
18class TestViewElements(unittest.TestCase):
19    def setUp(self):
20        import traitsui.api
21
22        self.toolkit = traitsui.api.toolkit()
23
24    def tearDown(self):
25        del self.toolkit
26
27    def test_view_definition(self):
28        from traitsui.api import View
29
30        view = View('count')
31
32        class Model(HasTraits):
33            count = Int
34            my_view = view
35
36        view_elements = Model.class_trait_view_elements()
37
38        self.assertEqual(view_elements.content, {'my_view': view})
39
40    def test_view_definition_twice(self):
41        from traitsui.api import View
42
43        view = View('count')
44
45        class Model(HasTraits):
46            count = Int
47            my_view = view
48
49        view_elements = Model.class_trait_view_elements()
50        view_elements2 = Model.class_trait_view_elements()
51
52        self.assertEqual(view_elements.content, {'my_view': view})
53        self.assertIs(view_elements, view_elements2)
54
55    def test_view_elements_parents(self):
56        from traitsui.api import View
57
58        class Model(HasTraits):
59            count = Int
60            my_view = View('count')
61
62        class ModelSubclass(Model):
63            total = Int
64            my_view = View('count', 'total')
65
66        view_elements = ModelSubclass.class_trait_view_elements()
67        parent_view_elements = Model.class_trait_view_elements()
68
69        self.assertEqual(view_elements.parents[0], parent_view_elements)
70
71    def test_instance_view_definition(self):
72        from traitsui.api import View
73
74        view = View('count')
75
76        class Model(HasTraits):
77            count = Int
78            my_view = view
79
80        m = Model()
81        view_elements = m.trait_view_elements()
82
83        self.assertEqual(view_elements.content, {'my_view': view})
84
85    def test_trait_views(self):
86        from traitsui.api import View
87
88        view = View('count')
89
90        class Model(HasTraits):
91            count = Int
92            my_view = view
93
94        m = Model()
95        views = m.trait_views()
96
97        self.assertEqual(views, ['my_view'])
98
99    def test_included_names(self):
100        from traitsui.api import Group, Item, View
101
102        item = Item('count', id='item_with_id')
103        group = Group(item)
104        view = View(Item('count'))
105
106        class Model(HasTraits):
107            count = Int
108            my_group = group
109            my_view = view
110
111        view_elements = Model.class_trait_view_elements()
112
113        self.assertEqual(
114            view_elements.content,
115            {'my_view': view, 'my_group': group, 'item_with_id': item}
116        )
117
118    def test_duplicate_names(self):
119        from traitsui.api import Group, Item, View
120
121        class Model(HasTraits):
122            count = Int
123            includable = Group(Item('count', id='name_conflict'))
124            name_conflict = View(Item('count'))
125
126        with self.assertRaises(TraitError):
127            Model.class_trait_view_elements()
128
129    def test_view_element_superclass(self):
130        from traitsui.api import ViewElement
131
132        self.assertIsInstance(ViewElement(), AbstractViewElement)
133