import unittest
import wx

def loop( delay=0 ):
    app = wx.GetApp()
    if  app is None:
        return
    if  delay == 0:
        while True:
            wx.CallAfter( app.ExitMainLoop )
            app.MainLoop()
            if  not app.Pending():
                break
    else:
        wx.FutureCall( delay, app.ExitMainLoop )
        app.MainLoop()

def window_to_image( wnd ):
    win_dc = wx.ClientDC( wnd )
    size = win_dc.GetSize()
    bmp = wx.EmptyBitmap( size.width, size.height )
    bmp_dc = wx.MemoryDC()
    bmp_dc.SelectObject( bmp )
    bmp_dc.BlitPointSize( (0,0), size, win_dc, (0,0) )
    bmp_dc.SelectObject( wx.NullBitmap )
    return  wx.ImageFromBitmap( bmp )

class TestGUI( unittest.TestCase ):
    def setUp( self ):
        self.app = wx.PySimpleApp()
        self.frame = frame = wx.Frame( None, title='test' )
        self.nb = nb = wx.Notebook( frame )
        nb.SetSize( (300,200) )
        frame.Show()
        loop()
    
    def tearDown (self):
        loop()
        self.frame.Close( force=True )
        self.app = None
        loop()
    
    def test_empty_NB_redraws_badly( self ):
        nb = self.nb
        frame = self.frame
        frame.SetSize( (100,100) )
        loop()
        #img1 = window_to_image( nb )
        #img1.SaveFile( 'nb.png', wx.BITMAP_TYPE_PNG )
        frame.SetSize( (200,200) )
        loop()
        img2 = window_to_image( nb )
        #img2.SaveFile( 'nb.png', wx.BITMAP_TYPE_PNG )
        img2 = img2.GetSubImage( wx.RectPP( (10,10),(180,120) ) )
        img2.SaveFile( 'inner_area.png', wx.BITMAP_TYPE_PNG )
        #loop(5*1000)
        self.assertEqual( img2.CountColours(), 1 )
    
def suite():
    suite = unittest.TestSuite()
    suite.addTest( unittest.makeSuite( TestGUI ) )
    return  suite

if  __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run( suite() )
