Proxy.handler-set.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. describe("[[Set]] trap normal behavior", () => {
  2. test("forwarding when not defined in handler", () => {
  3. expect((new Proxy({}, { set: undefined }).foo = 1)).toBe(1);
  4. expect((new Proxy({}, { set: null }).foo = 1)).toBe(1);
  5. expect((new Proxy({}, {}).foo = 1)).toBe(1);
  6. });
  7. test("correct arguments supplied to trap", () => {
  8. let o = {};
  9. let p = new Proxy(o, {
  10. set(target, prop, value, receiver) {
  11. expect(target).toBe(o);
  12. expect(prop).toBe("foo");
  13. expect(value).toBe(10);
  14. expect(receiver).toBe(p);
  15. return true;
  16. },
  17. });
  18. p.foo = 10;
  19. });
  20. test("conditional return value", () => {
  21. let p = new Proxy(
  22. {},
  23. {
  24. set(target, prop, value) {
  25. if (target[prop] === value) {
  26. target[prop] *= 2;
  27. } else {
  28. target[prop] = value;
  29. }
  30. },
  31. }
  32. );
  33. p.foo = 10;
  34. expect(p.foo).toBe(10);
  35. p.foo = 10;
  36. expect(p.foo).toBe(20);
  37. p.foo = 10;
  38. expect(p.foo).toBe(10);
  39. p[Symbol.hasInstance] = "foo"
  40. expect(p[Symbol.hasInstance]).toBe("foo");
  41. });
  42. });
  43. describe("[[Set]] invariants", () => {
  44. test("cannot return true for a non-configurable, non-writable property", () => {
  45. let o = {};
  46. Object.defineProperty(o, "foo", { value: 10 });
  47. let p = new Proxy(o, {
  48. set() {
  49. return true;
  50. },
  51. });
  52. expect(() => {
  53. p.foo = 12;
  54. }).toThrowWithMessage(
  55. TypeError,
  56. "Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable, non-writable own data property"
  57. );
  58. });
  59. test("cannot return true for a non-configurable accessor property with no setter", () => {
  60. let o = {};
  61. Object.defineProperty(o, "foo", { get() {} });
  62. let p = new Proxy(o, {
  63. set() {
  64. return true;
  65. },
  66. });
  67. expect(() => {
  68. p.foo = 12;
  69. }).toThrowWithMessage(
  70. TypeError,
  71. "Proxy handler's set trap violates invariant: cannot return true for a property on the target which is a non-configurable own accessor property with an undefined set attribute"
  72. );
  73. });
  74. });