From a548f7224d8dcda7428592748dcbe63b8e8a287d Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 15 Sep 2011 16:16:21 +0000 Subject: [PATCH] unittest updates and new test modules git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@69095 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- unittests/imp_unittest.py | 10 ++++ unittests/runtests.py | 11 +---- unittests/test_app.py | 8 ++-- unittests/test_apptraits.py | 24 ++++++++++ unittests/test_arrayint.py | 8 ++-- unittests/test_arraystring.py | 6 +-- unittests/test_bitmap.py | 70 ++++++++++++++++++++++++++++ unittests/test_bmpbuttn.py | 28 ++++++++++++ unittests/test_brush.py | 36 +++++++++++++++ unittests/test_button.py | 43 +++++++++++++++++ unittests/test_choice.py | 37 +++++++++++++++ unittests/test_collpane.py | 35 ++++++++++++++ unittests/test_colour.py | 6 +-- unittests/test_event.py | 6 +-- unittests/test_gdicmn.py | 12 ++--- unittests/test_geometry.py | 8 ++-- unittests/test_mousestate.py | 6 +-- unittests/test_pyevent.py | 6 +-- unittests/test_string.py | 6 +-- unittests/test_window.py | 84 ++++++++++++++++++++++++++++++++++ unittests/test_windowid.py | 21 +++++++++ unittests/test_windowlist.py | 6 +-- unittests/toucan.png | Bin 0 -> 21806 bytes unittests/wtc.py | 25 ++++++++++ 24 files changed, 454 insertions(+), 48 deletions(-) create mode 100644 unittests/imp_unittest.py create mode 100644 unittests/test_apptraits.py create mode 100644 unittests/test_bitmap.py create mode 100644 unittests/test_bmpbuttn.py create mode 100644 unittests/test_brush.py create mode 100644 unittests/test_button.py create mode 100644 unittests/test_choice.py create mode 100644 unittests/test_collpane.py create mode 100644 unittests/test_window.py create mode 100644 unittests/test_windowid.py create mode 100644 unittests/toucan.png create mode 100644 unittests/wtc.py diff --git a/unittests/imp_unittest.py b/unittests/imp_unittest.py new file mode 100644 index 00000000..0f9bb707 --- /dev/null +++ b/unittests/imp_unittest.py @@ -0,0 +1,10 @@ +import sys + +if sys.version_info < (2,7): + # The unittest2 package has back-ported most of the new features of the + # unittest module in Python 2.7, you can get it at PyPI. + import unittest2 + sys.modules['unittest'] = unittest2 + +else: + import unittest diff --git a/unittests/runtests.py b/unittests/runtests.py index c8336ca0..b530232a 100755 --- a/unittests/runtests.py +++ b/unittests/runtests.py @@ -18,15 +18,8 @@ print "wx.version:", wx.version() print "pid:", os.getpid() #print "executable:", sys.executable; raw_input("Press Enter...") -if sys.version_info < (2,7): - # The unittest2 package has back-ported most of the new features of the - # unittest module in Python 2.7, you can get it at PyPI. - import unittest2 - unittest = unittest2 -else: - import unittest - sys.modules['unittest2'] = unittest - +import imp_unittest, unittest + args = sys.argv[:1] + 'discover -p test_*.py -s unittests -t .'.split() + sys.argv[1:] unittest.main( argv=args ) diff --git a/unittests/test_app.py b/unittests/test_app.py index cbaf0996..602c18b0 100644 --- a/unittests/test_app.py +++ b/unittests/test_app.py @@ -1,4 +1,4 @@ -import unittest2 +import imp_unittest, unittest import wx ##import os; print 'PID:', os.getpid(); raw_input('Ready to start, press enter...') @@ -6,7 +6,7 @@ import warnings #--------------------------------------------------------------------------- -class App(unittest2.TestCase): +class App(unittest.TestCase): def test_App(self): app = wx.App() @@ -47,7 +47,7 @@ class App(unittest2.TestCase): # wx.PySimpleApp is supposed to be deprecated, make sure it is. with warnings.catch_warnings(): warnings.simplefilter("error") - with self.assertRaises(DeprecationWarning): + with self.assertRaises(wx.wxPyDeprecationWarning): app = wx.PySimpleApp() @@ -71,4 +71,4 @@ class App(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_apptraits.py b/unittests/test_apptraits.py new file mode 100644 index 00000000..1310c5d9 --- /dev/null +++ b/unittests/test_apptraits.py @@ -0,0 +1,24 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class AppTraitsTests(wtc.WidgetTestCase): + + def test_AppTraits(self): + t = self.app.GetTraits() + self.assertTrue(t is not None) + + v = t.GetToolkitVersion() + self.assertTrue( len(v) == 3) + + t.HasStderr() + t.IsUsingUniversalWidgets() + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_arrayint.py b/unittests/test_arrayint.py index 08999ffe..f8c0479f 100644 --- a/unittests/test_arrayint.py +++ b/unittests/test_arrayint.py @@ -1,13 +1,13 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class ArrayInt(unittest2.TestCase): +class ArrayInt(unittest.TestCase): if hasattr(wx, 'testArrayIntTypemap'): - def test_ArrayStringTypemaps(self): + def test_ArrayIntTypemaps(self): # basic conversion of list or tuples of numbers seqList = [1,2,3,4.5,6.7] self.assertEqual(wx.testArrayIntTypemap(seqList), [1,2,3,4,6]) #floats are truncated to int @@ -24,4 +24,4 @@ class ArrayInt(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_arraystring.py b/unittests/test_arraystring.py index 02c1addf..46cfdfd5 100644 --- a/unittests/test_arraystring.py +++ b/unittests/test_arraystring.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class ArrayString(unittest2.TestCase): +class ArrayString(unittest.TestCase): if hasattr(wx, 'testArrayStringTypemap'): def test_ArrayStringTypemaps(self): @@ -28,4 +28,4 @@ class ArrayString(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_bitmap.py b/unittests/test_bitmap.py new file mode 100644 index 00000000..97045200 --- /dev/null +++ b/unittests/test_bitmap.py @@ -0,0 +1,70 @@ +import imp_unittest, unittest +import wtc +import wx +import os + +pngFile = os.path.join(os.path.dirname(__file__), 'toucan.png') + +#--------------------------------------------------------------------------- + +class BitmapTests(wtc.WidgetTestCase): + + def test_BitmapCtors(self): + b1 = wx.Bitmap() + self.assertTrue( not b1.IsOk() ) + b2 = wx.Bitmap(5, 10, 32) + self.assertTrue( b2.IsOk() ) + b3 = wx.Bitmap(wx.Size(5,10), 32) + self.assertTrue( b3.IsOk() ) + b4 = wx.Bitmap((5,10), 32) + self.assertTrue( b4.IsOk() ) + b5 = wx.Bitmap(pngFile) + self.assertTrue( b5.IsOk() ) + img = wx.Image(pngFile) + b6 = wx.Bitmap(img) + self.assertTrue( b6.IsOk() ) + + + def test_Bitmap__nonzero__(self): + b1 = wx.Bitmap() + self.assertTrue( not b1.IsOk() ) + b2 = wx.Bitmap(5, 10, 24) + self.assertTrue( b2.IsOk() ) + self.assertTrue( b2.__nonzero__() == b2.IsOk() ) + + # check that the __nonzero__ method can be used with if satements + nzcheck = False + if b2: + nzcheck = True + self.assertTrue(nzcheck) + nzcheck = False + if not b1: + nzcheck = True + self.assertTrue(nzcheck) + + + def test_BitmapNullBitmap(self): + # just make sure this one exists + wx.NullBitmap + self.assertTrue(not wx.NullBitmap.IsOk()) + + + def test_BitmapSetMaskColour(self): + b5 = wx.Bitmap(pngFile) + b5.SetMaskColour(wx.Colour(1,2,3)) + b5.SetMaskColour('black') + + + def test_BitmapMask(self): + b5 = wx.Bitmap(pngFile) + m = wx.Mask() + m = wx.Mask(b5, 4) + m = wx.Mask(b5) + m = wx.Mask(b5, wx.Colour(1,2,3)) + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_bmpbuttn.py b/unittests/test_bmpbuttn.py new file mode 100644 index 00000000..247e2bd8 --- /dev/null +++ b/unittests/test_bmpbuttn.py @@ -0,0 +1,28 @@ +import imp_unittest, unittest +import wtc +import wx +import os + +pngFile = os.path.join(os.path.dirname(__file__), 'toucan.png') + +#--------------------------------------------------------------------------- + +class BitmapButtonTests(wtc.WidgetTestCase): + + def test_BitmapButtonCtor(self): + bmp = wx.Bitmap(pngFile) + btn = wx.BitmapButton(self.frame, -1, bmp) + + + def test_BitmapButtonDefaultCtor(self): + bmp = wx.Bitmap(pngFile) + btn = wx.BitmapButton() + btn.Create(self.frame, -1, bmp) + + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_brush.py b/unittests/test_brush.py new file mode 100644 index 00000000..1ba9639b --- /dev/null +++ b/unittests/test_brush.py @@ -0,0 +1,36 @@ +import imp_unittest, unittest +import wtc +import wx +import os + +pngFile = os.path.join(os.path.dirname(__file__), 'toucan.png') + +#--------------------------------------------------------------------------- + +class BrushTests(wtc.WidgetTestCase): + + def test_BrushCtors(self): + b = wx.Brush() + b = wx.Brush(wx.Colour(1,2,3), wx.BRUSHSTYLE_SOLID) + bmp = wx.Bitmap(pngFile) + b = wx.Brush(bmp) + copy = wx.Brush(b) + + + def test_BrushOperators(self): + b1 = wx.Brush(wx.Colour(1,2,3), wx.BRUSHSTYLE_SOLID) + b2 = wx.Brush(wx.Colour(1,2,3), wx.BRUSHSTYLE_SOLID) + b3 = wx.Brush(wx.Colour(4,5,6), wx.BRUSHSTYLE_SOLID) + + self.assertTrue(b1 == b2) + self.assertTrue(b2 != b3) + self.assertFalse(b1 != b2) + self.assertFalse(b2 == b3) + + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_button.py b/unittests/test_button.py new file mode 100644 index 00000000..5b95cdb7 --- /dev/null +++ b/unittests/test_button.py @@ -0,0 +1,43 @@ +import imp_unittest, unittest +import wtc +import wx +import os + +pngFile = os.path.join(os.path.dirname(__file__), 'toucan.png') + +#--------------------------------------------------------------------------- + +class ButtonTests(wtc.WidgetTestCase): + + def test_ButtonCtors(self): + btn = wx.Button(self.frame, label='label') + btn = wx.Button(self.frame, -1, 'label', (10,10), (100,-1), wx.BU_LEFT) + bmp = wx.Bitmap(pngFile) + btn.SetBitmap(bmp) + + def test_ButtonProperties(self): + btn = wx.Button(self.frame, label='label') + + # do the properties exist? + btn.AuthNeeded + btn.Bitmap + btn.BitmapCurrent + btn.BitmapDisabled + btn.BitmapFocus + btn.BitmapLabel + btn.BitmapMargins + btn.BitmapPressed + btn.Label + + + def test_ButtonDefaultCtor(self): + btn = wx.Button() + btn.Create(self.frame, -1, 'button label') + + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_choice.py b/unittests/test_choice.py new file mode 100644 index 00000000..aeaf42db --- /dev/null +++ b/unittests/test_choice.py @@ -0,0 +1,37 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class ChoiceTests(wtc.WidgetTestCase): + + def test_ChoiceCtors(self): + c = wx.Choice(self.frame, choices="one two three four".split()) + c = wx.Choice(self.frame, -1, wx.Point(10,10), wx.Size(80,-1), + "one two three four".split(), 0) + c = wx.Choice(self.frame, -1, (10,10), (80,-1), "one two three four".split(), 0) + + self.assertTrue(c.GetCount() == 4) + + + def test_ChoiceDefaultCtor(self): + c = wx.Choice() + c.Create(self.frame, choices="one two three four".split()) + + + def test_ChoiceProperties(self): + c = wx.Choice(self.frame, choices="one two three four".split()) + + # do the properties exist? + c.Columns + c.Count + c.CurrentSelection + c.Selection + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_collpane.py b/unittests/test_collpane.py new file mode 100644 index 00000000..d71618e2 --- /dev/null +++ b/unittests/test_collpane.py @@ -0,0 +1,35 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class CollapsiblePaneTests(wtc.WidgetTestCase): + + def test_CollPaneCtors(self): + c = wx.CollapsiblePane(self.frame, label='label') + c = wx.CollapsiblePane(self.frame, -1, 'label', (12, 34), (45, 67)) + + c.Collapse() + c.Expand() + c.IsCollapsed() + c.IsExpanded() + + + def test_CollPaneDefaultCtor(self): + c = wx.CollapsiblePane() + c.Create(self.frame) + + + def test_CollPaneProperties(self): + c = wx.CollapsiblePane(self.frame) + + # do the properties exist? + c.Pane + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_colour.py b/unittests/test_colour.py index acdb2365..88452112 100644 --- a/unittests/test_colour.py +++ b/unittests/test_colour.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class Colour(unittest2.TestCase): +class Colour(unittest.TestCase): def setUp(self): if hasattr(wx, 'InitializeStockLists'): wx.InitializeStockLists() # switch to wx.App once we have that class working @@ -52,4 +52,4 @@ class Colour(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_event.py b/unittests/test_event.py index b29e3726..5624ca73 100644 --- a/unittests/test_event.py +++ b/unittests/test_event.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class Events(unittest2.TestCase): +class Events(unittest.TestCase): # Test the constructors to make sure the classes are not abstract, except # for wx.Event @@ -144,4 +144,4 @@ class Events(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_gdicmn.py b/unittests/test_gdicmn.py index 5fe42f3b..293fd338 100644 --- a/unittests/test_gdicmn.py +++ b/unittests/test_gdicmn.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class Point(unittest2.TestCase): +class Point(unittest.TestCase): def test_default_ctor(self): p = wx.Point() @@ -86,7 +86,7 @@ class Point(unittest2.TestCase): #--------------------------------------------------------------------------- -class Size(unittest2.TestCase): +class Size(unittest.TestCase): def test_default_ctor(self): s = wx.Size() @@ -203,7 +203,7 @@ class Size(unittest2.TestCase): #--------------------------------------------------------------------------- -class RealPoint(unittest2.TestCase): +class RealPoint(unittest.TestCase): def test_default_ctor(self): p = wx.RealPoint() @@ -228,7 +228,7 @@ class RealPoint(unittest2.TestCase): #--------------------------------------------------------------------------- -class Rect(unittest2.TestCase): +class Rect(unittest.TestCase): def test_default_ctor(self): r = wx.Rect() @@ -272,4 +272,4 @@ class Rect(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_geometry.py b/unittests/test_geometry.py index 545a5ae2..42c083fa 100644 --- a/unittests/test_geometry.py +++ b/unittests/test_geometry.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class Point2D(unittest2.TestCase): +class Point2D(unittest.TestCase): def test_default_ctor(self): p = wx.Point2D() @@ -21,7 +21,7 @@ class Point2D(unittest2.TestCase): -class Rect2D(unittest2.TestCase): +class Rect2D(unittest.TestCase): def test_default_ctor(self): r = wx.Rect2D() @@ -42,5 +42,5 @@ class Rect2D(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() \ No newline at end of file diff --git a/unittests/test_mousestate.py b/unittests/test_mousestate.py index 9c9bb449..11c7e60c 100644 --- a/unittests/test_mousestate.py +++ b/unittests/test_mousestate.py @@ -1,9 +1,9 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class MouseState(unittest2.TestCase): +class MouseState(unittest.TestCase): def test_MouseState(self): ms = wx.MouseState() @@ -28,4 +28,4 @@ class MouseState(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_pyevent.py b/unittests/test_pyevent.py index 10f2907c..ce85d1df 100644 --- a/unittests/test_pyevent.py +++ b/unittests/test_pyevent.py @@ -1,11 +1,11 @@ import sys -import unittest2 +import imp_unittest, unittest import wx ##import os; print 'PID:', os.getpid(); raw_input('Ready to start, press enter...') #--------------------------------------------------------------------------- -class PyEvents(unittest2.TestCase): +class PyEvents(unittest.TestCase): def test_PyEvent(self): id = wx.NewId() @@ -97,4 +97,4 @@ class PyEvents(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_string.py b/unittests/test_string.py index 6c58bd8d..6c1ab4af 100644 --- a/unittests/test_string.py +++ b/unittests/test_string.py @@ -1,10 +1,10 @@ -import unittest2 +import imp_unittest, unittest import wx #--------------------------------------------------------------------------- -class String(unittest2.TestCase): +class String(unittest.TestCase): if hasattr(wx, 'testStringTypemap'): def test_StringTypemaps(self): @@ -59,4 +59,4 @@ class String(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/test_window.py b/unittests/test_window.py new file mode 100644 index 00000000..86afd01a --- /dev/null +++ b/unittests/test_window.py @@ -0,0 +1,84 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class WindowTests(wtc.WidgetTestCase): + + def test_SimpleWindowCtor(self): + w = wx.Window(self.frame, -1, (10,10), (50,50), + wx.BORDER_SIMPLE|wx.VSCROLL) + self.assertTrue(w.GetWindowStyle() == wx.BORDER_SIMPLE|wx.VSCROLL) + self.assertTrue(w.Parent is self.frame) + + # Just test that these properties exist for now. More tests can be + # added later to ensure that they work correctly. + w.AcceleratorTable + w.AutoLayout + w.BackgroundColour + w.BackgroundStyle + w.EffectiveMinSize + w.BestSize + w.BestVirtualSize + w.Border + w.Caret + w.CharHeight + w.CharWidth + w.Children + w.ClientAreaOrigin + w.ClientRect + w.ClientSize + w.Constraints + w.ContainingSizer + w.Cursor + w.DefaultAttributes + w.DropTarget + w.EventHandler + w.ExtraStyle + w.Font + w.ForegroundColour + w.GrandParent + w.TopLevelParent + w.Handle + w.HelpText + w.Id + w.Label + w.LayoutDirection + w.MaxHeight + w.MaxSize + w.MaxWidth + w.MinHeight + w.MinSize + w.MinWidth + w.Name + w.Parent + w.Position + w.Rect + w.ScreenPosition + w.ScreenRect + w.Size + w.Sizer + w.ThemeEnabled + w.ToolTip + w.UpdateClientRect + w.UpdateRegion + w.Validator + w.VirtualSize + w.WindowStyle + w.WindowStyleFlag + w.WindowVariant + w.Shown + w.Enabled + w.TopLevel + w.MinClientSize + w.MaxClientSize + + + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_windowid.py b/unittests/test_windowid.py new file mode 100644 index 00000000..203df9eb --- /dev/null +++ b/unittests/test_windowid.py @@ -0,0 +1,21 @@ +import imp_unittest, unittest +import wx + + +#--------------------------------------------------------------------------- + +class IdManagerTest(unittest.TestCase): + + def test_idManager(self): + id = wx.IdManager.ReserveId(5) + self.assertTrue(id != wx.ID_NONE) + + wx.IdManager.UnreserveId(id, 5) + + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_windowlist.py b/unittests/test_windowlist.py index f7d1a0c4..6decbc7d 100644 --- a/unittests/test_windowlist.py +++ b/unittests/test_windowlist.py @@ -1,11 +1,11 @@ import sys -import unittest2 +import imp_unittest, unittest import wx ##import os; print 'PID:', os.getpid(); raw_input('Ready to start, press enter...') #--------------------------------------------------------------------------- -class WindowList(unittest2.TestCase): +class WindowList(unittest.TestCase): def setUp(self): self.app = wx.App() self.frames = list() @@ -44,4 +44,4 @@ class WindowList(unittest2.TestCase): if __name__ == '__main__': - unittest2.main() + unittest.main() diff --git a/unittests/toucan.png b/unittests/toucan.png new file mode 100644 index 0000000000000000000000000000000000000000..8a33e241b272080127545a6a79e37295b2239afa GIT binary patch literal 21806 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