@maplibre/maplibre-gl-style-spec
Version:
a specification for maplibre styles
69 lines (59 loc) • 2.55 kB
text/typescript
import {describe, test, expect, afterEach, vi, beforeAll} from 'vitest';
describe('get_own', () => {
describe.each([
[
'when Object.hasOwn is available',
function beforeAllFn() {
// clear require cache before running tests as the implementation of
// hasOwn depends on whether Object.hasOwn is available
vi.resetModules();
expect(Object.hasOwn).toBeInstanceOf(Function);
}
],
[
'when Object.hasOwn is not available',
function beforeAllFn() {
vi.resetModules();
delete Object.hasOwn;
expect(Object.hasOwn).toBeUndefined();
}
]
])('unit tests %s', (_, beforeAllFn) => {
let getOwn: typeof import('./get_own').getOwn;
beforeAll(async () => {
beforeAllFn();
const res = await import('./get_own');
getOwn = res.getOwn;
});
afterEach(() => {
vi.resetModules();
});
test('returns value for own properties', () => {
const obj = {key: 'value'};
expect(getOwn(obj, 'key')).toBe('value');
});
test('returns value for falsy own properties', () => {
const obj = {key: false, key2: 0, key3: '', key4: undefined, key5: null};
expect(getOwn(obj, 'key')).toBe(false);
expect(getOwn(obj, 'key2')).toBe(0);
expect(getOwn(obj, 'key3')).toBe('');
expect(getOwn(obj, 'key4')).toBeUndefined();
expect(getOwn(obj, 'key5')).toBeNull();
});
test('returns undefined for properties inherited from the prototype', () => {
const obj = {key: 'value'};
expect(getOwn(obj, '__proto__')).toBeUndefined();
expect(getOwn(obj, 'constructor')).toBeUndefined();
expect(getOwn(obj, 'valueOf')).toBeUndefined();
const inheritedKey = 'inheritedKey';
const prototype = {[inheritedKey]: 1234};
const objWithPrototype = Object.create(prototype);
expect(getOwn(objWithPrototype, inheritedKey)).toBeUndefined();
});
test('returns true for own properties that have the same name as a property in the prototype', () => {
const obj = JSON.parse('{"__proto__": 123, "valueOf": "123"}');
expect(getOwn(obj, '__proto__')).toBe(123);
expect(getOwn(obj, 'valueOf')).toBe('123');
});
});
});