|
0
|
1 |
import unittest |
|
|
2 |
|
|
|
3 |
from django.forms import ValidationError |
|
|
4 |
from django.contrib.gis import forms |
|
|
5 |
from django.contrib.gis.geos import GEOSGeometry |
|
|
6 |
|
|
|
7 |
class GeometryFieldTest(unittest.TestCase): |
|
|
8 |
|
|
|
9 |
def test00_init(self): |
|
|
10 |
"Testing GeometryField initialization with defaults." |
|
|
11 |
fld = forms.GeometryField() |
|
|
12 |
for bad_default in ('blah', 3, 'FoO', None, 0): |
|
|
13 |
self.assertRaises(ValidationError, fld.clean, bad_default) |
|
|
14 |
|
|
|
15 |
def test01_srid(self): |
|
|
16 |
"Testing GeometryField with a SRID set." |
|
|
17 |
# Input that doesn't specify the SRID is assumed to be in the SRID |
|
|
18 |
# of the input field. |
|
|
19 |
fld = forms.GeometryField(srid=4326) |
|
|
20 |
geom = fld.clean('POINT(5 23)') |
|
|
21 |
self.assertEqual(4326, geom.srid) |
|
|
22 |
# Making the field in a different SRID from that of the geometry, and |
|
|
23 |
# asserting it transforms. |
|
|
24 |
fld = forms.GeometryField(srid=32140) |
|
|
25 |
tol = 0.0000001 |
|
|
26 |
xform_geom = GEOSGeometry('POINT (951640.547328465 4219369.26171664)', srid=32140) |
|
|
27 |
# The cleaned geometry should be transformed to 32140. |
|
|
28 |
cleaned_geom = fld.clean('SRID=4326;POINT (-95.363151 29.763374)') |
|
|
29 |
self.failUnless(xform_geom.equals_exact(cleaned_geom, tol)) |
|
|
30 |
|
|
|
31 |
def test02_null(self): |
|
|
32 |
"Testing GeometryField's handling of null (None) geometries." |
|
|
33 |
# Form fields, by default, are required (`required=True`) |
|
|
34 |
fld = forms.GeometryField() |
|
|
35 |
self.assertRaises(forms.ValidationError, fld.clean, None) |
|
|
36 |
|
|
|
37 |
# Still not allowed if `null=False`. |
|
|
38 |
fld = forms.GeometryField(required=False, null=False) |
|
|
39 |
self.assertRaises(forms.ValidationError, fld.clean, None) |
|
|
40 |
|
|
|
41 |
# This will clean None as a geometry (See #10660). |
|
|
42 |
fld = forms.GeometryField(required=False) |
|
|
43 |
self.assertEqual(None, fld.clean(None)) |
|
|
44 |
|
|
|
45 |
def test03_geom_type(self): |
|
|
46 |
"Testing GeometryField's handling of different geometry types." |
|
|
47 |
# By default, all geometry types are allowed. |
|
|
48 |
fld = forms.GeometryField() |
|
|
49 |
for wkt in ('POINT(5 23)', 'MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))', 'LINESTRING(0 0, 1 1)'): |
|
|
50 |
self.assertEqual(GEOSGeometry(wkt), fld.clean(wkt)) |
|
|
51 |
|
|
|
52 |
pnt_fld = forms.GeometryField(geom_type='POINT') |
|
|
53 |
self.assertEqual(GEOSGeometry('POINT(5 23)'), pnt_fld.clean('POINT(5 23)')) |
|
|
54 |
self.assertRaises(forms.ValidationError, pnt_fld.clean, 'LINESTRING(0 0, 1 1)') |
|
|
55 |
|
|
|
56 |
def suite(): |
|
|
57 |
s = unittest.TestSuite() |
|
|
58 |
s.addTest(unittest.makeSuite(GeometryFieldTest)) |
|
|
59 |
return s |
|
|
60 |
|
|
|
61 |
def run(verbosity=2): |
|
|
62 |
unittest.TextTestRunner(verbosity=verbosity).run(suite()) |
|
|
63 |
|
|
|
64 |
if __name__=="__main__": |
|
|
65 |
run() |