123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- """
- Distance and Area objects to allow for sensible and convenient calculation
- and conversions. Here are some tests.
- """
- import unittest
- from django.contrib.gis.measure import A, D, Area, Distance
- class DistanceTest(unittest.TestCase):
- "Testing the Distance object"
- def testInit(self):
- "Testing initialization from valid units"
- d = Distance(m=100)
- self.assertEqual(d.m, 100)
- d1, d2, d3 = D(m=100), D(meter=100), D(metre=100)
- for d in (d1, d2, d3):
- self.assertEqual(d.m, 100)
- d = D(nm=100)
- self.assertEqual(d.m, 185200)
- y1, y2, y3 = D(yd=100), D(yard=100), D(Yard=100)
- for d in (y1, y2, y3):
- self.assertEqual(d.yd, 100)
- mm1, mm2 = D(millimeter=1000), D(MiLLiMeTeR=1000)
- for d in (mm1, mm2):
- self.assertEqual(d.m, 1.0)
- self.assertEqual(d.mm, 1000.0)
- def testInitInvalid(self):
- "Testing initialization from invalid units"
- self.assertRaises(AttributeError, D, banana=100)
- def testAccess(self):
- "Testing access in different units"
- d = D(m=100)
- self.assertEqual(d.km, 0.1)
- self.assertAlmostEqual(d.ft, 328.084, 3)
- def testAccessInvalid(self):
- "Testing access in invalid units"
- d = D(m=100)
- self.assertFalse(hasattr(d, 'banana'))
- def testAddition(self):
- "Test addition & subtraction"
- d1 = D(m=100)
- d2 = D(m=200)
- d3 = d1 + d2
- self.assertEqual(d3.m, 300)
- d3 += d1
- self.assertEqual(d3.m, 400)
- d4 = d1 - d2
- self.assertEqual(d4.m, -100)
- d4 -= d1
- self.assertEqual(d4.m, -200)
- with self.assertRaises(TypeError):
- d1 + 1
- with self.assertRaises(TypeError):
- d1 - 1
- with self.assertRaises(TypeError):
- d1 += 1
- with self.assertRaises(TypeError):
- d1 -= 1
- def testMultiplication(self):
- "Test multiplication & division"
- d1 = D(m=100)
- d3 = d1 * 2
- self.assertEqual(d3.m, 200)
- d3 = 2 * d1
- self.assertEqual(d3.m, 200)
- d3 *= 5
- self.assertEqual(d3.m, 1000)
- d4 = d1 / 2
- self.assertEqual(d4.m, 50)
- d4 /= 5
- self.assertEqual(d4.m, 10)
- d5 = d1 / D(m=2)
- self.assertEqual(d5, 50)
- a5 = d1 * D(m=10)
- self.assertIsInstance(a5, Area)
- self.assertEqual(a5.sq_m, 100 * 10)
- with self.assertRaises(TypeError):
- d1 *= D(m=1)
- with self.assertRaises(TypeError):
- d1 /= D(m=1)
- def testUnitConversions(self):
- "Testing default units during maths"
- d1 = D(m=100)
- d2 = D(km=1)
- d3 = d1 + d2
- self.assertEqual(d3._default_unit, 'm')
- d4 = d2 + d1
- self.assertEqual(d4._default_unit, 'km')
- d5 = d1 * 2
- self.assertEqual(d5._default_unit, 'm')
- d6 = d1 / 2
- self.assertEqual(d6._default_unit, 'm')
- def testComparisons(self):
- "Testing comparisons"
- d1 = D(m=100)
- d2 = D(km=1)
- d3 = D(km=0)
- self.assertGreater(d2, d1)
- self.assertEqual(d1, d1)
- self.assertLess(d1, d2)
- self.assertFalse(d3)
- def testUnitsStr(self):
- "Testing conversion to strings"
- d1 = D(m=100)
- d2 = D(km=3.5)
- self.assertEqual(str(d1), '100.0 m')
- self.assertEqual(str(d2), '3.5 km')
- self.assertEqual(repr(d1), 'Distance(m=100.0)')
- self.assertEqual(repr(d2), 'Distance(km=3.5)')
- def testUnitAttName(self):
- "Testing the `unit_attname` class method"
- unit_tuple = [('Yard', 'yd'), ('Nautical Mile', 'nm'), ('German legal metre', 'german_m'),
- ('Indian yard', 'indian_yd'), ('Chain (Sears)', 'chain_sears'), ('Chain', 'chain')]
- for nm, att in unit_tuple:
- self.assertEqual(att, D.unit_attname(nm))
- class AreaTest(unittest.TestCase):
- "Testing the Area object"
- def testInit(self):
- "Testing initialization from valid units"
- a = Area(sq_m=100)
- self.assertEqual(a.sq_m, 100)
- a = A(sq_m=100)
- self.assertEqual(a.sq_m, 100)
- a = A(sq_mi=100)
- self.assertEqual(a.sq_m, 258998811.0336)
- def testInitInvaliA(self):
- "Testing initialization from invalid units"
- self.assertRaises(AttributeError, A, banana=100)
- def testAccess(self):
- "Testing access in different units"
- a = A(sq_m=100)
- self.assertEqual(a.sq_km, 0.0001)
- self.assertAlmostEqual(a.sq_ft, 1076.391, 3)
- def testAccessInvaliA(self):
- "Testing access in invalid units"
- a = A(sq_m=100)
- self.assertFalse(hasattr(a, 'banana'))
- def testAddition(self):
- "Test addition & subtraction"
- a1 = A(sq_m=100)
- a2 = A(sq_m=200)
- a3 = a1 + a2
- self.assertEqual(a3.sq_m, 300)
- a3 += a1
- self.assertEqual(a3.sq_m, 400)
- a4 = a1 - a2
- self.assertEqual(a4.sq_m, -100)
- a4 -= a1
- self.assertEqual(a4.sq_m, -200)
- with self.assertRaises(TypeError):
- a1 + 1
- with self.assertRaises(TypeError):
- a1 - 1
- with self.assertRaises(TypeError):
- a1 += 1
- with self.assertRaises(TypeError):
- a1 -= 1
- def testMultiplication(self):
- "Test multiplication & division"
- a1 = A(sq_m=100)
- a3 = a1 * 2
- self.assertEqual(a3.sq_m, 200)
- a3 = 2 * a1
- self.assertEqual(a3.sq_m, 200)
- a3 *= 5
- self.assertEqual(a3.sq_m, 1000)
- a4 = a1 / 2
- self.assertEqual(a4.sq_m, 50)
- a4 /= 5
- self.assertEqual(a4.sq_m, 10)
- with self.assertRaises(TypeError):
- a1 * A(sq_m=1)
- with self.assertRaises(TypeError):
- a1 *= A(sq_m=1)
- with self.assertRaises(TypeError):
- a1 / A(sq_m=1)
- with self.assertRaises(TypeError):
- a1 /= A(sq_m=1)
- def testUnitConversions(self):
- "Testing default units during maths"
- a1 = A(sq_m=100)
- a2 = A(sq_km=1)
- a3 = a1 + a2
- self.assertEqual(a3._default_unit, 'sq_m')
- a4 = a2 + a1
- self.assertEqual(a4._default_unit, 'sq_km')
- a5 = a1 * 2
- self.assertEqual(a5._default_unit, 'sq_m')
- a6 = a1 / 2
- self.assertEqual(a6._default_unit, 'sq_m')
- def testComparisons(self):
- "Testing comparisons"
- a1 = A(sq_m=100)
- a2 = A(sq_km=1)
- a3 = A(sq_km=0)
- self.assertGreater(a2, a1)
- self.assertEqual(a1, a1)
- self.assertLess(a1, a2)
- self.assertFalse(a3)
- def testUnitsStr(self):
- "Testing conversion to strings"
- a1 = A(sq_m=100)
- a2 = A(sq_km=3.5)
- self.assertEqual(str(a1), '100.0 sq_m')
- self.assertEqual(str(a2), '3.5 sq_km')
- self.assertEqual(repr(a1), 'Area(sq_m=100.0)')
- self.assertEqual(repr(a2), 'Area(sq_km=3.5)')
- def suite():
- s = unittest.TestSuite()
- s.addTest(unittest.makeSuite(DistanceTest))
- s.addTest(unittest.makeSuite(AreaTest))
- return s
- def run(verbosity=2):
- unittest.TextTestRunner(verbosity=verbosity).run(suite())
- if __name__ == "__main__":
- run()
|