# Copyright (C) 2009, Tutorius.org # Copyright (C) 2009, Simon Poirier # # 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 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" widg = gtk.Button('bo') widg.show() overlay.put(widg, 50,50) #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) time.sleep(10) assert widget.exposition_count>0, "overlay widget should expose" if __name__ == "__main__": unittest.main()