1717import { expect , it , describe } from '@jest/globals' ;
1818import * as vscode from 'vscode' ;
1919import * as path from 'path' ;
20- import { CompileCommandsGeneratorImpl } from './compile-commands-generator' ;
20+ import { CompileCommandsGenerator } from './compile-commands-generator' ;
2121import { buildTaskDefinitionBuilderFactory , MockBuildTaskDefinitionBuilder } from '../../tasks/build/build-task-definition-builder.factories' ;
2222import { BuildTaskDefinition } from '../../tasks/build/build-task-definition' ;
2323import { BuildTaskProvider , BuildTaskProviderImpl } from '../../tasks/build/build-task-provider' ;
24+ import { SolutionEventHub } from '../solution-event-hub' ;
25+ import * as manifest from '../../manifest' ;
26+ import { MockOutputChannelProvider , outputChannelProviderFactory } from '../../vscode-api/output-channel-provider.factories' ;
27+ import { waitTimeout } from '../../__test__/test-waits' ;
2428
2529jest . mock ( 'which' , ( ) => jest . fn ( ( cmd ) => Promise . resolve ( path . join ( 'path' , 'to' , cmd ) ) ) ) ;
2630
2731describe ( 'CompileCommandsGenerator' , ( ) => {
28- let generator : CompileCommandsGeneratorImpl ;
32+ let generator : CompileCommandsGenerator ;
2933 let mockBuildTaskProvider : BuildTaskProvider ;
3034 let buildTaskDefinitionBuilder : MockBuildTaskDefinitionBuilder ;
3135 let mockExecution : vscode . TaskExecution ;
3236 let exitCode : number ;
37+ let mockEventHub : jest . Mocked < SolutionEventHub > ;
38+ let outputChannelProvider : MockOutputChannelProvider ;
39+ let cbuildSetupRequestedListener : ( ( ) => void ) | undefined ;
3340
3441 beforeEach ( async ( ) => {
3542 exitCode = 0 ;
43+ mockEventHub = {
44+ fireCbuildCompleted : jest . fn ( ) . mockResolvedValue ( undefined ) ,
45+ onDidCbuildSetupRequested : jest . fn ( ( listener : ( ) => void ) => {
46+ cbuildSetupRequestedListener = listener ;
47+ return { dispose : jest . fn ( ) } as unknown as vscode . Disposable ;
48+ } ) ,
49+ } as unknown as jest . Mocked < SolutionEventHub > ;
50+ outputChannelProvider = outputChannelProviderFactory ( ) ;
3651
3752 const buildTaskDefinition : BuildTaskDefinition = {
3853 type : BuildTaskProviderImpl . taskType ,
@@ -59,10 +74,13 @@ describe('CompileCommandsGenerator', () => {
5974 return { dispose : jest . fn ( ) } as unknown as vscode . Disposable ;
6075 } ;
6176
62- generator = new CompileCommandsGeneratorImpl (
77+ generator = new CompileCommandsGenerator (
6378 mockBuildTaskProvider ,
6479 buildTaskDefinitionBuilder ,
80+ mockEventHub ,
81+ outputChannelProvider ,
6582 ) ;
83+ generator . activate ( { subscriptions : [ ] } as unknown as vscode . ExtensionContext ) ;
6684
6785 } ) ;
6886
@@ -71,18 +89,61 @@ describe('CompileCommandsGenerator', () => {
7189 getOutputBuffer : ( ) => [ 'completed with exit code 0' ]
7290 } ) ;
7391 exitCode = 0 ;
74- const [ result , output ] = await generator . runCbuildSetup ( ) ;
75- expect ( result ) . toBe ( true ) ;
76- expect ( output ) . toEqual ( expect . arrayContaining ( [ 'completed with exit code 0' ] ) ) ;
77- } , 10000 ) ;
92+ cbuildSetupRequestedListener ?.( ) ;
93+ await waitTimeout ( ) ;
94+
95+ const outputChannel = outputChannelProvider . mockGetCreatedChannelByName ( manifest . CMSIS_SOLUTION_OUTPUT_CHANNEL ) ;
96+ expect ( vscode . tasks . executeTask ) . toHaveBeenCalledTimes ( 1 ) ;
97+ expect ( outputChannel ! . appendLine ) . toHaveBeenCalledWith ( 'Launching cbuild setup in Terminal to generate IntelliSense database' ) ;
98+ expect ( mockEventHub . fireCbuildCompleted ) . toHaveBeenCalledWith ( { success : true , severity : 'success' , toolsOutputMessages : [ 'completed with exit code 0' ] } ) ;
99+ } ) ;
100+
101+ it ( 'runs cbuild setup when cbuild setup request event is received' , async ( ) => {
102+ ( mockBuildTaskProvider . getActiveTaskRunner as jest . Mock ) . mockReturnValue ( {
103+ getOutputBuffer : ( ) => [ 'completed with exit code 0' ]
104+ } ) ;
105+ exitCode = 0 ;
106+ cbuildSetupRequestedListener ?.( ) ;
107+ await waitTimeout ( ) ;
108+
109+ expect ( vscode . tasks . executeTask ) . toHaveBeenCalledTimes ( 1 ) ;
110+ } ) ;
78111
79112 it ( 'prints an error message if the compilation database could not be generated' , async ( ) => {
80113 ( mockBuildTaskProvider . getActiveTaskRunner as jest . Mock ) . mockReturnValue ( {
81114 getOutputBuffer : ( ) => [ 'failed with exit code 1' ]
82115 } ) ;
83116 exitCode = 1 ;
84- const [ result , output ] = await generator . runCbuildSetup ( ) ;
85- expect ( result ) . toBe ( false ) ;
86- expect ( output ) . toEqual ( expect . arrayContaining ( [ 'failed with exit code 1' ] ) ) ;
87- } , 10000 ) ;
117+ cbuildSetupRequestedListener ?.( ) ;
118+ await waitTimeout ( ) ;
119+ expect ( mockEventHub . fireCbuildCompleted ) . toHaveBeenCalledWith ( { success : false , severity : 'error' , toolsOutputMessages : [ 'failed with exit code 1' ] } ) ;
120+ } ) ;
121+
122+ it ( 'reports warning severity when exit code is 0 but output contains warning pattern' , async ( ) => {
123+ ( mockBuildTaskProvider . getActiveTaskRunner as jest . Mock ) . mockReturnValue ( {
124+ getOutputBuffer : ( ) => [ 'warning cbuild: deprecated option' , 'completed with exit code 0' ]
125+ } ) ;
126+ exitCode = 0 ;
127+ cbuildSetupRequestedListener ?.( ) ;
128+ await waitTimeout ( ) ;
129+ expect ( mockEventHub . fireCbuildCompleted ) . toHaveBeenCalledWith ( {
130+ success : true ,
131+ severity : 'warning' ,
132+ toolsOutputMessages : [ 'warning cbuild: deprecated option' , 'completed with exit code 0' ]
133+ } ) ;
134+ } ) ;
135+
136+ it ( 'reports error severity when exit code is 0 but output contains error pattern' , async ( ) => {
137+ ( mockBuildTaskProvider . getActiveTaskRunner as jest . Mock ) . mockReturnValue ( {
138+ getOutputBuffer : ( ) => [ 'error cbuild: failed to generate' , 'completed with exit code 0' ]
139+ } ) ;
140+ exitCode = 0 ;
141+ cbuildSetupRequestedListener ?.( ) ;
142+ await waitTimeout ( ) ;
143+ expect ( mockEventHub . fireCbuildCompleted ) . toHaveBeenCalledWith ( {
144+ success : true ,
145+ severity : 'error' ,
146+ toolsOutputMessages : [ 'error cbuild: failed to generate' , 'completed with exit code 0' ]
147+ } ) ;
148+ } ) ;
88149} ) ;
0 commit comments