@thoughtspot/ts-chart-sdk 0.0.2-alpha.3 → 0.0.2-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/package.json +2 -2
  2. package/src/index.ts +2 -0
  3. package/src/main/custom-chart-context.spec.ts +118 -1
  4. package/src/main/custom-chart-context.ts +113 -8
  5. package/src/main/post-message-event-bridge.ts +1 -1
  6. package/src/test/test-conditional-formatting-utils.ts +95 -0
  7. package/src/types/answer-column.types.ts +63 -0
  8. package/src/types/common.types.ts +8 -0
  9. package/src/types/conditional-formatting.types.ts +172 -0
  10. package/src/types/configurator.types.ts +7 -0
  11. package/src/types/ts-to-chart-event.types.ts +2 -1
  12. package/src/types/visual-prop.types.ts +7 -0
  13. package/src/utils/conditional-formatting/conditional-formatting.spec.ts +415 -0
  14. package/src/utils/conditional-formatting/conditional-formatting.ts +229 -0
  15. package/lib/index.d.ts +0 -9
  16. package/lib/index.d.ts.map +0 -1
  17. package/lib/index.js +0 -9
  18. package/lib/index.js.map +0 -1
  19. package/lib/main/custom-chart-context.d.ts +0 -54
  20. package/lib/main/custom-chart-context.d.ts.map +0 -1
  21. package/lib/main/custom-chart-context.js +0 -292
  22. package/lib/main/custom-chart-context.js.map +0 -1
  23. package/lib/main/custom-chart-context.spec.d.ts +0 -2
  24. package/lib/main/custom-chart-context.spec.d.ts.map +0 -1
  25. package/lib/main/custom-chart-context.spec.js +0 -518
  26. package/lib/main/custom-chart-context.spec.js.map +0 -1
  27. package/lib/main/post-message-event-bridge.d.ts +0 -6
  28. package/lib/main/post-message-event-bridge.d.ts.map +0 -1
  29. package/lib/main/post-message-event-bridge.js +0 -29
  30. package/lib/main/post-message-event-bridge.js.map +0 -1
  31. package/lib/main/post-message-event-bridge.spec.d.ts +0 -2
  32. package/lib/main/post-message-event-bridge.spec.d.ts.map +0 -1
  33. package/lib/main/post-message-event-bridge.spec.js +0 -117
  34. package/lib/main/post-message-event-bridge.spec.js.map +0 -1
  35. package/lib/main/util.d.ts +0 -2
  36. package/lib/main/util.d.ts.map +0 -1
  37. package/lib/main/util.js +0 -9
  38. package/lib/main/util.js.map +0 -1
  39. package/lib/react/mocks/custom-chart-context-mock.d.ts +0 -3
  40. package/lib/react/mocks/custom-chart-context-mock.d.ts.map +0 -1
  41. package/lib/react/mocks/custom-chart-context-mock.js +0 -94
  42. package/lib/react/mocks/custom-chart-context-mock.js.map +0 -1
  43. package/lib/react/use-custom-chart-context.d.ts +0 -4
  44. package/lib/react/use-custom-chart-context.d.ts.map +0 -1
  45. package/lib/react/use-custom-chart-context.js +0 -68
  46. package/lib/react/use-custom-chart-context.js.map +0 -1
  47. package/lib/react/use-custom-chart-context.spec.d.ts +0 -2
  48. package/lib/react/use-custom-chart-context.spec.d.ts.map +0 -1
  49. package/lib/react/use-custom-chart-context.spec.js +0 -318
  50. package/lib/react/use-custom-chart-context.spec.js.map +0 -1
  51. package/lib/react/use-custom-chart-context.util.d.ts +0 -6
  52. package/lib/react/use-custom-chart-context.util.d.ts.map +0 -1
  53. package/lib/react/use-custom-chart-context.util.js +0 -51
  54. package/lib/react/use-custom-chart-context.util.js.map +0 -1
  55. package/lib/react/use-custom-chart-types.d.ts +0 -23
  56. package/lib/react/use-custom-chart-types.d.ts.map +0 -1
  57. package/lib/react/use-custom-chart-types.js +0 -2
  58. package/lib/react/use-custom-chart-types.js.map +0 -1
  59. package/lib/test/test-utils.d.ts +0 -7
  60. package/lib/test/test-utils.d.ts.map +0 -1
  61. package/lib/test/test-utils.js +0 -11
  62. package/lib/test/test-utils.js.map +0 -1
  63. package/lib/types/answer-column.types.d.ts +0 -69
  64. package/lib/types/answer-column.types.d.ts.map +0 -1
  65. package/lib/types/answer-column.types.js +0 -56
  66. package/lib/types/answer-column.types.js.map +0 -1
  67. package/lib/types/chart-to-ts-event.types.d.ts +0 -98
  68. package/lib/types/chart-to-ts-event.types.d.ts.map +0 -1
  69. package/lib/types/chart-to-ts-event.types.js +0 -29
  70. package/lib/types/chart-to-ts-event.types.js.map +0 -1
  71. package/lib/types/common.types.d.ts +0 -52
  72. package/lib/types/common.types.d.ts.map +0 -1
  73. package/lib/types/common.types.js +0 -2
  74. package/lib/types/common.types.js.map +0 -1
  75. package/lib/types/configurator.types.d.ts +0 -15
  76. package/lib/types/configurator.types.d.ts.map +0 -1
  77. package/lib/types/configurator.types.js +0 -2
  78. package/lib/types/configurator.types.js.map +0 -1
  79. package/lib/types/ts-to-chart-event.types.d.ts +0 -94
  80. package/lib/types/ts-to-chart-event.types.d.ts.map +0 -1
  81. package/lib/types/ts-to-chart-event.types.js +0 -15
  82. package/lib/types/ts-to-chart-event.types.js.map +0 -1
  83. package/lib/types/visual-prop.types.d.ts +0 -73
  84. package/lib/types/visual-prop.types.d.ts.map +0 -1
  85. package/lib/types/visual-prop.types.js +0 -2
  86. package/lib/types/visual-prop.types.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @file: Conditional Formatting Types
