@@ -201,188 +201,108 @@ describeWithMockConnection('AI Assistance Panel', () => {
201201 } ) ;
202202 } ) ;
203203
204- describe ( 'flavor change listeners' , ( ) => {
205- describe ( 'SDK.DOMModel.DOMNode flavor changes for selected element' , ( ) => {
206- it ( 'should set the selected element when the widget is shown' , async ( ) => {
207- const { view, panel} = await createAiAssistancePanel ( ) ;
208-
209- const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
210- nodeType : Node . ELEMENT_NODE ,
211- } ) ;
212- UI . Context . Context . instance ( ) . setFlavor ( SDK . DOMModel . DOMNode , node ) ;
213- panel . handleAction ( 'freestyler.elements-floating-button' ) ;
214-
215- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
216- selectedContext : new AiAssistance . NodeContext ( node ) ,
217- } ) ) ;
218- } ) ;
219-
220- it ( 'should update the selected element when the changed DOMNode flavor is an ELEMENT_NODE' , async ( ) => {
221- const { view, panel} = await createAiAssistancePanel ( ) ;
222- panel . handleAction ( 'freestyler.elements-floating-button' ) ;
223- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
224- selectedContext : null ,
225- } ) ) ;
226-
227- const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
228- nodeType : Node . ELEMENT_NODE ,
229- } ) ;
230- UI . Context . Context . instance ( ) . setFlavor ( SDK . DOMModel . DOMNode , node ) ;
231-
232- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
233- selectedContext : new AiAssistance . NodeContext ( node ) ,
234- } ) ) ;
235- } ) ;
236-
237- it ( 'should set selected element to null when the change DOMNode flavor is not an ELEMENT_NODE' , async ( ) => {
238- const { view, panel} = await createAiAssistancePanel ( ) ;
239- panel . handleAction ( 'freestyler.elements-floating-button' ) ;
240- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
241- selectedContext : null ,
242- } ) ) ;
243-
244- const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
245- nodeType : Node . COMMENT_NODE ,
246- } ) ;
247- UI . Context . Context . instance ( ) . setFlavor ( SDK . DOMModel . DOMNode , node ) ;
248-
249- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
250- selectedContext : null ,
251- } ) ) ;
252- } ) ;
253-
254- it ( 'should not handle DOMNode flavor changes if the widget is not shown' , async ( ) => {
255- const { view, panel} = await createAiAssistancePanel ( ) ;
256- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
257- selectedContext : null ,
258- } ) ) ;
259- const callCount = view . callCount ;
260- panel . hideWidget ( ) ;
261- const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
262- nodeType : Node . ELEMENT_NODE ,
263- } ) ;
264- UI . Context . Context . instance ( ) . setFlavor ( SDK . DOMModel . DOMNode , node ) ;
265- assert . strictEqual ( view . callCount , callCount ) ;
266- } ) ;
267- } ) ;
268-
269- describe ( 'SDK.NetworkRequest.NetworkRequest flavor changes for selected network request' , ( ) => {
270- it ( 'should set the selected network request when the widget is shown' , async ( ) => {
271- const networkRequest = sinon . createStubInstance ( SDK . NetworkRequest . NetworkRequest ) ;
272- UI . Context . Context . instance ( ) . setFlavor ( SDK . NetworkRequest . NetworkRequest , networkRequest ) ;
273- const { view, panel} = await createAiAssistancePanel ( ) ;
274- panel . handleAction ( 'drjones.network-floating-button' ) ;
204+ describe ( 'Contexts' , ( ) => {
205+ const tests = [
206+ {
207+ flavor : SDK . DOMModel . DOMNode ,
208+ createContext : ( ) => {
209+ const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
210+ nodeType : Node . ELEMENT_NODE ,
211+ } ) ;
212+ return new AiAssistance . NodeContext ( node ) ;
213+ } ,
214+ action : 'freestyler.elements-floating-button' ,
215+ } ,
216+ {
217+ flavor : SDK . NetworkRequest . NetworkRequest ,
218+ createContext : ( ) => {
219+ return new AiAssistance . RequestContext ( sinon . createStubInstance ( SDK . NetworkRequest . NetworkRequest ) ) ;
220+ } ,
221+ action : 'drjones.network-floating-button'
222+ } ,
223+ {
224+ flavor : TimelineUtils . AICallTree . AICallTree ,
225+ createContext : ( ) => {
226+ return new AiAssistance . CallTreeContext ( sinon . createStubInstance ( TimelineUtils . AICallTree . AICallTree ) ) ;
227+ } ,
228+ action : 'drjones.performance-panel-context'
229+ } ,
230+ {
231+ flavor : Workspace . UISourceCode . UISourceCode ,
232+ createContext : ( ) => {
233+ return new AiAssistance . FileContext ( sinon . createStubInstance ( Workspace . UISourceCode . UISourceCode ) ) ;
234+ } ,
235+ action : 'drjones.sources-panel-context' ,
236+ }
237+ ] ;
238+
239+ for ( const test of tests ) {
240+ it ( `should use the selected ${ test . flavor . name } context after the widget is shown` , async ( ) => {
241+ const { view, panel, waitForRendering} = await createAiAssistancePanel ( ) ;
242+ const context = test . createContext ( ) ;
243+ const contextItem = context . getItem ( ) ;
244+ if ( ! contextItem ) {
245+ throw new Error ( 'Context is not available' ) ;
246+ }
247+ UI . Context . Context . instance ( ) . setFlavor ( test . flavor , contextItem ) ;
248+ panel . handleAction ( test . action ) ;
249+ await waitForRendering ( ) ;
275250 sinon . assert . calledWith ( view . lastCall , sinon . match ( {
276- selectedContext : new AiAssistance . RequestContext ( networkRequest ) ,
251+ selectedContext : context ,
277252 } ) ) ;
278253 } ) ;
279254
280- it ( ' should set selected network request when the NetworkRequest flavor changes' , async ( ) => {
281- const { view, panel} = await createAiAssistancePanel ( ) ;
282- panel . handleAction ( 'drjones.network-floating-button' ) ;
255+ it ( ` should update the selected ${ test . flavor . name } context whenever flavor changes` , async ( ) => {
256+ const { view, panel, waitForRendering } = await createAiAssistancePanel ( ) ;
257+ panel . handleAction ( test . action ) ;
283258 sinon . assert . calledWith ( view . lastCall , sinon . match ( {
284259 selectedContext : null ,
285260 } ) ) ;
286-
287- const networkRequest = sinon . createStubInstance ( SDK . NetworkRequest . NetworkRequest ) ;
288- UI . Context . Context . instance ( ) . setFlavor ( SDK . NetworkRequest . NetworkRequest , networkRequest ) ;
289- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
290- selectedContext : new AiAssistance . RequestContext ( networkRequest ) ,
291- } ) ) ;
292- } ) ;
293-
294- it ( 'should not handle NetworkRequest flavor changes if the widget is not shown' , async ( ) => {
295- const { view, panel} = await createAiAssistancePanel ( ) ;
261+ const context = test . createContext ( ) ;
262+ const contextItem = context . getItem ( ) ;
263+ if ( ! contextItem ) {
264+ throw new Error ( 'Context is not available' ) ;
265+ }
266+ UI . Context . Context . instance ( ) . setFlavor ( test . flavor , contextItem ) ;
267+ await waitForRendering ( ) ;
296268 sinon . assert . calledWith ( view . lastCall , sinon . match ( {
297- selectedContext : null ,
269+ selectedContext : context ,
298270 } ) ) ;
299- const callCount = view . callCount ;
300- panel . hideWidget ( ) ;
301- const networkRequest = sinon . createStubInstance ( SDK . NetworkRequest . NetworkRequest ) ;
302- UI . Context . Context . instance ( ) . setFlavor ( SDK . NetworkRequest . NetworkRequest , networkRequest ) ;
303- assert . strictEqual ( view . callCount , callCount ) ;
304271 } ) ;
305- } ) ;
306-
307- describe ( 'TimelineUtils.AICallTree.AICallTree flavor changes for selected call tree' , ( ) => {
308- it ( 'should set the selected call tree when the widget is shown' , async ( ) => {
309- const { view, panel} = await createAiAssistancePanel ( ) ;
310-
311- const selectedAiCallTree = { } ;
312- UI . Context . Context . instance ( ) . setFlavor ( TimelineUtils . AICallTree . AICallTree , selectedAiCallTree ) ;
313- panel . handleAction ( 'drjones.performance-panel-context' ) ;
314272
273+ it ( `should ignore ${ test . flavor . name } flavor change after the panel was hidden` , async ( ) => {
274+ const { view, panel, waitForRendering} = await createAiAssistancePanel ( ) ;
315275 sinon . assert . calledWith ( view . lastCall , sinon . match ( {
316- selectedContext : new AiAssistance . CallTreeContext ( selectedAiCallTree as TimelineUtils . AICallTree . AICallTree ) ,
317- } ) ) ;
318- } ) ;
319-
320- it ( 'should set selected call tree when the AICallTree flavor changes' , async ( ) => {
321- const { view, panel} = await createAiAssistancePanel ( ) ;
322-
323- panel . handleAction ( 'drjones.performance-panel-context' ) ;
324- sinon . assert . calledWith ( view , sinon . match ( {
325276 selectedContext : null ,
326277 } ) ) ;
327-
328- const selectedAiCallTree = { } ;
329- UI . Context . Context . instance ( ) . setFlavor ( TimelineUtils . AICallTree . AICallTree , selectedAiCallTree ) ;
330-
331- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
332- selectedContext : new AiAssistance . CallTreeContext ( selectedAiCallTree as TimelineUtils . AICallTree . AICallTree ) ,
333- } ) ) ;
334- } ) ;
335-
336- it ( 'should not handle AICallTree flavor changes if the widget is not shown' , async ( ) => {
337- const { view, panel} = await createAiAssistancePanel ( ) ;
338278 const callCount = view . callCount ;
339279 panel . hideWidget ( ) ;
340-
341- const selectedAiCallTree = { } ;
342- UI . Context . Context . instance ( ) . setFlavor ( TimelineUtils . AICallTree . AICallTree , selectedAiCallTree ) ;
343-
280+ const context = test . createContext ( ) ;
281+ const contextItem = context . getItem ( ) ;
282+ if ( ! contextItem ) {
283+ throw new Error ( 'Context is not available' ) ;
284+ }
285+ UI . Context . Context . instance ( ) . setFlavor ( test . flavor , contextItem ) ;
286+ await waitForRendering ( ) ;
344287 assert . strictEqual ( view . callCount , callCount ) ;
345288 } ) ;
346- } ) ;
347-
348- describe ( 'Workspace.UISourceCode.UISourceCode flavor changes for selected file' , ( ) => {
349- it ( 'should set selected file when the widget is shown' , async ( ) => {
350- const { view, panel} = await createAiAssistancePanel ( ) ;
351- panel . handleAction ( 'drjones.sources-panel-context' ) ;
352-
353- const uiSourceCode = sinon . createStubInstance ( Workspace . UISourceCode . UISourceCode ) ;
354- UI . Context . Context . instance ( ) . setFlavor ( Workspace . UISourceCode . UISourceCode , uiSourceCode ) ;
355-
356- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
357- selectedContext : new AiAssistance . FileContext ( uiSourceCode ) ,
358- } ) ) ;
359- } ) ;
360-
361- it ( 'should set selected file when the UISourceCode flavor changes' , async ( ) => {
362- const { view, panel} = await createAiAssistancePanel ( ) ;
363- panel . handleAction ( 'drjones.sources-panel-context' ) ;
364- sinon . assert . calledWith ( view , sinon . match ( {
365- selectedContext : null ,
366- } ) ) ;
289+ }
367290
368- const uiSourceCode = sinon . createStubInstance ( Workspace . UISourceCode . UISourceCode ) ;
369- UI . Context . Context . instance ( ) . setFlavor ( Workspace . UISourceCode . UISourceCode , uiSourceCode ) ;
291+ it ( 'should set selected context to null when the change DOMNode flavor is not an ELEMENT_NODE' , async ( ) => {
292+ const { view, panel} = await createAiAssistancePanel ( ) ;
293+ panel . handleAction ( 'freestyler.elements-floating-button' ) ;
294+ sinon . assert . calledWith ( view . lastCall , sinon . match ( {
295+ selectedContext : null ,
296+ } ) ) ;
370297
371- sinon . assert . calledWith ( view . lastCall , sinon . match ( {
372- selectedContext : new AiAssistance . FileContext ( uiSourceCode ) ,
373- } ) ) ;
298+ const node = sinon . createStubInstance ( SDK . DOMModel . DOMNode , {
299+ nodeType : Node . COMMENT_NODE ,
374300 } ) ;
301+ UI . Context . Context . instance ( ) . setFlavor ( SDK . DOMModel . DOMNode , node ) ;
375302
376- it ( 'should not handle UISourceCode flavor changes if the widget is not shown' , async ( ) => {
377- const { view, panel} = await createAiAssistancePanel ( ) ;
378- const callCount = view . callCount ;
379- panel . hideWidget ( ) ;
380-
381- const uiSourceCode = sinon . createStubInstance ( Workspace . UISourceCode . UISourceCode ) ;
382- UI . Context . Context . instance ( ) . setFlavor ( Workspace . UISourceCode . UISourceCode , uiSourceCode ) ;
383-
384- assert . strictEqual ( view . callCount , callCount ) ;
385- } ) ;
303+ sinon . assert . calledWith ( view . lastCall , sinon . match ( {
304+ selectedContext : null ,
305+ } ) ) ;
386306 } ) ;
387307 } ) ;
388308
0 commit comments