builtin_weakset_test.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package goja
  2. import (
  3. "runtime"
  4. "testing"
  5. )
  6. func TestWeakSetBasic(t *testing.T) {
  7. const SCRIPT = `
  8. var s = new WeakSet();
  9. var o = {};
  10. s.add(o);
  11. if (!s.has(o)) {
  12. throw new Error("has");
  13. }
  14. s.delete(o);
  15. if (s.has(o)) {
  16. throw new Error("still has");
  17. }
  18. `
  19. testScript1(SCRIPT, _undefined, t)
  20. }
  21. func TestWeakSetExpiry(t *testing.T) {
  22. vm := New()
  23. _, err := vm.RunString(`
  24. var s = new WeakSet();
  25. var o = {};
  26. s.add(o);
  27. if (!s.has(o)) {
  28. throw new Error("has");
  29. }
  30. o = undefined;
  31. `)
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. runtime.GC()
  36. wso := vm.Get("s").ToObject(vm).self.(*weakSetObject)
  37. wso.s.Lock()
  38. l := len(wso.s.data)
  39. wso.s.Unlock()
  40. if l > 0 {
  41. t.Fatal("Object has not been removed")
  42. }
  43. }
  44. func TestWeakSetArraySimple(t *testing.T) {
  45. const SCRIPT = `
  46. var o1 = {}, o2 = {}, o3 = {};
  47. var s = new WeakSet([o1, o2, o3]);
  48. s.has(o1) && s.has(o2) && s.has(o3);
  49. `
  50. testScript1(SCRIPT, valueTrue, t)
  51. }
  52. func TestWeakSetArrayGeneric(t *testing.T) {
  53. const SCRIPT = `
  54. var o1 = {}, o2 = {}, o3 = {};
  55. var a = new Array();
  56. var s;
  57. var thrown = false;
  58. a[1] = o2;
  59. try {
  60. s = new WeakSet(a);
  61. } catch (e) {
  62. if (e instanceof TypeError) {
  63. thrown = true;
  64. }
  65. }
  66. if (!thrown) {
  67. throw new Error("Case 1 does not throw");
  68. }
  69. Object.defineProperty(a.__proto__, "0", {value: o1, writable: true, enumerable: true, configurable: true});
  70. s = new WeakSet(a);
  71. if (!(s.has(o1) && s.has(o2) && !s.has(o3))) {
  72. throw new Error("Case 2 failed");
  73. }
  74. Object.defineProperty(a, "2", {value: o3, configurable: true});
  75. s = new WeakSet(a);
  76. s.has(o1) && s.has(o2) && s.has(o3);
  77. `
  78. testScript1(SCRIPT, valueTrue, t)
  79. }