import { chartPluginMock } from 'src/plugins/charts/public/mocks' ; import type { DatatableColumn } from 'src/plugins/expressions/public' ; import { applyPaletteParams , getDataMinMax , getPaletteStops , getStepValue , remapStopsByNewInterval , reversePalette , getSortPredicate , } from './helpers' ; describe ( 'applyPaletteParams' , ( ) => { const paletteRegistry = chartPluginMock . createPaletteRegistry ( ) ; it ( 'should return a palette stops array only by the name' , ( ) => { expect ( applyPaletteParams ( paletteRegistry , { name : 'default' , type : 'palette' , params : { name : 'default' } } , { min : 0 , max : 100 } ) ) . toEqual ( [ { color : 'red' , stop : 20 } , { color : 'black' , stop : 70 } , ] ) ; } ) ; it ( 'should return a palette stops array reversed' , ( ) => { expect ( applyPaletteParams ( paletteRegistry , { name : 'default' , type : 'palette' , params : { name : 'default' , reverse : true } } , { min : 0 , max : 100 } ) ) . toEqual ( [ { color : 'black' , stop : 20 } , { color : 'red' , stop : 70 } , ] ) ; } ) ; it ( 'should pick the default palette from the activePalette object when passed' , ( ) => { expect ( applyPaletteParams ( paletteRegistry , { name : 'mocked' , type : 'palette' } , { min : 0 , max : 100 } ) ) . toEqual ( [ { color : 'blue' , stop : 20 } , { color : 'yellow' , stop : 70 } , ] ) ; } ) ; } ) ; describe ( 'remapStopsByNewInterval' , ( ) => { it ( 'should correctly remap the current palette from 0..1 to 0...100' , ( ) => { expect ( remapStopsByNewInterval ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 0.5 } , { color : 'red' , stop : 0.9 } , ] , { newInterval : 100 , oldInterval : 1 , newMin : 0 , oldMin : 0 } ) ) . toEqual ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 50 } , { color : 'red' , stop : 90 } , ] ) ; expect ( remapStopsByNewInterval ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 50 } , { color : 'red' , stop : 90 } , ] , { newInterval : 1 , oldInterval : 100 , newMin : 0 , oldMin : 0 } ) ) . toEqual ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 0.5 } , { color : 'red' , stop : 0.9 } , ] ) ; } ) ; it ( 'should correctly handle negative numbers to/from' , ( ) => { expect ( remapStopsByNewInterval ( [ { color : 'black' , stop : - 100 } , { color : 'green' , stop : - 50 } , { color : 'red' , stop : - 1 } , ] , { newInterval : 100 , oldInterval : 100 , newMin : 0 , oldMin : - 100 } ) ) . toEqual ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 50 } , { color : 'red' , stop : 99 } , ] ) ; expect ( remapStopsByNewInterval ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 50 } , { color : 'red' , stop : 99 } , ] , { newInterval : 100 , oldInterval : 100 , newMin : - 100 , oldMin : 0 } ) ) . toEqual ( [ { color : 'black' , stop : - 100 } , { color : 'green' , stop : - 50 } , { color : 'red' , stop : - 1 } , ] ) ; expect ( remapStopsByNewInterval ( [ { color : 'black' , stop : - 50 } , { color : 'green' , stop : 0 } , { color : 'red' , stop : 50 } , ] , { newInterval : 100 , oldInterval : 100 , newMin : 0 , oldMin : - 50 } ) ) . toEqual ( [ { color : 'black' , stop : 0 } , { color : 'green' , stop : 50 } , { color : 'red' , stop : 100 } , ] ) ; } ) ; } ) ; describe ( 'getDataMinMax' , ( ) => { it ( 'should pick the correct min/max based on the current range type' , ( ) => { expect ( getDataMinMax ( 'percent' , { min : - 100 , max : 0 } ) ) . toEqual ( { min : 0 , max : 100 } ) ; } ) ; it ( 'should pick the correct min/max apply percent by default' , ( ) => { expect ( getDataMinMax ( undefined , { min : - 100 , max : 0 } ) ) . toEqual ( { min : 0 , max : 100 } ) ; } ) ; } ) ; describe ( 'getPaletteStops' , ( ) => { const paletteRegistry = chartPluginMock . createPaletteRegistry ( ) ; it ( 'should correctly compute a predefined palette stops definition from only the name' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'mock' } , { dataBounds : { min : 0 , max : 100 } } ) ) . toEqual ( [ { color : 'blue' , stop : 20 } , { color : 'yellow' , stop : 70 } , ] ) ; } ) ; it ( 'should correctly compute a predefined palette stops definition from explicit prevPalette (override)' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'default' } , { dataBounds : { min : 0 , max : 100 } , prevPalette : 'mock' } ) ) . toEqual ( [ { color : 'blue' , stop : 20 } , { color : 'yellow' , stop : 70 } , ] ) ; } ) ; it ( 'should infer the domain from dataBounds but start from 0' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'default' , rangeType : 'number' } , { dataBounds : { min : 1 , max : 11 } , prevPalette : 'mock' } ) ) . toEqual ( [ { color : 'blue' , stop : 2 } , { color : 'yellow' , stop : 7 } , ] ) ; } ) ; it ( 'should override the minStop when requested' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'default' , rangeType : 'number' } , { dataBounds : { min : 1 , max : 11 } , mapFromMinValue : true } ) ) . toEqual ( [ { color : 'red' , stop : 1 } , { color : 'black' , stop : 6 } , ] ) ; } ) ; it ( 'should compute a display stop palette from custom colorStops defined by the user' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'custom' , rangeType : 'number' , colorStops : [ { color : 'green' , stop : 0 } , { color : 'blue' , stop : 40 } , { color : 'red' , stop : 80 } , ] , } , { dataBounds : { min : 0 , max : 100 } } ) ) . toEqual ( [ { color : 'green' , stop : 40 } , { color : 'blue' , stop : 80 } , { color : 'red' , stop : 100 } , ] ) ; } ) ; it ( 'should compute a display stop palette from custom colorStops defined by the user - handle stop at the end' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'custom' , rangeType : 'number' , colorStops : [ { color : 'green' , stop : 0 } , { color : 'blue' , stop : 40 } , { color : 'red' , stop : 100 } , ] , } , { dataBounds : { min : 0 , max : 100 } } ) ) . toEqual ( [ { color : 'green' , stop : 40 } , { color : 'blue' , stop : 100 } , { color : 'red' , stop : 101 } , ] ) ; } ) ; it ( 'should compute a display stop palette from custom colorStops defined by the user - handle stop at the end (fractional)' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'custom' , rangeType : 'number' , colorStops : [ { color : 'green' , stop : 0 } , { color : 'blue' , stop : 0.4 } , { color : 'red' , stop : 1 } , ] , } , { dataBounds : { min : 0 , max : 1 } } ) ) . toEqual ( [ { color : 'green' , stop : 0.4 } , { color : 'blue' , stop : 1 } , { color : 'red' , stop : 2 } , ] ) ; } ) ; it ( 'should compute a display stop palette from custom colorStops defined by the user - stretch the stops to 100% percent' , ( ) => { expect ( getPaletteStops ( paletteRegistry , { name : 'custom' , colorStops : [ { color : 'green' , stop : 0 } , { color : 'blue' , stop : 0.4 } , { color : 'red' , stop : 1 } , ] , } , { dataBounds : { min : 0 , max : 1 } } ) ) . toEqual ( [ { color : 'green' , stop : 0.4 } , { color : 'blue' , stop : 1 } , { color : 'red' , stop : 100 } , ] ) ; } ) ; } ) ; describe ( 'reversePalette' , ( ) => { it ( 'should correctly reverse color and stops' , ( ) => { expect ( reversePalette ( [ { color : 'red' , stop : 0 } , { color : 'green' , stop : 0.5 } , { color : 'blue' , stop : 0.9 } , ] ) ) . toEqual ( [ { color : 'blue' , stop : 0 } , { color : 'green' , stop : 0.5 } , { color : 'red' , stop : 0.9 } , ] ) ; } ) ; } ) ; describe ( 'getStepValue' , ( ) => { it ( 'should compute the next step based on the last 2 stops' , ( ) => { expect ( getStepValue ( [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 50 } , ] , [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 50 } , ] , 100 ) ) . toBe ( 50 ) ; expect ( getStepValue ( [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 80 } , ] , [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 50 } , ] , 90 ) ) . toBe ( 10 ) ; expect ( getStepValue ( [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 100 } , ] , [ { color : 'red' , stop : 0 } , { color : 'red' , stop : 50 } , ] , 100 ) ) . toBe ( 1 ) ; } ) ; } ) ; describe ( 'getSortPredicate' , ( ) => { it ( 'should return dataIndex if otherbucker it enabled' , ( ) => { const column = { id : '0c4cfb78-3c2f-4eaf-82b3-4b2c1c6abe5a' , name : 'Top values of Carrier' , meta : { type : 'string' , source : 'esaggs' , sourceParams : { params : { field : 'Carrier' , orderBy : '1' , order : 'desc' , size : 3 , otherBucket : true , otherBucketLabel : 'Other' , missingBucket : false , missingBucketLabel : '(missing value)' , } , schema : 'segment' , } , } , } as DatatableColumn ; expect ( getSortPredicate ( column ) ) . toEqual ( 'dataIndex' ) ; } ) ; it ( 'should return numDesc for descending metric sorting' , ( ) => { const column = { id : 'col-0-2' , name : 'Dest: Descending' , meta : { type : 'string' , source : 'esaggs' , sourceParams : { params : { field : 'Dest' , orderBy : '1' , order : 'desc' , size : 5 , otherBucket : false , otherBucketLabel : 'Other' , missingBucket : false , missingBucketLabel : 'Missing' , } , schema : 'segment' , } , } , } as DatatableColumn ; expect ( getSortPredicate ( column ) ) . toEqual ( 'numDesc' ) ; } ) ; it ( 'should return alphaAsc for ascending alphabetical sorting' , ( ) => { const column = { id : 'col-0-2' , name : 'Dest: Ascending' , meta : { type : 'string' , source : 'esaggs' , sourceParams : { params : { field : 'Dest' , orderBy : '_key' , order : 'asc' , size : 5 , otherBucket : false , otherBucketLabel : 'Other' , missingBucket : false , missingBucketLabel : 'Missing' , } , schema : 'segment' , } , } , } as DatatableColumn ; expect ( getSortPredicate ( column ) ) . toEqual ( 'alphaAsc' ) ; } ) ; } ) ;