@@ -145,7 +145,7 @@ impl<'de> Iterator for NodeSeqIter<'de, '_> {
145145 Some ( Self :: Item {
146146 dtb : self . de . dtb ,
147147 reg : self . de . reg ,
148- body : node_reuslt. start_cursor ,
148+ body : node_reuslt. skip_cursor ,
149149 at : suf_name,
150150 } )
151151 }
@@ -173,3 +173,84 @@ impl<'de> NodeSeqItem<'de> {
173173 . unwrap ( )
174174 }
175175}
176+
177+ #[ cfg( test) ]
178+ mod tests {
179+ use crate :: buildin:: { NodeSeq , Reg } ;
180+ use crate :: { from_raw_mut, Dtb , DtbPtr } ;
181+ use serde_derive:: Deserialize ;
182+
183+ const RAW_DEVICE_TREE : & [ u8 ] = include_bytes ! ( "../../examples/bl808.dtb" ) ;
184+ const BUFFER_SIZE : usize = RAW_DEVICE_TREE . len ( ) ;
185+ const RAW_DEVICE_TREE_QEMU : & [ u8 ] = include_bytes ! ( "../../examples/qemu-virt.dtb" ) ;
186+ const BUFFER_SIZE_QEMU : usize = RAW_DEVICE_TREE_QEMU . len ( ) ;
187+ #[ derive( Deserialize ) ]
188+ pub struct Tree < ' a > {
189+ /// Memory information.
190+ pub memory : NodeSeq < ' a > ,
191+ }
192+ /// Memory range.
193+ #[ derive( Deserialize ) ]
194+ #[ serde( rename_all = "kebab-case" ) ]
195+ pub struct Memory < ' a > {
196+ pub reg : Reg < ' a > ,
197+ }
198+ #[ test]
199+ fn test_nodeseq_without_at ( ) {
200+ #[ repr( align( 8 ) ) ]
201+ struct AlignedBuffer {
202+ pub data : [ u8 ; RAW_DEVICE_TREE . len ( ) ] ,
203+ }
204+ let mut aligned_data: Box < AlignedBuffer > = Box :: new ( AlignedBuffer {
205+ data : [ 0 ; BUFFER_SIZE ] ,
206+ } ) ;
207+ aligned_data. data [ ..BUFFER_SIZE ] . clone_from_slice ( RAW_DEVICE_TREE ) ;
208+ let mut slice = aligned_data. data . to_vec ( ) ;
209+ let ptr = DtbPtr :: from_raw ( slice. as_mut_ptr ( ) ) . unwrap ( ) ;
210+ let dtb = Dtb :: from ( ptr) . share ( ) ;
211+
212+ let t: Tree = from_raw_mut ( & dtb) . unwrap ( ) ;
213+ assert_eq ! ( t. memory. len( ) , 1 ) ;
214+ let range = t
215+ . memory
216+ . iter ( )
217+ . next ( )
218+ . unwrap ( )
219+ . deserialize :: < Memory > ( )
220+ . reg
221+ . iter ( )
222+ . next ( )
223+ . unwrap ( )
224+ . 0 ;
225+ assert_eq ! ( range, 1342177280 ..1408237568 ) ;
226+ }
227+ #[ test]
228+ fn test_nodeseq_with_at ( ) {
229+ #[ repr( align( 8 ) ) ]
230+ struct AlignedBuffer {
231+ pub data : [ u8 ; RAW_DEVICE_TREE_QEMU . len ( ) ] ,
232+ }
233+ let mut aligned_data: Box < AlignedBuffer > = Box :: new ( AlignedBuffer {
234+ data : [ 0 ; BUFFER_SIZE_QEMU ] ,
235+ } ) ;
236+ aligned_data. data [ ..BUFFER_SIZE_QEMU ] . clone_from_slice ( RAW_DEVICE_TREE_QEMU ) ;
237+ let mut slice = aligned_data. data . to_vec ( ) ;
238+ let ptr = DtbPtr :: from_raw ( slice. as_mut_ptr ( ) ) . unwrap ( ) ;
239+ let dtb = Dtb :: from ( ptr) . share ( ) ;
240+
241+ let t: Tree = from_raw_mut ( & dtb) . unwrap ( ) ;
242+ assert_eq ! ( t. memory. len( ) , 1 ) ;
243+ let range = t
244+ . memory
245+ . iter ( )
246+ . next ( )
247+ . unwrap ( )
248+ . deserialize :: < Memory > ( )
249+ . reg
250+ . iter ( )
251+ . next ( )
252+ . unwrap ( )
253+ . 0 ;
254+ assert_eq ! ( range, 2147483648 ..6442450944 ) ;
255+ }
256+ }
0 commit comments