Sfoglia il codice sorgente

Test reading from memory maps

Johannes Hofmann 8 anni fa
parent
commit
b4a8c53d1b
2 ha cambiato i file con 67 aggiunte e 1 eliminazioni
  1. 10
    1
      src/mmap_blob.rs
  2. 57
    0
      tests/read.rs

+ 10
- 1
src/mmap_blob.rs Vedi File

@@ -4,7 +4,7 @@ extern crate protobuf;
4 4
 extern crate byteorder;
5 5
 extern crate memmap;
6 6
 
7
-use blob::{BlobDecode, decode_blob};
7
+use blob::{BlobDecode, BlobType, decode_blob};
8 8
 use byteorder::ByteOrder;
9 9
 use errors::*;
10 10
 use block::{HeaderBlock, PrimitiveBlock};
@@ -98,6 +98,15 @@ impl<'a> MmapBlob<'a> {
98 98
             x => Ok(BlobDecode::Unknown(x)),
99 99
         }
100 100
     }
101
+
102
+    /// Returns the type of a blob without decoding its content.
103
+    pub fn get_type(&self) -> BlobType {
104
+        match self.header.get_field_type() {
105
+            "OSMHeader" => BlobType::OsmHeader,
106
+            "OSMData" => BlobType::OsmData,
107
+            x => BlobType::Unknown(x),
108
+        }
109
+    }
101 110
 }
102 111
 
103 112
 /// A reader for memory mapped PBF files that allows iterating over `MmapBlob`s.

+ 57
- 0
tests/read.rs Vedi File

@@ -62,3 +62,60 @@ fn read() {
62 62
         }
63 63
     }
64 64
 }
65
+
66
+#[test]
67
+fn mmap_read() {
68
+    let mmap = unsafe { Mmap::from_path(TEST_FILE_PATH).unwrap() };
69
+    let reader = MmapBlobReader::new(&mmap);
70
+
71
+    let blobs = reader.collect::<Result<Vec<_>>>().unwrap();
72
+
73
+    assert_eq!(blobs.len(), 2);
74
+
75
+    assert_eq!(blobs[0].get_type(), BlobType::OsmHeader);
76
+    assert_eq!(blobs[1].get_type(), BlobType::OsmData);
77
+
78
+    if let BlobDecode::OsmHeader(header) = blobs[0].decode().unwrap() {
79
+        assert!(header.required_features().contains(&String::from("OsmSchema-V0.6")));
80
+        assert!(header.required_features().contains(&String::from("DenseNodes")));
81
+    } else {
82
+        panic!("Unexpected blob type");
83
+    }
84
+
85
+    if let BlobDecode::OsmData(primitive_block) = blobs[1].decode().unwrap() {
86
+        let nodes = primitive_block.groups().flat_map(|g| g.nodes()).count();
87
+        assert_eq!(nodes, 0);
88
+
89
+        {
90
+            let dense_nodes: Vec<_> = primitive_block.groups().flat_map(|g| g.dense_nodes()).collect();
91
+            assert_eq!(dense_nodes.len(), 3);
92
+
93
+            assert!(approx_eq(dense_nodes[1].lat(), 52.11992359584));
94
+            assert!(approx_eq(dense_nodes[1].lon(), 11.62564468943));
95
+
96
+            assert!(approx_eq(dense_nodes[2].lat(), 52.11989910567));
97
+            assert!(approx_eq(dense_nodes[2].lon(), 11.63101926915));
98
+
99
+            assert_eq!(dense_nodes[0].id, 105);
100
+            assert_eq!(dense_nodes[1].id, 106);
101
+            assert_eq!(dense_nodes[2].id, 108);
102
+
103
+            assert_eq!(dense_nodes[0].uid, 17);
104
+            assert_eq!(dense_nodes[1].uid, 17);
105
+            assert_eq!(dense_nodes[2].uid, 17);
106
+        }
107
+
108
+        {
109
+            let ways: Vec<_> = primitive_block.groups().flat_map(|g| g.ways()).collect();
110
+            assert_eq!(ways.len(), 1);
111
+
112
+            let way_tags = ways[0].tags().collect::<Vec<_>>();
113
+            assert_eq!(way_tags.len(), 2);
114
+
115
+            assert!(way_tags.contains(&("building", "yes")));
116
+            assert!(way_tags.contains(&("name", "triangle")));
117
+        }
118
+    } else {
119
+        panic!("Unexpected blob type");
120
+    }
121
+}