@@ -258,7 +258,10 @@ where
258258#[ allow( clippy:: unwrap_used) ]
259259mod tests {
260260 use super :: ContextSpecific ;
261- use crate :: { Decode , Encode , SliceReader , TagMode , TagNumber , asn1:: BitStringRef } ;
261+ use crate :: {
262+ Decode , Encode , SliceReader , TagMode , TagNumber ,
263+ asn1:: { BitStringRef , ContextSpecificRef , SetOf , Utf8StringRef } ,
264+ } ;
262265 use hex_literal:: hex;
263266
264267 // Public key data from `pkcs8` crate's `ed25519-pkcs8-v2.der`
@@ -353,4 +356,75 @@ mod tests {
353356 None
354357 ) ;
355358 }
359+
360+ #[ test]
361+ fn context_specific_explicit_ref ( ) {
362+ let mut set = SetOf :: new ( ) ;
363+ set. insert ( 8u16 ) . unwrap ( ) ;
364+ set. insert ( 7u16 ) . unwrap ( ) ;
365+
366+ let field = ContextSpecificRef :: < SetOf < u16 , 2 > > {
367+ value : & set,
368+ tag_number : TagNumber ( 2 ) ,
369+ tag_mode : TagMode :: Explicit ,
370+ } ;
371+
372+ let mut buf = [ 0u8 ; 16 ] ;
373+ let encoded = field. encode_to_slice ( & mut buf) . unwrap ( ) ;
374+ assert_eq ! (
375+ encoded,
376+ & [
377+ /* CONTEXT-SPECIFIC [2] */ 0xA2 , 0x08 , /* SET 0x11 | 0x20 */ 0x31 , 0x06 ,
378+ /* INTEGER */ 0x02 , 0x01 , 0x07 , /* INTEGER */ 0x02 , 0x01 , 0x08
379+ ]
380+ ) ;
381+
382+ let mut reader = SliceReader :: new ( encoded) . unwrap ( ) ;
383+ let field = ContextSpecific :: < SetOf < u16 , 2 > > :: decode_explicit ( & mut reader, TagNumber ( 2 ) )
384+ . unwrap ( )
385+ . unwrap ( ) ;
386+
387+ assert_eq ! ( field. value. len( ) , 2 ) ;
388+ assert_eq ! ( field. value. get( 0 ) . cloned( ) , Some ( 7 ) ) ;
389+ assert_eq ! ( field. value. get( 1 ) . cloned( ) , Some ( 8 ) ) ;
390+ }
391+
392+ #[ test]
393+ fn context_specific_implicit_ref ( ) {
394+ let hello = Utf8StringRef :: new ( "Hello" ) . unwrap ( ) ;
395+ let world = Utf8StringRef :: new ( "world" ) . unwrap ( ) ;
396+
397+ let mut set = SetOf :: new ( ) ;
398+ set. insert ( hello) . unwrap ( ) ;
399+ set. insert ( world) . unwrap ( ) ;
400+
401+ let field = ContextSpecificRef :: < SetOf < Utf8StringRef < ' _ > , 2 > > {
402+ value : & set,
403+ tag_number : TagNumber ( 2 ) ,
404+ tag_mode : TagMode :: Implicit ,
405+ } ;
406+
407+ let mut buf = [ 0u8 ; 16 ] ;
408+ let encoded = field. encode_to_slice ( & mut buf) . unwrap ( ) ;
409+ assert_eq ! (
410+ encoded,
411+ & [
412+ 0xA2 , 0x0E , // CONTEXT-SPECIFIC [2]
413+ 0x0C , 0x05 , b'H' , b'e' , b'l' , b'l' , b'o' , // UTF8String "Hello"
414+ 0x0C , 0x05 , b'w' , b'o' , b'r' , b'l' , b'd' , // UTF8String "world"
415+ ]
416+ ) ;
417+
418+ let mut reader = SliceReader :: new ( encoded) . unwrap ( ) ;
419+ let field = ContextSpecific :: < SetOf < Utf8StringRef < ' _ > , 2 > > :: decode_implicit (
420+ & mut reader,
421+ TagNumber ( 2 ) ,
422+ )
423+ . unwrap ( )
424+ . unwrap ( ) ;
425+
426+ assert_eq ! ( field. value. len( ) , 2 ) ;
427+ assert_eq ! ( field. value. get( 0 ) . cloned( ) , Some ( hello) ) ;
428+ assert_eq ! ( field. value. get( 1 ) . cloned( ) , Some ( world) ) ;
429+ }
356430}
0 commit comments