builtin_weakset_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package goja
  2. import (
  3. "testing"
  4. )
  5. func TestWeakSetBasic(t *testing.T) {
  6. const SCRIPT = `
  7. var s = new WeakSet();
  8. var o = {};
  9. s.add(o);
  10. if (!s.has(o)) {
  11. throw new Error("has");
  12. }
  13. s.delete(o);
  14. if (s.has(o)) {
  15. throw new Error("still has");
  16. }
  17. `
  18. testScript(SCRIPT, _undefined, t)
  19. }
  20. func TestWeakSetArraySimple(t *testing.T) {
  21. const SCRIPT = `
  22. var o1 = {}, o2 = {}, o3 = {};
  23. var s = new WeakSet([o1, o2, o3]);
  24. s.has(o1) && s.has(o2) && s.has(o3);
  25. `
  26. testScript(SCRIPT, valueTrue, t)
  27. }
  28. func TestWeakSetArrayGeneric(t *testing.T) {
  29. const SCRIPT = `
  30. var o1 = {}, o2 = {}, o3 = {};
  31. var a = new Array();
  32. var s;
  33. var thrown = false;
  34. a[1] = o2;
  35. try {
  36. s = new WeakSet(a);
  37. } catch (e) {
  38. if (e instanceof TypeError) {
  39. thrown = true;
  40. }
  41. }
  42. if (!thrown) {
  43. throw new Error("Case 1 does not throw");
  44. }
  45. Object.defineProperty(a.__proto__, "0", {value: o1, writable: true, enumerable: true, configurable: true});
  46. s = new WeakSet(a);
  47. if (!(s.has(o1) && s.has(o2) && !s.has(o3))) {
  48. throw new Error("Case 2 failed");
  49. }
  50. Object.defineProperty(a, "2", {value: o3, configurable: true});
  51. s = new WeakSet(a);
  52. s.has(o1) && s.has(o2) && s.has(o3);
  53. `
  54. testScript(SCRIPT, valueTrue, t)
  55. }
  56. func TestWeakSetGetAdderGetIteratorOrder(t *testing.T) {
  57. const SCRIPT = `
  58. let getterCalled = 0;
  59. class S extends WeakSet {
  60. get add() {
  61. getterCalled++;
  62. return null;
  63. }
  64. }
  65. let getIteratorCalled = 0;
  66. let iterable = {};
  67. iterable[Symbol.iterator] = () => {
  68. getIteratorCalled++
  69. return {
  70. next: 1
  71. };
  72. }
  73. let thrown = false;
  74. try {
  75. new S(iterable);
  76. } catch (e) {
  77. if (e instanceof TypeError) {
  78. thrown = true;
  79. } else {
  80. throw e;
  81. }
  82. }
  83. thrown && getterCalled === 1 && getIteratorCalled === 0;
  84. `
  85. testScript(SCRIPT, valueTrue, t)
  86. }