3
+ * @fileoverview All CF types for the Custom Chart implementations
4
+ * @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
5
+ *
6
+ * Copyright: ThoughtSpot Inc. 2023
7
+ */
8
+
9
+ export type Maybe<T> = T | null;
10
+ export type InputMaybe<T> = Maybe<T>;
11
+
12
+ export type ConditionalFormatting = {
13
+ __typename?: 'ConditionalFormatting';
14
+ rows?: Maybe<Array<Maybe<ConditionalMetric>>>;
15
+ };
16
+ export type Scalars = {
17
+ ID: string;
18
+ String: string;
19
+ Boolean: boolean;
20
+ Int: number;
21
+ Float: number;
22
+ FileUpload: any;
23
+ GUID: string;
24
+ JSON: {
25
+ [key: string]: any;
26
+ };
27
+ JSONObject: any;
28
+ Long: any;
29
+ };
30
+ export declare enum BackgroundFormatTypes {
31
+ Gradient = 'GRADIENT',
32
+ Solid = 'SOLID',
33
+ }
34
+ export enum ConditionalFormattingComparisonTypes {
35
+ ColumnBased = 'COLUMN_BASED',
36
+ ParameterBased = 'PARAMETER_BASED',
37
+ ValueBased = 'VALUE_BASED',
38
+ }
39
+ export type FontAttrs = {
40
+ __typename?: 'FontAttrs';
41
+ bold?: Maybe<Scalars['Boolean']>;
42
+ color?: Maybe<Scalars['String']>;
43
+ italic?: Maybe<Scalars['Boolean']>;
44
+ strikeThrough?: Maybe<Scalars['Boolean']>;
45
+ underline?: Maybe<Scalars['Boolean']>;
46
+ };
47
+ export type GradientBackgroundAttrs = {
48
+ __typename?: 'GradientBackgroundAttrs';
49
+ backgroundFormatMidpoint?: Maybe<Scalars['Float']>;
50
+ backgroundFormatRange?: Maybe<Array<Maybe<Scalars['Float']>>>;
51
+ colors?: Maybe<Array<Maybe<Scalars['String']>>>;
52
+ };
53
+ export enum Operators {
54
+ Contains = 'CONTAINS',
55
+ DoesNotContain = 'DOES_NOT_CONTAIN',
56
+ EndsWith = 'ENDS_WITH',
57
+ EqualTo = 'EQUAL_TO',
58
+ GreaterThan = 'GREATER_THAN',
59
+ GreaterThanEqualTo = 'GREATER_THAN_EQUAL_TO',
60
+ Is = 'IS',
61
+ IsBetween = 'IS_BETWEEN',
62
+ IsEmpty = 'IS_EMPTY',
63
+ IsNot = 'IS_NOT',
64
+ IsNotEmpty = 'IS_NOT_EMPTY',
65
+ IsNotNull = 'IS_NOT_NULL',
66
+ IsNull = 'IS_NULL',
67
+ LessThan = 'LESS_THAN',
68
+ LessThanEqualTo = 'LESS_THAN_EQUAL_TO',
69
+ NotEqualTo = 'NOT_EQUAL_TO',
70
+ StartsWith = 'STARTS_WITH',
71
+ }
72
+ export type SolidBackgroundAttrs = {
73
+ __typename?: 'SolidBackgroundAttrs';
74
+ color?: Maybe<Scalars['String']>;
75
+ };
76
+ export type Range = {
77
+ __typename?: 'Range';
78
+ max?: Maybe<Scalars['Float']>;
79
+ min?: Maybe<Scalars['Float']>;
80
+ };
81
+ export type ConditionalMetric = {
82
+ __typename?: 'ConditionalMetric';
83
+ backgroundFormatType?: Maybe<BackgroundFormatTypes>;
84
+ comparisonParameterId?: Maybe<Scalars['String']>;
85
+ comparisonType?: Maybe<ConditionalFormattingComparisonTypes>;
86
+ fontProperties?: Maybe<FontAttrs>;
87
+ gradientBackgroundAttrs?: Maybe<GradientBackgroundAttrs>;
88
+ isHighlightRow?: Maybe<Scalars['Boolean']>;
89
+ lhsColumnId?: Maybe<Scalars['String']>;
90
+ operator?: Maybe<Operators>;
91
+ plotAsBand?: Maybe<Scalars['Boolean']>;
92
+ rangeValues?: Maybe<Range>;
93
+ rhsColumnId?: Maybe<Scalars['String']>;
94
+ solidBackgroundAttrs?: Maybe<SolidBackgroundAttrs>;
95
+ value?: Maybe<Scalars['String']>;
96
+ };
97
+
98
+ export type Parameter = {
99
+ __typename?: 'Parameter';
100
+ dataType: FalconDataType;
101
+ defaultValue: Scalars['String'];
102
+ description: Scalars['String'];
103
+ id: Scalars['GUID'];
104
+ name: Scalars['String'];
105
+ /** If not present, the parameter has not been overridden */
106
+ overrideValue?: Maybe<Scalars['String']>;
107
+ owner: ParameterOwnerInfo;
108
+ valueList?: Maybe<Array<ParameterValueListItem>>;
109
+ valueRange?: Maybe<ParameterValueRange>;
110
+ valueType: ParameterValueType;
111
+ };
112
+
113
+ export enum FalconDataType {
114
+ Bool = 'BOOL',
115
+ Char = 'CHAR',
116
+ Date = 'DATE',
117
+ DateTime = 'DATE_TIME',
118
+ Double = 'DOUBLE',
119
+ Float = 'FLOAT',
120
+ Int32 = 'INT32',
121
+ Int64 = 'INT64',
122
+ List = 'LIST',
123
+ ListBool = 'LIST_BOOL',
124
+ ListDate = 'LIST_DATE',
125
+ ListDateTime = 'LIST_DATE_TIME',
126
+ ListDouble = 'LIST_DOUBLE',
127
+ ListInt = 'LIST_INT',
128
+ ListString = 'LIST_STRING',
129
+ ListTime = 'LIST_TIME',
130
+ MaxType = 'MAX_TYPE',
131
+ Time = 'TIME',
132
+ Unknown = 'UNKNOWN',
133
+ }
134
+ export type ParameterOwnerInfo = {
135
+ __typename?: 'ParameterOwnerInfo';
136
+ id: Scalars['GUID'];
137
+ name: Scalars['String'];
138
+ type: ParameterOwnerType;
139
+ };
140
+
141
+ export enum ParameterOwnerType {
142
+ Answer = 'ANSWER',
143
+ Worksheet = 'WORKSHEET',
144
+ }
145
+
146
+ export type ParameterValueListItem = {
147
+ __typename?: 'ParameterValueListItem';
148
+ displayAs?: Maybe<Scalars['String']>;
149
+ value: Scalars['String'];
150
+ };
151
+
152
+ export type ParameterValueListItemInput = {
153
+ displayAs?: InputMaybe<Scalars['String']>;
154
+ value: Scalars['String'];
155
+ };
156
+
157
+ export type ParameterValueRange = {
158
+ __typename?: 'ParameterValueRange';
159
+ max?: Maybe<Scalars['Float']>;
160
+ min?: Maybe<Scalars['Float']>;
161
+ };
162
+
163
+ export type ParameterValueRangeInput = {
164
+ max?: InputMaybe<Scalars['Float']>;
165
+ min?: InputMaybe<Scalars['Float']>;
166
+ };
167
+
168
+ export enum ParameterValueType {
169
+ Any = 'ANY',
170
+ List = 'LIST',
171
+ Range = 'RANGE',
172
+ }
@@ -14,6 +14,8 @@
14
14
  * Copyright: ThoughtSpot Inc. 2023
