@@ -36,6 +36,12 @@ describe('Tile resize', () => {
3636 let columnSize : number ;
3737 let rowSize : number ;
3838
39+ /** Wait tile dragging view transition(s) to complete. */
40+ async function viewTransitionComplete ( ) {
41+ await nextFrame ( ) ;
42+ await nextFrame ( ) ;
43+ }
44+
3945 function getTiles ( ) {
4046 return Array . from ( tileManager . querySelectorAll ( IgcTileComponent . tagName ) ) ;
4147 }
@@ -389,6 +395,92 @@ describe('Tile resize', () => {
389395 assertRectsAreEqual ( firstTile . getBoundingClientRect ( ) , tileRect ) ;
390396 } ) ;
391397
398+ it ( 'should fire `igcTileResizeStart` when a resize operation begins' , async ( ) => {
399+ const DOM = getResizeContainerDOM ( firstTile ) ;
400+ const eventSpy = spy ( firstTile , 'emitEvent' ) ;
401+
402+ simulatePointerDown ( DOM . adorners . corner ) ;
403+ await elementUpdated ( firstTile ) ;
404+
405+ expect ( eventSpy ) . calledWith ( 'igcTileResizeStart' ) ;
406+ } ) ;
407+
408+ it ( 'should stop resize operations by canceling the `igcTileResizeStart` event' , async ( ) => {
409+ const DOM = getResizeContainerDOM ( firstTile ) ;
410+ const eventSpy = spy ( firstTile , 'emitEvent' ) ;
411+
412+ firstTile . addEventListener ( 'igcTileResizeStart' , ( event ) =>
413+ event . preventDefault ( )
414+ ) ;
415+
416+ simulatePointerDown ( DOM . adorners . corner ) ;
417+ await elementUpdated ( firstTile ) ;
418+
419+ expect ( eventSpy ) . calledWith ( 'igcTileResizeStart' ) ;
420+
421+ simulatePointerMove ( DOM . adorners . corner ) ;
422+ simulateLostPointerCapture ( DOM . adorners . corner ) ;
423+ await elementUpdated ( firstTile ) ;
424+
425+ expect ( eventSpy . callCount ) . to . equal ( 1 ) ;
426+ expect ( eventSpy ) . not . calledWith ( 'igcTileResizeEnd' ) ;
427+ } ) ;
428+
429+ it ( 'should fire `igcTileResizeEnd` when a resize operation is performed successfully' , async ( ) => {
430+ const DOM = getResizeContainerDOM ( firstTile ) ;
431+ const eventSpy = spy ( firstTile , 'emitEvent' ) ;
432+
433+ const { colSpan : initialColumnSpan , rowSpan : initialRowSpan } = firstTile ;
434+
435+ const tileRect = firstTile . getBoundingClientRect ( ) ;
436+
437+ simulatePointerDown ( DOM . adorners . corner ) ;
438+ await elementUpdated ( firstTile ) ;
439+
440+ expect ( eventSpy ) . calledWith ( 'igcTileResizeStart' ) ;
441+
442+ simulatePointerMove ( DOM . adorners . corner , {
443+ clientX : tileRect . right * 2 ,
444+ clientY : tileRect . bottom * 2 ,
445+ } ) ;
446+ simulateLostPointerCapture ( DOM . adorners . corner ) ;
447+ await viewTransitionComplete ( ) ;
448+
449+ expect ( eventSpy ) . calledWith ( 'igcTileResizeEnd' ) ;
450+ expect ( DOM . ghostElement ) . to . be . null ;
451+
452+ const { colSpan, rowSpan } = firstTile ;
453+ expect ( initialColumnSpan ) . is . lessThan ( colSpan ) ;
454+ expect ( initialRowSpan ) . is . lessThan ( rowSpan ) ;
455+ } ) ;
456+
457+ it ( 'should fire `igcTileResizeCancel` when canceling a resize operation' , async ( ) => {
458+ const DOM = getResizeContainerDOM ( firstTile ) ;
459+ const eventSpy = spy ( firstTile , 'emitEvent' ) ;
460+
461+ const tileRect = firstTile . getBoundingClientRect ( ) ;
462+
463+ simulatePointerDown ( DOM . adorners . corner ) ;
464+ await elementUpdated ( firstTile ) ;
465+
466+ expect ( eventSpy ) . calledWith ( 'igcTileResizeStart' ) ;
467+
468+ simulatePointerMove ( DOM . adorners . corner , {
469+ clientX : tileRect . right * 2 ,
470+ clientY : tileRect . bottom * 2 ,
471+ } ) ;
472+ await elementUpdated ( firstTile ) ;
473+
474+ expect ( DOM . ghostElement ) . not . to . be . null ;
475+
476+ simulateKeyboard ( DOM . resizeElement , escapeKey ) ;
477+ await elementUpdated ( firstTile ) ;
478+
479+ expect ( eventSpy ) . calledWith ( 'igcTileResizeCancel' ) ;
480+ expect ( DOM . ghostElement ) . to . be . null ;
481+ assertRectsAreEqual ( firstTile . getBoundingClientRect ( ) , tileRect ) ;
482+ } ) ;
483+
392484 it ( 'should disable igc-resize behavior when `disableResize` is true' , async ( ) => {
393485 const DOM = getTileDOM ( firstTile ) ;
394486
0 commit comments