From 1159f9ec182496ddc5324f23fb1d5eae73fe63e3 Mon Sep 17 00:00:00 2001 From: hut Date: Sun, 13 Dec 2009 19:42:51 +0100 Subject: updated / added tests --- test/__init__.py | 21 +++++++++ test/tc_directory.py | 8 ++-- test/tc_displayable.py | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ test/tc_ui.py | 61 +++++++++++++++++++++++++ test/test.py | 5 ++ 5 files changed, 213 insertions(+), 4 deletions(-) create mode 100644 test/tc_displayable.py create mode 100644 test/tc_ui.py create mode 100644 test/test.py (limited to 'test') diff --git a/test/__init__.py b/test/__init__.py index 500d3383..3043ba18 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -6,3 +6,24 @@ __all__ = [ x[0:x.index('.')] \ def init(): sys.path.append(os.path.abspath(os.path.join(sys.path[0], '..'))) + +class Fake(object): + def __getattr__(self, attrname): + if not hasattr(self, attrname): + setattr(self, attrname, Fake()) + return self.__dict__[attrname] + + def __call__(self, *_): + return Fake() + + def __clear__(self): + self.__dict__.clear() + + def __iter__(self): + return iter(()) + +class OK(Exception): + pass + +def raise_ok(*_, **__): + raise OK() diff --git a/test/tc_directory.py b/test/tc_directory.py index 676ec0fe..11c94b3b 100644 --- a/test/tc_directory.py +++ b/test/tc_directory.py @@ -48,11 +48,11 @@ class Test1(unittest.TestCase): for name in assumed_filenames: f = File(name) f.load() - equal = 0 for dirfile in dir.files: - if (f.__dict__ == dirfile.__dict__): - equal += 1 - self.assertEqual(equal, 1) + if (f.path == dirfile.path and f.stat == dirfile.stat): + break + else: + self.fail("couldn't find file {0}".format(name)) def test_nonexistant_dir(self): dir = Directory(NONEXISTANT_DIR) diff --git a/test/tc_displayable.py b/test/tc_displayable.py new file mode 100644 index 00000000..01be0c9c --- /dev/null +++ b/test/tc_displayable.py @@ -0,0 +1,122 @@ +if __name__ == '__main__': from __init__ import init; init() + +import unittest +import curses +from random import randint + +from ranger.gui.displayable import\ + Displayable, DisplayableContainer, OutOfBoundsException +from test import Fake, OK, raise_ok + +class TestDisplayable(unittest.TestCase): + def setUp(self): + self.win = Fake() + self.fm = Fake() + self.env = Fake() + self.settings = Fake() + self.disp = Displayable( win=self.win, + env=self.env, fm=self.fm, settings=self.settings) + + hei, wid = 100, 100 + self.env.termsize = (hei, wid) + + def tearDown(self): + self.disp.destroy() + + def test_colorscheme(self): + # Using a color method implies change of window attributes + disp = self.disp + + self.win.chgat = raise_ok + self.win.attrset = raise_ok + + self.assertRaises(OK, disp.color, 'a', 'b') + self.assertRaises(OK, disp.color_at, 0, 0, 0, 'a', 'b') + self.assertRaises(OK, disp.color_reset) + + def test_boundaries(self): + disp = self.disp + hei, wid = self.env.termsize + + self.assertRaises(OutOfBoundsException, disp.resize, 0, 0, hei + 1, wid) + self.assertRaises(OutOfBoundsException, disp.resize, 0, 0, hei, wid + 1) + self.assertRaises(OutOfBoundsException, disp.resize, -1, 0, hei, wid) + self.assertRaises(OutOfBoundsException, disp.resize, 0, -1, hei, wid) + + box = (randint(10, 20), randint(30, 40), \ + randint(30, 40), randint(10, 20)) + + def in_box(y, x): + return (x >= box[1] and x < box[1] + box[3]) and \ + (y >= box[0] and y < box[0] + box[2]) + + disp.resize(*box) + for y, x in zip(range(10), range(10)): + is_in_box = in_box(y, x) + + point1 = (y, x) + self.assertEqual(is_in_box, point1 in disp) + + point2 = Fake() + point2.x = x + point2.y = y + self.assertEqual(is_in_box, point2 in disp) + +class TestDisplayableContainer(unittest.TestCase): + def setUp(self): + self.win = Fake() + self.fm = Fake() + self.env = Fake() + self.settings = Fake() + + self.initdict = {'win': self.win, 'settings': self.settings, + 'fm': self.fm, 'env': self.env} + + self.disp = Displayable(**self.initdict) + self.disc = DisplayableContainer(**self.initdict) + self.disc.add_obj(self.disp) + + hei, wid = (100, 100) + self.env.termsize = (hei, wid) + + def tearDown(self): + self.disc.destroy() + + def test_container(self): + self.assertTrue(self.disp in self.disc.container) + + def test_click(self): + self.disp.click = raise_ok + + self.disc.resize(0, 0, 50, 50) + self.disp.resize(0, 0, 20, 20) + fakepos = Fake() + + fakepos.x = 10 + fakepos.y = 10 + self.assertRaises(OK, self.disc.click, fakepos) + + fakepos.x = 30 + fakepos.y = 10 + self.disc.click(fakepos) + + def test_focused_object(self): + d1 = Displayable(**self.initdict) + d2 = DisplayableContainer(**self.initdict) + d2.add_obj(*[Displayable(**self.initdict) for x in range(5)]) + d3 = DisplayableContainer(**self.initdict) + d3.add_obj(*[Displayable(**self.initdict) for x in range(5)]) + + self.disc.add_obj(d1, d2, d3) + + d3.container[3].focused = True + + self.assertEqual(self.disc.get_focused_obj(), d3.container[3]) + + d3.container[3].focused = False + d2.container[0].focused = True + + self.assertEqual(self.disc.get_focused_obj(), d2.container[0]) + +if __name__ == '__main__': + unittest.main() diff --git a/test/tc_ui.py b/test/tc_ui.py new file mode 100644 index 00000000..fbe51f64 --- /dev/null +++ b/test/tc_ui.py @@ -0,0 +1,61 @@ +if __name__ == '__main__': from __init__ import init; init() + +import unittest +import curses + +from ranger.gui import ui + +from test import Fake, OK, raise_ok + +ui.curses = Fake() + +class Test(unittest.TestCase): + def setUp(self): + + self.fm = Fake() + self.ui = ui.UI(env=Fake(), fm=self.fm) + + def fakesetup(): + self.ui.widget = Fake() + self.ui.add_obj(self.ui.widget) + self.ui.setup = fakesetup + + self.ui.initialize() + + def tearDown(self): + self.ui.destroy() + + def test_scrolling(self): + # test whether scrolling works + self.fm.scroll = raise_ok + self.ui.get_focused_obj = lambda: False + + ui.curses.getmouse = lambda: (0, 0, 0, 0, curses.BUTTON2_PRESSED) + self.assertRaises(OK, self.ui.handle_mouse) + + ui.curses.getmouse = lambda: (0, 0, 0, 0, curses.BUTTON4_PRESSED) + self.assertRaises(OK, self.ui.handle_mouse) + + def test_passing(self): + # Test whether certain method calls are passed to widgets + widget = self.ui.widget + + widget.draw = raise_ok + self.assertRaises(OK, self.ui.draw) + widget.__clear__() + + widget.finalize = raise_ok + self.assertRaises(OK, self.ui.finalize) + widget.__clear__() + + widget.press = raise_ok + random_key = 123 + self.assertRaises(OK, self.ui.handle_key, random_key) + widget.__clear__() + + widget.destroy = raise_ok + self.assertRaises(OK, self.ui.destroy) + widget.__clear__() + +if __name__ == '__main__': + unittest.main() diff --git a/test/test.py b/test/test.py new file mode 100644 index 00000000..bf285a47 --- /dev/null +++ b/test/test.py @@ -0,0 +1,5 @@ +"""Workaround to allow running single test cases directly""" +try: + from __init__ import init, Fake, OK, raise_ok +except: + from test import init, Fake, OK, raise_ok -- cgit 1.4.1-2-gfad0