15
15
  */
16
16
 
17
+ import { CustomChartContext } from '../main/custom-chart-context';
18
+ import { ChartModel } from './common.types';
17
19
  /**
18
20
  *
19
21
  * @group Chart Configuration Editor
@@ -100,3 +102,8 @@ export interface ChartConfigEditorDefinition {
100
102
  */
101
103
  columnSections: ChartConfigSection[];
102
104
  }
105
+
106
+ export type ConfigEditorDefinitionSetter = (
107
+ currentState: ChartModel,
108
+ ctx: CustomChartContext,
109
+ ) => ChartConfigEditorDefinition[];
@@ -200,7 +200,8 @@ export interface InitializeEventResponsePayload {
200
200
  */
201
201
  visualPropEditorDefinition?: VisualPropEditorDefinition;
202
202
  /**
203
- * Toggle native configurations supported by TS UI. Ex: column level number and conditional formatting.
203
+ * Toggle native configurations supported by TS UI. Ex: column level number and conditional
204
+ * formatting.
204
205
  *
205
206
  * @version SDK: 0.1 | ThoughtSpot:
206
207
  */
@@ -8,6 +8,8 @@
8
8
  * Copyright: ThoughtSpot Inc. 2023
9
9
  */
10
10
 
11
+ import { CustomChartContext } from '../main/custom-chart-context';
12
+ import { ChartModel } from './common.types';
11
13
  /**
12
14
  * Configuration for input validation rules
13
15
  */
@@ -373,6 +375,11 @@ export interface VisualPropEditorDefinition {
373
375
  elements: PropElement[];
374
376
  }
375
377
 
378
+ export type VisualEditorDefinitionSetter = (
379
+ currentState: ChartModel,
380
+ ctx: CustomChartContext,
381
+ ) => VisualPropEditorDefinition;
382
+
376
383
  /**
377
384
  * Example config to be able to store config in the following keys
378
385
  * 1. range.xaxis.min
@@ -0,0 +1,415 @@
1
+ /**
2
+ * @file: Conditional Formatting Spec
3
+ *
4
+ * @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
5
+ *
6
+ * Copyright: ThoughtSpot Inc. 2023
7
+ */
8
+ import _ from 'lodash';
9
+ import {
10
+ createAttributeOperator,
11
+ createBetweenMetricOperator,
12
+ createMetricOperator,
13
+ } from '../../test/test-conditional-formatting-utils';
14
+ import {
15
+ ChartColumn,
16
+ ColumnTimeBucket,
17
+ ColumnType,
18
+ DataType,
19
+ } from '../../types/answer-column.types';
20
+ import { DataPointsArray } from '../../types/common.types';
21
+ import {
22
+ ConditionalFormatting,
23
+ ConditionalFormattingComparisonTypes,
24
+ Operators,
25
+ } from '../../types/conditional-formatting.types';
26
+ import {
27
+ applicableConditionalFormatting,
28
+ getCfForColumn,
29
+ isConditionSatisfied,
30
+ validateCfCondition,
31
+ } from './conditional-formatting';
32
+
33
+ const mockDataAttr: DataPointsArray = {
34
+ columns: ['col1', 'col2'],
35
+ dataValue: [
36
+ [1, 'abc'],
37
+ [100, 'def'],
38
+ [150, 'ghi'],
39
+ [200, 'jkl'],
40
+ [300, 'mno'],
41
+ ],
42
+ };
43
+
44
+ // Measure operators
45
+ const lessThanOperator = createMetricOperator(Operators.LessThan);
46
+ const greaterThanOperator = createMetricOperator(Operators.GreaterThan);
47
+ const lessThanEqualToOperator = createMetricOperator(Operators.LessThanEqualTo);
48
+ const greaterThanEqualToOperator = createMetricOperator(
49
+ Operators.GreaterThanEqualTo,
50
+ );
51
+ const equalToOperator = createMetricOperator(Operators.EqualTo);
52
+ const notEqualToOperator = createMetricOperator(Operators.NotEqualTo);
53
+ const isBetweenOperator = createBetweenMetricOperator(Operators.IsBetween);
54
+ const isNullOperator = createMetricOperator(Operators.IsNull);
55
+ const isNotNullOperator = createMetricOperator(Operators.IsNotNull);
56
+
57
+ // Attribute operators
58
+ const isOperator = createAttributeOperator(Operators.Is);
59
+ const isNotOperator = createAttributeOperator(Operators.IsNot);
60
+ const containsOperator = createAttributeOperator(Operators.Contains);
61
+ const doesNotContainOperator = createAttributeOperator(
62
+ Operators.DoesNotContain,
63
+ );
64
+ const startsWithOperator = createAttributeOperator(Operators.StartsWith);
65
+ const endsWithOperator = createAttributeOperator(Operators.EndsWith);
66
+
67
+ const parameter = undefined;
68
+
69
+ const mockConditionalFormatting: ConditionalFormatting = {
70
+ rows: [lessThanOperator, greaterThanOperator, isBetweenOperator],
71
+ };
72
+
73
+ describe('validateCfCondition', () => {
74
+ test('verify validateCfCondition util', () => {
75
+ expect(
76
+ validateCfCondition(lessThanOperator, 0, 'col1', mockDataAttr),
77
+ ).toBe(true);
78
+ expect(
79
+ validateCfCondition(lessThanOperator, 3, 'col1', mockDataAttr),
80
+ ).toBe(false);
81
+ expect(
82
+ validateCfCondition(
83
+ lessThanEqualToOperator,
84
+ 3,
85
+ 'col1',
86
+ mockDataAttr,
87
+ ),
88
+ ).toBe(true);
89
+ expect(
90
+ validateCfCondition(greaterThanOperator, 4, 'col1', mockDataAttr),
91
+ ).toBe(true);
92
+ expect(
93
+ validateCfCondition(greaterThanOperator, 3, 'col1', mockDataAttr),
94
+ ).toBe(false);
95
+ expect(
96
+ validateCfCondition(
97
+ greaterThanEqualToOperator,
98
+ 3,
99
+ 'col1',
100
+ mockDataAttr,
101
+ ),
102
+ ).toBe(true);
103
+ expect(
104
+ validateCfCondition(isBetweenOperator, 0, 'col1', mockDataAttr),
105
+ ).toBe(false);
106
+ expect(
107
+ validateCfCondition(isBetweenOperator, 1, 'col1', mockDataAttr),
108
+ ).toBe(true);
109
+ expect(
110
+ validateCfCondition(isBetweenOperator, 2, 'col1', mockDataAttr),
111
+ ).toBe(true);
112
+ expect(
113
+ validateCfCondition(isBetweenOperator, 3, 'col1', mockDataAttr),
114
+ ).toBe(true);
115
+ expect(
116
+ validateCfCondition(isBetweenOperator, 4, 'col1', mockDataAttr),
117
+ ).toBe(false);
118
+ });
119
+ });
120
+
121
+ describe('applicableConditionalFormatting', () => {
122
+ test('returns the first applicable ConditionalMetric or null', () => {
123
+ expect(
124
+ applicableConditionalFormatting(
125
+ 0,
126
+ 'col1',
127
+ mockDataAttr,
128
+ mockConditionalFormatting,
129
+ ),
130
+ ).toEqual(lessThanOperator);
131
+ expect(
132
+ applicableConditionalFormatting(
133
+ 3,
134
+ 'col1',
135
+ mockDataAttr,
136
+ mockConditionalFormatting,
137
+ ),
138
+ ).toEqual(isBetweenOperator);
139
+ expect(
140
+ applicableConditionalFormatting(
141
+ 4,
142
+ 'col1',
143
+ mockDataAttr,
144
+ mockConditionalFormatting,
145
+ ),
146
+ ).toEqual(greaterThanOperator);
147
+ expect(
148
+ applicableConditionalFormatting(
149
+ 0,
150
+ 'col2',
151
+ mockDataAttr,
152
+ mockConditionalFormatting,
153
+ ),
154
+ ).toBeNull();
155
+ });
156
+ });
157
+
158
+ describe('getCfForColumn', () => {
159
+ it('returns conditional formatting or null for the specified column', () => {
160
+ const column: ChartColumn = {
161
+ id: 'col3',
162
+ name: '',
163
+ type: ColumnType.MEASURE,
164
+ timeBucket: ColumnTimeBucket.AUTO,
165
+ dataType: DataType.UNKNOWN,
166
+ columnProperties: {
167
+ conditionalFormatting: mockConditionalFormatting,
168
+ },
169
+ };
170
+
171
+ expect(getCfForColumn(column)).toEqual(mockConditionalFormatting);
172
+ });
173
+ });
174
+
175
+ describe('isConditionSatisfied', () => {
176
+ test('verify isConditionSatisfied util', () => {
177
+ expect(isConditionSatisfied(lessThanOperator, parameter, 100)).toBe(
178
+ true,
179
+ );
180
+ expect(isConditionSatisfied(lessThanOperator, parameter, 200)).toBe(
181
+ false,
182
+ );
183
+ expect(
184
+ isConditionSatisfied(lessThanOperator, parameter, undefined),
185
+ ).toBe(false);
186
+ expect(isConditionSatisfied(greaterThanOperator, parameter, 300)).toBe(
187
+ true,
188
+ );
189
+ expect(isConditionSatisfied(greaterThanOperator, parameter, 100)).toBe(
190
+ false,
191
+ );
192
+ expect(
193
+ isConditionSatisfied(lessThanEqualToOperator, parameter, 200),
194
+ ).toBe(true);
195
+ expect(
196
+ isConditionSatisfied(lessThanEqualToOperator, parameter, 300),
197
+ ).toBe(false);
198
+ expect(
199
+ isConditionSatisfied(greaterThanEqualToOperator, parameter, 200),
200
+ ).toBe(true);
201
+ expect(
202
+ isConditionSatisfied(
203
+ greaterThanEqualToOperator,
204
+ parameter,
205
+ undefined,
206
+ ),
207
+ ).toBe(false);
208
+ expect(
209
+ isConditionSatisfied(greaterThanEqualToOperator, parameter, 100),
210
+ ).toBe(false);
211
+ expect(isConditionSatisfied(equalToOperator, parameter, 200)).toBe(
212
+ true,
213
+ );
214
+ expect(isConditionSatisfied(equalToOperator, parameter, 100)).toBe(
215
+ false,
216
+ );
217
+ expect(isConditionSatisfied(notEqualToOperator, parameter, 300)).toBe(
218
+ true,
219
+ );
220
+ expect(isConditionSatisfied(notEqualToOperator, parameter, 200)).toBe(
221
+ false,
222
+ );
223
+ expect(isConditionSatisfied(isBetweenOperator, parameter, 200)).toBe(
224
+ true,
225
+ );
226
+ expect(isConditionSatisfied(isBetweenOperator, parameter, 150)).toBe(
227
+ true,
228
+ );
229
+ expect(isConditionSatisfied(isBetweenOperator, parameter, 201)).toBe(
230
+ false,
231
+ );
232
+ expect(isConditionSatisfied(isBetweenOperator, parameter, 50)).toBe(
233
+ false,
234
+ );
235
+
236
+ expect(
237
+ isConditionSatisfied(
238
+ createBetweenMetricOperator(
239
+ Operators.IsBetween,
240
+ -2.5412312,
241
+ 2.112312,
242
+ ),
243
+ parameter,
244
+ -2.54,
245
+ ),
246
+ ).toBe(true);
247
+ expect(
248
+ isConditionSatisfied(
249
+ createBetweenMetricOperator(
250
+ Operators.IsBetween,
251
+ -2.5412312,
252
+ 2.112312,
253
+ ),
254
+ parameter,
255
+ -2.5412312,
256
+ ),
257
+ ).toBe(true);
258
+ expect(
259
+ isConditionSatisfied(
260
+ createBetweenMetricOperator(
261
+ Operators.IsBetween,
262
+ -2.5412312,
263
+ 2.112312,
264
+ ),
265
+ parameter,
266
+ -2.5412313,
267
+ ),
268
+ ).toBe(false);
269
+ expect(
270
+ isConditionSatisfied(
271
+ createBetweenMetricOperator(
272
+ Operators.IsBetween,
273
+ -2.5412312,
274
+ 2.112312,
275
+ ),
276
+ parameter,
277
+ 2.1,
278
+ ),
279
+ ).toBe(true);
280
+ expect(
281
+ isConditionSatisfied(
282
+ createBetweenMetricOperator(
283
+ Operators.IsBetween,
284
+ -2.5412312,
285
+ 2.112312,
286
+ ),
287
+ parameter,
288
+ 2.112312,
289
+ ),
290
+ ).toBe(true);
291
+ expect(
292
+ isConditionSatisfied(
293
+ createBetweenMetricOperator(
294
+ Operators.IsBetween,
295
+ -2.5412312,
296
+ 2.112312,
297
+ ),
298
+ parameter,
299
+ 2.112313,
300
+ ),
301
+ ).toBe(false);
302
+
303
+ expect(isConditionSatisfied(isNullOperator, parameter, undefined)).toBe(
304
+ true,
305
+ );
306
+ expect(isConditionSatisfied(isNullOperator, parameter, 50)).toBe(false);
307
+ expect(isConditionSatisfied(isNullOperator, parameter, null)).toBe(
308
+ true,
309
+ );
310
+ expect(isConditionSatisfied(isNotNullOperator, parameter, 50)).toBe(
311
+ true,
312
+ );
313
+ expect(
314
+ isConditionSatisfied(isNotNullOperator, parameter, undefined),
315
+ ).toBe(false);
316
+
317
+ expect(
318
+ isConditionSatisfied(isOperator, parameter, 'check attribute'),
319
+ ).toBe(true);
320
+ expect(
321
+ isConditionSatisfied(isOperator, parameter, 'check not attribute'),
322
+ ).toBe(false);
323
+ expect(
324
+ isConditionSatisfied(
325
+ isNotOperator,
326
+ parameter,
327
+ 'check not attribute',
328
+ ),
329
+ ).toBe(true);
330
+ expect(
331
+ isConditionSatisfied(isNotOperator, parameter, 'check attribute'),
332
+ ).toBe(false);
333
+ expect(
334
+ isConditionSatisfied(
335
+ containsOperator,
336
+ parameter,
337
+ 'check attribute check',
338
+ ),
339
+ ).toBe(true);
340
+ expect(
341
+ isConditionSatisfied(
342
+ { operator: Operators.Contains, value: '4' },
343
+ parameter,
344
+ 4099,
345
+ ),
346
+ ).toBe(true);
347
+ expect(
348
+ isConditionSatisfied(
349
+ { operator: Operators.Contains, value: '4' },
350
+ parameter,
351
+ 5099,
352
+ ),
353
+ ).toBe(false);
354
+ expect(
355
+ isConditionSatisfied(containsOperator, parameter, 'check attribut'),
356
+ ).toBe(false);
357
+ expect(
358
+ isConditionSatisfied(
359
+ doesNotContainOperator,
360
+ parameter,
361
+ 'check attribut',
362
+ ),
363
+ ).toBe(true);
364
+ expect(
365
+ isConditionSatisfied(
366
+ doesNotContainOperator,
367
+ parameter,
368
+ 'check attribute check',
369
+ ),
370
+ ).toBe(false);
371
+ expect(
372
+ isConditionSatisfied(
373
+ startsWithOperator,
374
+ parameter,
375
+ 'check attribute check',
376
+ ),
377
+ ).toBe(true);
378
+ expect(
379
+ isConditionSatisfied(
380
+ startsWithOperator,
381
+ parameter,
382
+ 'check check attribute',
383
+ ),
384
+ ).toBe(false);
385
+ expect(
386
+ isConditionSatisfied(
387
+ endsWithOperator,
388
+ parameter,
389
+ 'check check attribute',
390
+ ),
391
+ ).toBe(true);
392
+ expect(
393
+ isConditionSatisfied(
394
+ endsWithOperator,
395
+ parameter,
396
+ 'check attribute check',
397
+ ),
398
+ ).toBe(false);
399
+
400
+ // Column Based
401
+ const columnBasedOperator = createMetricOperator(
402
+ Operators.EqualTo,
403
+ 'col1',
404
+ 'col2',
405
+ '',
406
+ ConditionalFormattingComparisonTypes.ColumnBased,
407
+ );
408
+ expect(
409
+ isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'abc'),
410
+ ).toBe(true);
411
+ expect(
412
+ isConditionSatisfied(columnBasedOperator, undefined, 'abc', 'def'),
413
+ ).toBe(false);
414
+ });
415
+ });