66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
|
import unittest
|
||
|
|
||
|
from django.forms import ValidationError
|
||
|
from django.contrib.gis import forms
|
||
|
from django.contrib.gis.geos import GEOSGeometry
|
||
|
|
||
|
class GeometryFieldTest(unittest.TestCase):
|
||
|
|
||
|
def test00_init(self):
|
||
|
"Testing GeometryField initialization with defaults."
|
||
|
fld = forms.GeometryField()
|
||
|
for bad_default in ('blah', 3, 'FoO', None, 0):
|
||
|
self.assertRaises(ValidationError, fld.clean, bad_default)
|
||
|
|
||
|
def test01_srid(self):
|
||
|
"Testing GeometryField with a SRID set."
|
||
|
# Input that doesn't specify the SRID is assumed to be in the SRID
|
||
|
# of the input field.
|
||
|
fld = forms.GeometryField(srid=4326)
|
||
|
geom = fld.clean('POINT(5 23)')
|
||
|
self.assertEqual(4326, geom.srid)
|
||
|
# Making the field in a different SRID from that of the geometry, and
|
||
|
# asserting it transforms.
|
||
|
fld = forms.GeometryField(srid=32140)
|
||
|
tol = 0.0000001
|
||
|
xform_geom = GEOSGeometry('POINT (951640.547328465 4219369.26171664)', srid=32140)
|
||
|
# The cleaned geometry should be transformed to 32140.
|
||
|
cleaned_geom = fld.clean('SRID=4326;POINT (-95.363151 29.763374)')
|
||
|
self.failUnless(xform_geom.equals_exact(cleaned_geom, tol))
|
||
|
|
||
|
def test02_null(self):
|
||
|
"Testing GeometryField's handling of null (None) geometries."
|
||
|
# Form fields, by default, are required (`required=True`)
|
||
|
fld = forms.GeometryField()
|
||
|
self.assertRaises(forms.ValidationError, fld.clean, None)
|
||
|
|
||
|
# Still not allowed if `null=False`.
|
||
|
fld = forms.GeometryField(required=False, null=False)
|
||
|
self.assertRaises(forms.ValidationError, fld.clean, None)
|
||
|
|
||
|
# This will clean None as a geometry (See #10660).
|
||
|
fld = forms.GeometryField(required=False)
|
||
|
self.assertEqual(None, fld.clean(None))
|
||
|
|
||
|
def test03_geom_type(self):
|
||
|
"Testing GeometryField's handling of different geometry types."
|
||
|
# By default, all geometry types are allowed.
|
||
|
fld = forms.GeometryField()
|
||
|
for wkt in ('POINT(5 23)', 'MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))', 'LINESTRING(0 0, 1 1)'):
|
||
|
self.assertEqual(GEOSGeometry(wkt), fld.clean(wkt))
|
||
|
|
||
|
pnt_fld = forms.GeometryField(geom_type='POINT')
|
||
|
self.assertEqual(GEOSGeometry('POINT(5 23)'), pnt_fld.clean('POINT(5 23)'))
|
||
|
self.assertRaises(forms.ValidationError, pnt_fld.clean, 'LINESTRING(0 0, 1 1)')
|
||
|
|
||
|
def suite():
|
||
|
s = unittest.TestSuite()
|
||
|
s.addTest(unittest.makeSuite(GeometryFieldTest))
|
||
|
return s
|
||
|
|
||
|
def run(verbosity=2):
|
||
|
unittest.TextTestRunner(verbosity=verbosity).run(suite())
|
||
|
|
||
|
if __name__=="__main__":
|
||
|
run()
|