UNPKG

maplibre-gl

Version:

BSD licensed community fork of mapbox-gl, a WebGL interactive maps library

65 lines (54 loc) 2.73 kB
import {createPropertyExpression, Feature, GlobalProperties, StylePropertyExpression} from '../expression'; import definitions from './definitions'; import v8 from '../reference/v8.json'; import {StylePropertySpecification} from '../style-spec'; import ParsingError from './parsing_error'; // filter out interal "error" and "filter-*" expressions from definition list const filterExpressionRegex = /filter-/; const definitionList = Object.keys(definitions).filter((expression) => { return expression !== 'error' && !filterExpressionRegex.exec(expression); }).sort(); describe('v8.json includes all definitions from style-spec', () => { const v8List = Object.keys(v8.expression_name.values); const v8SupportedList = v8List.filter((expression) => { //filter out expressions that are not supported in GL-JS return !!v8.expression_name.values[expression]['sdk-support']['basic functionality']['js']; }); expect(definitionList).toEqual(v8SupportedList.sort()); }); describe('createPropertyExpression', () => { test('prohibits non-interpolable properties from using an "interpolate" expression', () => { const {result, value} = createPropertyExpression([ 'interpolate', ['linear'], ['zoom'], 0, 0, 10, 10 ], { type: 'number', 'property-type': 'data-constant', expression: { 'interpolated': false, 'parameters': ['zoom'] } } as StylePropertySpecification); expect(result).toBe('error'); expect((value as ParsingError[])).toHaveLength(1); expect(value[0].message).toBe('"interpolate" expressions cannot be used with this property'); }); }); describe('evaluate expression', () => { test('warns and falls back to default for invalid enum values', () => { const {value} = createPropertyExpression(['get', 'x'], { type: 'enum', values: {a: {}, b: {}, c: {}}, default: 'a', 'property-type': 'data-driven', expression: { 'interpolated': false, 'parameters': ['zoom', 'feature'] } } as any as StylePropertySpecification) as {value: StylePropertyExpression}; jest.spyOn(console, 'warn').mockImplementation(() => { }); expect(value.kind).toBe('source'); expect(value.evaluate({} as GlobalProperties, {properties: {x: 'b'}} as any as Feature)).toBe('b'); expect(value.evaluate({} as GlobalProperties, {properties: {x: 'invalid'}} as any as Feature)).toBe('a'); expect(console.warn).toHaveBeenCalledWith('Expected value to be one of "a", "b", "c", but found "invalid" instead.'); }); });