1717
1818//! Tests for the WKB extension traits implemented in `wkb_ext`.
1919
20- use geo_traits:: {
21- CoordTrait , GeometryTrait , LineStringTrait , MultiLineStringTrait , MultiPointTrait ,
22- MultiPolygonTrait , PointTrait , PolygonTrait ,
23- } ;
20+ use geo_traits:: GeometryTrait ;
21+ use rstest:: rstest;
2422use sedona_geo_traits_ext:: * ;
2523use std:: str:: FromStr ;
26- use wkb:: reader:: Wkb ;
24+ use wkb:: { reader:: Wkb , Endianness } ;
2725use wkt:: Wkt ;
2826
2927/// Helper to create WKB from WKT string using the wkb writer
3028fn wkb_from_wkt ( wkt_str : & str ) -> Vec < u8 > {
29+ wkb_from_wkt_with_endianness ( wkt_str, wkb:: Endianness :: LittleEndian )
30+ }
31+
32+ /// Helper to create WKB from WKT string using the wkb writer
33+ fn wkb_from_wkt_with_endianness ( wkt_str : & str , endianness : wkb:: Endianness ) -> Vec < u8 > {
3134 let geometry = Wkt :: < f64 > :: from_str ( wkt_str) . unwrap ( ) ;
3235 let mut buf = Vec :: new ( ) ;
33- let options = wkb:: writer:: WriteOptions {
34- endianness : wkb:: Endianness :: LittleEndian ,
35- } ;
36+ let options = wkb:: writer:: WriteOptions { endianness } ;
3637 wkb:: writer:: write_geometry ( & mut buf, & geometry, & options) . unwrap ( ) ;
3738 buf
3839}
3940
40- #[ test]
41- fn test_point_ext ( ) {
42- let buf = wkb_from_wkt ( "POINT(1.5 -2.0)" ) ;
41+ #[ rstest]
42+ fn test_geo_coord (
43+ #[ values( Endianness :: LittleEndian , Endianness :: BigEndian ) ] endianness : Endianness ,
44+ ) {
45+ let buf = wkb_from_wkt_with_endianness ( "POINT (1.0 2.0)" , endianness) ;
46+ let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
47+ let geo_traits:: GeometryType :: Point ( pt) = wkb. as_type ( ) else {
48+ panic ! ( "expected point" )
49+ } ;
50+ let coord = pt. geo_coord ( ) . unwrap ( ) ;
51+ assert_eq ! ( coord. x, 1.0 ) ;
52+ assert_eq ! ( coord. y, 2.0 ) ;
53+
54+ let buf = wkb_from_wkt_with_endianness ( "POINT EMPTY" , endianness) ;
4355 let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
44- let geo_traits:: GeometryType :: Point ( p ) = wkb. as_type ( ) else {
56+ let geo_traits:: GeometryType :: Point ( pt ) = wkb. as_type ( ) else {
4557 panic ! ( "expected point" )
4658 } ;
47- let c = geo_traits:: PointTrait :: coord ( & p) . unwrap ( ) ;
48- assert_eq ! ( c. x( ) , 1.5 ) ;
49- assert_eq ! ( c. y( ) , -2.0 ) ;
50- assert_eq ! ( p. coord_ext( ) . unwrap( ) . geo_coord( ) . x, 1.5 ) ;
59+ let coord = pt. geo_coord ( ) ;
60+ assert ! ( coord. is_none( ) ) ;
5161}
5262
53- #[ test]
54- fn test_linestring_iterators ( ) {
55- let buf = wkb_from_wkt ( "LINESTRING(0 0, 1 1, 2 1.5)" ) ;
63+ #[ rstest]
64+ fn test_linestring_iterators (
65+ #[ values( Endianness :: LittleEndian , Endianness :: BigEndian ) ] endianness : Endianness ,
66+ ) {
67+ let buf = wkb_from_wkt_with_endianness ( "LINESTRING(0 0, 1 1, 2 1.5)" , endianness) ;
5668 let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
57- let geo_traits :: GeometryType :: LineString ( ls) = wkb. as_type ( ) else {
69+ let GeometryTypeExt :: LineString ( ls) = wkb. as_type_ext ( ) else {
5870 panic ! ( "expected linestring" )
5971 } ;
6072
@@ -69,51 +81,15 @@ fn test_linestring_iterators() {
6981 assert_eq ! ( segs. len( ) , coords. len( ) - 1 ) ;
7082 assert_eq ! ( segs[ 0 ] . start. x, 0.0 ) ;
7183 assert_eq ! ( segs[ 0 ] . end. x, 1.0 ) ;
72- }
73-
74- #[ test]
75- fn test_polygon_ext ( ) {
76- let buf = wkb_from_wkt ( "POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))" ) ;
77- let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
78- let geo_traits:: GeometryType :: Polygon ( p) = wkb. as_type ( ) else {
79- panic ! ( "expected polygon" )
80- } ;
81- assert_eq ! ( PolygonTrait :: num_interiors( & p) , 0 ) ;
82- let exterior = PolygonTrait :: exterior ( & p) . unwrap ( ) ;
83- assert_eq ! ( exterior. num_coords( ) , 5 ) ;
84- }
85-
86- #[ test]
87- fn test_multi_geometries ( ) {
88- // MultiPoint
89- let buf = wkb_from_wkt ( "MULTIPOINT(1 1, 2 2)" ) ;
90- let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
91- let geo_traits:: GeometryType :: MultiPoint ( mp) = wkb. as_type ( ) else {
92- panic ! ( "expected multipoint" )
93- } ;
94- assert_eq ! ( MultiPointTrait :: num_points( & mp) , 2 ) ;
95- let p0 = geo_traits:: MultiPointTrait :: point ( & mp, 0 ) . unwrap ( ) ;
96- assert_eq ! ( p0. coord( ) . unwrap( ) . x( ) , 1.0 ) ;
97-
98- // MultiLineString
99- let buf = wkb_from_wkt ( "MULTILINESTRING((0 0, 1 0))" ) ;
100- let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
101- let geo_traits:: GeometryType :: MultiLineString ( mls) = wkb. as_type ( ) else {
102- panic ! ( "expected multilinestring" )
103- } ;
104- assert_eq ! ( MultiLineStringTrait :: num_line_strings( & mls) , 1 ) ;
105- let ls0 = geo_traits:: MultiLineStringTrait :: line_string ( & mls, 0 ) . unwrap ( ) ;
106- assert_eq ! ( LineStringTrait :: num_coords( & ls0) , 2 ) ;
10784
108- // MultiPolygon
109- let buf = wkb_from_wkt ( "MULTIPOLYGON(((0 0, 1 0, 0 0)))" ) ;
85+ // Empty linestring
86+ let buf = wkb_from_wkt_with_endianness ( "LINESTRING EMPTY" , endianness ) ;
11087 let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
111- let geo_traits :: GeometryType :: MultiPolygon ( mp ) = wkb. as_type ( ) else {
112- panic ! ( "expected multipolygon " )
88+ let GeometryTypeExt :: LineString ( ls ) = wkb. as_type_ext ( ) else {
89+ panic ! ( "expected linestring " )
11390 } ;
114- assert_eq ! ( MultiPolygonTrait :: num_polygons( & mp) , 1 ) ;
115- let poly0 = geo_traits:: MultiPolygonTrait :: polygon ( & mp, 0 ) . unwrap ( ) ;
116- assert_eq ! ( PolygonTrait :: exterior( & poly0) . unwrap( ) . num_coords( ) , 3 ) ;
91+ assert_eq ! ( ls. coord_iter( ) . count( ) , 0 ) ;
92+ assert_eq ! ( ls. lines( ) . count( ) , 0 ) ;
11793}
11894
11995#[ test]
@@ -126,46 +102,21 @@ fn test_geometry_collection_ext() {
126102 assert_eq ! ( wkb. num_geometries_ext( ) , 2 ) ;
127103
128104 let child0 = wkb. geometry_ext ( 0 ) . unwrap ( ) ;
129- let geo_traits :: GeometryType :: Point ( _) = child0. as_type ( ) else {
105+ let GeometryTypeExt :: Point ( _) = child0. as_type_ext ( ) else {
130106 panic ! ( "child0 expected point" ) ;
131107 } ;
132108
133109 // Iterate via geometries_ext
134110 let types: Vec < _ > = wkb
135111 . geometries_ext ( )
136- . map ( |g| match g. as_type ( ) {
137- geo_traits :: GeometryType :: Point ( _) => "P" ,
112+ . map ( |g| match g. as_type_ext ( ) {
113+ GeometryTypeExt :: Point ( _) => "P" ,
138114 _ => "?" ,
139115 } )
140116 . collect ( ) ;
141117 assert_eq ! ( types, vec![ "P" , "P" ] ) ;
142118}
143119
144- /// Helper to create big-endian WKB linestring (for testing endianness handling)
145- fn wkb_linestring_be ( coords : & [ ( f64 , f64 ) ] ) -> Vec < u8 > {
146- let mut b = Vec :: new ( ) ;
147- b. push ( 0u8 ) ; // Big endian
148- b. extend_from_slice ( & 2u32 . to_be_bytes ( ) ) ;
149- b. extend_from_slice ( & ( coords. len ( ) as u32 ) . to_be_bytes ( ) ) ;
150- for ( x, y) in coords {
151- b. extend_from_slice ( & x. to_be_bytes ( ) ) ;
152- b. extend_from_slice ( & y. to_be_bytes ( ) ) ;
153- }
154- b
155- }
156-
157- #[ test]
158- fn test_linestring_iter_exact_size ( ) {
159- let buf = wkb_from_wkt ( "LINESTRING(0 0, 1 0, 2 1, 3 1)" ) ;
160- let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
161- let geo_traits:: GeometryType :: LineString ( ls) = wkb. as_type ( ) else {
162- panic ! ( "expected linestring" )
163- } ;
164- let mut iter = ls. lines ( ) ;
165- assert_eq ! ( iter. len( ) , 3 ) ; // ExactSizeIterator::len (4 coords - 1)
166- assert ! ( iter. next( ) . is_some( ) ) ;
167- }
168-
169120#[ test]
170121fn test_linestring_rev_lines ( ) {
171122 // Empty linestring
@@ -277,25 +228,3 @@ fn test_linestring_triangles() {
277228 assert_eq ! ( ls. triangles( ) . count( ) , 0 ) ;
278229 assert_eq ! ( ls. lines( ) . len( ) , 0 ) ;
279230}
280-
281- #[ test]
282- fn test_linestring_big_endian_and_coord_iter ( ) {
283- // Big endian variant to exercise EndianCoordIter and EndianLineIter
284- let coords = & [ ( 1.0 , 1.0 ) , ( 2.0 , 2.0 ) , ( 3.0 , 3.0 ) ] ;
285- let buf = wkb_linestring_be ( coords) ;
286- let wkb = Wkb :: try_new ( & buf) . unwrap ( ) ;
287- let geo_traits:: GeometryType :: LineString ( ls) = wkb. as_type ( ) else {
288- panic ! ( "expected linestring" )
289- } ;
290-
291- let collected: Vec < _ > = ls. coord_iter ( ) . collect ( ) ;
292- assert_eq ! ( collected. len( ) , coords. len( ) ) ;
293- for ( c, ( ex_x, ex_y) ) in collected. iter ( ) . zip ( coords. iter ( ) ) {
294- assert_eq ! ( ( c. x, c. y) , ( * ex_x, * ex_y) ) ;
295- }
296-
297- let segs: Vec < _ > = ls. lines ( ) . collect ( ) ;
298- assert_eq ! ( segs. len( ) , 2 ) ;
299- assert_eq ! ( segs[ 0 ] . start. x, 1.0 ) ;
300- assert_eq ! ( segs[ 1 ] . end. x, 3.0 ) ;
301- }
0 commit comments