|
@@ -0,0 +1,157 @@
|
|
|
|
|
+import { getDisplayProcessor, getColorFromThreshold, DisplayProcessor, DisplayValue } from './displayValue';
|
|
|
|
|
+import { MappingType, ValueMapping } from '../types/panel';
|
|
|
|
|
+
|
|
|
|
|
+function assertSame(input: any, processors: DisplayProcessor[], match: DisplayValue) {
|
|
|
|
|
+ processors.forEach(processor => {
|
|
|
|
|
+ const value = processor(input);
|
|
|
|
|
+ expect(value.text).toEqual(match.text);
|
|
|
|
|
+ if (match.hasOwnProperty('numeric')) {
|
|
|
|
|
+ expect(value.numeric).toEqual(match.numeric);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+describe('Process simple display values', () => {
|
|
|
|
|
+ // Don't test float values here since the decimal formatting changes
|
|
|
|
|
+ const processors = [
|
|
|
|
|
+ // Without options, this shortcuts to a much easier implementation
|
|
|
|
|
+ getDisplayProcessor(),
|
|
|
|
|
+
|
|
|
|
|
+ // Add a simple option that is not used (uses a different base class)
|
|
|
|
|
+ getDisplayProcessor({ color: '#FFF' }),
|
|
|
|
|
+
|
|
|
|
|
+ // Add a simple option that is not used (uses a different base class)
|
|
|
|
|
+ getDisplayProcessor({ unit: 'locale' }),
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ it('support null', () => {
|
|
|
|
|
+ assertSame(null, processors, { text: '', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('support undefined', () => {
|
|
|
|
|
+ assertSame(undefined, processors, { text: '', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('support NaN', () => {
|
|
|
|
|
+ assertSame(NaN, processors, { text: 'NaN', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('Integer', () => {
|
|
|
|
|
+ assertSame(3, processors, { text: '3', numeric: 3 });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('Text to number', () => {
|
|
|
|
|
+ assertSame('3', processors, { text: '3', numeric: 3 });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('Simple String', () => {
|
|
|
|
|
+ assertSame('hello', processors, { text: 'hello', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('empty array', () => {
|
|
|
|
|
+ assertSame([], processors, { text: '', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('array of text', () => {
|
|
|
|
|
+ assertSame(['a', 'b', 'c'], processors, { text: 'a,b,c', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('array of numbers', () => {
|
|
|
|
|
+ assertSame([1, 2, 3], processors, { text: '1,2,3', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('empty object', () => {
|
|
|
|
|
+ assertSame({}, processors, { text: '[object Object]', numeric: NaN });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('boolean true', () => {
|
|
|
|
|
+ assertSame(true, processors, { text: 'true', numeric: 1 });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('boolean false', () => {
|
|
|
|
|
+ assertSame(false, processors, { text: 'false', numeric: 0 });
|
|
|
|
|
+ });
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+describe('Processor with more configs', () => {
|
|
|
|
|
+ it('support prefix & suffix', () => {
|
|
|
|
|
+ const processor = getDisplayProcessor({
|
|
|
|
|
+ prefix: 'AA_',
|
|
|
|
|
+ suffix: '_ZZ',
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(processor('XXX').text).toEqual('AA_XXX_ZZ');
|
|
|
|
|
+ });
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+describe('Get color from threshold', () => {
|
|
|
|
|
+ it('should get first threshold color when only one threshold', () => {
|
|
|
|
|
+ const thresholds = [{ index: 0, value: -Infinity, color: '#7EB26D' }];
|
|
|
|
|
+ expect(getColorFromThreshold(49, thresholds)).toEqual('#7EB26D');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('should get the threshold color if value is same as a threshold', () => {
|
|
|
|
|
+ const thresholds = [
|
|
|
|
|
+ { index: 2, value: 75, color: '#6ED0E0' },
|
|
|
|
|
+ { index: 1, value: 50, color: '#EAB839' },
|
|
|
|
|
+ { index: 0, value: -Infinity, color: '#7EB26D' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ expect(getColorFromThreshold(50, thresholds)).toEqual('#EAB839');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('should get the nearest threshold color between thresholds', () => {
|
|
|
|
|
+ const thresholds = [
|
|
|
|
|
+ { index: 2, value: 75, color: '#6ED0E0' },
|
|
|
|
|
+ { index: 1, value: 50, color: '#EAB839' },
|
|
|
|
|
+ { index: 0, value: -Infinity, color: '#7EB26D' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ expect(getColorFromThreshold(55, thresholds)).toEqual('#EAB839');
|
|
|
|
|
+ });
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+describe('Format value', () => {
|
|
|
|
|
+ it('should return if value isNaN', () => {
|
|
|
|
|
+ const valueMappings: ValueMapping[] = [];
|
|
|
|
|
+ const value = 'N/A';
|
|
|
|
|
+ const instance = getDisplayProcessor({ mappings: valueMappings });
|
|
|
|
|
+
|
|
|
|
|
+ const result = instance(value);
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.text).toEqual('N/A');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('should return formatted value if there are no value mappings', () => {
|
|
|
|
|
+ const valueMappings: ValueMapping[] = [];
|
|
|
|
|
+ const value = '6';
|
|
|
|
|
+
|
|
|
|
|
+ const instance = getDisplayProcessor({ mappings: valueMappings, decimals: 1 });
|
|
|
|
|
+
|
|
|
|
|
+ const result = instance(value);
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.text).toEqual('6.0');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('should return formatted value if there are no matching value mappings', () => {
|
|
|
|
|
+ const valueMappings: ValueMapping[] = [
|
|
|
|
|
+ { id: 0, operator: '', text: 'elva', type: MappingType.ValueToText, value: '11' },
|
|
|
|
|
+ { id: 1, operator: '', text: '1-9', type: MappingType.RangeToText, from: '1', to: '9' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ const value = '10';
|
|
|
|
|
+ const instance = getDisplayProcessor({ mappings: valueMappings, decimals: 1 });
|
|
|
|
|
+
|
|
|
|
|
+ const result = instance(value);
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.text).toEqual('10.0');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('should return mapped value if there are matching value mappings', () => {
|
|
|
|
|
+ const valueMappings: ValueMapping[] = [
|
|
|
|
|
+ { id: 0, operator: '', text: '1-20', type: MappingType.RangeToText, from: '1', to: '20' },
|
|
|
|
|
+ { id: 1, operator: '', text: 'elva', type: MappingType.ValueToText, value: '11' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ const value = '11';
|
|
|
|
|
+ const instance = getDisplayProcessor({ mappings: valueMappings, decimals: 1 });
|
|
|
|
|
+
|
|
|
|
|
+ expect(instance(value).text).toEqual('1-20');
|
|
|
|
|
+ });
|
|
|
|
|
+});
|