@@ -311,6 +311,72 @@ describe('tabs', () => {
311311 wrapper . destroy ( )
312312 } )
313313
314+ it ( '`activate-tab` event works' , async ( ) => {
315+ const App = Vue . extend ( {
316+ methods : {
317+ preventTab ( next , prev , bvEvt ) {
318+ // Prevent 3rd tab (index === 2) from activating
319+ if ( next === 2 ) {
320+ bvEvt . preventDefault ( )
321+ }
322+ }
323+ } ,
324+ render ( h ) {
325+ return h ( BTabs , { props : { value : 0 } , on : { 'activate-tab' : this . preventTab } } , [
326+ h ( BTab , { props : { } } , 'tab 0' ) ,
327+ h ( BTab , { props : { } } , 'tab 1' ) ,
328+ h ( BTab , { props : { } } , 'tab 2' )
329+ ] )
330+ }
331+ } )
332+ const wrapper = mount ( App )
333+ expect ( wrapper ) . toBeDefined ( )
334+
335+ await waitNT ( wrapper . vm )
336+ await waitRAF ( )
337+ const tabs = wrapper . find ( BTabs )
338+ expect ( tabs ) . toBeDefined ( )
339+ expect ( tabs . findAll ( BTab ) . length ) . toBe ( 3 )
340+
341+ // Expect 1st tab (index 0) to be active
342+ expect ( tabs . vm . currentTab ) . toBe ( 0 )
343+ expect ( tabs . vm . tabs [ 0 ] . localActive ) . toBe ( true )
344+ expect ( tabs . emitted ( 'input' ) ) . not . toBeDefined ( )
345+ expect ( tabs . emitted ( 'activate-tab' ) ) . not . toBeDefined ( )
346+
347+ // Set 2nd BTab to be active
348+ tabs . setProps ( { value : 1 } )
349+ await waitNT ( wrapper . vm )
350+ await waitRAF ( )
351+ expect ( tabs . vm . currentTab ) . toBe ( 1 )
352+ expect ( tabs . emitted ( 'input' ) ) . toBeDefined ( )
353+ expect ( tabs . emitted ( 'input' ) . length ) . toBe ( 1 )
354+ expect ( tabs . emitted ( 'input' ) [ 0 ] [ 0 ] ) . toBe ( 1 )
355+ expect ( tabs . emitted ( 'activate-tab' ) ) . toBeDefined ( )
356+ expect ( tabs . emitted ( 'activate-tab' ) . length ) . toBe ( 1 )
357+ expect ( tabs . emitted ( 'activate-tab' ) [ 0 ] [ 0 ] ) . toBe ( 1 )
358+ expect ( tabs . emitted ( 'activate-tab' ) [ 0 ] [ 1 ] ) . toBe ( 0 )
359+ expect ( tabs . emitted ( 'activate-tab' ) [ 0 ] [ 2 ] ) . toBeDefined ( )
360+ expect ( tabs . emitted ( 'activate-tab' ) [ 0 ] [ 2 ] . vueTarget ) . toBe ( tabs . vm )
361+
362+ // Attempt to set 3rd BTab to be active
363+ tabs . setProps ( { value : 2 } )
364+ await waitNT ( wrapper . vm )
365+ await waitRAF ( )
366+ expect ( tabs . vm . currentTab ) . toBe ( 1 )
367+ expect ( tabs . emitted ( 'input' ) ) . toBeDefined ( )
368+ expect ( tabs . emitted ( 'input' ) . length ) . toBe ( 2 )
369+ expect ( tabs . emitted ( 'input' ) [ 1 ] [ 0 ] ) . toBe ( 1 )
370+ expect ( tabs . emitted ( 'activate-tab' ) . length ) . toBe ( 2 )
371+ expect ( tabs . emitted ( 'activate-tab' ) [ 1 ] [ 0 ] ) . toBe ( 2 )
372+ expect ( tabs . emitted ( 'activate-tab' ) [ 1 ] [ 1 ] ) . toBe ( 1 )
373+ expect ( tabs . emitted ( 'activate-tab' ) [ 1 ] [ 2 ] ) . toBeDefined ( )
374+ expect ( tabs . emitted ( 'activate-tab' ) [ 1 ] [ 2 ] . vueTarget ) . toBe ( tabs . vm )
375+ expect ( tabs . emitted ( 'activate-tab' ) [ 1 ] [ 2 ] . defaultPrevented ) . toBe ( true )
376+
377+ wrapper . destroy ( )
378+ } )
379+
314380 it ( 'clicking on tab activates the tab, and tab emits click event' , async ( ) => {
315381 const App = Vue . extend ( {
316382 render ( h ) {
0 commit comments