2 Distance and Area objects to allow for sensible and convienient calculation
3 and conversions. Here are some tests.
6 from django
.contrib
.gis
.measure
import Distance
, Area
, D
, A
7 from django
.utils
import unittest
10 class DistanceTest(unittest
.TestCase
):
11 "Testing the Distance object"
14 "Testing initialisation from valid units"
16 self
.assertEqual(d
.m
, 100)
18 d1
, d2
, d3
= D(m
=100), D(meter
=100), D(metre
=100)
19 for d
in (d1
, d2
, d3
):
20 self
.assertEqual(d
.m
, 100)
23 self
.assertEqual(d
.m
, 185200)
25 y1
, y2
, y3
= D(yd
=100), D(yard
=100), D(Yard
=100)
26 for d
in (y1
, y2
, y3
):
27 self
.assertEqual(d
.yd
, 100)
29 mm1
, mm2
= D(millimeter
=1000), D(MiLLiMeTeR
=1000)
31 self
.assertEqual(d
.m
, 1.0)
32 self
.assertEqual(d
.mm
, 1000.0)
35 def testInitInvalid(self
):
36 "Testing initialisation from invalid units"
37 self
.assertRaises(AttributeError, D
, banana
=100)
40 "Testing access in different units"
42 self
.assertEqual(d
.km
, 0.1)
43 self
.assertAlmostEqual(d
.ft
, 328.084, 3)
45 def testAccessInvalid(self
):
46 "Testing access in invalid units"
48 self
.failIf(hasattr(d
, 'banana'))
50 def testAddition(self
):
51 "Test addition & subtraction"
56 self
.assertEqual(d3
.m
, 300)
58 self
.assertEqual(d3
.m
, 400)
61 self
.assertEqual(d4
.m
, -100)
63 self
.assertEqual(d4
.m
, -200)
70 self
.fail('Distance + number should raise TypeError')
77 self
.fail('Distance - number should raise TypeError')
84 self
.fail('Distance += number should raise TypeError')
91 self
.fail('Distance -= number should raise TypeError')
93 def testMultiplication(self
):
94 "Test multiplication & division"
98 self
.assertEqual(d3
.m
, 200)
100 self
.assertEqual(d3
.m
, 200)
102 self
.assertEqual(d3
.m
, 1000)
105 self
.assertEqual(d4
.m
, 50)
107 self
.assertEqual(d4
.m
, 10)
110 self
.assertTrue(isinstance(a5
, Area
))
111 self
.assertEqual(a5
.sq_m
, 100*10)
118 self
.fail('Distance *= Distance should raise TypeError')
125 self
.fail('Distance / Distance should raise TypeError')
132 self
.fail('Distance /= Distance should raise TypeError')
134 def testUnitConversions(self
):
135 "Testing default units during maths"
140 self
.assertEqual(d3
._default_unit
, 'm')
142 self
.assertEqual(d4
._default_unit
, 'km')
144 self
.assertEqual(d5
._default_unit
, 'm')
146 self
.assertEqual(d6
._default_unit
, 'm')
148 def testComparisons(self
):
149 "Testing comparisons"
154 self
.assertTrue(d2
> d1
)
155 self
.assertTrue(d1
== d1
)
156 self
.assertTrue(d1
< d2
)
159 def testUnitsStr(self
):
160 "Testing conversion to strings"
164 self
.assertEqual(str(d1
), '100.0 m')
165 self
.assertEqual(str(d2
), '3.5 km')
166 self
.assertEqual(repr(d1
), 'Distance(m=100.0)')
167 self
.assertEqual(repr(d2
), 'Distance(km=3.5)')
169 def testUnitAttName(self
):
170 "Testing the `unit_attname` class method"
171 unit_tuple
= [('Yard', 'yd'), ('Nautical Mile', 'nm'), ('German legal metre', 'german_m'),
172 ('Indian yard', 'indian_yd'), ('Chain (Sears)', 'chain_sears'), ('Chain', 'chain')]
173 for nm
, att
in unit_tuple
:
174 self
.assertEqual(att
, D
.unit_attname(nm
))
176 class AreaTest(unittest
.TestCase
):
177 "Testing the Area object"
180 "Testing initialisation from valid units"
182 self
.assertEqual(a
.sq_m
, 100)
185 self
.assertEqual(a
.sq_m
, 100)
188 self
.assertEqual(a
.sq_m
, 258998811.0336)
190 def testInitInvaliA(self
):
191 "Testing initialisation from invalid units"
192 self
.assertRaises(AttributeError, A
, banana
=100)
194 def testAccess(self
):
195 "Testing access in different units"
197 self
.assertEqual(a
.sq_km
, 0.0001)
198 self
.assertAlmostEqual(a
.sq_ft
, 1076.391, 3)
200 def testAccessInvaliA(self
):
201 "Testing access in invalid units"
203 self
.failIf(hasattr(a
, 'banana'))
205 def testAddition(self
):
206 "Test addition & subtraction"
211 self
.assertEqual(a3
.sq_m
, 300)
213 self
.assertEqual(a3
.sq_m
, 400)
216 self
.assertEqual(a4
.sq_m
, -100)
218 self
.assertEqual(a4
.sq_m
, -200)
225 self
.fail('Area + number should raise TypeError')
232 self
.fail('Area - number should raise TypeError')
239 self
.fail('Area += number should raise TypeError')
246 self
.fail('Area -= number should raise TypeError')
248 def testMultiplication(self
):
249 "Test multiplication & division"
253 self
.assertEqual(a3
.sq_m
, 200)
255 self
.assertEqual(a3
.sq_m
, 200)
257 self
.assertEqual(a3
.sq_m
, 1000)
260 self
.assertEqual(a4
.sq_m
, 50)
262 self
.assertEqual(a4
.sq_m
, 10)
269 self
.fail('Area * Area should raise TypeError')
276 self
.fail('Area *= Area should raise TypeError')
283 self
.fail('Area / Area should raise TypeError')
290 self
.fail('Area /= Area should raise TypeError')
292 def testUnitConversions(self
):
293 "Testing default units during maths"
298 self
.assertEqual(a3
._default_unit
, 'sq_m')
300 self
.assertEqual(a4
._default_unit
, 'sq_km')
302 self
.assertEqual(a5
._default_unit
, 'sq_m')
304 self
.assertEqual(a6
._default_unit
, 'sq_m')
306 def testComparisons(self
):
307 "Testing comparisons"
312 self
.assertTrue(a2
> a1
)
313 self
.assertTrue(a1
== a1
)
314 self
.assertTrue(a1
< a2
)
317 def testUnitsStr(self
):
318 "Testing conversion to strings"
322 self
.assertEqual(str(a1
), '100.0 sq_m')
323 self
.assertEqual(str(a2
), '3.5 sq_km')
324 self
.assertEqual(repr(a1
), 'Area(sq_m=100.0)')
325 self
.assertEqual(repr(a2
), 'Area(sq_km=3.5)')
328 s
= unittest
.TestSuite()
329 s
.addTest(unittest
.makeSuite(DistanceTest
))
330 s
.addTest(unittest
.makeSuite(AreaTest
))
333 def run(verbosity
=2):
334 unittest
.TextTestRunner(verbosity
=verbosity
).run(suite())
336 if __name__
=="__main__":