summary refs log tree commit diff stats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/__init__.py21
-rw-r--r--test/tc_directory.py8
-rw-r--r--test/tc_displayable.py122
-rw-r--r--test/tc_ui.py61
-rw-r--r--test/test.py5
5 files changed, 213 insertions, 4 deletions
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