@@ -848,6 +848,112 @@ describe('IgxGridState - input properties #grid', () => {
848848 const allSameWidth = calcWidths . every ( w => w === calcWidths [ 0 ] ) ;
849849 expect ( allSameWidth ) . toBe ( false , 'Columns should not all have the same width' ) ;
850850 } ) ;
851+
852+ it ( 'getState should not mutate live sorting expressions (strategy/owner)' , ( ) => {
853+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
854+ fix . detectChanges ( ) ;
855+ const grid = fix . componentInstance . grid ;
856+ const state = fix . componentInstance . state ;
857+
858+ const customStrategy = DefaultSortingStrategy . instance ( ) ;
859+ const owner = { } as any ;
860+ grid . sortingExpressions = [
861+ { fieldName : 'ProductID' , dir : SortingDirection . Asc , ignoreCase : false , strategy : customStrategy , owner }
862+ ] ;
863+ fix . detectChanges ( ) ;
864+
865+ expect ( grid . sortingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should be set before getState' ) ;
866+ expect ( grid . sortingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should be set before getState' ) ;
867+
868+ state . getState ( false , 'sorting' ) ;
869+
870+ expect ( grid . sortingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should not be removed from live expressions after getState' ) ;
871+ expect ( grid . sortingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should not be removed from live expressions after getState' ) ;
872+ } ) ;
873+
874+ it ( 'getState should not mutate live groupBy expressions (strategy/owner)' , ( ) => {
875+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
876+ fix . detectChanges ( ) ;
877+ const grid = fix . componentInstance . grid ;
878+ const state = fix . componentInstance . state ;
879+
880+ const customStrategy = DefaultSortingStrategy . instance ( ) ;
881+ const owner = { } as any ;
882+ grid . groupingExpressions = [
883+ { fieldName : 'ProductID' , dir : SortingDirection . Asc , ignoreCase : false , strategy : customStrategy , owner }
884+ ] ;
885+ fix . detectChanges ( ) ;
886+
887+ expect ( grid . groupingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should be set before getState' ) ;
888+ expect ( grid . groupingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should be set before getState' ) ;
889+
890+ state . getState ( false , 'groupBy' ) ;
891+
892+ expect ( grid . groupingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should not be removed from live groupBy expressions after getState' ) ;
893+ expect ( grid . groupingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should not be removed from live groupBy expressions after getState' ) ;
894+ } ) ;
895+
896+ it ( 'getState should not mutate live filtering expressions (owner)' , ( ) => {
897+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
898+ fix . detectChanges ( ) ;
899+ const grid = fix . componentInstance . grid ;
900+ const state = fix . componentInstance . state ;
901+
902+ const filteringTree = new FilteringExpressionsTree ( FilteringLogic . And ) ;
903+ const productFilteringTree = new FilteringExpressionsTree ( FilteringLogic . And , 'ProductName' ) ;
904+ productFilteringTree . filteringOperands . push ( {
905+ condition : IgxBooleanFilteringOperand . instance ( ) . condition ( 'true' ) ,
906+ conditionName : 'true' ,
907+ fieldName : 'InStock' ,
908+ ignoreCase : true
909+ } ) ;
910+ ( productFilteringTree as IFilteringExpressionsTree ) . owner = 'nestedOwner' ;
911+ filteringTree . filteringOperands . push ( productFilteringTree ) ;
912+ ( filteringTree as IFilteringExpressionsTree ) . owner = 'rootOwner' ;
913+ grid . filteringExpressionsTree = filteringTree ;
914+ fix . detectChanges ( ) ;
915+
916+ expect ( grid . filteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should be set before getState' ) ;
917+ expect ( ( grid . filteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
918+ . toBe ( 'nestedOwner' , 'nested owner should be set before getState' ) ;
919+
920+ state . getState ( false , 'filtering' ) ;
921+
922+ expect ( grid . filteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should not be removed from live filtering tree after getState' ) ;
923+ expect ( ( grid . filteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
924+ . toBe ( 'nestedOwner' , 'nested owner should not be removed from live filtering operand after getState' ) ;
925+ } ) ;
926+
927+ it ( 'getState should not mutate live advancedFiltering expressions (owner)' , ( ) => {
928+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
929+ fix . detectChanges ( ) ;
930+ const grid = fix . componentInstance . grid ;
931+ const state = fix . componentInstance . state ;
932+
933+ const filteringTree = new FilteringExpressionsTree ( FilteringLogic . And ) ;
934+ const productFilteringTree = new FilteringExpressionsTree ( FilteringLogic . And , 'ProductName' ) ;
935+ productFilteringTree . filteringOperands . push ( {
936+ condition : IgxBooleanFilteringOperand . instance ( ) . condition ( 'true' ) ,
937+ conditionName : 'true' ,
938+ fieldName : 'InStock' ,
939+ ignoreCase : true
940+ } ) ;
941+ ( productFilteringTree as IFilteringExpressionsTree ) . owner = 'nestedOwner' ;
942+ filteringTree . filteringOperands . push ( productFilteringTree ) ;
943+ ( filteringTree as IFilteringExpressionsTree ) . owner = 'rootOwner' ;
944+ grid . advancedFilteringExpressionsTree = filteringTree ;
945+ fix . detectChanges ( ) ;
946+
947+ expect ( grid . advancedFilteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should be set before getState' ) ;
948+ expect ( ( grid . advancedFilteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
949+ . toBe ( 'nestedOwner' , 'nested owner should be set before getState' ) ;
950+
951+ state . getState ( false , 'advancedFiltering' ) ;
952+
953+ expect ( grid . advancedFilteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should not be removed from live advanced filtering tree after getState' ) ;
954+ expect ( ( grid . advancedFilteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
955+ . toBe ( 'nestedOwner' , 'nested owner should not be removed from live advanced filtering operand after getState' ) ;
956+ } ) ;
851957} ) ;
852958
853959class HelperFunctions {
0 commit comments