@@ -436,3 +436,64 @@ test('assign value to unsafe object', async () => {
436436 'Assigning to unsafe value is not allowed' ,
437437 ) ;
438438} ) ;
439+
440+ test ( 'optional property access with value' , async ( ) => {
441+ const script = parseScript ( [
442+ //
443+ 'const a = { b: 1 };' ,
444+ 'a?.b;' ,
445+ ] ) ;
446+
447+ const agent = createAgent ( { script } ) ;
448+ const result = await executeAgent ( { agent } ) ;
449+
450+ const expectedStack = rootFrame ( {
451+ status : 'done' ,
452+ variables : { a : { b : 1 } } ,
453+ children : [
454+ completedFrame ( {
455+ node : 'var' ,
456+ children : [ completedFrame ( { node : 'literal' , value : { b : 1 } } ) ] ,
457+ } ) ,
458+ completedFrame ( {
459+ node : 'member' ,
460+ value : 1 ,
461+ children : [ completedFrame ( { node : 'ident' , value : { b : 1 } } ) ] ,
462+ } ) ,
463+ ] ,
464+ } ) ;
465+
466+ expect ( result ) . toEqual ( agentResult ( { ticks : 0 } ) ) ;
467+ expect ( agent . root ) . toEqual ( expectedStack ) ;
468+ expect ( agent . status ) . toBe ( 'done' ) ;
469+ } ) ;
470+
471+ test ( 'optional property access without value' , async ( ) => {
472+ const script = parseScript ( [
473+ //
474+ 'const a = null;' ,
475+ 'a?.b;' ,
476+ ] ) ;
477+
478+ const agent = createAgent ( { script } ) ;
479+ const result = await executeAgent ( { agent } ) ;
480+
481+ const expectedStack = rootFrame ( {
482+ status : 'done' ,
483+ variables : { a : null } ,
484+ children : [
485+ completedFrame ( {
486+ node : 'var' ,
487+ } ) ,
488+ completedFrame ( {
489+ node : 'member' ,
490+ value : undefined ,
491+ children : [ completedFrame ( { node : 'ident' , value : null } ) ] ,
492+ } ) ,
493+ ] ,
494+ } ) ;
495+
496+ expect ( result ) . toEqual ( agentResult ( { ticks : 0 } ) ) ;
497+ expect ( agent . root ) . toEqual ( expectedStack ) ;
498+ expect ( agent . status ) . toBe ( 'done' ) ;
499+ } ) ;
0 commit comments