@@ -803,6 +803,112 @@ describe('IgxGridState - input properties #grid', () => {
803803 expect ( prodIdColumn . colEnd ) . toBe ( 1 ) ;
804804 } ) ;
805805
806+ it ( 'getState should not mutate live sorting expressions (strategy/owner)' , ( ) => {
807+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
808+ fix . detectChanges ( ) ;
809+ const grid = fix . componentInstance . grid ;
810+ const state = fix . componentInstance . state ;
811+
812+ const customStrategy = DefaultSortingStrategy . instance ( ) ;
813+ const owner = { } as any ;
814+ grid . sortingExpressions = [
815+ { fieldName : 'ProductID' , dir : SortingDirection . Asc , ignoreCase : false , strategy : customStrategy , owner }
816+ ] ;
817+ fix . detectChanges ( ) ;
818+
819+ expect ( grid . sortingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should be set before getState' ) ;
820+ expect ( grid . sortingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should be set before getState' ) ;
821+
822+ state . getState ( false , 'sorting' ) ;
823+
824+ expect ( grid . sortingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should not be removed from live expressions after getState' ) ;
825+ expect ( grid . sortingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should not be removed from live expressions after getState' ) ;
826+ } ) ;
827+
828+ it ( 'getState should not mutate live groupBy expressions (strategy/owner)' , ( ) => {
829+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
830+ fix . detectChanges ( ) ;
831+ const grid = fix . componentInstance . grid ;
832+ const state = fix . componentInstance . state ;
833+
834+ const customStrategy = DefaultSortingStrategy . instance ( ) ;
835+ const owner = { } as any ;
836+ grid . groupingExpressions = [
837+ { fieldName : 'ProductID' , dir : SortingDirection . Asc , ignoreCase : false , strategy : customStrategy , owner }
838+ ] ;
839+ fix . detectChanges ( ) ;
840+
841+ expect ( grid . groupingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should be set before getState' ) ;
842+ expect ( grid . groupingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should be set before getState' ) ;
843+
844+ state . getState ( false , 'groupBy' ) ;
845+
846+ expect ( grid . groupingExpressions [ 0 ] . strategy ) . toBe ( customStrategy , 'strategy should not be removed from live groupBy expressions after getState' ) ;
847+ expect ( grid . groupingExpressions [ 0 ] . owner ) . toBe ( owner , 'owner should not be removed from live groupBy expressions after getState' ) ;
848+ } ) ;
849+
850+ it ( 'getState should not mutate live filtering expressions (owner)' , ( ) => {
851+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
852+ fix . detectChanges ( ) ;
853+ const grid = fix . componentInstance . grid ;
854+ const state = fix . componentInstance . state ;
855+
856+ const filteringTree = new FilteringExpressionsTree ( FilteringLogic . And ) ;
857+ const productFilteringTree = new FilteringExpressionsTree ( FilteringLogic . And , 'ProductName' ) ;
858+ productFilteringTree . filteringOperands . push ( {
859+ condition : IgxBooleanFilteringOperand . instance ( ) . condition ( 'true' ) ,
860+ conditionName : 'true' ,
861+ fieldName : 'InStock' ,
862+ ignoreCase : true
863+ } ) ;
864+ ( productFilteringTree as IFilteringExpressionsTree ) . owner = 'nestedOwner' ;
865+ filteringTree . filteringOperands . push ( productFilteringTree ) ;
866+ ( filteringTree as IFilteringExpressionsTree ) . owner = 'rootOwner' ;
867+ grid . filteringExpressionsTree = filteringTree ;
868+ fix . detectChanges ( ) ;
869+
870+ expect ( grid . filteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should be set before getState' ) ;
871+ expect ( ( grid . filteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
872+ . toBe ( 'nestedOwner' , 'nested owner should be set before getState' ) ;
873+
874+ state . getState ( false , 'filtering' ) ;
875+
876+ expect ( grid . filteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should not be removed from live filtering tree after getState' ) ;
877+ expect ( ( grid . filteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
878+ . toBe ( 'nestedOwner' , 'nested owner should not be removed from live filtering operand after getState' ) ;
879+ } ) ;
880+
881+ it ( 'getState should not mutate live advancedFiltering expressions (owner)' , ( ) => {
882+ const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
883+ fix . detectChanges ( ) ;
884+ const grid = fix . componentInstance . grid ;
885+ const state = fix . componentInstance . state ;
886+
887+ const filteringTree = new FilteringExpressionsTree ( FilteringLogic . And ) ;
888+ const productFilteringTree = new FilteringExpressionsTree ( FilteringLogic . And , 'ProductName' ) ;
889+ productFilteringTree . filteringOperands . push ( {
890+ condition : IgxBooleanFilteringOperand . instance ( ) . condition ( 'true' ) ,
891+ conditionName : 'true' ,
892+ fieldName : 'InStock' ,
893+ ignoreCase : true
894+ } ) ;
895+ ( productFilteringTree as IFilteringExpressionsTree ) . owner = 'nestedOwner' ;
896+ filteringTree . filteringOperands . push ( productFilteringTree ) ;
897+ ( filteringTree as IFilteringExpressionsTree ) . owner = 'rootOwner' ;
898+ grid . advancedFilteringExpressionsTree = filteringTree ;
899+ fix . detectChanges ( ) ;
900+
901+ expect ( grid . advancedFilteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should be set before getState' ) ;
902+ expect ( ( grid . advancedFilteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
903+ . toBe ( 'nestedOwner' , 'nested owner should be set before getState' ) ;
904+
905+ state . getState ( false , 'advancedFiltering' ) ;
906+
907+ expect ( grid . advancedFilteringExpressionsTree . owner ) . toBe ( 'rootOwner' , 'root owner should not be removed from live advanced filtering tree after getState' ) ;
908+ expect ( ( grid . advancedFilteringExpressionsTree . filteringOperands [ 0 ] as IFilteringExpressionsTree ) . owner )
909+ . toBe ( 'nestedOwner' , 'nested owner should not be removed from live advanced filtering operand after getState' ) ;
910+ } ) ;
911+
806912 it ( 'should preserve column widths when restoring state with all columns hidden' , ( ) => {
807913 const fix = TestBed . createComponent ( IgxGridStateComponent ) ;
808914 fix . detectChanges ( ) ;
0 commit comments