/[thuban]/branches/WIP-pyshapelib-bramz/test/support.py
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/test/support.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 956 - (show annotations)
Wed May 21 17:11:17 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/test/support.py
File MIME type: text/x-python
File size: 7741 byte(s)
(FileLoadTestCase.filename): New base class for
file loading tests

1 # Copyright (c) 2002, 2003 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with Thuban for details.
7
8 """
9 Support classes and function for the test suite
10 """
11
12 __version__ = "$Revision$"
13 # $Source$
14 # $Id$
15
16 import os, sys
17 import unittest
18
19 def thuban_dir():
20 """Return the directory containing the Thuban package"""
21 thisdir = os.path.dirname(__file__)
22 return os.path.join(thisdir, os.pardir)
23
24
25 def add_thuban_dir_to_path():
26 """Insert the Thuban directory at the beginning of the python path.
27
28 If it's already part of the path, remove later occurrences.
29 """
30 dir = thuban_dir()
31 while 1:
32 try:
33 sys.path.remove(dir)
34 except ValueError:
35 break
36 sys.path.insert(0, dir)
37
38
39 _initthuban_done = 0
40 def initthuban():
41 """Initialize the interpreter for using Thuban modules
42 """
43 global _initthuban_done
44 if not _initthuban_done:
45 add_thuban_dir_to_path()
46 import thubaninit
47 _initthuban_done = 1
48
49 def run_tests():
50 """Frontend for unittest.main that prints some additional debug information
51
52 After calling unittest.main, run the garbage collector and print
53 uncollected objects. Also print any un-unsubscribed messages.
54 """
55 try:
56 unittest.main()
57 finally:
58 # This has to be in a finally clause because unittest.main()
59 # ends with a sys.exit to make sure that the process exits with
60 # an appropriate exit code
61 print_garbage_information()
62
63 def print_garbage_information():
64 """Print information about things that haven't been cleaned up.
65
66 Run the garbage collector and print uncollected objects. Also print
67 any un-unsubscribed messages.
68 """
69 import gc, Thuban.Lib.connector
70 gc.collect()
71 if gc.garbage:
72 print
73 print "There are %d uncollected objects:" % len(gc.garbage)
74 print gc.garbage
75 Thuban.Lib.connector._the_connector.print_connections()
76
77
78 def create_temp_dir():
79 """Create a temporary directory and return its name.
80
81 The temporary directory is always called temp and is created in the
82 directory where support module is located.
83
84 If the temp directory already exists, just return the name.
85 """
86 name = os.path.abspath(os.path.join(os.path.dirname(__file__), "temp"))
87
88 # if the directory already exists, we're done
89 if os.path.isdir(name):
90 return name
91
92 # create the directory
93 os.mkdir(name)
94 return name
95
96
97 class FileTestMixin:
98
99 """Mixin class for tests that use files in the temporary directory
100 """
101
102 def temp_file_name(self, basename):
103 """Return the full name of the file named basename in the temp. dir"""
104 return os.path.join(create_temp_dir(), basename)
105
106 def temp_dir(self):
107 """Return the name of the directory for the temporary files"""
108 return create_temp_dir()
109
110
111
112 class FileLoadTestCase(unittest.TestCase, FileTestMixin):
113
114 """Base class for test case that test loading files.
115
116 This base class provides some common infrastructure for testing the
117 reading of files.
118
119 Each test case should be its own class derived from this one. There
120 is one file associated with each class. The contents are defined by
121 the file_contents class attribute and its name by the filename
122 method.
123
124 Derived classes usually only have to provide appropriate values for
125 the file_contents and file_extension class attributes.
126 """
127
128 file_contents = None
129 file_extension = ""
130
131 def filename(self):
132 """Return the name of the test file to use.
133
134 The default implementation simply calls self.volatile_file_name
135 with a basename derived from the class name by stripping off a
136 leading 'test_' and appending self.file_extension.
137 """
138 name = self.__class__.__name__
139 if name.startswith("test_"):
140 name = name[5:]
141 return self.temp_file_name(name + self.file_extension)
142
143 def setUp(self):
144 """Create the volatile file for the test.
145
146 Write self.contents (which should be a string) to the file named
147 by self.filename().
148 """
149 filename = self.filename()
150 file = open(filename, "w")
151 file.write(self.file_contents)
152 file.close()
153
154
155 class FloatComparisonMixin:
156
157 """
158 Mixin class for tests comparing floating point numbers.
159
160 This class provides a few methods for testing floating point
161 operations.
162 """
163
164 fp_epsilon = 1e-6
165
166 def assertFloatEqual(self, test, value):
167 """Assert equality of test and value with some tolerance.
168
169 Assert that the absolute difference between test and value is
170 less than self.fp_epsilon.
171 """
172 self.assert_(self.fp_epsilon > abs(test - value),
173 "abs(%g - %g) >= %g" % (test, value, self.fp_epsilon))
174
175 def assertFloatSeqEqual(self, test, value, epsilon = None):
176 """Assert equality of the sequences test and value with some tolerance.
177
178 Assert that the absolute difference between each corresponding
179 value in test and value is less than the optional parameter
180 epsilon. If epsilon is not given use self.fp_epsilon.
181 """
182 if epsilon is None:
183 epsilon = self.fp_epsilon
184 for i in range(len(test)):
185 self.assert_(epsilon > abs(test[i] - value[i]),
186 "abs(%g - %g) >= %g" % (test[i], value[i], epsilon))
187
188
189 class SubscriberMixin:
190
191 """Mixin class for tests for messages sent through the Connector
192
193 The SubscriberMixin has some methods that can be used as subscribers
194 of events that when called append information about the message into
195 a list of messages received.
196
197 A derived class should call the clear_messages() method in both its
198 setUp and tearDown methods to clear the list of messages received.
199 """
200
201 def clear_messages(self):
202 """Clear the list of received messages.
203
204 Call this at least in the tests setUp and tearDown methods. It's
205 important to do it in tearDown too because otherwise there may
206 be cyclic references.
207 """
208 self.received_messages = []
209
210 def subscribe_no_params(self):
211 """Method for subscriptions without parameters.
212
213 Add an empty tuple to the list of received messages.
214 """
215 self.received_messages.append(())
216
217 def subscribe_with_params(self, *args):
218 """Method for subscriptions with parameters.
219
220 Append the tuple will all arguments to this function (except for
221 the self argument) to the list of received messages.
222 """
223 self.received_messages.append(args)
224
225 def check_messages(self, messages):
226 """Check whether the messages received match the list messages"""
227 self.assertEquals(messages, self.received_messages)
228
229 class FloatTestCase(unittest.TestCase):
230 """TestCase with methods for testing floating point values"""
231
232 fp_epsilon = 1e-6
233 fp_inf = float('1e1000') # FIXME: hack for infinite
234
235 def assertFloatEqual(self, first, second, msg=None):
236 """Fail if one float is greater than the other + fp_epsilon"""
237 if abs(first) == self.fp_inf:
238 self.assertEqual(first, second, msg)
239 else:
240 self.assert_(self.fp_epsilon > abs(first - second), msg)
241

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26