Proxy.handler-preventExtensions.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. preventExtensions() {
  26. return false;
  27. },
  28. });
  29. expect(() => {
  30. Object.preventExtensions(p);
  31. }).toThrowWithMessage(TypeError, "Object's [[PreventExtensions]] method returned false");
  32. });
  33. test("cannot return true if the target is extensible", () => {
  34. let o = {};
  35. let p = new Proxy(o, {
  36. preventExtensions() {
  37. return true;
  38. },
  39. });
  40. expect(() => {
  41. Object.preventExtensions(p);
  42. }).toThrowWithMessage(TypeError, "Proxy handler's preventExtensions trap violates invariant: cannot return true if the target object is extensible");
  43. Object.preventExtensions(o);
  44. expect(Object.preventExtensions(p)).toBe(p);
  45. });
  46. });