@@ -883,4 +883,91 @@ describe('ComponentViewerBase', () => {
883883 await expect ( handleExpandAll ( ) ) . resolves . toBeUndefined ( ) ;
884884 expect ( provider . expandAllElements ) . toHaveBeenCalled ( ) ;
885885 } ) ;
886+
887+ it ( 'collapseAll command collapses all tree elements' , async ( ) => {
888+ await controller . activate ( tracker as unknown as GDBTargetDebugTracker ) ;
889+ const registerCommandMock = asMockedFunction ( vscode . commands . registerCommand ) ;
890+ const collapseHandler = registerCommandMock . mock . calls . find (
891+ ( [ command ] ) => command === 'vscode-cmsis-debugger.testClass.collapseAll'
892+ ) ?. [ 1 ] as ( ( ) => void ) | undefined ;
893+ expect ( collapseHandler ) . toBeDefined ( ) ;
894+ collapseHandler ?.( ) ;
895+ expect ( provider . collapseAllElements ) . toHaveBeenCalled ( ) ;
896+ } ) ;
897+
898+ it ( 'webviewProvider onToggle callback calls toggleById on the tree data provider' , async ( ) => {
899+ await controller . activate ( tracker as unknown as GDBTargetDebugTracker ) ;
900+ const webviewProvider = ( controller as unknown as { _webviewProvider : { onToggle : ( ( id : string , expanded : boolean ) => void ) | undefined } } ) . _webviewProvider ;
901+ expect ( webviewProvider ) . toBeDefined ( ) ;
902+ const toggleSpy = jest . spyOn ( provider , 'toggleById' ) ;
903+ webviewProvider ! . onToggle ?.( 'node-1' , true ) ;
904+ expect ( toggleSpy ) . toHaveBeenCalledWith ( 'node-1' , true ) ;
905+ } ) ;
906+
907+ it ( 'webviewProvider onLock callback delegates to handleLockInstanceById' , async ( ) => {
908+ await controller . activate ( tracker as unknown as GDBTargetDebugTracker ) ;
909+ const webviewProvider = ( controller as unknown as { _webviewProvider : { onLock : ( ( id : string ) => void ) | undefined } } ) . _webviewProvider ;
910+ expect ( webviewProvider ) . toBeDefined ( ) ;
911+ const root = makeGuiNode ( 'my-node' ) ;
912+ asMockedFunction ( provider . getChildren as ( ) => ScvdGuiInterface [ ] ) . mockReturnValue ( [ root ] ) ;
913+ const lockSpy = jest . spyOn ( controller as unknown as { handleLockInstance : ( node : ScvdGuiInterface ) => void } , 'handleLockInstance' ) ;
914+ webviewProvider ! . onLock ?.( 'my-node' ) ;
915+ expect ( lockSpy ) . toHaveBeenCalledWith ( root ) ;
916+ } ) ;
917+
918+ it ( 'handleOnWillStartSession registers a refresh callback on the session timer' , async ( ) => {
919+ await controller . activate ( tracker as unknown as GDBTargetDebugTracker ) ;
920+ const session = debugSessionFactory ( 's1' , [ ] ) ;
921+ await tracker . callbacks . willStart ?.( session ) ;
922+ expect ( session . refreshTimer . onRefresh ) . toHaveBeenCalled ( ) ;
923+ } ) ;
924+
925+ it ( 'setSvdPath is called on instance when svdPath is provided' , async ( ) => {
926+ const session = debugSessionFactory ( 's1' , [ 'a.scvd' ] , 'stopped' ) ;
927+ // Set definitionPath on the debug session configuration
928+ ( session . session as unknown as { configuration : { definitionPath : string } } ) . configuration = { definitionPath : '/path/to/device.svd' } ;
929+ ( controller as unknown as { _activeSession ?: typeof session } ) . _activeSession = session ;
930+
931+ const setSvdPathSpy = jest . fn ( ) ;
932+ instanceFactory . mockImplementationOnce ( ( ) => ( {
933+ readModel : jest . fn ( ) . mockResolvedValue ( undefined ) ,
934+ update : jest . fn ( ) . mockResolvedValue ( undefined ) ,
935+ getGuiTree : jest . fn < ScvdGuiInterface [ ] | undefined , [ ] > ( ( ) => [ ] ) ,
936+ updateActiveSession : jest . fn ( ) ,
937+ cancelExecution : jest . fn ( ) ,
938+ setSvdPath : setSvdPathSpy ,
939+ } ) ) ;
940+
941+ const readScvdFiles = getReadScvdFiles ( controller ) ;
942+ await readScvdFiles ( tracker , session ) ;
943+
944+ expect ( setSvdPathSpy ) . toHaveBeenCalledWith ( '/path/to/device.svd' ) ;
945+ } ) ;
946+
947+ it ( 'handleOnStackTrace throws when session id does not match active session' , async ( ) => {
948+ const sessionA = debugSessionFactory ( 's1' , [ ] , 'stopped' ) ;
949+ const sessionB = debugSessionFactory ( 's2' , [ ] , 'stopped' ) ;
950+ ( controller as unknown as { _activeSession ?: typeof sessionA } ) . _activeSession = sessionA ;
951+ const handleOnStackTrace = ( controller as unknown as { handleOnStackTrace : ( s : typeof sessionA ) => Promise < void > } ) . handleOnStackTrace . bind ( controller ) ;
952+ await expect ( handleOnStackTrace ( sessionB ) ) . rejects . toThrow ( 'Received stack trace event' ) ;
953+ } ) ;
954+
955+ it ( 'handleOnStackItemChanged throws when session id does not match active session' , async ( ) => {
956+ const sessionA = debugSessionFactory ( 's1' , [ ] , 'stopped' ) ;
957+ const sessionB = debugSessionFactory ( 's2' , [ ] , 'stopped' ) ;
958+ ( controller as unknown as { _activeSession ?: typeof sessionA } ) . _activeSession = sessionA ;
959+ const handleOnStackItemChanged = ( controller as unknown as { handleOnStackItemChanged : ( s : typeof sessionA ) => Promise < void > } ) . handleOnStackItemChanged . bind ( controller ) ;
960+ await expect ( handleOnStackItemChanged ( sessionB ) ) . rejects . toThrow ( 'Received stack item changed event' ) ;
961+ } ) ;
962+
963+ it ( 'onDidChangeActiveStackItem tracker callback delegates to handleOnStackItemChanged' , async ( ) => {
964+ await controller . activate ( tracker as unknown as GDBTargetDebugTracker ) ;
965+ const sessionA = debugSessionFactory ( 's1' , [ ] , 'stopped' ) ;
966+ ( controller as unknown as { _activeSession ?: typeof sessionA } ) . _activeSession = sessionA ;
967+ const scheduleSpy = jest
968+ . spyOn ( controller as unknown as { schedulePendingUpdate : ( reason : UpdateReason ) => void } , 'schedulePendingUpdate' )
969+ . mockImplementation ( ( ) => undefined ) ;
970+ await tracker . callbacks . activeStackItem ?.( { session : sessionA } ) ;
971+ expect ( scheduleSpy ) . toHaveBeenCalledWith ( 'stackItemChanged' ) ;
972+ } ) ;
886973} ) ;
0 commit comments