builtin_weakset_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. runtime.GC()
  37. wso := vm.Get("s").ToObject(vm).self.(*weakSetObject)
  38. wso.s.Lock()
  39. l := len(wso.s.data)
  40. wso.s.Unlock()
  41. if l > 0 {
  42. t.Fatal("Object has not been removed")
  43. }
  44. }
  45. func TestWeakSetArraySimple(t *testing.T) {
  46. const SCRIPT = `
  47. var o1 = {}, o2 = {}, o3 = {};
  48. var s = new WeakSet([o1, o2, o3]);
  49. s.has(o1) && s.has(o2) && s.has(o3);
  50. `
  51. testScript1(SCRIPT, valueTrue, t)
  52. }
  53. func TestWeakSetArrayGeneric(t *testing.T) {
  54. const SCRIPT = `
  55. var o1 = {}, o2 = {}, o3 = {};
  56. var a = new Array();
  57. var s;
  58. var thrown = false;
  59. a[1] = o2;
  60. try {
  61. s = new WeakSet(a);
  62. } catch (e) {
  63. if (e instanceof TypeError) {
  64. thrown = true;
  65. }
  66. }
  67. if (!thrown) {
  68. throw new Error("Case 1 does not throw");
  69. }
  70. Object.defineProperty(a.__proto__, "0", {value: o1, writable: true, enumerable: true, configurable: true});
  71. s = new WeakSet(a);
  72. if (!(s.has(o1) && s.has(o2) && !s.has(o3))) {
  73. throw new Error("Case 2 failed");
  74. }
  75. Object.defineProperty(a, "2", {value: o3, configurable: true});
  76. s = new WeakSet(a);
  77. s.has(o1) && s.has(o2) && s.has(o3);
  78. `
  79. testScript1(SCRIPT, valueTrue, t)
  80. }