maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
65 lines (54 loc) • 2.73 kB
text/typescript
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.');
});
});