builtin_set_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package goja
  2. import (
  3. "fmt"
  4. "strings"
  5. "testing"
  6. )
  7. func TestSetEvilIterator(t *testing.T) {
  8. const SCRIPT = `
  9. var o = {};
  10. o[Symbol.iterator] = function() {
  11. return {
  12. next: function() {
  13. if (!this.flag) {
  14. this.flag = true;
  15. return {};
  16. }
  17. return {done: true};
  18. }
  19. }
  20. }
  21. new Set(o);
  22. undefined;
  23. `
  24. testScript(SCRIPT, _undefined, t)
  25. }
  26. func ExampleRuntime_ExportTo_setToMap() {
  27. vm := New()
  28. s, err := vm.RunString(`
  29. new Set([1, 2, 3])
  30. `)
  31. if err != nil {
  32. panic(err)
  33. }
  34. m := make(map[int]struct{})
  35. err = vm.ExportTo(s, &m)
  36. if err != nil {
  37. panic(err)
  38. }
  39. fmt.Println(m)
  40. // Output: map[1:{} 2:{} 3:{}]
  41. }
  42. func ExampleRuntime_ExportTo_setToSlice() {
  43. vm := New()
  44. s, err := vm.RunString(`
  45. new Set([1, 2, 3])
  46. `)
  47. if err != nil {
  48. panic(err)
  49. }
  50. var a []int
  51. err = vm.ExportTo(s, &a)
  52. if err != nil {
  53. panic(err)
  54. }
  55. fmt.Println(a)
  56. // Output: [1 2 3]
  57. }
  58. func TestSetExportToSliceCircular(t *testing.T) {
  59. vm := New()
  60. s, err := vm.RunString(`
  61. let s = new Set();
  62. s.add(s);
  63. s;
  64. `)
  65. if err != nil {
  66. t.Fatal(err)
  67. }
  68. var a []Value
  69. err = vm.ExportTo(s, &a)
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. if len(a) != 1 {
  74. t.Fatalf("len: %d", len(a))
  75. }
  76. if a[0] != s {
  77. t.Fatalf("a: %v", a)
  78. }
  79. }
  80. func TestSetExportToArrayMismatchedLengths(t *testing.T) {
  81. vm := New()
  82. s, err := vm.RunString(`
  83. new Set([1, 2])
  84. `)
  85. if err != nil {
  86. panic(err)
  87. }
  88. var s1 [3]int
  89. err = vm.ExportTo(s, &s1)
  90. if err == nil {
  91. t.Fatal("expected error")
  92. }
  93. if msg := err.Error(); !strings.Contains(msg, "lengths mismatch") {
  94. t.Fatalf("unexpected error: %v", err)
  95. }
  96. }
  97. func TestSetExportToNilMap(t *testing.T) {
  98. vm := New()
  99. var m map[int]interface{}
  100. res, err := vm.RunString("new Set([1])")
  101. if err != nil {
  102. t.Fatal(err)
  103. }
  104. err = vm.ExportTo(res, &m)
  105. if err != nil {
  106. t.Fatal(err)
  107. }
  108. if len(m) != 1 {
  109. t.Fatal(m)
  110. }
  111. if _, exists := m[1]; !exists {
  112. t.Fatal(m)
  113. }
  114. }
  115. func TestSetExportToNonNilMap(t *testing.T) {
  116. vm := New()
  117. m := map[int]interface{}{
  118. 2: true,
  119. }
  120. res, err := vm.RunString("new Set([1])")
  121. if err != nil {
  122. t.Fatal(err)
  123. }
  124. err = vm.ExportTo(res, &m)
  125. if err != nil {
  126. t.Fatal(err)
  127. }
  128. if len(m) != 1 {
  129. t.Fatal(m)
  130. }
  131. if _, exists := m[1]; !exists {
  132. t.Fatal(m)
  133. }
  134. }
  135. func TestSetGetAdderGetIteratorOrder(t *testing.T) {
  136. const SCRIPT = `
  137. let getterCalled = 0;
  138. class S extends Set {
  139. get add() {
  140. getterCalled++;
  141. return null;
  142. }
  143. }
  144. let getIteratorCalled = 0;
  145. let iterable = {};
  146. iterable[Symbol.iterator] = () => {
  147. getIteratorCalled++
  148. return {
  149. next: 1
  150. };
  151. }
  152. let thrown = false;
  153. try {
  154. new S(iterable);
  155. } catch (e) {
  156. if (e instanceof TypeError) {
  157. thrown = true;
  158. } else {
  159. throw e;
  160. }
  161. }
  162. thrown && getterCalled === 1 && getIteratorCalled === 0;
  163. `
  164. testScript(SCRIPT, valueTrue, t)
  165. }