Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/tutorius/tests/overlaytests.py
blob: b5fd209e89d9faea3d64306eb616ee92bf93770d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Copyright (C) 2009, Tutorius.org
# Copyright (C) 2009, Simon Poirier <simpoir@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
"""
GUI Tests

This module contains all the tests that pertain to the usage of the Tutorius
overlay mechanism used to display objects on top of the application.
"""

import unittest

import logging
import gtk, gobject
from sugar.tutorius.actions import Action, BubbleMessage
import sugar.tutorius.overlayer as overlayer

class CanvasDrawable(object):
    def __init__(self):
        self._no_expose = False
        self.exposition_count = 0
    def _set_no_expose(self, value):
        self._no_expose = value
    def draw_with_context(self, context):
        self.exposition_count += 1
    no_expose = property(fset=_set_no_expose)


class OverlayerTest(unittest.TestCase):
    def test_cairodrawable_iface(self):
        """
        Quickly validates that all our cairo widgets have a minimal interface
        implemented.
        """
        drawables = [overlayer.TextBubble]
        for widget in drawables:
            for attr in filter(lambda s:s[0]!='_', dir(CanvasDrawable)):
                assert hasattr(widget, attr), \
                    "%s not implementing CanvasDrawable iface"%widget.__name__


    def test_drawn(self):
        """
        Ensures a cairo widget draw method is called at least once in
        a real gui app.
        """
        win = gtk.Window(type=gtk.WINDOW_TOPLEVEL)

        btn = gtk.Button()
        btn.show()
        overlay = overlayer.Overlayer(btn)
        win.add(overlay)
        # let's also try to draw substitute button label
        lbl = overlayer.TextBubble("test!")
        assert lbl.label == 'test!', \
            "label property mismatch"
        btn.show()
        lbl.show()
        btn.add(lbl)

        lbl.no_expose = True
        assert lbl.no_expose, "wrong no_expose evaluation"
        lbl.no_expose = False
        assert not lbl.no_expose, "wrong no_expose evaluation"


        widget = overlayer.TextBubble("testing msg!", tailpos=(10,-20))
        widget.exposition_count = 0
        # override draw method
        def counter(ctx, self=widget):
            self.exposition_count += 1
            self.real_exposer(ctx)
        widget.real_exposer = widget.draw_with_context
        widget.draw_with_context = counter
        # centering allows to test the blending with the label
        overlay.put(widget, 50, 50)
        widget.show()
        assert widget.no_expose, \
            "Overlay should overide exposition handling of widget"
        assert not lbl.no_expose, \
            "Non-overlayed cairo should expose as usual"

        # force widget realization
        # the child is flagged to be redrawn, the overlay should redraw too.
        win.set_default_size(100, 100)
        win.show()

        while gtk.events_pending():
            gtk.main_iteration(block=False)
        # visual validation: there should be 2 visible bubbles, one as label,
        # one as overlay
        import time
        time.sleep(1)
        # as x11 events are asynchronous, wait a bit before assuming it went
        # wrong.
        while gtk.events_pending():
            gtk.main_iteration(block=False)
        assert widget.exposition_count>0, "overlay widget should expose"


if __name__ == "__main__":
    unittest.main()