Skip to content

Commit 3ebabb4

Browse files
committed
Add tests for insert Geometry/GeometryCollection
1 parent 790bdc7 commit 3ebabb4

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

src/ewkb.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,19 +1136,20 @@ impl<'a, P, PI, MP, L, LI, ML, Y, YI, MY, G, GI, GC> EwkbWrite for EwkbGeometryC
11361136

11371137
fn write_ewkb_body<W: Write+?Sized>(&self, w: &mut W) -> Result<(), Error> {
11381138
w.write_u32::<LittleEndian>(self.geom.geometries().len() as u32)?;
1139+
11391140
for geom in self.geom.geometries() {
11401141
match geom.as_type() {
11411142
postgis::GeometryType::Point(geom) => {
11421143
let wkb = EwkbPoint { geom: geom, srid: None, point_type: self.point_type.clone() };
1143-
wkb.write_ewkb_body(w)?;
1144+
wkb.write_ewkb(w)?;
11441145
},
11451146
postgis::GeometryType::LineString(geom) => {
11461147
let wkb = EwkbLineString { geom: geom, srid: None, point_type: self.point_type.clone() };
1147-
wkb.write_ewkb_body(w)?;
1148+
wkb.write_ewkb(w)?;
11481149
},
11491150
postgis::GeometryType::Polygon(geom) => {
11501151
let wkb = EwkbPolygon { geom: geom, srid: None, point_type: self.point_type.clone() };
1151-
wkb.write_ewkb_body(w)?;
1152+
wkb.write_ewkb(w)?;
11521153
},
11531154
postgis::GeometryType::MultiPoint(geom) => {
11541155
let wkb = EwkbMultiPoint { geom: geom, srid: None, point_type: self.point_type.clone() };
@@ -1164,7 +1165,7 @@ impl<'a, P, PI, MP, L, LI, ML, Y, YI, MY, G, GI, GC> EwkbWrite for EwkbGeometryC
11641165
},
11651166
postgis::GeometryType::GeometryCollection(geom) => {
11661167
let wkb = EwkbGeometryCollection { geom: geom, srid: None, point_type: self.point_type.clone() };
1167-
wkb.write_ewkb_body(w)?;
1168+
wkb.write_ewkb(w)?;
11681169
},
11691170
}
11701171
}

src/postgis.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ mod tests {
405405

406406
#[test]
407407
#[ignore]
408-
fn test_insert_multipoylgon() {
408+
fn test_insert_multipolygon() {
409409
let conn = connect();
410410
or_panic!(conn.execute("CREATE TEMPORARY TABLE geomtests (geom geometry(MultiPolygon))", &[]));
411411
let p = |x, y| ewkb::Point { x: x, y: y, srid: Some(4326) };
@@ -420,6 +420,55 @@ mod tests {
420420
assert!(result.iter().map(|r| r.get::<_, bool>(0)).last().unwrap());
421421
}
422422

423+
#[test]
424+
#[ignore]
425+
fn test_insert_geometry() {
426+
let conn = connect();
427+
or_panic!(conn.execute("CREATE TEMPORARY TABLE geomtests (geom geometry)", &[]));
428+
let p = |x, y| ewkb::Point { x: x, y: y, srid: Some(4326) };
429+
// SELECT 'SRID=4326;MULTIPOLYGON (((0 0, 2 0, 2 2, 0 2, 0 0)), ((10 10, -2 10, -2 -2, 10 -2, 10 10)))'::geometry
430+
let multipoly = {
431+
let line = ewkb::LineString {srid: Some(4326), points: vec![p(0., 0.), p(2., 0.), p(2., 2.), p(0., 2.), p(0., 0.)]};
432+
let poly1 = ewkb::Polygon {srid: Some(4326), rings: vec![line]};
433+
let line = ewkb::LineString {srid: Some(4326), points: vec![p(10., 10.), p(-2., 10.), p(-2., -2.), p(10., -2.), p(10., 10.)]};
434+
let poly2 = ewkb::Polygon {srid: Some(4326), rings: vec![line]};
435+
ewkb::MultiPolygon {srid: Some(4326), polygons: vec![poly1, poly2]}
436+
};
437+
let geometry = ewkb::GeometryT::MultiPolygon(multipoly);
438+
or_panic!(conn.execute("INSERT INTO geomtests (geom) VALUES ($1)", &[&geometry]));
439+
let result = or_panic!(conn.query("SELECT geom=ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON (((0 0, 2 0, 2 2, 0 2, 0 0)), ((10 10, -2 10, -2 -2, 10 -2, 10 10)))') FROM geomtests", &[]));
440+
assert!(result.iter().map(|r| r.get::<_, bool>(0)).last().unwrap());
441+
}
442+
443+
#[test]
444+
#[ignore]
445+
fn test_insert_geometrycollection() {
446+
let conn = connect();
447+
or_panic!(conn.execute("CREATE TEMPORARY TABLE geomtests (geom geometry(GeometryCollection))", &[]));
448+
let p = |x, y| ewkb::Point { x: x, y: y, srid: Some(4326) };
449+
// SELECT 'SRID=4326;LINESTRING (10 -20, -0 -0.5)'
450+
let line = ewkb::LineString {srid: Some(4326), points: vec![p(10.0, -20.0), p(0., -0.5)]};
451+
// SELECT 'SRID=4326;MULTIPOLYGON (((0 0, 2 0, 2 2, 0 2, 0 0)), ((10 10, -2 10, -2 -2, 10 -2, 10 10)))'::geometry
452+
let multipoly = {
453+
let line = ewkb::LineString {srid: Some(4326), points: vec![p(0., 0.), p(2., 0.), p(2., 2.), p(0., 2.), p(0., 0.)]};
454+
let poly1 = ewkb::Polygon {srid: Some(4326), rings: vec![line]};
455+
let line = ewkb::LineString {srid: Some(4326), points: vec![p(10., 10.), p(-2., 10.), p(-2., -2.), p(10., -2.), p(10., 10.)]};
456+
let poly2 = ewkb::Polygon {srid: Some(4326), rings: vec![line]};
457+
ewkb::MultiPolygon {srid: Some(4326), polygons: vec![poly1, poly2]}
458+
};
459+
// SELECT 'SRID=4326;GEOMETRYCOLLECTION (LINESTRING (10 -20,0 -0.5), MULTIPOLYGON (((0 0,2 0,2 2,0 2,0 0)),((10 10,-2 10,-2 -2,10 -2,10 10))))'::geometry
460+
let collection = ewkb::GeometryCollection{
461+
srid: Some(4326),
462+
geometries: vec![
463+
ewkb::GeometryT::LineString(line),
464+
ewkb::GeometryT::MultiPolygon(multipoly),
465+
],
466+
};
467+
or_panic!(conn.execute("INSERT INTO geomtests (geom) VALUES ($1)", &[&collection]));
468+
let result = or_panic!(conn.query("SELECT geom=ST_GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION (LINESTRING (10 -20,0 -0.5), MULTIPOLYGON (((0 0,2 0,2 2,0 2,0 0)),((10 10,-2 10,-2 -2,10 -2,10 10))))') FROM geomtests", &[]));
469+
assert!(result.iter().map(|r| r.get::<_, bool>(0)).last().unwrap());
470+
}
471+
423472
#[test]
424473
#[ignore]
425474
fn test_select_point() {

0 commit comments

Comments
 (0)