'use strict'; var test = require('tape'); var hasSymbols = require('has-symbols/shams')(); var hasPropertyDescriptors = require('has-property-descriptors')(); var ownKeys = require('../'); /** @type {(a: PropertyKey, b: PropertyKey) => number} */ function comparator(a, b) { if (typeof a === 'string' && typeof b === 'string') { return a.localeCompare(b); } if (typeof a === 'number' && typeof b === 'number') { return a - b; } return typeof a === 'symbol' ? 1 : -1; } test('ownKeys', function (t) { t.equal(typeof ownKeys, 'function', 'is a function'); t.equal( ownKeys.length, 1, 'has a length of 1' ); t.test('basics', function (st) { var obj = { a: 1, b: 2 }; if (hasPropertyDescriptors) { Object.defineProperty(obj, 'c', { configurable: true, enumerable: false, writable: true, value: 3 }); } st.deepEqual( ownKeys(obj).sort(comparator), (hasPropertyDescriptors ? ['a', 'b', 'c'] : ['a', 'b']).sort(comparator), 'includes non-enumerable properties' ); st.end(); }); t.test('symbols', { skip: !hasSymbols }, function (st) { /** @type {Record} */ var obj = { a: 1 }; var sym = Symbol('b'); obj[sym] = 2; var nonEnumSym = Symbol('c'); Object.defineProperty(obj, nonEnumSym, { configurable: true, enumerable: false, writable: true, value: 3 }); st.deepEqual( ownKeys(obj).sort(comparator), ['a', sym, nonEnumSym].sort(comparator), 'works with symbols, both enum and non-enum' ); st.end(); }); t.end(); });