66a5338cb24a86004bbdb354471a3993c17b8e451a95c306474d790f17f7fa15ce1f8a61a7cc652e58c48766893a23962a7de4ecda46df58b4c27cbdf88617 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. 'use strict';
  2. var test = require('tape');
  3. var hasToStringTag = require('has-tostringtag/shams')();
  4. var hasOwn = require('hasown');
  5. var setToStringTag = require('../');
  6. test('setToStringTag', function (t) {
  7. t.equal(typeof setToStringTag, 'function', 'is a function');
  8. /** @type {{ [Symbol.toStringTag]?: typeof sentinel }} */
  9. var obj = {};
  10. var sentinel = {};
  11. setToStringTag(obj, sentinel);
  12. t['throws'](
  13. // @ts-expect-error
  14. function () { setToStringTag(obj, sentinel, { force: 'yes' }); },
  15. TypeError,
  16. 'throws if options is not an object'
  17. );
  18. t.test('has Symbol.toStringTag', { skip: !hasToStringTag }, function (st) {
  19. st.ok(hasOwn(obj, Symbol.toStringTag), 'has toStringTag property');
  20. st.equal(obj[Symbol.toStringTag], sentinel, 'toStringTag property is as expected');
  21. st.equal(String(obj), '[object Object]', 'toStringTag works');
  22. /** @type {{ [Symbol.toStringTag]?: string }} */
  23. var tagged = {};
  24. tagged[Symbol.toStringTag] = 'already tagged';
  25. st.equal(String(tagged), '[object already tagged]', 'toStringTag works');
  26. setToStringTag(tagged, 'new tag');
  27. st.equal(String(tagged), '[object already tagged]', 'toStringTag is unchanged');
  28. setToStringTag(tagged, 'new tag', { force: true });
  29. st.equal(String(tagged), '[object new tag]', 'toStringTag is changed with force: true');
  30. st.deepEqual(
  31. Object.getOwnPropertyDescriptor(tagged, Symbol.toStringTag),
  32. {
  33. configurable: true,
  34. enumerable: false,
  35. value: 'new tag',
  36. writable: false
  37. },
  38. 'has expected property descriptor'
  39. );
  40. setToStringTag(tagged, 'new tag', { force: true, nonConfigurable: true });
  41. st.deepEqual(
  42. Object.getOwnPropertyDescriptor(tagged, Symbol.toStringTag),
  43. {
  44. configurable: false,
  45. enumerable: false,
  46. value: 'new tag',
  47. writable: false
  48. },
  49. 'is nonconfigurable'
  50. );
  51. st.end();
  52. });
  53. t.test('does not have Symbol.toStringTag', { skip: hasToStringTag }, function (st) {
  54. var passed = true;
  55. for (var key in obj) { // eslint-disable-line no-restricted-syntax
  56. if (hasOwn(obj, key)) {
  57. st.fail('object has own key ' + key);
  58. passed = false;
  59. }
  60. }
  61. if (passed) {
  62. st.ok(true, 'object has no enumerable own keys');
  63. }
  64. st.end();
  65. });
  66. t.end();
  67. });