Proxy.handler-preventExtensions.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. describe("[[PreventExtension]] trap normal behavior", () => {
  2. test("forwarding when not defined in handler", () => {
  3. let p = new Proxy({}, { preventExtensions: null });
  4. expect(Object.preventExtensions(p)).toBe(p);
  5. p = new Proxy({}, { preventExtensions: undefined });
  6. expect(Object.preventExtensions(p)).toBe(p);
  7. p = new Proxy({}, {});
  8. expect(Object.preventExtensions(p)).toBe(p);
  9. });
  10. test("correct arguments supplied to trap", () => {
  11. let o = {};
  12. p = new Proxy(o, {
  13. preventExtensions(target) {
  14. expect(target).toBe(o);
  15. return true;
  16. },
  17. });
  18. Object.preventExtensions(o);
  19. Object.preventExtensions(p);
  20. });
  21. });
  22. describe("[[PreventExtensions]] invariants", () => {
  23. test("cannot return false", () => {
  24. let p = new Proxy(
  25. {},
  26. {
  27. preventExtensions() {
  28. return false;
  29. },
  30. }
  31. );
  32. expect(() => {
  33. Object.preventExtensions(p);
  34. }).toThrowWithMessage(TypeError, "Object's [[PreventExtensions]] method returned false");
  35. });
  36. test("cannot return true if the target is extensible", () => {
  37. let o = {};
  38. let p = new Proxy(o, {
  39. preventExtensions() {
  40. return true;
  41. },
  42. });
  43. expect(() => {
  44. Object.preventExtensions(p);
  45. }).toThrowWithMessage(
  46. TypeError,
  47. "Proxy handler's preventExtensions trap violates invariant: cannot return true if the target object is extensible"
  48. );
  49. Object.preventExtensions(o);
  50. expect(Object.preventExtensions(p)).toBe(p);
  51. });
  52. });