Proxy.handler-deleteProperty.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. describe("[[Delete]] trap normal behavior", () => {
  2. test("forwarding when not defined in handler", () => {
  3. expect(delete new Proxy({}, { deleteProperty: undefined }).foo).toBeTrue();
  4. expect(delete new Proxy({}, { deleteProperty: null }).foo).toBeTrue();
  5. expect(delete new Proxy({}, {}).foo).toBeTrue();
  6. });
  7. test("correct arguments supplied to trap", () => {
  8. let o = {};
  9. let p = new Proxy(o, {
  10. deleteProperty(target, property) {
  11. expect(target).toBe(o);
  12. expect(property).toBe("foo");
  13. return true;
  14. },
  15. });
  16. delete p.foo;
  17. });
  18. test("correct arguments passed to trap even for number", () => {
  19. let o = {};
  20. let p = new Proxy(o, {
  21. deleteProperty(target, property) {
  22. expect(target).toBe(o);
  23. expect(property).toBe("1");
  24. return true;
  25. },
  26. });
  27. delete p[1];
  28. });
  29. test("conditional deletion", () => {
  30. o = { foo: 1, bar: 2 };
  31. p = new Proxy(o, {
  32. deleteProperty(target, property) {
  33. if (property === "foo") {
  34. delete target[property];
  35. return true;
  36. }
  37. return false;
  38. },
  39. });
  40. expect(delete p.foo).toBeTrue();
  41. expect(delete p.bar).toBeFalse();
  42. expect(o.foo).toBeUndefined();
  43. expect(o.bar).toBe(2);
  44. });
  45. });
  46. describe("[[Delete]] invariants", () => {
  47. test("cannot report a non-configurable own property as deleted", () => {
  48. let o = {};
  49. Object.defineProperty(o, "foo", { configurable: false });
  50. let p = new Proxy(o, {
  51. deleteProperty() {
  52. return true;
  53. },
  54. });
  55. expect(() => {
  56. delete p.foo;
  57. }).toThrowWithMessage(
  58. TypeError,
  59. "Proxy handler's deleteProperty trap violates invariant: cannot report a non-configurable own property of the target as deleted"
  60. );
  61. });
  62. });