object_goslice_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package goja
  2. import (
  3. "testing"
  4. )
  5. func TestGoSliceBasic(t *testing.T) {
  6. const SCRIPT = `
  7. var sum = 0;
  8. for (var i = 0; i < a.length; i++) {
  9. sum += a[i];
  10. }
  11. sum;
  12. `
  13. r := New()
  14. r.Set("a", []interface{}{1, 2, 3, 4})
  15. v, err := r.RunString(SCRIPT)
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. if i := v.ToInteger(); i != 10 {
  20. t.Fatalf("Expected 10, got: %d", i)
  21. }
  22. }
  23. func TestGoSliceIn(t *testing.T) {
  24. const SCRIPT = `
  25. var idx = "";
  26. for (var i in a) {
  27. idx += i;
  28. }
  29. idx;
  30. `
  31. r := New()
  32. r.Set("a", []interface{}{1, 2, 3, 4})
  33. v, err := r.RunString(SCRIPT)
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. if i := v.String(); i != "0123" {
  38. t.Fatalf("Expected '0123', got: '%s'", i)
  39. }
  40. }
  41. func TestGoSliceExpand(t *testing.T) {
  42. const SCRIPT = `
  43. var l = a.length;
  44. for (var i = 0; i < l; i++) {
  45. a[l + i] = a[i] * 2;
  46. }
  47. var sum = 0;
  48. for (var i = 0; i < a.length; i++) {
  49. sum += a[i];
  50. }
  51. sum;
  52. `
  53. r := New()
  54. a := []interface{}{int64(1), int64(2), int64(3), int64(4)}
  55. r.Set("a", &a)
  56. v, err := r.RunString(SCRIPT)
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. sum := int64(0)
  61. for _, v := range a {
  62. sum += v.(int64)
  63. }
  64. if i := v.ToInteger(); i != sum {
  65. t.Fatalf("Expected %d, got: %d", sum, i)
  66. }
  67. }
  68. func TestGoSliceProtoMethod(t *testing.T) {
  69. const SCRIPT = `
  70. a.join(",")
  71. `
  72. r := New()
  73. a := []interface{}{1, 2, 3, 4}
  74. r.Set("a", a)
  75. ret, err := r.RunString(SCRIPT)
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. if s := ret.String(); s != "1,2,3,4" {
  80. t.Fatalf("Unexpected result: '%s'", s)
  81. }
  82. }
  83. func TestGoSliceSetLength(t *testing.T) {
  84. r := New()
  85. a := []interface{}{1, 2, 3, 4}
  86. r.Set("a", &a)
  87. _, err := r.RunString(`
  88. 'use strict';
  89. a.length = 3;
  90. if (a.length !== 3) {
  91. throw new Error("length="+a.length);
  92. }
  93. if (a[3] !== undefined) {
  94. throw new Error("a[3](1)="+a[3]);
  95. }
  96. a.length = 5;
  97. if (a.length !== 5) {
  98. throw new Error("length="+a.length);
  99. }
  100. if (a[3] !== null) {
  101. throw new Error("a[3](2)="+a[3]);
  102. }
  103. if (a[4] !== null) {
  104. throw new Error("a[4]="+a[4]);
  105. }
  106. `)
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. }
  111. func TestGoSliceProto(t *testing.T) {
  112. r := New()
  113. a := []interface{}{1, nil, 3}
  114. r.Set("a", &a)
  115. _, err := r.RunString(TESTLIB + `
  116. var proto = [,2,,4];
  117. Object.setPrototypeOf(a, proto);
  118. assert.sameValue(a[1], null, "a[1]");
  119. assert.sameValue(a[3], 4, "a[3]");
  120. var desc = Object.getOwnPropertyDescriptor(a, "1");
  121. assert.sameValue(desc.value, null, "desc.value");
  122. assert(desc.writable, "writable");
  123. assert(desc.enumerable, "enumerable");
  124. assert(!desc.configurable, "configurable");
  125. var v5;
  126. Object.defineProperty(proto, "5", {
  127. set: function(v) {
  128. v5 = v;
  129. }
  130. });
  131. a[5] = "test";
  132. assert.sameValue(v5, "test", "v5");
  133. `)
  134. if err != nil {
  135. t.Fatal(err)
  136. }
  137. }
  138. func TestGoSliceProtoProto(t *testing.T) {
  139. r := New()
  140. a := []interface{}{1, nil, 3}
  141. proto := []interface{}{1, 2, 3, 4}
  142. r.Set("a", &a)
  143. r.Set("proto", proto)
  144. _, err := r.RunString(`
  145. "use strict";
  146. var protoproto = Object.create(null);
  147. Object.defineProperty(protoproto, "3", {
  148. value: 42
  149. });
  150. Object.setPrototypeOf(proto, protoproto);
  151. Object.setPrototypeOf(a, proto);
  152. a[3] = 11;
  153. if (a[3] !== 11) {
  154. throw new Error("a[3]=" + a[3]);
  155. }
  156. `)
  157. if err != nil {
  158. t.Fatal(err)
  159. }
  160. }
  161. func TestGoSliceDelete(t *testing.T) {
  162. r := New()
  163. a := []interface{}{1, nil, 3}
  164. r.Set("a", a)
  165. v, err := r.RunString(`
  166. delete a[0] && delete a[1] && delete a[3];
  167. `)
  168. if err != nil {
  169. t.Fatal(err)
  170. }
  171. if v != valueTrue {
  172. t.Fatalf("not true: %v", v)
  173. }
  174. }
  175. func TestGoSlicePop(t *testing.T) {
  176. r := New()
  177. a := []interface{}{1, nil, 3}
  178. r.Set("a", &a)
  179. v, err := r.RunString(`
  180. a.pop()
  181. `)
  182. if err != nil {
  183. t.Fatal(err)
  184. }
  185. if !v.SameAs(intToValue(3)) {
  186. t.Fatal(v)
  187. }
  188. }
  189. func TestGoSlicePopNoPtr(t *testing.T) {
  190. r := New()
  191. a := []interface{}{1, nil, 3}
  192. r.Set("a", a)
  193. v, err := r.RunString(`
  194. a.pop()
  195. `)
  196. if err != nil {
  197. t.Fatal(err)
  198. }
  199. if !v.SameAs(intToValue(3)) {
  200. t.Fatal(v)
  201. }
  202. }
  203. func TestGoSliceShift(t *testing.T) {
  204. r := New()
  205. a := []interface{}{1, nil, 3}
  206. r.Set("a", &a)
  207. v, err := r.RunString(`
  208. a.shift()
  209. `)
  210. if err != nil {
  211. t.Fatal(err)
  212. }
  213. if !v.SameAs(intToValue(1)) {
  214. t.Fatal(v)
  215. }
  216. }
  217. func TestGoSliceLengthProperty(t *testing.T) {
  218. vm := New()
  219. vm.Set("s", []interface{}{2, 3, 4})
  220. _, err := vm.RunString(`
  221. if (!s.hasOwnProperty("length")) {
  222. throw new Error("hasOwnProperty() returned false");
  223. }
  224. let desc = Object.getOwnPropertyDescriptor(s, "length");
  225. if (desc.value !== 3 || !desc.writable || desc.enumerable || desc.configurable) {
  226. throw new Error("incorrect property descriptor: " + JSON.stringify(desc));
  227. }
  228. `)
  229. if err != nil {
  230. t.Fatal(err)
  231. }
  232. }