@@ -322,7 +322,7 @@ pub(crate) enum ModelBinaryReadError {
322322mod test {
323323 use super :: * ;
324324
325- use crate :: extension:: ExtensionRegistry ;
325+ use crate :: extension:: { ExtensionId , ExtensionRegistry } ;
326326
327327 use crate :: envelope:: header:: EnvelopeHeader ;
328328 use cool_asserts:: assert_matches;
@@ -466,4 +466,41 @@ mod test {
466466 handle_error ( & mut desc, & error) ;
467467 assert ! ( desc. used_extensions_resolved. is_none( ) ) ;
468468 }
469+
470+ #[ test]
471+ fn test_decode_model_ast_with_packaged_extensions ( ) {
472+ let mut simple_package = crate :: builder:: test:: simple_package ( ) ;
473+ // Create a simple extension to package
474+ let ext_id = ExtensionId :: new ( "test.packaged.extension" ) . unwrap ( ) ;
475+ let extension = Extension :: new ( ext_id. clone ( ) , crate :: extension:: Version :: new ( 1 , 0 , 0 ) ) ;
476+
477+ simple_package
478+ . extensions
479+ . register ( std:: sync:: Arc :: new ( extension) )
480+ . unwrap ( ) ;
481+
482+ let header = EnvelopeHeader {
483+ format : EnvelopeFormat :: ModelTextWithExtensions ,
484+ ..Default :: default ( )
485+ } ;
486+
487+ let mut cursor = Cursor :: new ( Vec :: new ( ) ) ;
488+ simple_package. store ( & mut cursor, header. config ( ) ) . unwrap ( ) ;
489+ cursor. set_position ( 0 ) ;
490+
491+ let registry = ExtensionRegistry :: new ( [ ] ) ;
492+ let mut reader = EnvelopeReader :: new ( cursor, & registry) . unwrap ( ) ;
493+
494+ // Before decoding, the packaged extension should not be registered
495+ assert ! ( !reader. registry. contains( & ext_id) ) ;
496+
497+ let result = reader. decode_model_ast ( ) ;
498+
499+ // After decoding, the packaged extension should be registered
500+ assert ! ( result. is_ok( ) ) ;
501+ assert ! ( reader. registry. contains( & ext_id) ) ;
502+
503+ let package = result. unwrap ( ) ;
504+ assert ! ( package. extensions. contains( & ext_id) ) ;
505+ }
469506}
0 commit comments